1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Merge from stable-2.2

This commit is contained in:
Andy Wingo 2019-08-02 15:02:11 +02:00
commit c5526c4e40
4 changed files with 60 additions and 8 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

@ -86,9 +86,8 @@ SCM_DEFINE (scm_eof_object, "eof-object", 0, 0, 0,
/* Input ports. */ /* Input ports. */
#ifndef MIN #define MAX(A, B) ((A) >= (B) ? (A) : (B))
# define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MIN(A, B) ((A) < (B) ? (A) : (B))
#endif
/* Bytevector input ports. */ /* Bytevector input ports. */
static scm_t_port_type *bytevector_input_port_type = 0; static scm_t_port_type *bytevector_input_port_type = 0;
@ -521,6 +520,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,
(uint8_t *) 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 "
@ -732,8 +774,6 @@ bytevector_output_port_buffer_init (scm_t_bytevector_output_port_buffer *buf)
/* Don't clear the port. */ /* Don't clear the port. */
} }
#define MAX(A, B) ((A) >= (B) ? (A) : (B))
static inline void static inline void
bytevector_output_port_buffer_grow (scm_t_bytevector_output_port_buffer *buf, bytevector_output_port_buffer_grow (scm_t_bytevector_output_port_buffer *buf,
size_t min_size) size_t min_size)

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 2009-2011,2013,2018 /* Copyright 2009-2011,2013,2018-2019
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of Guile. This file is part of Guile.
@ -35,7 +35,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);
@ -47,4 +46,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