summaryrefslogtreecommitdiff
path: root/libguile/fports.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-04-11 18:40:03 +0200
committerAndy Wingo <wingo@pobox.com>2016-04-11 22:23:47 +0200
commitf7027a8b88452948cd6bf0fe2605ef3d9ef4dded (patch)
tree28c1addea333d1b8ae56db070fbc64eaa9ec97d4 /libguile/fports.c
parent55fb8f4e7e8181ef09e49ea9d917ca25f9fe8159 (diff)
downloadguile-f7027a8b88452948cd6bf0fe2605ef3d9ef4dded.tar.gz
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.
Diffstat (limited to 'libguile/fports.c')
-rw-r--r--libguile/fports.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/libguile/fports.c b/libguile/fports.c
index 3e4756204..11aa1707b 100644
--- a/libguile/fports.c
+++ b/libguile/fports.c
@@ -578,29 +578,29 @@ fport_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED)
/* fill a port's read-buffer with a single read. returns the first
char or EOF if end of file. */
-static void
-fport_read (SCM port, scm_t_port_buffer *dst)
+static size_t
+fport_read (SCM port, SCM dst, size_t start, size_t count)
{
- long count;
+ long res;
scm_t_fport *fp = SCM_FSTREAM (port);
- scm_t_uint8 *ptr = dst->buf + dst->end;
- size_t size = dst->size - dst->end;
+ signed char *ptr = SCM_BYTEVECTOR_CONTENTS (dst) + start;
- SCM_SYSCALL (count = read (fp->fdes, ptr, size));
- if (count == -1)
+ SCM_SYSCALL (res = read (fp->fdes, ptr, count));
+ if (res == -1)
scm_syserror ("fport_read");
- dst->end += count;
+ return res;
}
-static void
-fport_write (SCM port, scm_t_port_buffer *src)
+static size_t
+fport_write (SCM port, SCM src, size_t start, size_t count)
{
int fd = SCM_FPORT_FDES (port);
- scm_t_uint8 *ptr = src->buf + src->cur;
- size_t size = src->end - src->cur;
+ signed char *ptr = SCM_BYTEVECTOR_CONTENTS (src) + start;
- if (full_write (fd, ptr, size) < size)
+ if (full_write (fd, ptr, count) < count)
scm_syserror ("fport_write");
+
+ return count;
}
static scm_t_off