mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
Remove "buf" field from port buffers
* libguile/ports-internal.h (scm_port_buffer_reset_end): New helper. (scm_port_buffer_putback): New helper. * libguile/ports.h (scm_t_port_buffer): Remove "buf" field. (scm_get_byte_or_eof_unlocked, scm_peek_byte_or_eof_unlocked): Adapt. * libguile/ports.c (scm_c_make_port_buffer): No more "buf" field. (scm_i_unget_bytes_unlocked): Use helper. * libguile/read.c (scm_i_scan_for_encoding): No more "buf" field.
This commit is contained in:
parent
b869344a4f
commit
10dc6d043e
4 changed files with 41 additions and 24 deletions
|
@ -22,6 +22,8 @@
|
||||||
#ifndef SCM_PORTS_INTERNAL
|
#ifndef SCM_PORTS_INTERNAL
|
||||||
#define SCM_PORTS_INTERNAL
|
#define SCM_PORTS_INTERNAL
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "libguile/_scm.h"
|
#include "libguile/_scm.h"
|
||||||
#include "libguile/ports.h"
|
#include "libguile/ports.h"
|
||||||
|
|
||||||
|
@ -37,6 +39,12 @@ scm_port_buffer_reset (scm_t_port_buffer *buf)
|
||||||
buf->cur = buf->end = 0;
|
buf->cur = buf->end = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
scm_port_buffer_reset_end (scm_t_port_buffer *buf)
|
||||||
|
{
|
||||||
|
buf->cur = buf->end = scm_port_buffer_size (buf);
|
||||||
|
}
|
||||||
|
|
||||||
static inline size_t
|
static inline size_t
|
||||||
scm_port_buffer_can_take (scm_t_port_buffer *buf)
|
scm_port_buffer_can_take (scm_t_port_buffer *buf)
|
||||||
{
|
{
|
||||||
|
@ -96,6 +104,18 @@ scm_port_buffer_put (scm_t_port_buffer *buf, const scm_t_uint8 *src,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
scm_port_buffer_putback (scm_t_port_buffer *buf, const scm_t_uint8 *src,
|
||||||
|
size_t count)
|
||||||
|
{
|
||||||
|
assert (count <= buf->cur);
|
||||||
|
|
||||||
|
/* Sometimes used to move around data within a buffer, so we must use
|
||||||
|
memmove. */
|
||||||
|
buf->cur -= count;
|
||||||
|
memmove (SCM_BYTEVECTOR_CONTENTS (buf->bytevector) + buf->cur, src, count);
|
||||||
|
}
|
||||||
|
|
||||||
enum scm_port_encoding_mode {
|
enum scm_port_encoding_mode {
|
||||||
SCM_PORT_ENCODING_MODE_UTF8,
|
SCM_PORT_ENCODING_MODE_UTF8,
|
||||||
SCM_PORT_ENCODING_MODE_LATIN1,
|
SCM_PORT_ENCODING_MODE_LATIN1,
|
||||||
|
|
|
@ -518,7 +518,6 @@ scm_c_make_port_buffer (size_t size)
|
||||||
scm_t_port_buffer *ret = scm_gc_typed_calloc (scm_t_port_buffer);
|
scm_t_port_buffer *ret = scm_gc_typed_calloc (scm_t_port_buffer);
|
||||||
|
|
||||||
ret->bytevector = scm_c_make_bytevector (size);
|
ret->bytevector = scm_c_make_bytevector (size);
|
||||||
ret->buf = (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (ret->bytevector);
|
|
||||||
ret->has_eof_p = SCM_BOOL_F;
|
ret->has_eof_p = SCM_BOOL_F;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1998,11 +1997,9 @@ scm_i_unget_bytes_unlocked (const scm_t_uint8 *buf, size_t len, SCM port)
|
||||||
{
|
{
|
||||||
/* But they would fit if we shift the not-yet-read bytes from
|
/* But they would fit if we shift the not-yet-read bytes from
|
||||||
the read_buf right. Let's do that. */
|
the read_buf right. Let's do that. */
|
||||||
memmove (read_buf->buf + (size - buffered),
|
const scm_t_uint8 *to_shift = scm_port_buffer_take_pointer (read_buf);
|
||||||
scm_port_buffer_take_pointer (read_buf),
|
scm_port_buffer_reset_end (read_buf);
|
||||||
buffered);
|
scm_port_buffer_putback (read_buf, to_shift, buffered);
|
||||||
read_buf->end = size;
|
|
||||||
read_buf->cur = read_buf->end - buffered;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2013,18 +2010,16 @@ scm_i_unget_bytes_unlocked (const scm_t_uint8 *buf, size_t len, SCM port)
|
||||||
size *= 2;
|
size *= 2;
|
||||||
|
|
||||||
new_buf = scm_c_make_port_buffer (size);
|
new_buf = scm_c_make_port_buffer (size);
|
||||||
new_buf->end = size;
|
scm_port_buffer_reset_end (new_buf);
|
||||||
new_buf->cur = new_buf->end - buffered;
|
|
||||||
new_buf->has_eof_p = read_buf->has_eof_p;
|
new_buf->has_eof_p = read_buf->has_eof_p;
|
||||||
memcpy (new_buf->buf + new_buf->cur, read_buf->buf + read_buf->cur,
|
scm_port_buffer_putback (new_buf,
|
||||||
buffered);
|
scm_port_buffer_take_pointer (read_buf),
|
||||||
|
buffered);
|
||||||
pt->read_buf = read_buf = new_buf;
|
pt->read_buf = read_buf = new_buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
read_buf->cur -= len;
|
scm_port_buffer_putback (read_buf, buf, len);
|
||||||
memcpy (read_buf->buf + read_buf->cur, buf, len);
|
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include "libguile/bytevectors.h"
|
||||||
#include "libguile/gc.h"
|
#include "libguile/gc.h"
|
||||||
#include "libguile/tags.h"
|
#include "libguile/tags.h"
|
||||||
#include "libguile/error.h"
|
#include "libguile/error.h"
|
||||||
|
@ -73,8 +74,8 @@ struct scm_port_internal;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* Start of the buffer. Never changed. */
|
/* The port buffer. */
|
||||||
scm_t_uint8 *buf;
|
SCM bytevector;
|
||||||
|
|
||||||
/* Offsets into the buffer. Invariant: cur <= end <= size(buf). */
|
/* Offsets into the buffer. Invariant: cur <= end <= size(buf). */
|
||||||
size_t cur;
|
size_t cur;
|
||||||
|
@ -86,8 +87,6 @@ typedef struct
|
||||||
peek-u8 should still return EOF. */
|
peek-u8 should still return EOF. */
|
||||||
SCM has_eof_p;
|
SCM has_eof_p;
|
||||||
|
|
||||||
/* Bytevector whose contents are [BUF, BUF + SIZE). */
|
|
||||||
SCM bytevector;
|
|
||||||
} scm_t_port_buffer;
|
} scm_t_port_buffer;
|
||||||
|
|
||||||
|
|
||||||
|
@ -430,13 +429,16 @@ SCM_INLINE_IMPLEMENTATION int
|
||||||
scm_get_byte_or_eof_unlocked (SCM port)
|
scm_get_byte_or_eof_unlocked (SCM port)
|
||||||
{
|
{
|
||||||
scm_t_port_buffer *buf = SCM_PTAB_ENTRY (port)->read_buf;
|
scm_t_port_buffer *buf = SCM_PTAB_ENTRY (port)->read_buf;
|
||||||
|
scm_t_uint8 *ptr;
|
||||||
|
|
||||||
|
ptr = (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (buf->bytevector);
|
||||||
if (SCM_LIKELY (buf->cur < buf->end))
|
if (SCM_LIKELY (buf->cur < buf->end))
|
||||||
return buf->buf[buf->cur++];
|
return ptr[buf->cur++];
|
||||||
|
|
||||||
buf = scm_fill_input_unlocked (port);
|
buf = scm_fill_input_unlocked (port);
|
||||||
|
ptr = (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (buf->bytevector);
|
||||||
if (buf->cur < buf->end)
|
if (buf->cur < buf->end)
|
||||||
return buf->buf[buf->cur++];
|
return ptr[buf->cur++];
|
||||||
|
|
||||||
/* The next peek or get should cause the read() function to be called
|
/* The next peek or get should cause the read() function to be called
|
||||||
to see if we still have EOF. */
|
to see if we still have EOF. */
|
||||||
|
@ -448,15 +450,15 @@ scm_get_byte_or_eof_unlocked (SCM port)
|
||||||
SCM_INLINE_IMPLEMENTATION int
|
SCM_INLINE_IMPLEMENTATION int
|
||||||
scm_peek_byte_or_eof_unlocked (SCM port)
|
scm_peek_byte_or_eof_unlocked (SCM port)
|
||||||
{
|
{
|
||||||
scm_t_port *pt = SCM_PTAB_ENTRY (port);
|
scm_t_port_buffer *buf = SCM_PTAB_ENTRY (port)->read_buf;
|
||||||
scm_t_port_buffer *buf = pt->read_buf;
|
scm_t_uint8 *ptr = (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (buf->bytevector);
|
||||||
|
|
||||||
if (SCM_LIKELY (buf->cur < buf->end))
|
if (SCM_LIKELY (buf->cur < buf->end))
|
||||||
return buf->buf[buf->cur];
|
return ptr[buf->cur];
|
||||||
|
|
||||||
buf = scm_fill_input_unlocked (port);
|
buf = scm_fill_input_unlocked (port);
|
||||||
if (buf->cur < buf->end)
|
if (buf->cur < buf->end)
|
||||||
return buf->buf[buf->cur];
|
return ptr[buf->cur];
|
||||||
|
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2086,7 +2086,7 @@ scm_i_scan_for_encoding (SCM port)
|
||||||
/* An unbuffered port -- don't scan. */
|
/* An unbuffered port -- don't scan. */
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
memcpy (header, buf->buf + buf->cur, bytes_read);
|
memcpy (header, scm_port_buffer_take_pointer (buf), bytes_read);
|
||||||
header[bytes_read] = '\0';
|
header[bytes_read] = '\0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue