annotate modules/file.tp @ 299:c0561cb06ee3

Add readAll method to file objects
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Jul 2014 08:24:39 -0700
parents abe3141caefe
children dcb495cf2b97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
297
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 _getStdin <- {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 _stdin <- (file fromFD: 0)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 _getStdin <- { _stdin }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 _stdin
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 _getStdout <- {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 _stdout <- (file fromFD: 1)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 _getStdout <- { _stdout }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 _stdout
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 _getStderr <- {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 _stderr <- (file fromFD: 2)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 _getStderr <- { _stderr }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 _stderr
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 #{
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 fromFD <- :_fd {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 _buffers <- #[]
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 _readPos <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 _buffered <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 _bufferChunk <- 4096
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 _eof? <- false
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 _addBuffer <- {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 newbuf <- bytearray normal: _bufferChunk
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 justRead <- os readFrom: _fd to: newbuf
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 if: justRead > 0 {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 _buffered <- _buffered + justRead
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 _buffers append: (newbuf shrinkTo: justRead)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 } else: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 _eof? <- true
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 _lineIter <- :f {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 iter <- #{
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 foreach <- :self fun {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 idx <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 while: { not: (f eof?) } do: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 line <- f nextLine
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 fun: idx line
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 idx <- idx + 1
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 self
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 map <- :fun {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 new <- #[]
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 foreach: :idx el {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 new append: (fun: el)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 new
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 filter <- :fun {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 new <- #[]
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 foreach: :idx el {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 if: (fun: el) {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 new append: el
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 new
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 fold:with <- :acc :fun {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 foreach: :idx el {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 acc <- fun: acc el
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 acc
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 foldr:with <- :acc :fun {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 (map: :el { el }) foldr: acc with: fun
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 _lineIter <- { iter }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 iter
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 #{
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 read <- :bytes {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 while: { bytes > _buffered && (not: _eof?)} do: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 _addBuffer:
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 nextBuffers <- #[]
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 pieces <- #[]
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 toRead <- bytes
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 i <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 while: { toRead > 0 && i < (_buffers length) } do: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 curBuf <- _buffers get: i
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 if: toRead >= (curBuf length) - _readPos {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 pieces append: (curBuf stringFrom: _readPos to: (curBuf length))
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 _buffered <- _buffered - ((curBuf length) - _readPos)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 toRead <- toRead - ((curBuf length) - _readPos)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 _readPos <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 } else: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 nextPos <- _readPos + toRead
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 pieces append: (curBuf stringFrom: _readPos to: nextPos)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 _readPos <- nextPos
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 _buffered <- _buffered - toRead
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 toRead <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 nextBuffers append: curBuf
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 i <- i + 1
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 while: {i < (_buffers length)} do: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 nextBuffers append: (_buffers get: i)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 i <- i + 1
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 _buffers <- nextBuffers
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 pieces join: ""
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 }
299
c0561cb06ee3 Add readAll method to file objects
Michael Pavone <pavone@retrodev.com>
parents: 297
diff changeset
112 readAll <- {
c0561cb06ee3 Add readAll method to file objects
Michael Pavone <pavone@retrodev.com>
parents: 297
diff changeset
113 while: { not: _eof? } do: {
c0561cb06ee3 Add readAll method to file objects
Michael Pavone <pavone@retrodev.com>
parents: 297
diff changeset
114 _addBuffer:
c0561cb06ee3 Add readAll method to file objects
Michael Pavone <pavone@retrodev.com>
parents: 297
diff changeset
115 }
c0561cb06ee3 Add readAll method to file objects
Michael Pavone <pavone@retrodev.com>
parents: 297
diff changeset
116 read: _buffered
c0561cb06ee3 Add readAll method to file objects
Michael Pavone <pavone@retrodev.com>
parents: 297
diff changeset
117 }
297
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 write <- :data {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 //TODO: write buffering for small writes
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 os write: _fd data
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 nextLine <- {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 nl <- "\n" byte: 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 notfound <- true
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 pos <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 i <- 0
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 while: { notfound } do: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 while: { notfound && i < (_buffers length) } do: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 curBuf <- _buffers get: i
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 start <- if: i = 0 { _readPos } else: { 0 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 curBuf findChar: nl from: start :idx {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 notfound <- false
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 pos <- pos + idx + 1
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 } else: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 pos <- pos + (curBuf length)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 i <- i + 1
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 if: notfound && (not: _eof?) {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 _addBuffer:
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 } else: {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 notfound <- false
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 read: pos - _readPos
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 lines <- {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 _lineIter: self
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 close <- {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 os close: _fd
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 eof? <- { _eof? && _buffered <= 0 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 open <- :filename {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 fromFD: (os open: filename (os O_RDONLY))
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 openWrite <- :filename {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 fromFD: (os open: filename ((os O_WRONLY) or (os O_CREAT) or (os O_TRUNC)) 0x1B6)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 openAppend <- :filename {
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 fromFD: (os open: filename ((os O_RDWR) or (os O_CREAT) or (os O_APPEND)) 0x1B6)
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 stdin <- { _getStdin: }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 stdout <- { _getStdout: }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 stderr <- { _getStderr: }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 }
abe3141caefe Added file module and sample
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 }