From c60a3e6e803ed06746c0eefb2355682b0325f8dd Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Thu, 20 Nov 2014 14:40:43 -0800 Subject: [PATCH] io.buffers: adding a buffer-read-into that can take a c-ptr or a sequence. --- basis/io/buffers/buffers-tests.factor | 17 ++++++++++++++--- basis/io/buffers/buffers.factor | 14 +++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/basis/io/buffers/buffers-tests.factor b/basis/io/buffers/buffers-tests.factor index 719448fedd..92d44c9126 100644 --- a/basis/io/buffers/buffers-tests.factor +++ b/basis/io/buffers/buffers-tests.factor @@ -1,7 +1,6 @@ IN: io.buffers.tests -USING: alien alien.c-types alien.data io.buffers kernel -kernel.private libc sequences tools.test namespaces byte-arrays -strings accessors destructors ; +USING: accessors alien alien.data arrays byte-arrays destructors +io.buffers kernel libc namespaces sequences strings tools.test ; : buffer-set ( string buffer -- ) [ ptr>> swap >byte-array binary-object memcpy ] @@ -63,3 +62,15 @@ strings accessors destructors ; "hello world" string>buffer "b" set [ "hello" CHAR: \s ] [ " " "b" get buffer-read-until [ >string ] dip ] unit-test "b" get dispose + +[ 4 B{ 1 2 3 4 0 0 0 0 0 0 } ] [ + 10 + [ B{ 1 2 3 4 } binary-object rot buffer-write ] + [ 10 [ 10 rot buffer-read-into ] keep ] bi +] unit-test + +[ 4 { 1 2 3 4 f f f f f f } ] [ + 10 + [ B{ 1 2 3 4 } binary-object rot buffer-write ] + [ 10 f [ 10 rot buffer-read-into ] keep ] bi +] unit-test diff --git a/basis/io/buffers/buffers.factor b/basis/io/buffers/buffers.factor index 4981e3229a..2854a0abf3 100644 --- a/basis/io/buffers/buffers.factor +++ b/basis/io/buffers/buffers.factor @@ -3,7 +3,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien alien.accessors alien.data byte-arrays combinators destructors kernel libc math math.order sequences -typed ; +sequences.private typed ; IN: io.buffers TUPLE: buffer @@ -51,6 +51,18 @@ TYPED: buffer-read-unsafe ( n: fixnum buffer: buffer -- n ptr ) 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 + TYPED: buffer-end ( buffer: buffer -- alien ) [ fill>> ] [ ptr>> ] bi ; inline