aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-06-03 19:47:07 +0200
committerDavid Robillard <d@drobilla.net>2018-11-25 22:12:47 +0100
commit957fbbae9d51e3850f00ed109052ce7bab7087e0 (patch)
tree1c34e3bad481e08f40e800b1cc20aaaa809aad97
parentcd63c3d8d0627b5cb6c060db5f5132c0dbcc9a79 (diff)
downloadserd-957fbbae9d51e3850f00ed109052ce7bab7087e0.tar.gz
serd-957fbbae9d51e3850f00ed109052ce7bab7087e0.tar.bz2
serd-957fbbae9d51e3850f00ed109052ce7bab7087e0.zip
Make statement sink take a statement rather than nodes
This makes the interface more extensible, towards associating more information with statements. The serd_sink_write_nodes wrapper remains so that user code does not need to allocate in order to write statement.
-rw-r--r--serd/serd.h9
-rw-r--r--src/reader.c8
-rw-r--r--src/sink.c13
-rw-r--r--src/writer.c14
-rw-r--r--tests/serd_test.c26
5 files changed, 33 insertions, 37 deletions
diff --git a/serd/serd.h b/serd/serd.h
index 1db1d1b1..4ad187b0 100644
--- a/serd/serd.h
+++ b/serd/serd.h
@@ -768,12 +768,9 @@ typedef SerdStatus (*SerdPrefixSink)(void* handle,
Called for every RDF statement in the serialisation.
*/
-typedef SerdStatus (*SerdStatementSink)(void* handle,
- SerdStatementFlags flags,
- const SerdNode* graph,
- const SerdNode* subject,
- const SerdNode* predicate,
- const SerdNode* object);
+typedef SerdStatus (*SerdStatementSink)(void* handle,
+ SerdStatementFlags flags,
+ const SerdStatement* statement);
/**
Sink (callback) for anonymous node end markers.
diff --git a/src/reader.c b/src/reader.c
index 261b8d65..0c32fbc7 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -17,6 +17,7 @@
#include "reader.h"
#include "serd_internal.h"
+#include "statement.h"
#include "system.h"
#include "world.h"
@@ -122,9 +123,12 @@ emit_statement(SerdReader* reader, ReadContext ctx, SerdNode* o)
(subject and predicate) were already zeroed by subsequent pushes. */
serd_node_zero_pad(o);
+ const SerdStatement statement = {
+ { ctx.subject, ctx.predicate, o, graph }
+ };
+
const SerdStatus st = reader->sink->statement(
- reader->sink->handle, *ctx.flags, graph,
- ctx.subject, ctx.predicate, o);
+ reader->sink->handle, *ctx.flags, &statement);
*ctx.flags &= SERD_ANON_CONT|SERD_LIST_CONT; // Preserve only cont flags
return st;
}
diff --git a/src/sink.c b/src/sink.c
index 52e85c48..487f10d4 100644
--- a/src/sink.c
+++ b/src/sink.c
@@ -16,6 +16,8 @@
#include "serd/serd.h"
+#include "statement.h"
+
SerdStatus
serd_sink_set_base(const SerdSink* sink, const SerdNode* uri)
{
@@ -35,12 +37,7 @@ serd_sink_write_statement(const SerdSink* sink,
const SerdStatementFlags flags,
const SerdStatement* statement)
{
- return sink->statement(sink->handle,
- flags,
- serd_statement_get_graph(statement),
- serd_statement_get_subject(statement),
- serd_statement_get_predicate(statement),
- serd_statement_get_object(statement));
+ return sink->statement(sink->handle, flags, statement);
}
SerdStatus
@@ -51,8 +48,8 @@ serd_sink_write_nodes(const SerdSink* sink,
const SerdNode* object,
const SerdNode* graph)
{
- return sink->statement(
- sink->handle, flags, graph, subject, predicate, object);
+ const SerdStatement statement = { { subject, predicate, object, graph } };
+ return sink->statement(sink->handle, flags, &statement);
}
SerdStatus
diff --git a/src/writer.c b/src/writer.c
index 807ae8be..cbd3baa6 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -682,13 +682,15 @@ write_list_obj(SerdWriter* writer,
}
static SerdStatus
-serd_writer_write_statement(SerdWriter* writer,
- SerdStatementFlags flags,
- const SerdNode* graph,
- const SerdNode* subject,
- const SerdNode* predicate,
- const SerdNode* object)
+serd_writer_write_statement(SerdWriter* writer,
+ SerdStatementFlags flags,
+ const SerdStatement* statement)
{
+ const SerdNode* const subject = serd_statement_get_subject(statement);
+ const SerdNode* const predicate = serd_statement_get_predicate(statement);
+ const SerdNode* const object = serd_statement_get_object(statement);
+ const SerdNode* const graph = serd_statement_get_graph(statement);
+
if (!subject || !predicate || !object ||
!is_resource(subject) || !is_resource(predicate)) {
return SERD_ERR_BAD_ARG;
diff --git a/tests/serd_test.c b/tests/serd_test.c
index 049b4767..3475d08e 100644
--- a/tests/serd_test.c
+++ b/tests/serd_test.c
@@ -69,16 +69,13 @@ typedef struct {
} ReaderTest;
static SerdStatus
-test_sink(void* handle,
- SerdStatementFlags flags,
- const SerdNode* graph,
- const SerdNode* subject,
- const SerdNode* predicate,
- const SerdNode* object)
+test_sink(void* handle,
+ SerdStatementFlags flags,
+ const SerdStatement* statement)
{
ReaderTest* rt = (ReaderTest*)handle;
++rt->n_statements;
- rt->graph = graph;
+ rt->graph = serd_statement_get_graph(statement);
return SERD_SUCCESS;
}
@@ -602,9 +599,8 @@ main(void)
{ s, p, NULL },
{ NULL, NULL, NULL } };
for (unsigned i = 0; i < sizeof(junk) / (sizeof(SerdNode*) * 5); ++i) {
- if (!iface->statement(
- iface->handle, 0, NULL,
- junk[i][0], junk[i][1], junk[i][2])) {
+ if (!serd_sink_write_nodes(
+ iface, 0, junk[i][0], junk[i][1], junk[i][2], 0)) {
FAILF("Successfully wrote junk statement %d\n", i);
}
}
@@ -624,8 +620,8 @@ main(void)
{ s, p, o },
{ s, p, o } };
for (unsigned i = 0; i < sizeof(good) / (sizeof(SerdNode*) * 5); ++i) {
- if (iface->statement(
- iface->handle, 0, NULL, good[i][0], good[i][1], good[i][2])) {
+ if (serd_sink_write_nodes(
+ iface, 0, good[i][0], good[i][1], good[i][2], 0)) {
FAILF("Failed to write good statement %d\n", i);
}
}
@@ -634,9 +630,9 @@ main(void)
const char bad_str[] = { (char)0xFF, (char)0x90, 'h', 'i', 0 };
SerdNode* bad_lit = serd_node_new_string(bad_str);
SerdNode* bad_uri = serd_node_new_uri(bad_str);
- if (iface->statement(iface->handle, 0, NULL, s, p, bad_lit)) {
+ if (serd_sink_write_nodes(iface, 0, s, p, bad_lit, 0)) {
FAIL("Failed to write junk UTF-8 literal\n");
- } else if (iface->statement(iface->handle, 0, NULL, s, p, bad_uri)) {
+ } else if (serd_sink_write_nodes(iface, 0, s, p, bad_uri, 0)) {
FAIL("Failed to write junk UTF-8 URI\n");
}
serd_node_free(bad_uri);
@@ -645,7 +641,7 @@ main(void)
// Write 1 valid statement
serd_node_free(o);
o = serd_node_new_string("hello");
- if (iface->statement(iface->handle, 0, NULL, s, p, o)) {
+ if (serd_sink_write_nodes(iface, 0, s, p, o, 0)) {
FAIL("Failed to write valid statement\n");
}