aboutsummaryrefslogtreecommitdiffstats
path: root/src/byte_source.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-12-26 19:25:51 -0500
committerDavid Robillard <d@drobilla.net>2020-10-27 13:13:58 +0100
commit36a418f0d8dfd10007e48d6e8cb796cfa8aa4d88 (patch)
treed498db3c1870a90e7ec91eba2ea4dcb9987f30e2 /src/byte_source.c
parent5d65a0b7b687ffbbd624d75b42ac3336ce353c39 (diff)
downloadserd-36a418f0d8dfd10007e48d6e8cb796cfa8aa4d88.tar.gz
serd-36a418f0d8dfd10007e48d6e8cb796cfa8aa4d88.tar.bz2
serd-36a418f0d8dfd10007e48d6e8cb796cfa8aa4d88.zip
Hide fopen wrapper and use reader interface consistently
Diffstat (limited to 'src/byte_source.c')
-rw-r--r--src/byte_source.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/byte_source.c b/src/byte_source.c
index 9d245004..fce0fadb 100644
--- a/src/byte_source.c
+++ b/src/byte_source.c
@@ -47,6 +47,7 @@ SerdStatus
serd_byte_source_open_source(SerdByteSource* source,
SerdReadFunc read_func,
SerdStreamErrorFunc error_func,
+ SerdStreamCloseFunc close_func,
void* stream,
const char* name,
size_t page_size)
@@ -54,13 +55,14 @@ serd_byte_source_open_source(SerdByteSource* source,
const Cursor cur = { name, 1, 1 };
memset(source, '\0', sizeof(*source));
+ source->read_func = read_func;
+ source->error_func = error_func;
+ source->close_func = close_func;
source->stream = stream;
- source->from_stream = true;
source->page_size = page_size;
source->buf_size = page_size;
source->cur = cur;
- source->error_func = error_func;
- source->read_func = read_func;
+ source->from_stream = true;
if (page_size > 1) {
source->file_buf = (uint8_t*)serd_bufalloc(page_size);
@@ -101,9 +103,14 @@ serd_byte_source_open_string(SerdByteSource* source, const char* utf8)
SerdStatus
serd_byte_source_close(SerdByteSource* source)
{
+ SerdStatus st = SERD_SUCCESS;
+ if (source->close_func) {
+ st = source->close_func(source->stream) ? SERD_ERR_UNKNOWN
+ : SERD_SUCCESS;
+ }
if (source->page_size > 1) {
free(source->file_buf);
}
memset(source, '\0', sizeof(*source));
- return SERD_SUCCESS;
+ return st;
}