1 ! Copyright (C) 2004, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel kernel.private namespaces make io io.encodings sequences
4 math generic threads.private classes io.backend io.files
5 io.encodings.utf8 alien.strings continuations destructors byte-arrays
6 accessors combinators ;
9 TUPLE: c-stream < disposable handle ;
11 : new-c-stream ( handle class -- c-stream )
12 new-disposable swap >>handle ; inline
14 M: c-stream dispose* handle>> fclose ;
16 M: c-stream stream-tell handle>> ftell ;
18 M: c-stream stream-seek
20 { seek-absolute [ 0 ] }
21 { seek-relative [ 1 ] }
26 TUPLE: c-writer < c-stream ;
28 : <c-writer> ( handle -- stream ) c-writer new-c-stream ;
30 M: c-writer stream-element-type drop +byte+ ;
32 M: c-writer stream-write1 dup check-disposed handle>> fputc ;
34 M: c-writer stream-write dup check-disposed handle>> fwrite ;
36 M: c-writer stream-flush dup check-disposed handle>> fflush ;
38 TUPLE: c-reader < c-stream ;
40 : <c-reader> ( handle -- stream ) c-reader new-c-stream ;
42 M: c-reader stream-element-type drop +byte+ ;
44 M: c-reader stream-read dup check-disposed handle>> fread ;
46 M: c-reader stream-read-partial stream-read ;
48 M: c-reader stream-read1 dup check-disposed handle>> fgetc ;
50 : read-until-loop ( stream delim -- ch )
51 over stream-read1 dup [
52 dup pick member-eq? [ 2nip ] [ , read-until-loop ] if
57 M: c-reader stream-read-until
59 [ swap read-until-loop ] B{ } make swap
60 over empty? over not and [ 2drop f f ] when ;
62 M: c-io-backend init-io ;
64 : stdin-handle ( -- alien ) 11 getenv ;
65 : stdout-handle ( -- alien ) 12 getenv ;
66 : stderr-handle ( -- alien ) 61 getenv ;
69 stdin-handle <c-reader>
70 stdout-handle <c-writer>
71 stderr-handle <c-writer>
74 M: c-io-backend init-stdio init-c-stdio ;
76 M: c-io-backend io-multiplex 60 60 * 1000 * 1000 * or (sleep) ;
78 : fopen ( path mode -- alien )
79 [ utf8 string>alien ] bi@ (fopen) ;
81 M: c-io-backend (file-reader)
82 "rb" fopen <c-reader> ;
84 M: c-io-backend (file-writer)
85 "wb" fopen <c-writer> ;
87 M: c-io-backend (file-appender)
88 "ab" fopen <c-writer> ;
91 #! A word which directly calls primitives. It is used to
92 #! print stuff from contexts where the I/O system would
93 #! otherwise not work (tools.deploy.shaker, the I/O
94 #! multiplexer thread).
95 "\n" append >byte-array
97 stdout-handle fflush ;