aboutsummaryrefslogtreecommitdiffstats
path: root/src/serdi.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-02-10 13:32:06 +0100
committerDavid Robillard <d@drobilla.net>2018-11-25 09:21:03 +0100
commitdae82c273a7de279627c64a95aa6ae21532d6478 (patch)
tree62288dccc84072a21a5161be8bb3000e67bc85ab /src/serdi.c
parent8a315ba8778378c1d9e5f03173a1c0715698a601 (diff)
downloadserd-dae82c273a7de279627c64a95aa6ae21532d6478.tar.gz
serd-dae82c273a7de279627c64a95aa6ae21532d6478.tar.bz2
serd-dae82c273a7de279627c64a95aa6ae21532d6478.zip
Simplify reader interface
Diffstat (limited to 'src/serdi.c')
-rw-r--r--src/serdi.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/serdi.c b/src/serdi.c
index ec66cfd3..caa1d9af 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -113,6 +113,19 @@ quiet_error_sink(void* handle, const SerdError* e)
return SERD_SUCCESS;
}
+/** fread-like wrapper for getc (which is faster). */
+static size_t
+serd_file_read_byte(void* buf, size_t size, size_t nmemb, void* stream)
+{
+ const int c = getc((FILE*)stream);
+ if (c == EOF) {
+ *((uint8_t*)buf) = 0;
+ return 0;
+ }
+ *((uint8_t*)buf) = (uint8_t)c;
+ return 1;
+}
+
int
main(int argc, char** argv)
{
@@ -282,17 +295,21 @@ main(int argc, char** argv)
SerdStatus status = SERD_SUCCESS;
if (!from_file) {
- status = serd_reader_read_string(reader, input);
- } else if (bulk_read) {
- status = serd_reader_read_file_handle(reader, in_fd, in_name);
+ status = serd_reader_start_string(reader, input);
} else {
- status = serd_reader_start_stream(reader, in_fd, in_name, false);
- while (!status) {
- status = serd_reader_read_chunk(reader);
- }
- serd_reader_end_stream(reader);
+ status = serd_reader_start_stream(
+ reader,
+ bulk_read ? (SerdSource)fread : serd_file_read_byte,
+ (SerdStreamErrorFunc)ferror,
+ in_fd,
+ in_name,
+ bulk_read ? SERD_PAGE_SIZE : 1);
}
+ status = serd_reader_read_document(reader);
+
+ serd_reader_end_stream(reader);
+
serd_reader_free(reader);
serd_writer_finish(writer);
serd_writer_free(writer);