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 ;
|
"int" "libc" "realloc" [ "ulong" "ulong" ] alien-invoke ;
|
||||||
|
|
||||||
: imemcpy ( dst src size -- )
|
: imemcpy ( dst src size -- )
|
||||||
"void" "libc" "realloc" [ "ulong" "ulong" "ulong" ] alien-invoke ;
|
"void" "libc" "memcpy" [ "ulong" "ulong" "ulong" ] alien-invoke ;
|
||||||
|
|
||||||
C: buffer ( size -- buffer )
|
C: buffer ( size -- buffer )
|
||||||
2dup set-buffer-size
|
2dup set-buffer-size
|
||||||
|
|
@ -92,6 +92,11 @@ C: buffer ( size -- buffer )
|
||||||
[ buffer@ <alien> 0 alien-unsigned-1 1 ] keep
|
[ buffer@ <alien> 0 alien-unsigned-1 1 ] keep
|
||||||
buffer-consume ;
|
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 -- )
|
: buffer-set ( string buffer -- )
|
||||||
2dup buffer-ptr string>memory
|
2dup buffer-ptr string>memory
|
||||||
>r string-length r> buffer-reset ;
|
>r string-length r> buffer-reset ;
|
||||||
|
|
|
||||||
|
|
@ -36,3 +36,10 @@ USING: kernel io-internals test ;
|
||||||
"hello" string>buffer
|
"hello" string>buffer
|
||||||
1 over buffer-consume [ buffer-pop ] keep buffer-free
|
1 over buffer-consume [ buffer-pop ] keep buffer-free
|
||||||
] unit-test
|
] 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
|
IN: io-internals
|
||||||
USING: errors generic kernel math sequences strings ;
|
USING: errors generic kernel math sequences strings ;
|
||||||
|
|
||||||
|
FORGET: can-read-line?
|
||||||
|
FORGET: can-read-count?
|
||||||
|
FORGET: can-write?
|
||||||
|
|
||||||
: file-mode OCT: 0600 ;
|
: file-mode OCT: 0600 ;
|
||||||
|
|
||||||
: io-error ( n -- ) 0 < [ errno strerror throw ] when ;
|
: 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
|
O_WRONLY O_CREAT bitor O_TRUNC bitor file-mode sys-open
|
||||||
dup io-error ;
|
dup io-error ;
|
||||||
|
|
||||||
FORGET: can-read-line?
|
|
||||||
FORGET: can-read-count?
|
|
||||||
FORGET: can-write?
|
|
||||||
|
|
||||||
TUPLE: port handle buffer error ;
|
TUPLE: port handle buffer error ;
|
||||||
|
|
||||||
C: port ( handle buffer -- port )
|
C: port ( handle buffer -- port )
|
||||||
|
|
@ -155,16 +155,13 @@ C: writer ( fd -- writer )
|
||||||
: can-copy? ( from -- ? )
|
: can-copy? ( from -- ? )
|
||||||
dup eof? [ read-step ] [ drop t ] ifte ;
|
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 -- ? )
|
: copy-from-task ( from to -- ? )
|
||||||
over can-copy? [
|
over can-copy? [
|
||||||
over eof? [
|
over eof? [
|
||||||
2drop t
|
2drop t
|
||||||
] [
|
] [
|
||||||
over buffer-fill over can-write? [
|
over buffer-fill over can-write? [
|
||||||
dupd copy-from-step 0 swap buffer-reset
|
dupd buffer-append 0 swap buffer-reset
|
||||||
] [
|
] [
|
||||||
2drop
|
2drop
|
||||||
] ifte f
|
] ifte f
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue