diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | serd/serd.h | 16 | ||||
-rw-r--r-- | src/error.c | 33 | ||||
-rw-r--r-- | src/reader.c | 29 | ||||
-rw-r--r-- | wscript | 3 |
5 files changed, 67 insertions, 19 deletions
@@ -2,8 +2,11 @@ serd (UNRELEASED) unstable; urgency=low * Fix pretty printing of successive blank descriptions, i.e. "] , [" * Avoid writing illegal Turtle names as a result of URI qualifying + * Gracefully handle NULL reader sinks + * Add serd_strerror + * Fix erroneously equal SERD_ERR_BAD_SYNTAX and SERD_ERR_BAD_ARG. - -- David Robillard <d@drobilla.net> UNRELEASED + -- David Robillard <d@drobilla.net> (UNRELEASED) serd (0.4.2) unstable; urgency=low diff --git a/serd/serd.h b/serd/serd.h index 41dff3bb..583c6eec 100644 --- a/serd/serd.h +++ b/serd/serd.h @@ -83,14 +83,18 @@ typedef struct SerdWriterImpl SerdWriter; Return status code. */ typedef enum { - SERD_SUCCESS = 0, /**< No error */ - SERD_FAILURE = 1, /**< Non-fatal failure */ - SERD_ERR_UNKNOWN = 2, /**< Unknown error */ - SERD_ERR_BAD_SYNTAX = 3, /**< Invalid syntax */ - SERD_ERR_BAD_ARG = 3, /**< Invalid argument */ - SERD_ERR_NOT_FOUND = 4 /**< Not found */ + SERD_SUCCESS, /**< No error */ + SERD_FAILURE, /**< Non-fatal failure */ + SERD_ERR_UNKNOWN, /**< Unknown error */ + SERD_ERR_BAD_SYNTAX, /**< Invalid syntax */ + SERD_ERR_BAD_ARG, /**< Invalid argument */ + SERD_ERR_NOT_FOUND /**< Not found */ } SerdStatus; +SERD_API +const uint8_t* +serd_strerror(SerdStatus status); + /** RDF syntax type. */ 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); @@ -9,7 +9,7 @@ from waflib.extras import autowaf as autowaf import waflib.Logs as Logs, waflib.Options as Options # Version of this package (even if built as a child) -SERD_VERSION = '0.4.3' +SERD_VERSION = '0.4.5' SERD_MAJOR_VERSION = '0' # Library version (UNIX style major, minor, micro) @@ -74,6 +74,7 @@ def build(bld): lib_source = ''' src/env.c + src/error.c src/node.c src/reader.c src/uri.c |