diff options
author | David Robillard <d@drobilla.net> | 2011-08-21 04:44:37 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-08-21 04:44:37 +0000 |
commit | 59143950ece9b6de731e1b00d2ca7f6596ea7d39 (patch) | |
tree | 4b220343283b336d8c04c847a283c9eb018bdd26 /src | |
parent | 95697f076150957f01a84315775ab081011714bb (diff) | |
download | serd-59143950ece9b6de731e1b00d2ca7f6596ea7d39.tar.gz serd-59143950ece9b6de731e1b00d2ca7f6596ea7d39.tar.bz2 serd-59143950ece9b6de731e1b00d2ca7f6596ea7d39.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/error.c | 33 | ||||
-rw-r--r-- | src/reader.c | 29 |
2 files changed, 51 insertions, 11 deletions
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 <http://drobilla.net> + + 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 <assert.h> +#include <errno.h> #include <stdarg.h> #include <stdbool.h> #include <stdint.h> @@ -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); |