From f7027a8b88452948cd6bf0fe2605ef3d9ef4dded Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 11 Apr 2016 18:40:03 +0200 Subject: Port read/write functions take bytevectors This will allow better Scheme integration for ports. * libguile/ports.h (scm_t_port_buffer): Change "holder" member to be a bytevector defined to have "buf" as its starting point. (scm_t_ptob_descriptor): Change read and write functions to take bytevectors as arguments and to return the number of octets read or written. (scm_make_port_type): Adapt accordingly. (scm_c_read_bytes, scm_c_write_bytes): New functions that take bytevectors. * libguile/ports.c (scm_make_port_type): Adapt to read/write function prototype change. (scm_c_make_port_buffer): Arrange to populate the "bytevector" field. (scm_i_read_bytes_unlocked): New function. (scm_i_read_unlocked): Use scm_i_read_bytes_unlocked. (scm_c_read_bytes_unlocked): New function. (scm_c_read_unlocked): Update comment, and always go through the buffer. (scm_c_read_bytes): New function. (scm_flush_unlocked): Use scm_i_write_unlocked instead of the port's write function. (scm_i_write_bytes_unlocked): New function. (scm_i_write_unlocked): Use scm_i_write_bytes_unlocked. (scm_c_write_bytes_unlocked): New function. (scm_c_write_unlocked): Always write through the buffer. (scm_c_write_bytes): New function. (scm_truncate_file): Remove unused variable. (void_port_read, void_port_write): Adapt to read/write prototype change. * libguile/fports.c (fport_read, fport_write): * libguile/r6rs-ports.c (bytevector_input_port_read) (custom_binary_input_port_read, bytevector_output_port_write) (custom_binary_output_port_write, transcoded_port_write) (transcoded_port_read): Adapt to read/write prototype change. (scm_get_bytevector_n, scm_get_bytevector_n_x) (scm_get_bytevector_all): Use scm_c_read_bytes. (scm_put_bytevector): Use scm_c_write_bytes. * libguile/strports.c (string_port_read, string_port_write): * libguile/vports.c (soft_port_write, soft_port_read): Adapt to read/write prototype change. * test-suite/standalone/test-scm-c-read.c (custom_port_read): Fix for read API change. --- libguile/strports.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'libguile/strports.c') diff --git a/libguile/strports.c b/libguile/strports.c index 6ad7d18f2..e8ce67a8f 100644 --- a/libguile/strports.c +++ b/libguile/strports.c @@ -60,31 +60,29 @@ struct string_port { size_t len; }; -static void -string_port_read (SCM port, scm_t_port_buffer *dst) +static size_t +string_port_read (SCM port, SCM dst, size_t start, size_t count) { - size_t count; struct string_port *stream = (void *) SCM_STREAM (port); if (stream->pos >= stream->len) - return; + return 0; - count = stream->len - stream->pos; - if (count > dst->size - dst->end) - count = dst->size - dst->end; + if (count > stream->len - stream->pos) + count = stream->len - stream->pos; - memcpy (dst->buf + dst->end, + memcpy (SCM_BYTEVECTOR_CONTENTS (dst) + start, SCM_BYTEVECTOR_CONTENTS (stream->bytevector) + stream->pos, count); - dst->end += count; + stream->pos += count; + return count; } -static void -string_port_write (SCM port, scm_t_port_buffer *src) +static size_t +string_port_write (SCM port, SCM src, size_t start, size_t count) { struct string_port *stream = (void *) SCM_STREAM (port); - size_t count = src->end - src->cur; if (SCM_BYTEVECTOR_LENGTH (stream->bytevector) < stream->pos + count) { @@ -101,12 +99,13 @@ string_port_write (SCM port, scm_t_port_buffer *src) } memcpy (SCM_BYTEVECTOR_CONTENTS (stream->bytevector) + stream->pos, - src->buf + src->cur, + SCM_BYTEVECTOR_CONTENTS (src) + start, count); - src->cur += count; stream->pos += count; if (stream->pos > stream->len) stream->len = stream->pos; + + return count; } static scm_t_off -- cgit v1.2.1