aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--serd/serd.h36
-rw-r--r--src/reader.c2
-rw-r--r--src/serdi.c23
-rw-r--r--src/writer.c128
4 files changed, 63 insertions, 126 deletions
diff --git a/serd/serd.h b/serd/serd.h
index 01e58f80..6b27ff18 100644
--- a/serd/serd.h
+++ b/serd/serd.h
@@ -243,16 +243,14 @@ typedef bool (*SerdPrefixSink)(void* handle,
const SerdString* uri);
/** Sink for statements. */
-typedef bool (*SerdStatementSink)(void* handle,
- const SerdString* graph,
- const SerdString* subject,
- SerdType subject_type,
- const SerdString* predicate,
- SerdType predicate_type,
- const SerdString* object,
- SerdType object_type,
- const SerdString* object_lang,
- const SerdString* object_datatype);
+typedef bool (*SerdStatementSink)(
+ void* handle,
+ const SerdString* graph, SerdType graph_type,
+ const SerdString* subject, SerdType subject_type,
+ const SerdString* predicate, SerdType predicate_type,
+ const SerdString* object, SerdType object_type,
+ const SerdString* object_lang,
+ const SerdString* object_datatype);
/** Sink for anonymous node end markers.
* This is called to indicate that the anonymous node with the given
@@ -326,16 +324,14 @@ serd_writer_set_prefix(SerdWriter writer,
/** Write a statement. */
SERD_API
bool
-serd_writer_write_statement(SerdWriter writer,
- const SerdString* graph,
- const SerdString* subject,
- SerdType subject_type,
- const SerdString* predicate,
- SerdType predicate_type,
- const SerdString* object,
- SerdType object_type,
- const SerdString* object_datatype,
- const SerdString* object_lang);
+serd_writer_write_statement(
+ SerdWriter writer,
+ const SerdString* graph, SerdType graph_type,
+ const SerdString* subject, SerdType subject_type,
+ const SerdString* predicate, SerdType predicate_type,
+ const SerdString* object, SerdType object_type,
+ const SerdString* object_datatype,
+ const SerdString* object_lang);
/** Mark the end of an anonymous node's description. */
SERD_API
diff --git a/src/reader.c b/src/reader.c
index 8bae4c03..08511045 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -275,7 +275,7 @@ emit_statement(SerdReader reader,
{
assert(s->value && p->value && o->value);
reader->statement_sink(reader->handle,
- g ? deref(reader, g->value) : NULL,
+ g ? deref(reader, g->value) : NULL, g ? g->type : 0,
deref(reader, s->value), s->type,
deref(reader, p->value), p->type,
deref(reader, o->value), o->type,
diff --git a/src/serdi.c b/src/serdi.c
index 5c176ce8..d8b88dd0 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -96,23 +96,20 @@ event_prefix(void* handle,
static bool
event_statement(void* handle,
- const SerdString* graph,
- const SerdString* subject,
- SerdType subject_type,
- const SerdString* predicate,
- SerdType predicate_type,
- const SerdString* object,
- SerdType object_type,
+ const SerdString* graph, SerdType graph_type,
+ const SerdString* subject, SerdType subject_type,
+ const SerdString* predicate, SerdType predicate_type,
+ const SerdString* object, SerdType object_type,
const SerdString* object_datatype,
const SerdString* object_lang)
{
State* const state = (State*)handle;
- return serd_writer_write_statement(
- state->writer,
- graph,
- subject, subject_type,
- predicate, predicate_type,
- object, object_type, object_datatype, object_lang);
+ return serd_writer_write_statement(state->writer,
+ graph, graph_type,
+ subject, subject_type,
+ predicate, predicate_type,
+ object, object_type,
+ object_datatype, object_lang);
}
static bool
diff --git a/src/writer.c b/src/writer.c
index 94f91f49..b58d4f3e 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -29,35 +29,16 @@ typedef struct {
static const WriteContext WRITE_CONTEXT_NULL = { 0, 0, 0 };
-typedef bool (*StatementWriter)(SerdWriter writer,
- const SerdString* graph,
- const SerdString* subject,
- SerdType subject_type,
- const SerdString* predicate,
- SerdType predicate_type,
- const SerdString* object,
- SerdType object_type,
- const SerdString* object_datatype,
- const SerdString* object_lang);
-
-typedef bool (*NodeWriter)(SerdWriter writer,
- SerdType type,
- const SerdString* str,
- const SerdString* datatype,
- const SerdString* lang);
-
struct SerdWriterImpl {
- SerdSyntax syntax;
- SerdStyle style;
- SerdEnv env;
- SerdURI base_uri;
- SerdStack anon_stack;
- SerdSink sink;
- void* stream;
- StatementWriter write_statement;
- NodeWriter write_node;
- WriteContext context;
- unsigned indent;
+ SerdSyntax syntax;
+ SerdStyle style;
+ SerdEnv env;
+ SerdURI base_uri;
+ SerdStack anon_stack;
+ SerdSink sink;
+ void* stream;
+ WriteContext context;
+ unsigned indent;
};
typedef enum {
@@ -166,7 +147,6 @@ static void
serd_writer_write_delim(SerdWriter writer, const uint8_t delim)
{
switch (delim) {
- case 0:
case '\n':
break;
default:
@@ -262,44 +242,36 @@ write_node(SerdWriter writer,
SERD_API
bool
-serd_writer_write_statement(SerdWriter writer,
- const SerdString* graph,
- const SerdString* subject,
- SerdType subject_type,
- const SerdString* predicate,
- SerdType predicate_type,
- const SerdString* object,
- SerdType object_type,
- const SerdString* object_datatype,
- const SerdString* object_lang)
-{
- return writer->write_statement(writer,
- graph,
- subject, subject_type,
- predicate, predicate_type,
- object, object_type, object_datatype, object_lang);
-}
-
-static bool
-serd_writer_write_statement_abbrev(SerdWriter writer,
- const SerdString* graph,
- const SerdString* subject,
- SerdType subject_type,
- const SerdString* predicate,
- SerdType predicate_type,
- const SerdString* object,
- SerdType object_type,
- const SerdString* object_datatype,
- const SerdString* object_lang)
+serd_writer_write_statement(
+ SerdWriter writer,
+ const SerdString* graph, SerdType graph_type,
+ const SerdString* subject, SerdType subject_type,
+ const SerdString* predicate, SerdType predicate_type,
+ const SerdString* object, SerdType object_type,
+ const SerdString* object_datatype,
+ const SerdString* object_lang)
{
assert(subject && predicate && object);
+ switch (writer->syntax) {
+ case SERD_NTRIPLES:
+ write_node(writer, subject_type, subject, NULL, NULL);
+ writer->sink(" ", 1, writer->stream);
+ write_node(writer, predicate_type, predicate, NULL, NULL);
+ writer->sink(" ", 1, writer->stream);
+ write_node(writer, object_type, object, object_datatype, object_lang);
+ writer->sink(" .\n", 3, writer->stream);
+ return true;
+ case SERD_TURTLE:
+ break;
+ }
+
if (subject == writer->context.subject) {
- if (predicate == writer->context.predicate) {
+ if (predicate == writer->context.predicate) { // Abbreviate S P
++writer->indent;
serd_writer_write_delim(writer, ',');
write_node(writer, object_type, object, object_datatype, object_lang);
--writer->indent;
- } else {
+ } else { // Abbreviate S
if (writer->context.predicate) {
serd_writer_write_delim(writer, ';');
} else {
@@ -355,29 +327,6 @@ serd_writer_write_statement_abbrev(SerdWriter writer,
SERD_API
bool
-serd_writer_write_statement_flat(SerdWriter writer,
- const SerdString* graph,
- const SerdString* subject,
- SerdType subject_type,
- const SerdString* predicate,
- SerdType predicate_type,
- const SerdString* object,
- SerdType object_type,
- const SerdString* object_datatype,
- const SerdString* object_lang)
-{
- assert(subject && predicate && object);
- write_node(writer, subject_type, subject, NULL, NULL);
- writer->sink(" ", 1, writer->stream);
- write_node(writer, predicate_type, predicate, NULL, NULL);
- writer->sink(" ", 1, writer->stream);
- write_node(writer, object_type, object, object_datatype, object_lang);
- writer->sink(" .\n", 3, writer->stream);
- return true;
-}
-
-SERD_API
-bool
serd_writer_end_anon(SerdWriter writer,
const SerdString* subject)
{
@@ -385,7 +334,7 @@ serd_writer_end_anon(SerdWriter writer,
return true;
}
if (serd_stack_is_empty(&writer->anon_stack)) {
- fprintf(stderr, "unexpected SERD_END received\n");
+ fprintf(stderr, "unexpected end of anonymous node\n");
return false;
}
assert(writer->indent > 0);
@@ -431,12 +380,6 @@ serd_writer_new(SerdSyntax syntax,
writer->stream = stream;
writer->context = context;
writer->indent = 0;
- writer->write_node = write_node;
- if ((style & SERD_STYLE_ABBREVIATED)) {
- writer->write_statement = serd_writer_write_statement_abbrev;
- } else {
- writer->write_statement = serd_writer_write_statement_flat;
- }
return writer;
}
@@ -451,11 +394,11 @@ serd_writer_set_base_uri(SerdWriter writer,
writer->sink(" .\n\n", 4, writer->stream);
writer->context = WRITE_CONTEXT_NULL;
}
- writer->sink("@base ", 6, writer->stream);
- writer->sink(" <", 2, writer->stream);
+ writer->sink("@base <", 7, writer->stream);
serd_uri_serialise(uri, writer->sink, writer->stream);
writer->sink("> .\n", 4, writer->stream);
}
+ writer->context = WRITE_CONTEXT_NULL;
}
SERD_API
@@ -475,6 +418,7 @@ serd_writer_set_prefix(SerdWriter writer,
write_text(writer, WRITE_URI, uri->buf, uri->n_bytes - 1, '>');
writer->sink("> .\n", 4, writer->stream);
}
+ writer->context = WRITE_CONTEXT_NULL;
}
SERD_API