:: read-loop ( dst n-remaining port n-read -- n-total )
n-remaining port read-step :> ( n-buffered ptr )
ptr [
- dst ptr n-buffered memcpy
+ n-read dst <displaced-alien> ptr n-buffered memcpy
n-remaining n-buffered fixnum-fast :> n-remaining'
n-read n-buffered fixnum+fast :> n-read'
- n-buffered dst <displaced-alien> :> dst'
- dst' n-remaining' port n-read' read-loop
+ dst n-remaining' port n-read' read-loop
] [ n-read ] if ; inline recursive
PRIVATE>
<PRIVATE
-:: port-write ( c-ptr n-remaining port -- )
+:: port-write ( src n-remaining port n-write -- )
port buffer>> :> buffer
- n-remaining buffer size>> min :> n-write
+ n-remaining buffer size>> min :> n-chunk
- n-write port wait-to-write
- c-ptr n-write buffer buffer-write
+ n-chunk port wait-to-write
+ n-write src >c-ptr <displaced-alien> n-chunk buffer buffer-write
- n-remaining n-write fixnum-fast dup 0 > [
- n-write c-ptr <displaced-alien> swap port port-write
+ n-remaining n-chunk fixnum-fast dup 0 > [
+ src swap port n-write n-chunk fixnum+fast port-write
] [ drop ] if ; inline recursive
PRIVATE>
M: output-port stream-write
- check-disposed [
- binary-object
- [ c-ptr check-instance ] [ integer>fixnum-strict ] bi*
- ] [ port-write ] bi* ;
+ [ dup byte-length integer>fixnum-strict ] dip check-disposed 0 port-write ;
HOOK: tell-handle os ( handle -- n )