diff options
author | David Robillard <d@drobilla.net> | 2018-06-03 19:47:07 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2018-11-25 22:12:47 +0100 |
commit | 957fbbae9d51e3850f00ed109052ce7bab7087e0 (patch) | |
tree | 1c34e3bad481e08f40e800b1cc20aaaa809aad97 | |
parent | cd63c3d8d0627b5cb6c060db5f5132c0dbcc9a79 (diff) | |
download | serd-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.h | 9 | ||||
-rw-r--r-- | src/reader.c | 8 | ||||
-rw-r--r-- | src/sink.c | 13 | ||||
-rw-r--r-- | src/writer.c | 14 | ||||
-rw-r--r-- | tests/serd_test.c | 26 |
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; } @@ -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"); } |