diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | serd/serd.h | 12 | ||||
-rw-r--r-- | src/reader.c | 18 | ||||
-rw-r--r-- | tests/serd_test.c | 47 | ||||
-rw-r--r-- | wscript | 2 |
5 files changed, 61 insertions, 19 deletions
@@ -39,6 +39,7 @@ serd (UNRELEASED) unstable; urgency=low * Add serd_writer_set_root_uri() and corresponding -r option to serdi to enable writing URIs with up references (../). * Resolve dot segments in serd_uri_resolve() instead of at write time. + * Add serd_reader_set_default_graph() for reading a file as a named graph. -- David Robillard <d@drobilla.net> (UNRELEASED) diff --git a/serd/serd.h b/serd/serd.h index 40e47499..807664dd 100644 --- a/serd/serd.h +++ b/serd/serd.h @@ -685,6 +685,18 @@ serd_reader_add_blank_prefix(SerdReader* reader, const uint8_t* prefix); /** + Set the URI of the default graph. + + If this is set, the reader will emit quads with the graph set to the given + node for any statements that are not in a named graph (which is currently + all of them since Serd currently does not support any graph syntaxes). +*/ +SERD_API +void +serd_reader_set_default_graph(SerdReader* reader, + const SerdNode* graph); + +/** Read a file at a given @c uri. */ SERD_API diff --git a/src/reader.c b/src/reader.c index 7e9bb3d4..23ef9fef 100644 --- a/src/reader.c +++ b/src/reader.c @@ -67,6 +67,7 @@ struct SerdReaderImpl { Ref rdf_first; Ref rdf_rest; Ref rdf_nil; + SerdNode default_graph; FILE* fd; SerdStack stack; SerdSyntax syntax; @@ -236,9 +237,13 @@ pop_node(SerdReader* reader, Ref ref) static inline bool emit_statement(SerdReader* reader, ReadContext ctx, Ref o, Ref d, Ref l) { + SerdNode* graph = deref(reader, ctx.graph); + if (!graph && reader->default_graph.buf) { + graph = &reader->default_graph; + } bool ret = !reader->statement_sink || !reader->statement_sink( - reader->handle, *ctx.flags, deref(reader, ctx.graph), + reader->handle, *ctx.flags, graph, deref(reader, ctx.subject), deref(reader, ctx.predicate), deref(reader, o), deref(reader, d), deref(reader, l)); *ctx.flags &= SERD_ANON_CONT|SERD_LIST_CONT; // Preserve only cont flags @@ -1354,6 +1359,7 @@ serd_reader_new(SerdSyntax syntax, me->prefix_sink = prefix_sink; me->statement_sink = statement_sink; me->end_sink = end_sink; + me->default_graph = SERD_NODE_NULL; me->fd = 0; me->stack = serd_stack_new(SERD_PAGE_SIZE); me->syntax = syntax; @@ -1384,6 +1390,7 @@ serd_reader_free(SerdReader* reader) pop_node(reader, reader->rdf_nil); pop_node(reader, reader->rdf_rest); pop_node(reader, reader->rdf_first); + serd_node_free(&reader->default_graph); #ifdef SERD_STACK_CHECK free(reader->allocs); @@ -1417,6 +1424,15 @@ serd_reader_add_blank_prefix(SerdReader* reader, memcpy(reader->bprefix, prefix, reader->bprefix_len + 1); } } + +SERD_API +void +serd_reader_set_default_graph(SerdReader* reader, + const SerdNode* graph) +{ + serd_node_free(&reader->default_graph); + reader->default_graph = serd_node_copy(graph); +} SERD_API SerdStatus diff --git a/tests/serd_test.c b/tests/serd_test.c index 3a4584ed..73276204 100644 --- a/tests/serd_test.c +++ b/tests/serd_test.c @@ -59,17 +59,24 @@ count_prefixes(void* handle, const SerdNode* name, const SerdNode* uri) return SERD_SUCCESS; } +typedef struct { + int n_statements; + const SerdNode* graph; +} ReaderTest; + static SerdStatus -count_statements(void* handle, - SerdStatementFlags flags, - const SerdNode* graph, - const SerdNode* subject, - const SerdNode* predicate, - const SerdNode* object, - const SerdNode* object_datatype, - const SerdNode* object_lang) +test_sink(void* handle, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* object_datatype, + const SerdNode* object_lang) { - ++*(int*)handle; + ReaderTest* rt = (ReaderTest*)handle; + ++rt->n_statements; + rt->graph = graph; return SERD_SUCCESS; } @@ -459,9 +466,6 @@ main() return failure("Failed to open file %s\n", path); } - int* n_statements = (int*)malloc(sizeof(int)); - *n_statements = 0; - SerdWriter* writer = serd_writer_new( SERD_TURTLE, (SerdStyle)0, env, NULL, serd_file_sink, fd); if (!writer) { @@ -567,16 +571,22 @@ main() // Rewind and test reader fseek(fd, 0, SEEK_SET); + ReaderTest* rt = (ReaderTest*)malloc(sizeof(ReaderTest)); + rt->n_statements = 0; + rt->graph = NULL; + SerdReader* reader = serd_reader_new( - SERD_TURTLE, n_statements, free, - NULL, NULL, count_statements, NULL); + SERD_TURTLE, rt, free, + NULL, NULL, test_sink, NULL); if (!reader) { return failure("Failed to create reader\n"); } - if (serd_reader_get_handle(reader) != n_statements) { + if (serd_reader_get_handle(reader) != rt) { return failure("Corrupt reader handle\n"); } + SerdNode g = serd_node_from_string(SERD_URI, USTR("http://example.org/")); + serd_reader_set_default_graph(reader, &g); serd_reader_add_blank_prefix(reader, USTR("tmp")); serd_reader_add_blank_prefix(reader, NULL); @@ -591,8 +601,11 @@ main() return failure("Error reading file (%s)\n", serd_strerror(st)); } - if (*n_statements != 12) { - return failure("Bad statement count %d\n", *n_statements); + if (rt->n_statements != 12) { + return failure("Bad statement count %d\n", rt->n_statements); + } else if (!rt->graph || !rt->graph->buf || + strcmp((const char*)rt->graph->buf, "http://example.org/")) { + return failure("Bad graph %p\n", rt->graph); } if (!serd_reader_read_string(reader, USTR("This isn't Turtle at all."))) { @@ -9,7 +9,7 @@ from waflib.extras import autowaf as autowaf import waflib.Logs as Logs, waflib.Options as Options # Version of this package (even if built as a child) -SERD_VERSION = '0.13.0' +SERD_VERSION = '0.14.0' SERD_MAJOR_VERSION = '0' # Library version (UNIX style major, minor, micro) |