@@ -2,6 +2,7 @@ package sink
2
2
3
3
import (
4
4
"bufio"
5
+ "bytes"
5
6
"fmt"
6
7
"io"
7
8
"os"
@@ -18,14 +19,13 @@ var sinkMetaKey = rt.StringValue("hshsink")
18
19
// A sink is a structure that has input and/or output to/from
19
20
// a desination.
20
21
type Sink struct {
21
- writer * bufio.Writer
22
- reader * bufio.Reader
22
+ rw * bufio.ReadWriter
23
23
file * os.File
24
24
UserData * rt.UserData
25
25
autoFlush bool
26
26
}
27
27
28
- func SetupSinkType (rtm * rt.Runtime ) {
28
+ func Loader (rtm * rt.Runtime ) * rt. Table {
29
29
sinkMeta := rt .NewTable ()
30
30
31
31
sinkMethods := rt .NewTable ()
@@ -65,9 +65,24 @@ func SetupSinkType(rtm *rt.Runtime) {
65
65
66
66
sinkMeta .Set (rt .StringValue ("__index" ), rt .FunctionValue (rt .NewGoFunction (sinkIndex , "__index" , 2 , false )))
67
67
rtm .SetRegistry (sinkMetaKey , rt .TableValue (sinkMeta ))
68
+
69
+ exports := map [string ]util.LuaExport {
70
+ "new" : {luaSinkNew , 0 , false },
71
+ }
72
+
73
+ mod := rt .NewTable ()
74
+ util .SetExports (rtm , mod , exports )
75
+
76
+ return mod
68
77
}
69
78
70
79
80
+ func luaSinkNew (t * rt.Thread , c * rt.GoCont ) (rt.Cont , error ) {
81
+ snk := NewSink (t .Runtime , new (bytes.Buffer ))
82
+
83
+ return c .PushingNext1 (t .Runtime , rt .UserDataValue (snk .UserData )), nil
84
+ }
85
+
71
86
// #member
72
87
// readAll() -> string
73
88
// --- @returns string
@@ -84,7 +99,7 @@ func luaSinkReadAll(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
84
99
85
100
lines := []string {}
86
101
for {
87
- line , err := s .reader .ReadString ('\n' )
102
+ line , err := s .rw .ReadString ('\n' )
88
103
if err != nil {
89
104
if err == io .EOF {
90
105
break
@@ -113,7 +128,7 @@ func luaSinkRead(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
113
128
return nil , err
114
129
}
115
130
116
- str , _ := s .reader .ReadString ('\n' )
131
+ str , _ := s .rw .ReadString ('\n' )
117
132
118
133
return c .PushingNext1 (t .Runtime , rt .StringValue (str )), nil
119
134
}
@@ -135,9 +150,9 @@ func luaSinkWrite(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
135
150
return nil , err
136
151
}
137
152
138
- s .writer .Write ([]byte (data ))
153
+ s .rw .Write ([]byte (data ))
139
154
if s .autoFlush {
140
- s .writer .Flush ()
155
+ s .rw .Flush ()
141
156
}
142
157
143
158
return c .Next (), nil
@@ -160,9 +175,9 @@ func luaSinkWriteln(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
160
175
return nil , err
161
176
}
162
177
163
- s .writer .Write ([]byte (data + "\n " ))
178
+ s .rw .Write ([]byte (data + "\n " ))
164
179
if s .autoFlush {
165
- s .writer .Flush ()
180
+ s .rw .Flush ()
166
181
}
167
182
168
183
return c .Next (), nil
@@ -181,7 +196,7 @@ func luaSinkFlush(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
181
196
return nil , err
182
197
}
183
198
184
- s .writer .Flush ()
199
+ s .rw .Flush ()
185
200
186
201
return c .Next (), nil
187
202
}
@@ -212,9 +227,22 @@ func luaSinkAutoFlush(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
212
227
return c .Next (), nil
213
228
}
214
229
230
+ func NewSink (rtm * rt.Runtime , rw io.ReadWriter ) * Sink {
231
+ s := & Sink {
232
+ rw : bufio .NewReadWriter (bufio .NewReader (rw ), bufio .NewWriter (rw )),
233
+ }
234
+ s .UserData = sinkUserData (rtm , s )
235
+
236
+ if f , ok := rw .(* os.File ); ok {
237
+ s .file = f
238
+ }
239
+
240
+ return s
241
+ }
242
+
215
243
func NewSinkInput (rtm * rt.Runtime , r io.Reader ) * Sink {
216
244
s := & Sink {
217
- reader : bufio .NewReader (r ),
245
+ rw : bufio .NewReadWriter ( bufio . NewReader (r ), nil ),
218
246
}
219
247
s .UserData = sinkUserData (rtm , s )
220
248
@@ -227,7 +255,7 @@ func NewSinkInput(rtm *rt.Runtime, r io.Reader) *Sink {
227
255
228
256
func NewSinkOutput (rtm * rt.Runtime , w io.Writer ) * Sink {
229
257
s := & Sink {
230
- writer : bufio .NewWriter (w ),
258
+ rw : bufio .NewReadWriter ( nil , bufio . NewWriter (w ) ),
231
259
autoFlush : true ,
232
260
}
233
261
s .UserData = sinkUserData (rtm , s )
0 commit comments