some unix i/o work

cvs
Slava Pestov 2005-04-12 22:31:50 +00:00
parent 7217109e2d
commit 1d60e69aee
1 changed files with 52 additions and 1 deletions

View File

@ -1,12 +1,18 @@
! Copyright (C) 2005 Slava Pestov. ! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license. ! See http://factor.sf.net/license.txt for BSD license.
IN: io-internals IN: io-internals
USING: errors generic kernel math sequences strings ; USING: errors generic kernel lists math namespaces sequences
strings vectors ;
FORGET: can-read-line? FORGET: can-read-line?
FORGET: can-read-count? FORGET: can-read-count?
FORGET: can-write? FORGET: can-write?
TUPLE: io-task port callback ;
GENERIC: do-io-task ( task -- ? )
SYMBOL: io-tasks
: file-mode OCT: 0600 ; : file-mode OCT: 0600 ;
: io-error ( n -- ) 0 < [ errno strerror throw ] when ; : io-error ( n -- ) 0 < [ errno strerror throw ] when ;
@ -80,6 +86,18 @@ C: reader ( handle -- reader )
: eof? ( buffer -- ? ) buffer-fill 0 = ; : eof? ( buffer -- ? ) buffer-fill 0 = ;
TUPLE: read-line-task ;
C: read-line-task ( port callback -- task )
[ >r <io-task> r> set-delegate ] keep ;
M: read-line-task do-io-task
io-task-port dup refill dup eof? [
reader-eof t
] [
read-line-step
] ifte ;
: read-count-step ( count reader -- ? ) : read-count-step ( count reader -- ? )
dup reader-line -rot >r over length - r> dup reader-line -rot >r over length - r>
2dup buffer-fill <= [ 2dup buffer-fill <= [
@ -96,6 +114,18 @@ C: reader ( handle -- reader )
2dup init-reader read-count-step 2dup init-reader read-count-step
] ifte ; ] ifte ;
TUPLE: read-task count ;
C: read-task ( port callback -- task )
[ >r <io-task> r> set-delegate ] keep ;
M: read-task do-io-task
dup refill dup eof? [
nip reader-eof t
] [
read-count-step
] ifte ;
: pop-line ( reader -- str ) : pop-line ( reader -- str )
dup reader-line dup [ sbuf>string ] when >r dup reader-line dup [ sbuf>string ] when >r
f over set-reader-line f over set-reader-line
@ -127,6 +157,18 @@ C: writer ( fd -- writer )
[ buffer-fill + ] keep buffer-capacity <= [ buffer-fill + ] keep buffer-capacity <=
] ifte ; ] ifte ;
TUPLE: write-task ;
C: write-task ( port callback -- task )
[ >r <io-task> r> set-delegate ] keep ;
M: write-task do-io-task
dup buffer-length 0 = over port-error or [
0 swap buffer-reset t
] [
>port< write-step
] ifte ;
: write-fin ( str writer -- ) : write-fin ( str writer -- )
dup pending-error dup pending-error
>r dup string? [ ch>string ] unless r> >buffer ; >r dup string? [ ch>string ] unless r> >buffer ;
@ -148,3 +190,12 @@ C: writer ( fd -- writer )
] [ ] [
2drop f 2drop f
] ifte ; ] ifte ;
: cons-nth ( elt n seq -- )
[ nth cons ] 2keep set-nth ;
: add-io-task ( task -- )
dup io-task-port port-handle io-tasks get cons-nth ;
: init-io ( -- )
global [ 100 <vector> io-tasks set ] bind ;