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 }