From 6413746068d35e8e88111f930cbaadc56e2cf0cf Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 3 Jun 2018 19:47:07 +0200 Subject: 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. --- src/reader.c | 8 ++++++-- src/sink.c | 13 +++++-------- src/writer.c | 14 ++++++++------ 3 files changed, 19 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/reader.c b/src/reader.c index ee27a2fb..40c48a41 100644 --- a/src/reader.c +++ b/src/reader.c @@ -21,6 +21,7 @@ #include "serd/serd.h" #include "serd_internal.h" #include "stack.h" +#include "statement.h" #include "system.h" #include "world.h" @@ -125,9 +126,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 5f4a5a2e..bc5e2287 100644 --- a/src/sink.c +++ b/src/sink.c @@ -17,6 +17,8 @@ #include "serd/serd.h" +#include "statement.h" + SerdStatus serd_sink_set_base(SerdSink* sink, const SerdNode* uri) { @@ -34,12 +36,7 @@ serd_sink_write_statement(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 @@ -50,8 +47,8 @@ serd_sink_write(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 3f39a6c9..3480b746 100644 --- a/src/writer.c +++ b/src/writer.c @@ -684,13 +684,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; -- cgit v1.2.1