io.buffers: cleanup interface a bit.
							parent
							
								
									60d0937041
								
							
						
					
					
						commit
						f79d61060e
					
				|  | @ -2,10 +2,10 @@ | ||||||
| ! See http://factorcode.org/license.txt for BSD license. | ! See http://factorcode.org/license.txt for BSD license. | ||||||
| USING: accessors alien.c-types alien.data alien.syntax | USING: accessors alien.c-types alien.data alien.syntax | ||||||
| classes.struct combinators destructors destructors.private fry | classes.struct combinators destructors destructors.private fry | ||||||
| hints io.backend io.backend.unix.multiplexers io.buffers | io.backend io.backend.unix.multiplexers io.buffers io.files | ||||||
| io.files io.ports io.timeouts kernel kernel.private libc locals | io.ports io.timeouts kernel kernel.private libc locals make math | ||||||
| make math namespaces sequences summary system threads unix | namespaces sequences summary system threads unix unix.ffi | ||||||
| unix.ffi unix.stat unix.types ; | unix.stat unix.types ; | ||||||
| QUALIFIED: io | QUALIFIED: io | ||||||
| IN: io.backend.unix | IN: io.backend.unix | ||||||
| 
 | 
 | ||||||
|  | @ -83,18 +83,21 @@ M: unix wait-for-fd ( handle event -- ) | ||||||
| 
 | 
 | ||||||
| ! Some general stuff | ! Some general stuff | ||||||
| 
 | 
 | ||||||
|  | ERROR: not-a-buffered-port port ; | ||||||
|  | 
 | ||||||
|  | : check-buffered-port ( port -- port ) | ||||||
|  |     dup buffered-port? [ not-a-buffered-port ] unless ; inline | ||||||
|  | 
 | ||||||
| M: fd refill | M: fd refill | ||||||
|     fd>> over buffer>> [ buffer-end ] [ buffer-capacity ] bi read |     [ check-buffered-port buffer>> ] [ fd>> ] bi* | ||||||
|  |     over [ buffer-end ] [ buffer-capacity ] bi read | ||||||
|     { |     { | ||||||
|         { [ dup 0 >= ] [ swap buffer>> n>buffer f ] } |         { [ dup 0 >= ] [ swap buffer+ f ] } | ||||||
|         { [ errno EINTR = ] [ 2drop +retry+ ] } |         { [ errno EINTR = ] [ 2drop +retry+ ] } | ||||||
|         { [ errno EAGAIN = ] [ 2drop +input+ ] } |         { [ errno EAGAIN = ] [ 2drop +input+ ] } | ||||||
|         [ (io-error) ] |         [ (io-error) ] | ||||||
|     } cond ; |     } cond ; | ||||||
| 
 | 
 | ||||||
| HINTS: M\ fd refill |  | ||||||
|     { buffered-port fd } ; |  | ||||||
| 
 |  | ||||||
| M: unix (wait-to-read) ( port -- ) | M: unix (wait-to-read) ( port -- ) | ||||||
|     dup |     dup | ||||||
|     dup handle>> dup check-disposed refill dup |     dup handle>> dup check-disposed refill dup | ||||||
|  | @ -102,11 +105,12 @@ M: unix (wait-to-read) ( port -- ) | ||||||
| 
 | 
 | ||||||
| ! Writers | ! Writers | ||||||
| M: fd drain | M: fd drain | ||||||
|     fd>> over buffer>> [ buffer@ ] [ buffer-length ] bi write |     [ check-buffered-port buffer>> ] [ fd>> ] bi* | ||||||
|  |     over [ buffer@ ] [ buffer-length ] bi write | ||||||
|     { |     { | ||||||
|         { [ dup 0 >= ] [ |         { [ dup 0 >= ] [ | ||||||
|             over buffer>> buffer-consume |             over buffer-consume | ||||||
|             buffer>> buffer-empty? f +output+ ? |             buffer-empty? f +output+ ? | ||||||
|         ] } |         ] } | ||||||
|         { [ errno EINTR = ] [ 2drop +retry+ ] } |         { [ errno EINTR = ] [ 2drop +retry+ ] } | ||||||
|         { [ errno EAGAIN = ] [ 2drop +output+ ] } |         { [ errno EAGAIN = ] [ 2drop +output+ ] } | ||||||
|  | @ -150,7 +154,7 @@ M: stdin dispose* | ||||||
|         errno EINTR = [ buffer stdin size refill-stdin ] [ (io-error) ] if |         errno EINTR = [ buffer stdin size refill-stdin ] [ (io-error) ] if | ||||||
|     ] [ |     ] [ | ||||||
|         size = [ "Error reading stdin pipe" throw ] unless |         size = [ "Error reading stdin pipe" throw ] unless | ||||||
|         size buffer n>buffer |         size buffer buffer+ | ||||||
|     ] if ; |     ] if ; | ||||||
| 
 | 
 | ||||||
