factor/basis/io/buffers/buffers.factor

102 lines
2.9 KiB
Factor
Raw Normal View History

2007-09-20 18:09:08 -04:00
! Copyright (C) 2004, 2005 Mackenzie Straight.
! Copyright (C) 2006, 2010 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2014-11-16 21:54:24 -05:00
USING: accessors alien alien.accessors alien.data byte-arrays
combinators destructors kernel libc math math.order math.private
sequences sequences.private typed ;
IN: io.buffers
2007-09-20 18:09:08 -04:00
2008-06-29 03:17:32 -04:00
TUPLE: buffer
2008-06-29 22:37:57 -04:00
{ size fixnum }
{ ptr alien }
2008-06-29 22:37:57 -04:00
{ fill fixnum }
{ pos fixnum }
2008-06-29 03:17:32 -04:00
disposed ;
2007-09-20 18:09:08 -04:00
: <buffer> ( n -- buffer )
dup malloc 0 0 f buffer boa ; inline
2007-09-20 18:09:08 -04:00
M: buffer dispose* ptr>> free ; inline
2007-09-20 18:09:08 -04:00
TYPED: buffer-reset ( n: fixnum buffer: buffer -- )
swap >>fill 0 >>pos drop ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-capacity ( buffer: buffer -- n )
[ size>> ] [ fill>> ] bi fixnum-fast ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-empty? ( buffer: buffer -- ? )
2008-07-12 02:08:30 -04:00
fill>> zero? ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-consume ( n: fixnum buffer: buffer -- )
[ fixnum+fast ] change-pos
dup [ pos>> ] [ fill>> ] bi <
[ 0 >>pos 0 >>fill ] unless drop ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-peek ( buffer: buffer -- byte )
[ ptr>> ] [ pos>> ] bi alien-unsigned-1 ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-pop ( buffer: buffer -- byte )
[ buffer-peek ] [ 1 swap buffer-consume ] bi ; inline
2007-10-27 14:43:17 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-length ( buffer: buffer -- n )
[ fill>> ] [ pos>> ] bi fixnum-fast ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer@ ( buffer: buffer -- alien )
2009-08-27 05:09:12 -04:00
[ pos>> ] [ ptr>> ] bi <displaced-alien> ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-read-unsafe ( n: fixnum buffer: buffer -- n ptr )
[ buffer-length min ] keep
[ buffer@ ] [ buffer-consume ] 2bi ; inline
2014-11-16 21:54:24 -05:00
TYPED: buffer-read ( n: fixnum buffer: buffer -- byte-array )
buffer-read-unsafe swap memory>byte-array ; inline
TYPED: buffer-read-into ( dst n: fixnum buffer: buffer -- count )
buffer-read-unsafe swap [
pick c-ptr? [
memcpy
] [
-rot swap
[ swap alien-unsigned-1 ]
[ set-nth-unsafe ] bi-curry*
[ bi ] 2curry each-integer
] if
] keep ; inline
2014-11-16 21:54:24 -05:00
TYPED: buffer-end ( buffer: buffer -- alien )
[ fill>> ] [ ptr>> ] bi <displaced-alien> ; inline
TYPED: buffer+ ( n: fixnum buffer: buffer -- )
[ fixnum+fast ] change-fill drop ; inline
2008-06-29 03:17:32 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-write ( c-ptr n buffer: buffer -- )
[ buffer-end -rot memcpy ] [ buffer+ ] 2bi ; inline
2007-09-20 18:09:08 -04:00
2014-11-16 21:54:24 -05:00
TYPED: buffer-write1 ( byte: fixnum buffer: buffer -- )
[ [ ptr>> ] [ fill>> ] bi set-alien-unsigned-1 ]
2014-11-16 21:54:24 -05:00
[ 1 swap buffer+ ] bi ; inline
2014-11-16 21:54:24 -05:00
<PRIVATE
: search-buffer-until ( pos fill ptr seps -- n )
[ iota ] 2dip
[ [ swap alien-unsigned-1 ] dip member-eq? ] 2curry
find-from drop ; inline
2014-11-16 21:54:24 -05:00
: finish-buffer-until ( buffer n -- byte-array sep/f )
[
over pos>> -
over buffer-read
swap buffer-pop
] [
2008-06-12 06:13:42 -04:00
[ buffer-length ] keep
buffer-read f
] if* ; inline
2014-11-16 21:54:24 -05:00
PRIVATE>
TYPED: buffer-read-until ( seps buffer: buffer -- byte-array sep/f )
swap [ { [ ] [ pos>> ] [ fill>> ] [ ptr>> ] } cleave ] dip
search-buffer-until
finish-buffer-until ;