aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/byte_source.c25
-rw-r--r--src/byte_source.h25
2 files changed, 20 insertions, 30 deletions
diff --git a/src/byte_source.c b/src/byte_source.c
index 6ba5a718..ccdc82e5 100644
--- a/src/byte_source.c
+++ b/src/byte_source.c
@@ -27,20 +27,23 @@
SerdStatus
serd_byte_source_page(SerdByteSource* source)
{
- source->read_head = 0;
+ uint8_t* const buf =
+ (source->page_size > 1 ? source->file_buf : &source->read_byte);
+
const size_t n_read =
- source->read_func(source->file_buf, 1, source->page_size, source->stream);
+ source->read_func(buf, 1, source->page_size, source->stream);
- if (n_read == 0) {
- source->file_buf[0] = '\0';
- source->eof = true;
- return (source->error_func(source->stream) ? SERD_ERR_UNKNOWN
- : SERD_FAILURE);
- }
+ source->buf_size = n_read;
+ source->read_head = 0;
+ source->eof = false;
if (n_read < source->page_size) {
- source->file_buf[n_read] = '\0';
- source->buf_size = n_read;
+ buf[n_read] = '\0';
+ if (n_read == 0) {
+ source->eof = true;
+ return (source->error_func(source->stream) ? SERD_ERR_UNKNOWN
+ : SERD_FAILURE);
+ }
}
return SERD_SUCCESS;
@@ -55,6 +58,7 @@ serd_byte_source_open_source(SerdByteSource* source,
const SerdNode* name,
size_t page_size)
{
+ assert(page_size > 0);
memset(source, '\0', sizeof(*source));
source->read_func = read_func;
source->error_func = error_func;
@@ -99,6 +103,7 @@ serd_byte_source_open_string(SerdByteSource* source,
{
memset(source, '\0', sizeof(*source));
+ source->page_size = 1;
source->name =
name ? serd_node_copy(name) : serd_new_string(SERD_STATIC_STRING("string"));
diff --git a/src/byte_source.h b/src/byte_source.h
index db9b29af..ff281435 100644
--- a/src/byte_source.h
+++ b/src/byte_source.h
@@ -79,7 +79,8 @@ serd_byte_source_peek(SerdByteSource* source)
static inline SerdStatus
serd_byte_source_advance(SerdByteSource* source)
{
- SerdStatus st = SERD_SUCCESS;
+ SerdStatus st = SERD_SUCCESS;
+ const bool was_eof = source->eof;
switch (serd_byte_source_peek(source)) {
case '\n':
@@ -90,28 +91,12 @@ serd_byte_source_advance(SerdByteSource* source)
++source->cur.col;
}
- const bool was_eof = source->eof;
if (source->from_stream) {
- source->eof = false;
- if (source->page_size > 1) {
- if (++source->read_head == source->page_size) {
- st = serd_byte_source_page(source);
- } else if (source->read_head == source->buf_size) {
- source->eof = true;
- }
- } else {
- source->eof = false;
- if (!source->read_func(&source->read_byte, 1, 1, source->stream)) {
- source->eof = true;
- st =
- source->error_func(source->stream) ? SERD_ERR_UNKNOWN : SERD_FAILURE;
- }
+ if (++source->read_head >= source->buf_size) {
+ st = serd_byte_source_page(source);
}
} else if (!source->eof) {
- ++source->read_head; // Move to next character in string
- if (source->read_buf[source->read_head] == '\0') {
- source->eof = true;
- }
+ source->eof = source->read_buf[++source->read_head] == '\0';
}
return (was_eof && source->eof) ? SERD_FAILURE : st;