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 8e44d891..397ea6d7 100644 --- a/src/byte_source.c +++ b/src/byte_source.c @@ -15,20 +15,23 @@ SerdStatus serd_byte_source_page(SerdByteSource* const 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_BAD_STREAM - : 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_BAD_STREAM + : SERD_FAILURE); + } } return SERD_SUCCESS; @@ -43,6 +46,7 @@ serd_byte_source_open_source(SerdByteSource* const source, const SerdNode* const name, const size_t page_size) { + assert(page_size > 0); memset(source, '\0', sizeof(*source)); source->read_func = read_func; source->error_func = error_func; @@ -91,6 +95,7 @@ serd_byte_source_open_string(SerdByteSource* const source, { memset(source, '\0', sizeof(*source)); + source->page_size = 1; source->name = name ? serd_node_copy(name) : serd_new_string(serd_string("string")); |