| M: stdin refill | M: stdin refill | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| USING: alien byte-arrays destructors help.markup help.syntax | USING: alien byte-arrays destructors help.markup help.syntax | ||||||
| kernel ; | kernel math ; | ||||||
| IN: io.buffers | IN: io.buffers | ||||||
| 
 | 
 | ||||||
| ARTICLE: "buffers" "Locked I/O buffers" | ARTICLE: "buffers" "Locked I/O buffers" | ||||||
|  | @ -29,24 +29,27 @@ $nl | ||||||
|     buffer-peek |     buffer-peek | ||||||
|     buffer-pop |     buffer-pop | ||||||
|     buffer-read |     buffer-read | ||||||
|  |     buffer-read-unsafe | ||||||
|  |     buffer-read-until | ||||||
| } | } | ||||||
| "Writing to the buffer:" | "Writing to the buffer:" | ||||||
| { $subsections | { $subsections | ||||||
|     byte>buffer |     buffer-write1 | ||||||
|     >buffer |     buffer-write | ||||||
|     n>buffer |     buffer+ | ||||||
| } ; | } ; | ||||||
| 
 | 
 | ||||||
| ABOUT: "buffers" | ABOUT: "buffers" | ||||||
| 
 | 
 | ||||||
| HELP: buffer | HELP: buffer | ||||||
| { $class-description "The class of I/O buffers, which resemble FIFO queues, but are optimized for holding bytes, are have underlying storage allocated at a fixed address. Buffers must be de-allocated manually." | { $class-description "The class of I/O buffers, which resemble FIFO queues, but are optimized for holding bytes, are have underlying storage allocated at a fixed address. Buffers must be de-allocated manually. It has the following slots:" | ||||||
| $nl |     { $table | ||||||
| "Buffers have two internal pointers:" |         { { $slot "size" } "The total size, in bytes, of the buffer" } | ||||||
| { $list |         { { $slot "ptr" } { "The " { $link c-ptr } " memory where data is stored" } } | ||||||
|     { { $snippet "fill" } " - the fill pointer, a write index where new data is added" } |         { { $slot "fill" } "The fill pointer, a write index where new data is added" } | ||||||
|     { { $snippet "pos" } " - the position, a read index where data is consumed" } |         { { $slot "pos" } "The position, a read index where data is consumed" } | ||||||
| } } ; |     } | ||||||
|  | } ; | ||||||
| 
 | 
 | ||||||
| HELP: <buffer> | HELP: <buffer> | ||||||
| { $values { "n" "a non-negative integer" } { "buffer" buffer } } | { $values { "n" "a non-negative integer" } { "buffer" buffer } } | ||||||
|  | @ -73,8 +76,8 @@ HELP: buffer-read | ||||||
| { $description "Collects a byte array of " { $snippet "n" } " bytes starting from the buffer's current position, and advances the position accordingly. If there are less than " { $snippet "n" } " bytes available, the output is truncated." } | { $description "Collects a byte array of " { $snippet "n" } " bytes starting from the buffer's current position, and advances the position accordingly. If there are less than " { $snippet "n" } " bytes available, the output is truncated." } | ||||||
| { $examples | { $examples | ||||||
|   { $example |   { $example | ||||||
|     "USING: destructors io.buffers kernel prettyprint ;" |     "USING: alien destructors io.buffers kernel prettyprint ;" | ||||||
|     "5 100 <buffer> [ B{ 7 14 21 } over >buffer buffer-read ] with-disposal ." |     "5 100 <buffer> [ B{ 7 14 21 } binary-object pick buffer-write buffer-read ] with-disposal ." | ||||||
|     "B{ 7 14 21 }" |     "B{ 7 14 21 }" | ||||||
|   } |   } | ||||||
| } ; | } ; | ||||||
|  | @ -84,8 +87,8 @@ HELP: buffer-length | ||||||
| { $description "Outputs the number of unconsumed bytes in the buffer." } | { $description "Outputs the number of unconsumed bytes in the buffer." } | ||||||
| { $examples | { $examples | ||||||
|   { $example |   { $example | ||||||
|     "USING: destructors io.buffers kernel prettyprint ;" |     "USING: alien destructors io.buffers kernel prettyprint ;" | ||||||
|     "100 <buffer> [ B{ 7 14 21 } over >buffer buffer-length ] with-disposal ." |     "100 <buffer> [ B{ 7 14 21 } binary-object pick buffer-write buffer-length ] with-disposal ." | ||||||
|     "3" |     "3" | ||||||
|   } |   } | ||||||
| } ; | } ; | ||||||
|  | @ -105,24 +108,24 @@ HELP: buffer-empty? | ||||||
| { $values { "buffer" buffer } { "?" boolean } } | { $values { "buffer" buffer } { "?" boolean } } | ||||||
| { $description "Tests if the buffer contains no more data to be read or written." } ; | { $description "Tests if the buffer contains no more data to be read or written." } ; | ||||||
| 
 | 
 | ||||||
