mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-26 21:20:30 +02:00
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.
This commit is contained in:
parent
55fb8f4e7e
commit
f7027a8b88
7 changed files with 372 additions and 240 deletions
|
@ -87,8 +87,8 @@ typedef struct
|
|||
peek-u8 should still return EOF. */
|
||||
int has_eof;
|
||||
|
||||
/* Heap object that keeps `buf' alive. */
|
||||
void *holder;
|
||||
/* Bytevector whose contents are [BUF, BUF + SIZE). */
|
||||
SCM bytevector;
|
||||
} scm_t_port_buffer;
|
||||
|
||||
|
||||
|
@ -204,8 +204,8 @@ typedef struct scm_t_ptob_descriptor
|
|||
char *name;
|
||||
int (*print) (SCM exp, SCM port, scm_print_state *pstate);
|
||||
|
||||
void (*read) (SCM port, scm_t_port_buffer *dst);
|
||||
void (*write) (SCM port, scm_t_port_buffer *src);
|
||||
size_t (*read) (SCM port, SCM dst, size_t start, size_t count);
|
||||
size_t (*write) (SCM port, SCM src, size_t start, size_t count);
|
||||
scm_t_off (*seek) (SCM port, scm_t_off OFFSET, int WHENCE);
|
||||
void (*close) (SCM port);
|
||||
|
||||
|
@ -230,8 +230,8 @@ SCM_API scm_t_ptob_descriptor* scm_c_port_type_ref (long ptobnum);
|
|||
SCM_API long scm_c_port_type_add_x (scm_t_ptob_descriptor *desc);
|
||||
SCM_API scm_t_bits scm_make_port_type
|
||||
(char *name,
|
||||
void (*read) (SCM port, scm_t_port_buffer *dst),
|
||||
void (*write) (SCM port, scm_t_port_buffer *src));
|
||||
size_t (*read) (SCM port, SCM dst, size_t start, size_t count),
|
||||
size_t (*write) (SCM port, SCM src, size_t start, size_t count));
|
||||
SCM_API void scm_set_port_print (scm_t_bits tc,
|
||||
int (*print) (SCM exp,
|
||||
SCM port,
|
||||
|
@ -323,6 +323,7 @@ SCM_INLINE int scm_peek_byte_or_eof_unlocked (SCM port);
|
|||
SCM_API int scm_slow_peek_byte_or_eof_unlocked (SCM port);
|
||||
SCM_API size_t scm_c_read (SCM port, void *buffer, size_t size);
|
||||
SCM_API size_t scm_c_read_unlocked (SCM port, void *buffer, size_t size);
|
||||
SCM_API size_t scm_c_read_bytes (SCM port, SCM dst, size_t start, size_t count);
|
||||
SCM_API scm_t_wchar scm_getc (SCM port);
|
||||
SCM_API scm_t_wchar scm_getc_unlocked (SCM port);
|
||||
SCM_API SCM scm_read_char (SCM port);
|
||||
|
@ -359,6 +360,7 @@ SCM_API void scm_puts (const char *str_data, SCM port);
|
|||
SCM_INLINE void scm_puts_unlocked (const char *str_data, SCM port);
|
||||
SCM_API void scm_c_write (SCM port, const void *buffer, size_t size);
|
||||
SCM_API void scm_c_write_unlocked (SCM port, const void *buffer, size_t size);
|
||||
SCM_API void scm_c_write_bytes (SCM port, SCM src, size_t start, size_t count);
|
||||
SCM_API void scm_lfwrite (const char *ptr, size_t size, SCM port);
|
||||
SCM_API void scm_lfwrite_unlocked (const char *ptr, size_t size, SCM port);
|
||||
SCM_INTERNAL void scm_lfwrite_substr (SCM str, size_t start, size_t end,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue