unix ffi i/o copy task works

cvs
Slava Pestov 2005-04-09 04:09:49 +00:00
parent 2382cd7da7
commit 8f1ee76193
3 changed files with 18 additions and 9 deletions

View File

@ -15,7 +15,7 @@ TUPLE: buffer size ptr fill pos ;
"int" "libc" "realloc" [ "ulong" "ulong" ] alien-invoke ;
: imemcpy ( dst src size -- )
"void" "libc" "realloc" [ "ulong" "ulong" "ulong" ] alien-invoke ;
"void" "libc" "memcpy" [ "ulong" "ulong" "ulong" ] alien-invoke ;
C: buffer ( size -- buffer )
2dup set-buffer-size
@ -92,6 +92,11 @@ C: buffer ( size -- buffer )
[ buffer@ <alien> 0 alien-unsigned-1 1 ] keep
buffer-consume ;
: buffer-append ( buffer buffer -- )
#! Append first buffer to second buffer.
2dup buffer-end over buffer-ptr rot buffer-fill imemcpy
>r buffer-fill r> n>buffer ;
: buffer-set ( string buffer -- )
2dup buffer-ptr string>memory
>r string-length r> buffer-reset ;

View File

@ -36,3 +36,10 @@ USING: kernel io-internals test ;
"hello" string>buffer
1 over buffer-consume [ buffer-pop ] keep buffer-free
] unit-test
[ "Hello world" ] [
" world" string>buffer
"Hello" string>buffer
2dup buffer-append
[ buffer-contents ] keep buffer-free swap buffer-free
] unit-test

View File

@ -3,6 +3,10 @@
IN: io-internals
USING: errors generic kernel math sequences strings ;
FORGET: can-read-line?
FORGET: can-read-count?
FORGET: can-write?
: file-mode OCT: 0600 ;
: io-error ( n -- ) 0 < [ errno strerror throw ] when ;
@ -14,10 +18,6 @@ USING: errors generic kernel math sequences strings ;
O_WRONLY O_CREAT bitor O_TRUNC bitor file-mode sys-open
dup io-error ;
FORGET: can-read-line?
FORGET: can-read-count?
FORGET: can-write?
TUPLE: port handle buffer error ;
C: port ( handle buffer -- port )
@ -155,16 +155,13 @@ C: writer ( fd -- writer )
: can-copy? ( from -- ? )
dup eof? [ read-step ] [ drop t ] ifte ;
: copy-from-step ( from to -- )
>r dup buffer-ptr swap buffer-fill r> buffer@ -rot imemcpy ;
: copy-from-task ( from to -- ? )
over can-copy? [
over eof? [
2drop t
] [
over buffer-fill over can-write? [
dupd copy-from-step 0 swap buffer-reset
dupd buffer-append 0 swap buffer-reset
] [
2drop
] ifte f