| HELP: >buffer | HELP: buffer-write | ||||||
| { $values { "byte-array" byte-array } { "buffer" buffer } } | { $values { "c-ptr" c-ptr } { "n" fixnum } { "buffer" buffer } } | ||||||
| { $description "Copies a byte array to the buffer's fill pointer, and advances it accordingly." } | { $description "Copies a " { $link c-ptr } " to the buffer's fill pointer, and advances it accordingly." } | ||||||
| { $warning "This word will corrupt memory if the byte array is larger than the space available in the buffer." } ; | { $warning "This word will corrupt memory if writing more than the space available in the buffer." } ; | ||||||
| 
 | 
 | ||||||
| HELP: byte>buffer | HELP: buffer-write1 | ||||||
| { $values { "byte" "a byte" } { "buffer" buffer } } | { $values { "byte" "a byte" } { "buffer" buffer } } | ||||||
| { $description "Appends a single byte to a buffer." } | { $description "Appends a single byte to a buffer." } | ||||||
| { $warning "This word will corrupt memory if the buffer is full." } | { $warning "This word will corrupt memory if the buffer is full." } | ||||||
| { $examples | { $examples | ||||||
|   { $example |   { $example | ||||||
|     "USING: destructors io.buffers kernel prettyprint ;" |     "USING: destructors io.buffers kernel prettyprint ;" | ||||||
|     "100 <buffer> [ 237 over byte>buffer buffer-pop ] with-disposal ." |     "100 <buffer> [ 237 over buffer-write1 buffer-pop ] with-disposal ." | ||||||
|     "237" |     "237" | ||||||
|   } |   } | ||||||
| } ; | } ; | ||||||
| 
 | 
 | ||||||
| HELP: n>buffer | HELP: buffer+ | ||||||
| { $values { "n" "a non-negative integer" } { "buffer" buffer } } | { $values { "n" "a non-negative integer" } { "buffer" buffer } } | ||||||
| { $description "Advances the fill pointer by " { $snippet "n" } " bytes." } | { $description "Advances the fill pointer by " { $snippet "n" } " bytes." } | ||||||
| { $warning "This word will leave the buffer in an invalid state if it does not have " { $snippet "n" } " bytes available." } ; | { $warning "This word will leave the buffer in an invalid state if it does not have " { $snippet "n" } " bytes available." } ; | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ strings accessors destructors ; | ||||||
| 
 | 
 | ||||||
| [ "hello world" ] [ | [ "hello world" ] [ | ||||||
|     "hello" 1024 <buffer> [ buffer-set ] keep |     "hello" 1024 <buffer> [ buffer-set ] keep | ||||||
|     " world" >byte-array over >buffer |     " world" >byte-array binary-object pick buffer-write | ||||||
|     dup buffer-read-all >string swap dispose |     dup buffer-read-all >string swap dispose | ||||||
| ] unit-test | ] unit-test | ||||||
| 
 | 
 | ||||||
|  | @ -57,9 +57,9 @@ strings accessors destructors ; | ||||||
| "b" get dispose | "b" get dispose | ||||||
| 
 | 
 | ||||||
