1 !:folding=indent:collapseFolds=1:
5 ! Copyright (C) 2003, 2004 Slava Pestov.
7 ! Redistribution and use in source and binary forms, with or without
8 ! modification, are permitted provided that the following conditions are met:
10 ! 1. Redistributions of source code must retain the above copyright notice,
11 ! this list of conditions and the following disclaimer.
13 ! 2. Redistributions in binary form must reproduce the above copyright notice,
14 ! this list of conditions and the following disclaimer in the documentation
15 ! and/or other materials provided with the distribution.
17 ! THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 ! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19 ! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 ! DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 ! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 ! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 : fcopy ( from to -- )
39 ! Copy the contents of the byte-stream 'from' to the byte-stream 'to'.
40 [ [ "in" get ] bind ] dip
42 [ "java.io.InputStream" "java.io.OutputStream" ]
43 "factor.FactorLib" "copy" jinvoke-static ;
45 ! These are in separate words so that they can be compiled.
46 ! Do not call them directly.
48 : <byte-stream>/freadln ( -- string )
50 [ "java.io.InputStream" ] "factor.FactorLib" "readLine"
53 : <byte-stream>/fread# ( count -- string )
55 [ "int" "java.io.InputStream" ]
56 "factor.FactorLib" "readCount"
59 : <byte-stream>/fwrite ( string -- )
62 [ "int" ] "java.io.OutputStream" "write" jinvoke
66 [ [ "byte" ] ] "java.io.OutputStream" "write" jinvoke
69 : <byte-stream>/fflush ( -- )
70 "out" get [ ] "java.io.OutputStream" "flush" jinvoke ;
72 : <byte-stream>/fclose ( -- )
73 "in" get [ [ ] "java.io.InputStream" "close" jinvoke ] when*
74 "out" get [ [ ] "java.io.OutputStream" "close" jinvoke ] when* ;
77 [ "java.io.InputStream" ] "java.io.BufferedInputStream" jnew ;
79 : <bout> ( out -- out )
80 [ "java.io.OutputStream" ] "java.io.BufferedOutputStream" jnew ;
82 : <byte-stream> ( in out -- stream )
83 #! Creates a new stream for reading from the
84 #! java.io.InputStream in, and writing to the
85 #! java.io.OutputStream out. The streams are wrapped in
91 [ <byte-stream>/freadln ] "freadln" set
93 [ <byte-stream>/fread# ] "fread#" set
95 [ <byte-stream>/fwrite ] "fwrite" set
97 [ <byte-stream>/fflush ] "fflush" set
99 [ <byte-stream>/fclose ] "fclose" set
102 : <char-stream>/freadln ( -- string )
103 "in" get [ ] "java.io.BufferedReader" "readLine"
106 : <char-stream>/fread# ( -- string )
108 [ "int" "java.io.Reader" ]
109 "factor.FactorLib" "readCount"
112 : <char-stream>/fwrite ( string -- )
113 "out" get [ "java.lang.String" ] "java.io.Writer" "write"
116 : <char-stream>/fflush ( -- )
117 "out" get [ ] "java.io.Writer" "flush" jinvoke ;
119 : <char-stream>/fclose ( -- )
120 "in" get [ [ ] "java.io.Reader" "close" jinvoke ] when*
121 "out" get [ [ ] "java.io.Writer" "close" jinvoke ] when* ;
123 : <char-stream> ( in out -- stream )
124 #! Creates a new stream for reading from the
125 #! java.io.BufferedReader in, and writing to the
126 #! java.io.Reader out.
131 [ <char-stream>/freadln ] "freadln" set
133 [ <char-stream>/fread# ] "fread#" set
135 [ <char-stream>/fwrite ] "fwrite" set
137 [ <char-stream>/fflush ] "fflush" set
139 [ <char-stream>/fclose ] "fclose" set
142 : <string-output-stream> ( size -- stream )
143 #! Creates a new stream for writing to a string buffer.
147 [ "buf" get sbuf-append ] "fwrite" set
150 : stream>str ( stream -- string )
151 #! Returns the string written to the given string output
153 [ "buf" get ] bind >str ;
155 : <bwriter> ( writer -- bwriter )
156 [ "java.io.Writer" ] "java.io.BufferedWriter" jnew ;
158 : <owriter> ( outputstream -- owriter )
159 [ "java.io.OutputStream" ] "java.io.OutputStreamWriter" jnew ;
161 : <filecr> ( path -- stream )
162 [ "java.lang.String" ] "java.io.FileReader" jnew <breader>
166 : <filecw> ( path -- stream )
167 [ "java.lang.String" ] "java.io.FileWriter" jnew <bwriter>
171 : <filebr> ( path -- stream )
172 [ "java.lang.String" ] "java.io.FileInputStream" jnew
176 : <filebw> ( path -- stream )
177 [ "java.lang.String" ] "java.io.FileOutputStream" jnew
181 : <file> ( path -- file )
182 dup "java.io.File" is not [
183 [ "java.lang.String" ] "java.io.File" jnew
186 : fdelete ( file -- ? )
188 <file> [ ] "java.io.File" "delete" jinvoke ;
190 : <freader> ( file -- freader )
191 [ "java.lang.String" ] "java.io.FileReader" jnew <breader> ;
193 : exists? ( file -- boolean )
194 <file> [ ] "java.io.File" "exists" jinvoke ;
196 : directory? ( file -- boolean )
197 <file> [ ] "java.io.File" "isDirectory" jinvoke ;
199 : directory ( file -- listing )
200 <file> [ ] "java.io.File" "list" jinvoke array>list str-sort ;
202 : frename ( from to -- ? )
203 ! Rename file 'from' to 'to'. These can be paths or
204 ! java.io.File instances.
206 [ "java.io.File" ] "java.io.File" "renameTo"
209 : file-extension ( filename -- extension )
212 : <sreader> ( string -- reader )
213 [ "java.lang.String" ] "java.io.StringReader" jnew ;
215 : close ( stream -- )
216 dup "java.io.Reader" is [
217 [ ] "java.io.Reader" "close" jinvoke
219 [ ] "java.io.Writer" "close" jinvoke
222 : <server> ( port -- stream )
223 #! Starts listening on localhost:port. Returns a stream that
224 #! you can close with fclose. No other stream operations are
226 [ "int" ] "java.net.ServerSocket" jnew
232 "socket" get [ ] "java.net.ServerSocket" "close" jinvoke
236 : <socket-stream> ( socket -- stream )
237 #! Wraps a socket inside a byte-stream.
239 [ [ ] "java.net.Socket" "getInputStream" jinvoke ]
240 [ [ ] "java.net.Socket" "getOutputStream" jinvoke ]
245 ! We "extend" byte-stream's fclose.
248 "socket" get [ ] "java.net.Socket" "close" jinvoke
249 ] append "fclose" set
252 : <client> ( server port -- stream )
253 #! Open a TCP/IP socket to a port on the given server.
254 [ "java.lang.String" "int" ] "java.net.Socket" jnew
257 : accept ( server -- client )
258 #! Accept a connection from a server socket.
259 [ "socket" get ] bind
260 [ ] "java.net.ServerSocket" "accept" jinvoke <socket-stream> ;