factor/library/io/stream.factor

67 lines
1.9 KiB
Factor
Raw Normal View History

! Copyright (C) 2003, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: io
USING: errors generic kernel lists math namespaces sequences
strings ;
2005-06-19 18:31:02 -04:00
SYMBOL: stdio
! Stream protocol.
2005-02-14 22:15:02 -05:00
GENERIC: stream-flush ( stream -- )
GENERIC: stream-auto-flush ( stream -- )
GENERIC: stream-readln ( stream -- string )
GENERIC: stream-read ( count stream -- string )
GENERIC: stream-read1 ( stream -- char/f )
2005-02-14 22:15:02 -05:00
GENERIC: stream-write-attr ( string style stream -- )
GENERIC: stream-close ( stream -- )
2005-05-23 20:56:38 -04:00
GENERIC: set-timeout ( timeout stream -- )
2005-02-14 22:15:02 -05:00
: stream-write ( string stream -- )
f swap stream-write-attr ;
2004-07-16 02:26:21 -04:00
2005-02-14 22:15:02 -05:00
: stream-print ( string stream -- )
[ stream-write ] keep
[ "\n" swap stream-write ] keep
stream-auto-flush ;
2005-06-19 18:31:02 -04:00
: (stream-copy) ( in out -- )
4096 pick stream-read [
over stream-write (stream-copy)
] [
2drop
] ifte* ;
: stream-copy ( in out -- )
[ 2dup (stream-copy) ]
[ >r stream-close stream-close r> [ rethrow ] when* ] catch ;
! Think '/dev/null'.
TUPLE: null-stream ;
M: null-stream stream-flush drop ;
M: null-stream stream-auto-flush drop ;
M: null-stream stream-readln drop f ;
M: null-stream stream-read 2drop f ;
M: null-stream stream-read1 drop f ;
M: null-stream stream-write-attr 3drop ;
M: null-stream stream-close drop ;
! Sometimes, we want to have a delegating stream that uses stdio
! words.
TUPLE: wrapper-stream scope ;
2004-12-25 21:28:47 -05:00
C: wrapper-stream ( stream -- stream )
2005-05-03 04:40:13 -04:00
2dup set-delegate [
>r <namespace> [ stdio set ] extend r>
set-wrapper-stream-scope
] keep ;
2005-05-03 04:40:13 -04:00
: with-wrapper ( stream quot -- )
>r wrapper-stream-scope r> bind ;
2005-03-18 19:38:27 -05:00
! Standard actions protocol for presentations output to
! attributed streams.
: <actions> ( path alist -- alist )
#! For each element of the alist, change the value to
#! path " " value
[ uncons >r swap " " r> append3 cons ] map-with ;