| 100 <buffer> "b" set | 100 <buffer> "b" set | ||||||
| [ 1000 "b" get n>buffer >string ] must-fail | [ 1000 "b" get buffer+ >string ] must-fail | ||||||
| "b" get dispose | "b" get dispose | ||||||
| 
 | 
 | ||||||
| "hello world" string>buffer "b" set | "hello world" string>buffer "b" set | ||||||
| [ "hello" CHAR: \s ] [ " " "b" get buffer-until [ >string ] dip ] unit-test | [ "hello" CHAR: \s ] [ " " "b" get buffer-read-until [ >string ] dip ] unit-test | ||||||
| "b" get dispose | "b" get dispose | ||||||
|  |  | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| ! Copyright (C) 2004, 2005 Mackenzie Straight. | ! Copyright (C) 2004, 2005 Mackenzie Straight. | ||||||
| ! Copyright (C) 2006, 2010 Slava Pestov. | ! Copyright (C) 2006, 2010 Slava Pestov. | ||||||
| ! See http://factorcode.org/license.txt for BSD license. | ! See http://factorcode.org/license.txt for BSD license. | ||||||
| USING: accessors alien alien.accessors alien.c-types | USING: accessors alien alien.accessors alien.data byte-arrays | ||||||
| alien.data alien.syntax kernel libc math sequences byte-arrays | combinators destructors kernel libc math math.order sequences | ||||||
| strings hints math.order destructors combinators ; | typed ; | ||||||
| IN: io.buffers | IN: io.buffers | ||||||
| 
 | 
 | ||||||
| TUPLE: buffer | TUPLE: buffer | ||||||
|  | @ -18,68 +18,60 @@ disposed ; | ||||||
| 
 | 
 | ||||||
| M: buffer dispose* ptr>> free ; inline | M: buffer dispose* ptr>> free ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-reset ( n buffer -- ) | TYPED: buffer-reset ( n buffer: buffer -- ) | ||||||
|     swap >>fill 0 >>pos drop ; inline |     swap >>fill 0 >>pos drop ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-capacity ( buffer -- n ) | TYPED: buffer-capacity ( buffer: buffer -- n ) | ||||||
|     [ size>> ] [ fill>> ] bi - >fixnum ; inline |     [ size>> ] [ fill>> ] bi - >fixnum ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-empty? ( buffer -- ? ) | TYPED: buffer-empty? ( buffer: buffer -- ? ) | ||||||
|     fill>> zero? ; inline |     fill>> zero? ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-consume ( n buffer -- ) | TYPED: buffer-consume ( n: fixnum buffer: buffer -- ) | ||||||
|     [ + ] change-pos |     [ + ] change-pos | ||||||
|     dup [ pos>> ] [ fill>> ] bi < |     dup [ pos>> ] [ fill>> ] bi < | ||||||
|     [ 0 >>pos 0 >>fill ] unless drop ; inline |     [ 0 >>pos 0 >>fill ] unless drop ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-peek ( buffer -- byte ) | TYPED: buffer-peek ( buffer: buffer -- byte ) | ||||||
|     [ ptr>> ] [ pos>> ] bi alien-unsigned-1 ; inline |     [ ptr>> ] [ pos>> ] bi alien-unsigned-1 ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-pop ( buffer -- byte ) | TYPED: buffer-pop ( buffer: buffer -- byte ) | ||||||
|     [ buffer-peek ] [ 1 swap buffer-consume ] bi ; inline |     [ buffer-peek ] [ 1 swap buffer-consume ] bi ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-length ( buffer -- n ) | TYPED: buffer-length ( buffer: buffer -- n ) | ||||||
|     [ fill>> ] [ pos>> ] bi - >fixnum ; inline |     [ fill>> ] [ pos>> ] bi - >fixnum ; inline | ||||||
| 
 | 
 | ||||||
