1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 11:50:28 +02:00

Add get-bytevector-some!.

* libguile/r6rs-ports.c (scm_get_bytevector_some_x): New procedure.
* libguile/r6rs-ports.h (scm_get_bytevector_some_x): Add prototype.
(scm_unget_bytevector): Move prototype next to 'scm_get_bytevector_some_x'.
* module/ice-9/binary-ports.scm: Export 'get-bytevector-some!'.
* doc/ref/api-io.texi (Binary I/O): Document it.
This commit is contained in:
Mark H Weaver 2019-04-16 23:13:06 -04:00
parent a23ee74fab
commit cc73c2ab5d
4 changed files with 58 additions and 3 deletions

View file

@ -1,7 +1,7 @@
@c -*-texinfo-*- @c -*-texinfo-*-
@c This is part of the GNU Guile Reference Manual. @c This is part of the GNU Guile Reference Manual.
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007, 2009, @c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007, 2009,
@c 2010, 2011, 2013, 2016 Free Software Foundation, Inc. @c 2010, 2011, 2013, 2016, 2019 Free Software Foundation, Inc.
@c See the file guile.texi for copying conditions. @c See the file guile.texi for copying conditions.
@node Input and Output @node Input and Output
@ -194,6 +194,14 @@ new bytevector containing some of the available bytes (at least one),
and update the port position to point just past these bytes. and update the port position to point just past these bytes.
@end deffn @end deffn
@deffn {Scheme Procedure} get-bytevector-some! port bv start count
@deffnx {C Function} scm_get_bytevector_some_x (port, bv, start, count)
Read up to @var{count} bytes from @var{port}, blocking as necessary
until at least one byte is available or an end-of-file is reached.
Store them in @var{bv} starting at index @var{start}. Return the number
of bytes actually read, or an end-of-file object.
@end deffn
@deffn {Scheme Procedure} get-bytevector-all port @deffn {Scheme Procedure} get-bytevector-all port
@deffnx {C Function} scm_get_bytevector_all (port) @deffnx {C Function} scm_get_bytevector_all (port)
Read from @var{port}, blocking as necessary, until the end-of-file is Read from @var{port}, blocking as necessary, until the end-of-file is

View file

@ -514,6 +514,49 @@ SCM_DEFINE (scm_get_bytevector_some, "get-bytevector-some", 1, 0, 0,
} }
#undef FUNC_NAME #undef FUNC_NAME
SCM_DEFINE (scm_get_bytevector_some_x, "get-bytevector-some!", 4, 0, 0,
(SCM port, SCM bv, SCM start, SCM count),
"Read up to @var{count} bytes from @var{port}, blocking "
"as necessary until at least one byte is available or an "
"end-of-file is reached. Store them in @var{bv} starting "
"at index @var{start}. Return the number of bytes actually "
"read, or an end-of-file object.")
#define FUNC_NAME s_scm_get_bytevector_some_x
{
SCM buf;
size_t c_start, c_count, c_len;
size_t cur, avail, transfer_size;
SCM_VALIDATE_BINARY_INPUT_PORT (1, port);
SCM_VALIDATE_BYTEVECTOR (2, bv);
c_start = scm_to_size_t (start);
c_count = scm_to_size_t (count);
c_len = SCM_BYTEVECTOR_LENGTH (bv);
if (SCM_UNLIKELY (c_len < c_start
|| c_len - c_start < c_count))
scm_out_of_range (FUNC_NAME, count);
if (c_count == 0)
return SCM_INUM0;
buf = scm_fill_input (port, 0, &cur, &avail);
if (avail == 0)
{
scm_port_buffer_set_has_eof_p (buf, SCM_BOOL_F);
return SCM_EOF_VAL;
}
transfer_size = min (avail, c_count);
scm_port_buffer_take (buf,
(scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (bv) + c_start,
transfer_size, cur, avail);
return scm_from_size_t (transfer_size);
}
#undef FUNC_NAME
SCM_DEFINE (scm_get_bytevector_all, "get-bytevector-all", 1, 0, 0, SCM_DEFINE (scm_get_bytevector_all, "get-bytevector-all", 1, 0, 0,
(SCM port), (SCM port),
"Read from @var{port}, blocking as necessary, until " "Read from @var{port}, blocking as necessary, until "

View file

@ -1,7 +1,7 @@
#ifndef SCM_R6RS_PORTS_H #ifndef SCM_R6RS_PORTS_H
#define SCM_R6RS_PORTS_H #define SCM_R6RS_PORTS_H
/* Copyright (C) 2009, 2010, 2011, 2013 Free Software Foundation, Inc. /* Copyright (C) 2009-2011, 2013, 2019 Free Software Foundation, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License * modify it under the terms of the GNU Lesser General Public License
@ -34,7 +34,6 @@ SCM_API SCM scm_get_bytevector_n (SCM, SCM);
SCM_API SCM scm_get_bytevector_n_x (SCM, SCM, SCM, SCM); SCM_API SCM scm_get_bytevector_n_x (SCM, SCM, SCM, SCM);
SCM_API SCM scm_get_bytevector_some (SCM); SCM_API SCM scm_get_bytevector_some (SCM);
SCM_API SCM scm_get_bytevector_all (SCM); SCM_API SCM scm_get_bytevector_all (SCM);
SCM_API SCM scm_unget_bytevector (SCM, SCM, SCM, SCM);
SCM_API SCM scm_put_u8 (SCM, SCM); SCM_API SCM scm_put_u8 (SCM, SCM);
SCM_API SCM scm_put_bytevector (SCM, SCM, SCM, SCM); SCM_API SCM scm_put_bytevector (SCM, SCM, SCM, SCM);
SCM_API SCM scm_open_bytevector_output_port (SCM); SCM_API SCM scm_open_bytevector_output_port (SCM);
@ -46,4 +45,8 @@ SCM_API SCM scm_get_string_n_x (SCM, SCM, SCM, SCM);
SCM_API void scm_init_r6rs_ports (void); SCM_API void scm_init_r6rs_ports (void);
SCM_INTERNAL void scm_register_r6rs_ports (void); SCM_INTERNAL void scm_register_r6rs_ports (void);
/* Guile extensions, not in R6RS. */
SCM_API SCM scm_unget_bytevector (SCM, SCM, SCM, SCM);
SCM_API SCM scm_get_bytevector_some_x (SCM, SCM, SCM, SCM);
#endif /* SCM_R6RS_PORTS_H */ #endif /* SCM_R6RS_PORTS_H */

View file

@ -36,6 +36,7 @@
get-bytevector-n get-bytevector-n
get-bytevector-n! get-bytevector-n!
get-bytevector-some get-bytevector-some
get-bytevector-some! ; Guile extension, not in R6RS
get-bytevector-all get-bytevector-all
get-string-n! get-string-n!
put-u8 put-u8