diff options
author | David Robillard <d@drobilla.net> | 2018-05-12 13:28:47 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2018-12-31 12:15:40 -0500 |
commit | 0342270f81dc9c676a92422c4e73484fb44f6da8 (patch) | |
tree | 384eff3b328eb2c287e4078a789adffbd1cdd765 /src/serdi.c | |
parent | 5307a8cf2a29a84fed72373f08f8f9cb20215f20 (diff) | |
download | serd-0342270f81dc9c676a92422c4e73484fb44f6da8.tar.gz serd-0342270f81dc9c676a92422c4e73484fb44f6da8.tar.bz2 serd-0342270f81dc9c676a92422c4e73484fb44f6da8.zip |
WIP: Add model
Diffstat (limited to 'src/serdi.c')
-rw-r--r-- | src/serdi.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/serdi.c b/src/serdi.c index 0b33ae77..46c5f47a 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"); @@ -93,7 +95,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; size_t stack_size = 4194304; const char* add_prefix = NULL; @@ -110,10 +114,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') { @@ -195,6 +203,9 @@ main(int argc, char** argv) const SerdWriterFlags writer_flags = (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); @@ -205,9 +216,22 @@ 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 SerdModelFlags flags = + SERD_INDEX_SPO | (input_has_graphs ? SERD_INDEX_GRAPHS : 0) | + (no_inline ? 0 : SERD_INDEX_OPS); + model = serd_model_new(world, flags); + 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_message_sink(world, quiet_error_sink, NULL); @@ -243,6 +267,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); |