| : buffer@ ( buffer -- alien ) | TYPED: buffer@ ( buffer: buffer -- alien ) | ||||||
|     [ pos>> ] [ ptr>> ] bi <displaced-alien> ; inline |     [ pos>> ] [ ptr>> ] bi <displaced-alien> ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-read-unsafe ( n buffer -- n ptr ) | TYPED: buffer-read-unsafe ( n: fixnum buffer: buffer -- n ptr ) | ||||||
|     [ buffer-length min ] keep |     [ buffer-length min ] keep | ||||||
|     [ buffer@ ] [ buffer-consume ] 2bi ; inline |     [ buffer@ ] [ buffer-consume ] 2bi ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-read ( n buffer -- byte-array ) | TYPED: buffer-read ( n: fixnum buffer: buffer -- byte-array ) | ||||||
|     buffer-read-unsafe swap memory>byte-array ; |     buffer-read-unsafe swap memory>byte-array ; inline | ||||||
| 
 | 
 | ||||||
| HINTS: buffer-read fixnum buffer ; | TYPED: buffer-end ( buffer: buffer -- alien ) | ||||||
| 
 |  | ||||||
| : buffer-end ( buffer -- alien ) |  | ||||||
|     [ fill>> ] [ ptr>> ] bi <displaced-alien> ; inline |     [ fill>> ] [ ptr>> ] bi <displaced-alien> ; inline | ||||||
| 
 | 
 | ||||||
| : n>buffer ( n buffer -- ) | TYPED: buffer+ ( n buffer: buffer -- ) | ||||||
|     [ + ] change-fill drop ; inline |     [ + ] change-fill drop ; inline | ||||||
| 
 | 
 | ||||||
| HINTS: n>buffer fixnum buffer ; | TYPED: buffer-write ( c-ptr n buffer: buffer -- ) | ||||||
|  |     [ buffer-end -rot memcpy ] [ buffer+ ] 2bi ; inline | ||||||
| 
 | 
 | ||||||
| : >buffer ( byte-array buffer -- ) | TYPED: buffer-write1 ( byte: fixnum buffer: buffer -- ) | ||||||
|     [ buffer-end swap binary-object memcpy ] |  | ||||||
|     [ [ byte-length ] dip n>buffer ] |  | ||||||
|     2bi ; |  | ||||||
| 
 |  | ||||||
| HINTS: >buffer byte-array buffer ; |  | ||||||
| 
 |  | ||||||
| : byte>buffer ( byte buffer -- ) |  | ||||||
|     [ >fixnum ] dip |  | ||||||
|     [ [ ptr>> ] [ fill>> ] bi set-alien-unsigned-1 ] |     [ [ ptr>> ] [ fill>> ] bi set-alien-unsigned-1 ] | ||||||
|     [ 1 swap n>buffer ] |     [ 1 swap buffer+ ] bi ; inline | ||||||
|     bi ; inline |  | ||||||
| 
 | 
 | ||||||
| : search-buffer-until ( pos fill ptr separators -- n ) | <PRIVATE | ||||||
|  | 
 | ||||||
|  | : search-buffer-until ( pos fill ptr seps -- n ) | ||||||
|     [ iota ] 2dip |     [ iota ] 2dip | ||||||
|     [ [ swap alien-unsigned-1 ] dip member-eq? ] 2curry |     [ [ swap alien-unsigned-1 ] dip member-eq? ] 2curry | ||||||
|     find-from drop ; inline |     find-from drop ; inline | ||||||
| 
 | 
 | ||||||
| : finish-buffer-until ( buffer n -- byte-array separator ) | : finish-buffer-until ( buffer n -- byte-array sep/f ) | ||||||
|     [ |     [ | ||||||
|         over pos>> - |         over pos>> - | ||||||
|         over buffer-read |         over buffer-read | ||||||
|  | @ -89,9 +81,9 @@ HINTS: >buffer byte-array buffer ; | ||||||
|         buffer-read f |         buffer-read f | ||||||
|     ] if* ; inline |     ] if* ; inline | ||||||
| 
 | 
 | ||||||
| : buffer-until ( separators buffer -- byte-array separator ) | PRIVATE> | ||||||
|  | 
 | ||||||
|  | TYPED: buffer-read-until ( seps buffer: buffer -- byte-array sep/f ) | ||||||
|     swap [ { [ ] [ pos>> ] [ fill>> ] [ ptr>> ] } cleave ] dip |     swap [ { [ ] [ pos>> ] [ fill>> ] [ ptr>> ] } cleave ] dip | ||||||
|     search-buffer-until |     search-buffer-until | ||||||
|     finish-buffer-until ; |     finish-buffer-until ; | ||||||
| 
 |  | ||||||
