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