aboutsummaryrefslogtreecommitdiffstats
path: root/src/serdi.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-05-12 13:28:47 +0200
committerDavid Robillard <d@drobilla.net>2018-11-25 22:12:48 +0100
commitc9fe9fdb61e15b64d03a8da062648ecd3f86d700 (patch)
tree4c2f6a751aed6a8abe03ef0b65bcbf675bf6bda8 /src/serdi.c
parent06f860fd95ba9f97e36416ad8fa3cdadba4f6259 (diff)
downloadserd-c9fe9fdb61e15b64d03a8da062648ecd3f86d700.tar.gz
serd-c9fe9fdb61e15b64d03a8da062648ecd3f86d700.tar.bz2
serd-c9fe9fdb61e15b64d03a8da062648ecd3f86d700.zip
WIP: Add model
Diffstat (limited to 'src/serdi.c')
-rw-r--r--src/serdi.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/serdi.c b/src/serdi.c
index 6259a6bf..2bef5e4a 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -51,10 +51,12 @@ print_usage(const char* name, bool error)
fprintf(os, " -b Fast bulk output for large serialisations.\n");
fprintf(os, " -c PREFIX Chop PREFIX from matching blank node IDs.\n");
fprintf(os, " -e Eat input one character at a time.\n");
+ fprintf(os, " -f Fast serialisation without object inlining\n");
fprintf(os, " -h Display this help and exit.\n");
fprintf(os, " -i SYNTAX Input syntax: turtle/ntriples/trig/nquads.\n");
fprintf(os, " -k BYTES Parser stack size.\n");
fprintf(os, " -l Lax (non-strict) parsing.\n");
+ fprintf(os, " -m Build and serialise a model (no streaming).\n");
fprintf(os, " -o SYNTAX Output syntax: turtle/ntriples/nquads.\n");
fprintf(os, " -p PREFIX Add PREFIX to blank node IDs.\n");
fprintf(os, " -q Suppress all output except data.\n");
@@ -91,7 +93,9 @@ main(int argc, char** argv)
bool ascii = false;
bool bulk_read = true;
bool bulk_write = false;
+ bool no_inline = false;
bool lax = false;
+ bool use_model = false;
bool quiet = false;
long stack_size = 4194304;
const char* add_prefix = NULL;
@@ -108,10 +112,14 @@ main(int argc, char** argv)
bulk_write = true;
} else if (argv[a][1] == 'e') {
bulk_read = false;
+ } else if (argv[a][1] == 'f') {
+ no_inline = true;
} else if (argv[a][1] == 'h') {
return print_usage(argv[0], false);
} else if (argv[a][1] == 'l') {
lax = true;
+ } else if (argv[a][1] == 'm') {
+ use_model = true;
} else if (argv[a][1] == 'q') {
quiet = true;
} else if (argv[a][1] == 'v') {
@@ -191,6 +199,9 @@ main(int argc, char** argv)
const SerdStyleFlags output_style = (ascii ? SERD_STYLE_ASCII : 0);
+ const SerdSerialisationFlags serialisation_flags =
+ no_inline ? SERD_NO_INLINE_OBJECTS : 0;
+
SerdByteSink* byte_sink = serd_byte_sink_new(
(SerdWriteFunc)fwrite, out_fd, bulk_write ? 4096 : 1);
@@ -201,9 +212,20 @@ main(int argc, char** argv)
(SerdWriteFunc)serd_byte_sink_write,
byte_sink);
- SerdReader* reader = serd_reader_new(
- world, input_syntax, serd_writer_get_sink(writer), stack_size);
+ SerdReader* reader = NULL;
+ SerdModel* model = NULL;
+ SerdInserter* inserter = NULL;
+ const SerdSink* sink = NULL;
+ if (use_model) {
+ const SerdIndexOptions indices = SERD_SPO | (no_inline ? 0 : SERD_OPS);
+ model = serd_model_new(world, indices, input_has_graphs);
+ inserter = serd_inserter_new(model, env, NULL);
+ sink = serd_inserter_get_sink(inserter);
+ } else {
+ sink = serd_writer_get_sink(writer);
+ }
+ reader = serd_reader_new(world, input_syntax, sink, stack_size);
serd_reader_set_strict(reader, !lax);
if (quiet) {
serd_world_set_error_sink(world, quiet_error_sink, NULL);
@@ -239,6 +261,19 @@ main(int argc, char** argv)
}
serd_reader_finish(reader);
+
+ if (status <= SERD_FAILURE && use_model) {
+ SerdSink* wsink = serd_writer_get_sink(writer);
+ serd_env_send_prefixes(env, wsink);
+
+ SerdRange* range = serd_model_all(model);
+ status = serd_range_serialise(range, wsink, serialisation_flags);
+ serd_range_free(range);
+ }
+
+ serd_node_free(input_name);
+ serd_inserter_free(inserter);
+ serd_model_free(model);
serd_reader_free(reader);
serd_writer_free(writer);
serd_byte_sink_free(byte_sink);