aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/reader.c3
-rw-r--r--src/serd_internal.h23
-rw-r--r--src/world.c29
-rw-r--r--src/world.h6
-rw-r--r--src/writer.c43
-rw-r--r--test/test_node.c2
6 files changed, 55 insertions, 51 deletions
diff --git a/src/reader.c b/src/reader.c
index 640fb12b..cfc43685 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -19,6 +19,7 @@
#include "serd_internal.h"
#include "stack.h"
#include "system.h"
+#include "world.h"
#include <errno.h>
#include <stdarg.h>
@@ -36,7 +37,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 1bb2a3bc..91ba509c 100644
--- a/src/serd_internal.h
+++ b/src/serd_internal.h
@@ -17,12 +17,6 @@
#ifndef SERD_INTERNAL_H
#define SERD_INTERNAL_H
-#include "world.h"
-
-#include "serd/serd.h"
-
-#include <stdio.h>
-
#define NS_XSD "http://www.w3.org/2001/XMLSchema#"
#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@@ -32,21 +26,4 @@
# define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
-/* Error reporting */
-
-static inline void
-serd_error(const SerdWorld* world, const SerdError* e)
-{
- if (world->error_func) {
- world->error_func(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 6f5a26c1..f74513da 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_func) {
+ world->error_func(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 3d994df9..08c351fe 100644
--- a/src/world.h
+++ b/src/world.h
@@ -24,4 +24,10 @@ 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 de0e80a7..d632c7af 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -22,11 +22,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>
@@ -139,24 +139,7 @@ supports_uriref(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 SERD_PURE_FUNC
-WriteContext*
+static inline WriteContext*
anon_stack_top(SerdWriter* writer)
{
assert(!serd_stack_is_empty(&writer->anon_stack));
@@ -194,7 +177,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]);
@@ -615,10 +599,10 @@ write_uri_node(SerdWriter* const writer,
if (!has_scheme && !supports_uriref(writer) &&
!serd_env_base_uri(writer->env)) {
- w_err(writer,
- SERD_ERR_BAD_ARG,
- "syntax does not support URI reference <%s>\n",
- node_str);
+ serd_world_errorf(writer->world,
+ SERD_ERR_BAD_ARG,
+ "syntax does not support URI reference <%s>\n",
+ node_str);
return false;
}
@@ -664,7 +648,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);
@@ -933,20 +918,24 @@ serd_writer_end_anon(SerdWriter* writer, const SerdNode* node)
if (writer->syntax == SERD_NTRIPLES || writer->syntax == SERD_NQUADS) {
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);
free_context(writer);
writer->context = *anon_stack_top(writer);
serd_stack_pop(&writer->anon_stack, sizeof(WriteContext));
+
const bool is_subject = serd_node_equals(node, writer->context.subject);
if (is_subject) {
serd_node_set(&writer->context.subject, node);
memset(writer->context.predicate, 0, sizeof(SerdNode));
}
+
return SERD_SUCCESS;
}
diff --git a/test/test_node.c b/test/test_node.c
index fc01803d..deb1abd1 100644
--- a/test/test_node.c
+++ b/test/test_node.c
@@ -223,6 +223,8 @@ check_get_integer(const char* string,
assert(node);
assert(serd_get_integer(node) == expected);
+
+ serd_node_free(node);
}
static void