| HINTS: buffer-until { string buffer } ; |  | ||||||
|  |  | ||||||
|  | @ -194,7 +194,7 @@ M: object drain ( port handle -- event/f ) | ||||||
|     } cleave ; |     } cleave ; | ||||||
| 
 | 
 | ||||||
| : finish-read ( n port -- ) | : finish-read ( n port -- ) | ||||||
|     [ update-file-ptr ] [ buffer>> n>buffer ] 2bi ; |     [ update-file-ptr ] [ buffer>> buffer+ ] 2bi ; | ||||||
| 
 | 
 | ||||||
| M: object refill ( port handle -- event/f ) | M: object refill ( port handle -- event/f ) | ||||||
|     [ make-FileArgs dup setup-read ReadFile ] |     [ make-FileArgs dup setup-read ReadFile ] | ||||||
|  |  | ||||||
|  | @ -1,10 +1,9 @@ | ||||||
| ! Copyright (C) 2005, 2010 Slava Pestov, Doug Coleman | ! Copyright (C) 2005, 2010 Slava Pestov, Doug Coleman | ||||||
| ! See http://factorcode.org/license.txt for BSD license. | ! See http://factorcode.org/license.txt for BSD license. | ||||||
| USING: accessors alien alien.c-types alien.data byte-arrays | USING: accessors alien byte-arrays combinators destructors hints | ||||||
| combinators destructors fry grouping hints io io.backend | io io.backend io.buffers io.encodings io.files io.timeouts | ||||||
| io.buffers io.encodings io.files io.timeouts kernel | kernel kernel.private libc locals math math.order namespaces | ||||||
| kernel.private libc locals math math.order namespaces sequences | sequences strings system ; | ||||||
| strings system ; |  | ||||||
| IN: io.ports | IN: io.ports | ||||||
| 
 | 
 | ||||||
| SYMBOL: default-buffer-size | SYMBOL: default-buffer-size | ||||||
|  | @ -84,9 +83,11 @@ M:: input-port stream-read-unsafe ( n dst port -- count ) | ||||||
|     ] [ 0 ] if ; |     ] [ 0 ] if ; | ||||||
| 
 | 
 | ||||||
| : read-until-step ( separators port -- string/f separator/f ) | : read-until-step ( separators port -- string/f separator/f ) | ||||||
|     dup wait-to-read [ 2drop f f ] [ buffer>> buffer-until ] if ; |     dup wait-to-read [ 2drop f f ] [ | ||||||
|  |         buffer>> buffer-read-until | ||||||
|  |     ] if ; inline | ||||||
| 
 | 
 | ||||||
| : read-until-loop ( seps port buf -- separator/f ) | : read-until-loop ( seps port accum -- separator/f ) | ||||||
|     2over read-until-step over [ |     2over read-until-step over [ | ||||||
|         [ append! ] dip dup [ |         [ append! ] dip dup [ | ||||||
|             [ 3drop ] dip |             [ 3drop ] dip | ||||||
|  | @ -95,7 +96,7 @@ M:: input-port stream-read-unsafe ( n dst port -- count ) | ||||||
|         ] if |         ] if | ||||||
|     ] [ |     ] [ | ||||||
|         [ 4drop ] dip |         [ 4drop ] dip | ||||||
|     ] if ; |     ] if ; inline recursive | ||||||
| 
 | 
 | ||||||
