diff options
Diffstat (limited to 'src/byte_source.c')
-rw-r--r-- | src/byte_source.c | 25 |
1 files changed, 15 insertions, 10 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")); |