diff options
author | David Robillard <d@drobilla.net> | 2018-05-10 20:14:24 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-10-27 13:13:58 +0100 |
commit | 87583c1f917756ebd06744cc39a20eee39c34010 (patch) | |
tree | 9c92a3533556a86b0484827a4f34e080c34b034b | |
parent | 3bdf4986884e26b40b0c9d010634a0c572c84122 (diff) | |
download | serd-87583c1f917756ebd06744cc39a20eee39c34010.tar.gz serd-87583c1f917756ebd06744cc39a20eee39c34010.tar.bz2 serd-87583c1f917756ebd06744cc39a20eee39c34010.zip |
Move error handling to world
-rw-r--r-- | src/reader.c | 3 | ||||
-rw-r--r-- | src/serd_internal.h | 15 | ||||
-rw-r--r-- | src/world.c | 29 | ||||
-rw-r--r-- | src/world.h | 5 | ||||
-rw-r--r-- | src/writer.c | 29 |
5 files changed, 43 insertions, 38 deletions
diff --git a/src/reader.c b/src/reader.c index eafc4606..536bc8df 100644 --- a/src/reader.c +++ b/src/reader.c @@ -18,6 +18,7 @@ #include "system.h" #include "serd_internal.h" +#include "world.h" #include <errno.h> #include <stdarg.h> @@ -34,7 +35,7 @@ r_err(SerdReader* reader, SerdStatus st, const char* fmt, ...) va_start(args, fmt); const Cursor* const cur = &reader->source.cur; const SerdError e = { st, cur->filename, cur->line, cur->col, fmt, &args }; - serd_error(reader->world, &e); + serd_world_error(reader->world, &e); va_end(args); return st; } diff --git a/src/serd_internal.h b/src/serd_internal.h index 26846312..a659a5b8 100644 --- a/src/serd_internal.h +++ b/src/serd_internal.h @@ -43,19 +43,4 @@ /* Error reporting */ -static inline void -serd_error(const SerdWorld* world, const SerdError* e) -{ - if (world->error_sink) { - world->error_sink(world->error_handle, e); - } else { - if (e->filename) { - fprintf(stderr, "error: %s:%u:%u: ", e->filename, e->line, e->col); - } else { - fprintf(stderr, "error: "); - } - vfprintf(stderr, e->fmt, *e->args); - } -} - #endif // SERD_INTERNAL_H diff --git a/src/world.c b/src/world.c index 483a33af..ab1a21e2 100644 --- a/src/world.c +++ b/src/world.c @@ -16,8 +16,37 @@ #include "world.h" +#include <stdarg.h> +#include <stdio.h> #include <stdlib.h> +SerdStatus +serd_world_error(const SerdWorld* world, const SerdError* e) +{ + if (world->error_sink) { + world->error_sink(world->error_handle, e); + } else { + if (e->filename) { + fprintf(stderr, "error: %s:%u:%u: ", e->filename, e->line, e->col); + } else { + fprintf(stderr, "error: "); + } + vfprintf(stderr, e->fmt, *e->args); + } + return e->status; +} + +SerdStatus +serd_world_errorf(const SerdWorld* world, SerdStatus st, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const SerdError e = { st, NULL, 0, 0, fmt, &args }; + serd_world_error(world, &e); + va_end(args); + return st; +} + SerdWorld* serd_world_new(void) { diff --git a/src/world.h b/src/world.h index 87479eab..86e155db 100644 --- a/src/world.h +++ b/src/world.h @@ -24,4 +24,9 @@ struct SerdWorldImpl { void* error_handle; }; +SerdStatus serd_world_error(const SerdWorld* world, const SerdError* e); + +SerdStatus +serd_world_errorf(const SerdWorld* world, SerdStatus st, const char* fmt, ...); + #endif // SERD_WORLD_H diff --git a/src/writer.c b/src/writer.c index 588fb769..bbe2a247 100644 --- a/src/writer.c +++ b/src/writer.c @@ -20,11 +20,11 @@ #include "stack.h" #include "string_utils.h" #include "uri_utils.h" +#include "world.h" #include "serd/serd.h" #include <assert.h> -#include <stdarg.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> @@ -137,22 +137,6 @@ supports_abbrev(const SerdWriter* writer) return writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG; } -static void -w_err(SerdWriter* writer, SerdStatus st, const char* fmt, ...) -{ - /* TODO: This results in errors with no file information, which is not - helpful when re-serializing a file (particularly for "undefined - namespace prefix" errors. The statement sink API needs to be changed to - add a Cursor parameter so the source can notify the writer of the - statement origin for better error reporting. */ - - va_list args; - va_start(args, fmt); - const SerdError e = { st, NULL, 0, 0, fmt, &args }; - serd_error(writer->world, &e); - va_end(args); -} - static inline WriteContext* anon_stack_top(SerdWriter* writer) { @@ -191,7 +175,8 @@ write_character(SerdWriter* writer, const uint8_t* utf8, size_t* size) const uint32_t c = parse_utf8_char(utf8, size); switch (*size) { case 0: - w_err(writer, SERD_ERR_BAD_ARG, "invalid UTF-8: %X\n", utf8[0]); + serd_world_errorf( + writer->world, SERD_ERR_BAD_ARG, "invalid UTF-8: %X\n", utf8[0]); return sink(replacement_char, sizeof(replacement_char), writer); case 1: snprintf(escape, sizeof(escape), "\\u%04X", utf8[0]); @@ -585,7 +570,8 @@ write_curie(SerdWriter* const writer, case SERD_NTRIPLES: case SERD_NQUADS: if ((st = serd_env_expand(writer->env, node, &prefix, &suffix))) { - w_err(writer, st, "undefined namespace prefix `%s'\n", node_str); + serd_world_errorf(writer->world, st, + "undefined namespace prefix `%s'\n", node_str); return false; } write_sep(writer, SEP_URI_BEGIN); @@ -844,9 +830,8 @@ serd_writer_end_anon(SerdWriter* writer, return SERD_SUCCESS; } if (serd_stack_is_empty(&writer->anon_stack) || writer->indent == 0) { - w_err(writer, SERD_ERR_UNKNOWN, - "unexpected end of anonymous node\n"); - return SERD_ERR_UNKNOWN; + return serd_world_errorf(writer->world, SERD_ERR_UNKNOWN, + "unexpected end of anonymous node\n"); } --writer->indent; write_sep(writer, SEP_ANON_END); |