unix ffi i/o copy task works
parent
2382cd7da7
commit
8f1ee76193
|
|
@ -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 ;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue