From 59143950ece9b6de731e1b00d2ca7f6596ea7d39 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 21 Aug 2011 04:44:37 +0000 Subject: Gracefully handle NULL reader sinks. Add serd_strerror. Fix erroneously equal SERD_ERR_BAD_SYNTAX and SERD_ERR_BAD_ARG. git-svn-id: http://svn.drobilla.net/serd/trunk@211 490d8e77-9747-427b-9fa3-0b8f29cee8a0 --- src/error.c | 33 +++++++++++++++++++++++++++++++++ src/reader.c | 29 ++++++++++++++++++----------- 2 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 src/error.c (limited to 'src') diff --git a/src/error.c b/src/error.c new file mode 100644 index 00000000..cfab5a77 --- /dev/null +++ b/src/error.c @@ -0,0 +1,33 @@ +/* + Copyright 2011 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "serd_internal.h" + +SERD_API +const uint8_t* +serd_strerror(SerdStatus st) +{ + switch (st) { + case SERD_SUCCESS: return (const uint8_t*)"Success"; + case SERD_FAILURE: return (const uint8_t*)"Non-fatal failure"; + case SERD_ERR_UNKNOWN: return (const uint8_t*)"Unknown error"; + case SERD_ERR_BAD_SYNTAX: return (const uint8_t*)"Invalid syntax"; + case SERD_ERR_BAD_ARG: return (const uint8_t*)"Invalid argument"; + case SERD_ERR_NOT_FOUND: return (const uint8_t*)"Not found"; + } + return (const uint8_t*)"Success"; // never reached +} + diff --git a/src/reader.c b/src/reader.c index 24802164..3cb2e3db 100644 --- a/src/reader.c +++ b/src/reader.c @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -316,14 +317,15 @@ emit_statement(SerdReader* reader, SerdStatementFlags* flags, const SerdNode datatype = public_node(reader, d); const SerdNode lang = public_node_from_ref(reader, SERD_LITERAL, l); object.flags = f; - bool ret = !reader->statement_sink(reader->handle, - *flags, - &graph, - &subject, - &predicate, - &object, - &datatype, - &lang); + bool ret = !reader->statement_sink + || !reader->statement_sink(reader->handle, + *flags, + &graph, + &subject, + &predicate, + &object, + &datatype, + &lang); *flags = (*flags & SERD_ANON_CONT) ? SERD_ANON_CONT : 0; return ret; } @@ -1326,7 +1328,9 @@ read_base(SerdReader* reader) Ref uri; TRY_RET(uri = read_uriref(reader)); const SerdNode uri_node = public_node_from_ref(reader, SERD_URI, uri); - reader->base_sink(reader->handle, &uri_node); + if (reader->base_sink) { + reader->base_sink(reader->handle, &uri_node); + } pop_string(reader, uri); return true; } @@ -1339,7 +1343,7 @@ read_prefixID(SerdReader* reader) // `@' is already eaten in read_directive eat_string(reader, "prefix", 6); TRY_RET(read_ws_plus(reader)); - bool ret = false; + bool ret = true; Ref name = read_prefixName(reader); if (!name) { name = push_string(reader, "", 0); @@ -1350,7 +1354,9 @@ read_prefixID(SerdReader* reader) TRY_THROW(uri = read_uriref(reader)); const SerdNode name_node = public_node_from_ref(reader, SERD_LITERAL, name); const SerdNode uri_node = public_node_from_ref(reader, SERD_URI, uri); - ret = !reader->prefix_sink(reader->handle, &name_node, &uri_node); + if (reader->prefix_sink) { + ret = !reader->prefix_sink(reader->handle, &name_node, &uri_node); + } pop_string(reader, uri); except: pop_string(reader, name); @@ -1503,6 +1509,7 @@ serd_reader_read_file(SerdReader* reader, FILE* fd = fopen((const char*)path, "r"); if (!fd) { + fprintf(stderr, "Error opening file %s (%s)\n", path, strerror(errno)); return SERD_ERR_UNKNOWN; } SerdStatus ret = serd_reader_read_file_handle(reader, fd, path); -- cgit v1.2.1