| M: input-port stream-read-until ( seps port -- str/f sep/f ) | M: input-port stream-read-until ( seps port -- str/f sep/f ) | ||||||
|     2dup read-until-step dup [ [ 2drop ] 2dip ] [ |     2dup read-until-step dup [ [ 2drop ] 2dip ] [ | ||||||
|  | @ -112,29 +113,6 @@ INSTANCE: output-port file-writer | ||||||
| : <output-port> ( handle -- output-port ) | : <output-port> ( handle -- output-port ) | ||||||
|     output-port <buffered-port> ; |     output-port <buffered-port> ; | ||||||
| 
 | 
 | ||||||
| : wait-to-write ( len port -- ) |  | ||||||
|     [ nip ] [ buffer>> buffer-capacity <= ] 2bi |  | ||||||
|     [ drop ] [ stream-flush ] if ; inline |  | ||||||
| 
 |  | ||||||
| M: output-port stream-write1 |  | ||||||
|     dup check-disposed |  | ||||||
|     1 over wait-to-write |  | ||||||
|     buffer>> byte>buffer ; inline |  | ||||||
| 
 |  | ||||||
| : write-in-groups ( byte-array port -- ) |  | ||||||
|     [ binary-object uchar <c-direct-array> ] dip |  | ||||||
|     [ buffer>> size>> <groups> ] [ '[ _ stream-write ] ] bi |  | ||||||
|     each ; inline |  | ||||||
| 
 |  | ||||||
| M: output-port stream-write |  | ||||||
|     dup check-disposed |  | ||||||
|     2dup [ byte-length ] [ buffer>> size>> ] bi* > [ |  | ||||||
|         write-in-groups |  | ||||||
|     ] [ |  | ||||||
|         [ [ byte-length ] dip wait-to-write ] |  | ||||||
|         [ buffer>> >buffer ] 2bi |  | ||||||
|     ] if ; |  | ||||||
| 
 |  | ||||||
| HOOK: (wait-to-write) io-backend ( port -- ) | HOOK: (wait-to-write) io-backend ( port -- ) | ||||||
| 
 | 
 | ||||||
| : port-flush ( port -- ) | : port-flush ( port -- ) | ||||||
|  | @ -144,11 +122,36 @@ HOOK: (wait-to-write) io-backend ( port -- ) | ||||||
| M: output-port stream-flush | M: output-port stream-flush | ||||||
|     [ check-disposed ] [ port-flush ] bi ; |     [ check-disposed ] [ port-flush ] bi ; | ||||||
| 
 | 
 | ||||||
|  | : wait-to-write ( len port -- ) | ||||||
|  |     [ nip ] [ buffer>> buffer-capacity <= ] 2bi | ||||||
|  |     [ drop ] [ port-flush ] if ; inline | ||||||
|  | 
 | ||||||
|  | M: output-port stream-write1 | ||||||
|  |     dup check-disposed | ||||||
|  |     1 over wait-to-write | ||||||
|  |     buffer>> buffer-write1 ; inline | ||||||
|  | 
 | ||||||
|  | :: port-write ( c-ptr n-remaining port -- ) | ||||||
|  |     port buffer>> :> buffer | ||||||
|  |     n-remaining buffer size>> min :> n-write | ||||||
|  | 
 | ||||||
|  |     n-write port wait-to-write | ||||||
|  |     c-ptr n-write buffer buffer-write | ||||||
|  | 
 | ||||||
|  |     n-remaining n-write - dup 0 > [ | ||||||
|  |         n-write c-ptr <displaced-alien> swap port port-write | ||||||
|  |     ] [ drop ] if ; inline recursive | ||||||
|  | 
 | ||||||
|  | M: output-port stream-write | ||||||
|  |     dup check-disposed | ||||||
|  |     [ binary-object ] [ port-write ] bi* ; | ||||||
|  | 
 | ||||||
| HOOK: tell-handle os ( handle -- n ) | HOOK: tell-handle os ( handle -- n ) | ||||||
| 
 | 
 | ||||||
| HOOK: seek-handle os ( n seek-type handle -- ) | HOOK: seek-handle os ( n seek-type handle -- ) | ||||||
| 
 | 
 | ||||||
| HOOK: can-seek-handle? os ( handle -- ? ) | HOOK: can-seek-handle? os ( handle -- ? ) | ||||||
|  | 
 | ||||||
| HOOK: handle-length os ( handle -- n/f ) | HOOK: handle-length os ( handle -- n/f ) | ||||||
| 
 | 
 | ||||||
| M: input-port stream-tell | M: input-port stream-tell | ||||||
|  | @ -164,7 +167,7 @@ M: output-port stream-tell | ||||||
|     ! buffer. |     ! buffer. | ||||||
|     seek-type seek-relative eq? |     seek-type seek-relative eq? | ||||||
|     [ n stream stream-tell + seek-absolute ] [ n seek-type ] if |     [ n stream stream-tell + seek-absolute ] [ n seek-type ] if | ||||||
|     stream ; |     stream ; inline | ||||||
| 
 | 
 | ||||||
| M: input-port stream-seek | M: input-port stream-seek | ||||||
|     do-seek-relative |     do-seek-relative | ||||||
|  | @ -209,8 +212,7 @@ M: port cancel-operation handle>> cancel-operation ; | ||||||
| M: port dispose* | M: port dispose* | ||||||
|     [ |     [ | ||||||
|         [ handle>> &dispose drop ] |         [ handle>> &dispose drop ] | ||||||
|         [ handle>> shutdown ] |         [ handle>> shutdown ] bi | ||||||
|         bi |  | ||||||
|     ] with-destructors ; |     ] with-destructors ; | ||||||
| 
 | 
 | ||||||
| GENERIC: underlying-port ( stream -- port ) | GENERIC: underlying-port ( stream -- port ) | ||||||
|  | @ -236,4 +238,3 @@ HINTS: M\ input-port stream-read-partial-unsafe | ||||||
| HINTS: M\ input-port stream-read-unsafe | HINTS: M\ input-port stream-read-unsafe | ||||||
|     { fixnum byte-array input-port } |     { fixnum byte-array input-port } | ||||||
|     { fixnum string input-port } ; |     { fixnum string input-port } ; | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -228,7 +228,7 @@ SYMBOL: default-secure-context | ||||||
| : do-ssl-read ( buffer ssl -- event/f ) | : do-ssl-read ( buffer ssl -- event/f ) | ||||||
|     2dup swap [ buffer-end ] [ buffer-capacity ] bi SSL_read [ |     2dup swap [ buffer-end ] [ buffer-capacity ] bi SSL_read [ | ||||||
|         { { SSL_ERROR_ZERO_RETURN [ drop f ] } } check-ssl-error |         { { SSL_ERROR_ZERO_RETURN [ drop f ] } } check-ssl-error | ||||||
|     ] keep swap [ 2nip ] [ swap n>buffer f ] if* ; |     ] keep swap [ 2nip ] [ swap buffer+ f ] if* ; | ||||||
| 
 | 
 | ||||||
| M: ssl-handle refill ( port handle -- event/f ) | M: ssl-handle refill ( port handle -- event/f ) | ||||||
|     dup maybe-handshake [ buffer>> ] [ handle>> ] bi* do-ssl-read ; |     dup maybe-handshake [ buffer>> ] [ handle>> ] bi* do-ssl-read ; | ||||||
|  |  | ||||||
|  | @ -39,7 +39,7 @@ TUPLE: crypt-stream handle eof? ; | ||||||
| 
 | 
 | ||||||
| : (refill) ( stream -- err ) | : (refill) ( stream -- err ) | ||||||
|     dup [ crypt-stream-handle ] keep [ buffer@ ] keep buffer-capacity |     dup [ crypt-stream-handle ] keep [ buffer@ ] keep buffer-capacity | ||||||
|     "int" <c-object> dup >r cryptPopData r> *int rot n>buffer ; |     "int" <c-object> dup >r cryptPopData r> *int rot buffer+ ; | ||||||
| 
 | 
 | ||||||
| : refill ( stream -- ) | : refill ( stream -- ) | ||||||
|     dup (refill) check-read swap set-crypt-stream-eof? ; |     dup (refill) check-read swap set-crypt-stream-eof? ; | ||||||
|  | @ -61,13 +61,13 @@ M: crypt-stream stream-read1 ( stream -- ch/f ) | ||||||
|     1 swap stream-read [ first ] [ f ] if* ; |     1 swap stream-read [ first ] [ f ] if* ; | ||||||
| 
 | 
 | ||||||
| : read-until-step ( seps stream -- sep/f ) | : read-until-step ( seps stream -- sep/f ) | ||||||
|     dup refill 2dup buffer-until [ swap % 2nip ] |     dup refill 2dup buffer-read-until [ swap % 2nip ] | ||||||
|     [  |     [  | ||||||
|         % dup crypt-stream-eof? [ 2drop f ] [ read-until-step ] if |         % dup crypt-stream-eof? [ 2drop f ] [ read-until-step ] if | ||||||
|     ] if* ; |     ] if* ; | ||||||
| 
 | 
 | ||||||
| M: crypt-stream stream-read-until ( seps stream -- str/f sep/f ) | M: crypt-stream stream-read-until ( seps stream -- str/f sep/f ) | ||||||
|     2dup buffer-until [ >r 2nip r> ] [ |     2dup buffer-read-until [ >r 2nip r> ] [ | ||||||
|         [ % read-until-step ] "" make f like swap |         [ % read-until-step ] "" make f like swap | ||||||
|     ] if* ; |     ] if* ; | ||||||
|   |   | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue