some unix i/o work
parent
7217109e2d
commit
1d60e69aee
|
@ -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 ;
|
||||||
|
|
Loading…
Reference in New Issue