io.streams.c: faster M\ c-reader stream-read-until.

db4
John Benediktsson 2014-11-16 07:07:41 -08:00
parent 0d9316f4f9
commit 86cff7b921
1 changed files with 16 additions and 12 deletions

View File

@ -1,8 +1,8 @@
! Copyright (C) 2004, 2010 Slava Pestov. ! Copyright (C) 2004, 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.strings byte-arrays destructors io USING: accessors alien alien.strings byte-arrays byte-vectors
io.backend io.encodings.utf8 io.files kernel kernel.private destructors io io.backend io.encodings.utf8 io.files kernel
make math sequences threads.private ; kernel.private math sequences threads.private ;
IN: io.streams.c IN: io.streams.c
TUPLE: c-stream < disposable handle ; TUPLE: c-stream < disposable handle ;
@ -18,7 +18,8 @@ INSTANCE: c-writer file-writer
: <c-writer> ( handle -- stream ) c-writer new-c-stream ; : <c-writer> ( handle -- stream ) c-writer new-c-stream ;
M: c-writer stream-write1 dup check-disposed handle>> fputc ; M: c-writer stream-write1
dup check-disposed handle>> fputc ;
M: c-writer stream-write M: c-writer stream-write
dup check-disposed dup check-disposed
@ -32,20 +33,23 @@ INSTANCE: c-reader file-reader
: <c-reader> ( handle -- stream ) c-reader new-c-stream ; : <c-reader> ( handle -- stream ) c-reader new-c-stream ;
M: c-reader stream-read-unsafe dup check-disposed handle>> fread-unsafe ; M: c-reader stream-read-unsafe
dup check-disposed handle>> fread-unsafe ;
M: c-reader stream-read1 dup check-disposed handle>> fgetc ; M: c-reader stream-read1
dup check-disposed handle>> fgetc ;
: read-until-loop ( stream delim -- ch ) : read-until-loop ( handle seps accum -- accum ch )
over stream-read1 dup [ pick fgetc dup [
dup pick member-eq? [ 2nip ] [ , read-until-loop ] if pick dupd member-eq?
[ [ 2drop ] 2dip ] [ over push read-until-loop ] if
] [ ] [
2nip [ 2drop ] 2dip
] if ; inline recursive ] if ; inline recursive
M: c-reader stream-read-until M: c-reader stream-read-until
dup check-disposed dup check-disposed handle>> swap
[ swap read-until-loop ] B{ } make swap 32 <byte-vector> read-until-loop [ B{ } like ] dip
over empty? over not and [ 2drop f f ] when ; over empty? over not and [ 2drop f f ] when ;
M: c-io-backend init-io ; M: c-io-backend init-io ;