2006-01-16 02:48:15 -05:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2006-01-13 20:13:14 -05:00
|
|
|
IN: io
|
2006-04-28 00:03:10 -04:00
|
|
|
USING: errors kernel ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
2006-04-28 00:03:10 -04:00
|
|
|
! We ensure that the stream can only be closed once, to preserve
|
|
|
|
! integrity of duplex I/O ports.
|
|
|
|
|
|
|
|
TUPLE: duplex-stream in out closed? ;
|
|
|
|
|
|
|
|
C: duplex-stream ( in out -- stream )
|
|
|
|
[ set-duplex-stream-out ] keep
|
|
|
|
[ set-duplex-stream-in ] keep ;
|
|
|
|
|
2006-08-01 04:45:05 -04:00
|
|
|
TUPLE: check-closed ;
|
2006-08-16 21:55:53 -04:00
|
|
|
|
|
|
|
: check-closed ( stream -- )
|
2006-08-01 04:45:05 -04:00
|
|
|
duplex-stream-closed? [ <check-closed> throw ] when ;
|
2006-04-28 00:03:10 -04:00
|
|
|
|
|
|
|
: duplex-stream-in+ ( duplex -- stream )
|
|
|
|
dup check-closed duplex-stream-in ;
|
|
|
|
|
|
|
|
: duplex-stream-out+ ( duplex -- stream )
|
|
|
|
dup check-closed duplex-stream-out ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
|
|
|
M: duplex-stream stream-flush
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-out+ stream-flush ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
|
|
|
M: duplex-stream stream-readln
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-in+ stream-readln ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
2005-07-17 14:48:55 -04:00
|
|
|
M: duplex-stream stream-read1
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-in+ stream-read1 ;
|
2005-07-17 14:48:55 -04:00
|
|
|
|
2005-06-19 18:31:02 -04:00
|
|
|
M: duplex-stream stream-read
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-in+ stream-read ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
2005-07-17 14:48:55 -04:00
|
|
|
M: duplex-stream stream-write1
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-out+ stream-write1 ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
2005-12-16 21:12:35 -05:00
|
|
|
M: duplex-stream stream-write
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-out+ stream-write ;
|
2005-12-16 21:12:35 -05:00
|
|
|
|
|
|
|
M: duplex-stream stream-terpri
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-out+ stream-terpri ;
|
2005-12-16 21:12:35 -05:00
|
|
|
|
2005-07-21 21:43:37 -04:00
|
|
|
M: duplex-stream stream-format
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-out+ stream-format ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
2006-06-20 18:31:48 -04:00
|
|
|
M: duplex-stream with-stream-style
|
|
|
|
duplex-stream-out+ with-stream-style ;
|
|
|
|
|
2005-12-16 21:12:35 -05:00
|
|
|
M: duplex-stream with-nested-stream
|
2006-04-28 00:03:10 -04:00
|
|
|
duplex-stream-out+ with-nested-stream ;
|
2005-12-16 21:12:35 -05:00
|
|
|
|
2006-06-07 23:04:37 -04:00
|
|
|
M: duplex-stream with-stream-table
|
|
|
|
duplex-stream-out+ with-stream-table ;
|
|
|
|
|
2005-06-19 18:31:02 -04:00
|
|
|
M: duplex-stream stream-close
|
2005-06-23 22:35:41 -04:00
|
|
|
#! The output stream is closed first, in case both streams
|
|
|
|
#! are attached to the same file descriptor, the output
|
|
|
|
#! buffer needs to be flushed before we close the fd.
|
2006-04-28 00:03:10 -04:00
|
|
|
dup duplex-stream-closed? [
|
|
|
|
t over set-duplex-stream-closed?
|
2006-08-04 00:24:20 -04:00
|
|
|
dup duplex-stream-out stream-close
|
|
|
|
dup duplex-stream-in stream-close
|
|
|
|
] unless drop ;
|
2005-06-19 18:31:02 -04:00
|
|
|
|
|
|
|
M: duplex-stream set-timeout
|
|
|
|
2dup
|
|
|
|
duplex-stream-in set-timeout
|
|
|
|
duplex-stream-out set-timeout ;
|