diff options
Diffstat (limited to 'src/serdi.c')
-rw-r--r-- | src/serdi.c | 94 |
1 files changed, 66 insertions, 28 deletions
diff --git a/src/serdi.c b/src/serdi.c index bc7c9d18..833e92d2 100644 --- a/src/serdi.c +++ b/src/serdi.c @@ -45,8 +45,11 @@ print_usage(const char* name, bool error) fprintf(os, "Read and write RDF syntax.\n"); fprintf(os, "Use - for INPUT to read from standard input.\n\n"); fprintf(os, " -h Display this help and exit\n"); + fprintf(os, " -i SYNTAX Input syntax (`turtle' or `ntriples')\n"); fprintf(os, " -o SYNTAX Output syntax (`turtle' or `ntriples')\n"); fprintf(os, " -s INPUT Parse INPUT as string (terminates options)\n"); + fprintf(os, " -p PREFIX Add PREFIX to blank node IDs\n"); + fprintf(os, " -c PREFIX Chop PREFIX from matching blank node IDs\n"); fprintf(os, " -v Display version information and exit\n"); return error ? 1 : 0; } @@ -58,6 +61,20 @@ file_sink(const void* buf, size_t len, void* stream) return fwrite(buf, 1, len, file); } +bool +set_syntax(SerdSyntax* syntax, const char* name) +{ + if (!strcmp(name, "turtle")) { + *syntax = SERD_TURTLE; + } else if (!strcmp(name, "ntriples")) { + *syntax = SERD_NTRIPLES; + } else { + fprintf(stderr, "Unknown input format `%s'\n", name); + return false; + } + return true; +} + int main(int argc, char** argv) { @@ -65,14 +82,17 @@ main(int argc, char** argv) return print_usage(argv[0], true); } - FILE* in_fd = NULL; - SerdSyntax output_syntax = SERD_NTRIPLES; - bool from_file = true; - const char* in_name = NULL; + FILE* in_fd = NULL; + SerdSyntax input_syntax = SERD_TURTLE; + SerdSyntax output_syntax = SERD_NTRIPLES; + bool from_file = true; + const uint8_t* in_name = NULL; + const uint8_t* add_prefix = NULL; + const uint8_t* chop_prefix = NULL; int a = 1; for (; a < argc && argv[a][0] == '-'; ++a) { if (argv[a][1] == '\0') { - in_name = "(stdin)"; + in_name = (const uint8_t*)"(stdin)"; in_fd = stdin; break; } else if (argv[a][1] == 'h') { @@ -80,23 +100,38 @@ main(int argc, char** argv) } else if (argv[a][1] == 'v') { return print_version(); } else if (argv[a][1] == 's') { - in_name = "(string)"; + in_name = (const uint8_t*)"(string)"; from_file = false; ++a; break; + } else if (argv[a][1] == 'i') { + if (++a == argc) { + fprintf(stderr, "Missing value for -i\n"); + return 1; + } + if (!set_syntax(&input_syntax, argv[a])) { + return 1; + } } else if (argv[a][1] == 'o') { if (++a == argc) { fprintf(stderr, "Missing value for -o\n"); return 1; } - if (!strcmp(argv[a], "turtle")) { - output_syntax = SERD_TURTLE; - } else if (!strcmp(argv[a], "ntriples")) { - output_syntax = SERD_NTRIPLES; - } else { - fprintf(stderr, "Unknown output format `%s'\n", argv[a]); + if (!set_syntax(&output_syntax, argv[a])) { return 1; } + } else if (argv[a][1] == 'p') { + if (++a == argc) { + fprintf(stderr, "Missing value for -p\n"); + return 1; + } + add_prefix = (const uint8_t*)argv[a]; + } else if (argv[a][1] == 'c') { + if (++a == argc) { + fprintf(stderr, "Missing value for -c\n"); + return 1; + } + chop_prefix = (const uint8_t*)argv[a]; } else { fprintf(stderr, "Unknown option `%s'\n", argv[a]); return print_usage(argv[0], true); @@ -105,7 +140,7 @@ main(int argc, char** argv) const uint8_t* input = (const uint8_t*)argv[a++]; if (from_file) { - in_name = in_name ? in_name : (const char*)input; + in_name = in_name ? in_name : input; if (!in_fd) { if (serd_uri_string_has_scheme(input)) { // INPUT is an absolute URI, ensure it a file and chop scheme @@ -132,27 +167,25 @@ main(int argc, char** argv) } const uint8_t* base_uri_str = NULL; - SerdURI base_uri; if (a < argc) { // Base URI given on command line - const uint8_t* const in_base_uri = (const uint8_t*)argv[a]; - if (serd_uri_parse((const uint8_t*)in_base_uri, &base_uri)) { - fprintf(stderr, "Invalid base URI <%s>\n", argv[2]); - return 1; - } - base_uri_str = in_base_uri; + base_uri_str = (const uint8_t*)argv[a]; } else if (from_file) { // Use input file URI base_uri_str = input; } else { base_uri_str = (const uint8_t*)""; } - if (serd_uri_parse(base_uri_str, &base_uri)) { + SerdURI base_uri = SERD_URI_NULL; + SerdNode base_uri_node = serd_node_new_uri_from_string( + base_uri_str, &base_uri, &base_uri); + + if (!base_uri_node.buf) { fprintf(stderr, "Invalid base URI <%s>\n", base_uri_str); return 1; } FILE* out_fd = stdout; - SerdEnv* env = serd_env_new(); + SerdEnv* env = serd_env_new(&base_uri_node); SerdStyle output_style = SERD_STYLE_RESOLVED; if (output_syntax == SERD_NTRIPLES) { @@ -161,24 +194,28 @@ main(int argc, char** argv) output_style |= SERD_STYLE_ABBREVIATED; } - SerdNode base_uri_node = serd_node_from_string(SERD_URI, base_uri_str); - serd_env_set_base_uri(env, &base_uri_node); - serd_env_get_base_uri(env, &base_uri); - SerdWriter* writer = serd_writer_new( output_syntax, output_style, env, &base_uri, file_sink, out_fd); + if (chop_prefix) { + serd_writer_chop_blank_prefix(writer, chop_prefix); + } + State state = { env, writer }; SerdReader* reader = serd_reader_new( - SERD_TURTLE, state.writer, + input_syntax, state.writer, NULL, (SerdBaseSink)serd_writer_set_base_uri, (SerdPrefixSink)serd_writer_set_prefix, (SerdStatementSink)serd_writer_write_statement, (SerdEndSink)serd_writer_end_anon); + if (add_prefix) { + serd_reader_add_blank_prefix(reader, add_prefix); + } + const SerdStatus status = (from_file) - ? serd_reader_read_file(reader, in_fd, (const uint8_t*)in_name) + ? serd_reader_read_file_handle(reader, in_fd, in_name) : serd_reader_read_string(reader, input); serd_reader_free(reader); @@ -190,6 +227,7 @@ main(int argc, char** argv) serd_writer_finish(state.writer); serd_writer_free(state.writer); serd_env_free(state.env); + serd_node_free(&base_uri_node); return (status == SERD_SUCCESS) ? 0 : 1; } |