aboutsummaryrefslogtreecommitdiffstats
path: root/src/serdi.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-01-21 06:28:23 +0000
committerDavid Robillard <d@drobilla.net>2011-01-21 06:28:23 +0000
commitff9510dc36fb3d6c5a85e3f4d41220c59b26ee93 (patch)
treee5d64ae74cf195a8d1783d8dfe9b268369c5036e /src/serdi.c
parentc5a3f407cb46797f8b122d2f3843d382760a2c3b (diff)
downloadserd-ff9510dc36fb3d6c5a85e3f4d41220c59b26ee93.tar.gz
serd-ff9510dc36fb3d6c5a85e3f4d41220c59b26ee93.tar.bz2
serd-ff9510dc36fb3d6c5a85e3f4d41220c59b26ee93.zip
Preliminary support for writing abbreviated Turtle.
git-svn-id: http://svn.drobilla.net/serd/trunk@22 490d8e77-9747-427b-9fa3-0b8f29cee8a0
Diffstat (limited to 'src/serdi.c')
-rw-r--r--src/serdi.c54
1 files changed, 47 insertions, 7 deletions
diff --git a/src/serdi.c b/src/serdi.c
index 5db96388..a688b41b 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -90,6 +90,8 @@ event_prefix(void* handle,
} else {
serd_namespaces_add(state->ns, name, uri_string);
}
+ serd_writer_set_prefix(state->writer, name, uri_string);
+
return true;
}
@@ -133,13 +135,39 @@ file_sink(const void* buf, size_t len, void* stream)
int
main(int argc, char** argv)
{
- if (argc != 2 && argc != 3) {
+ if (argc < 2) {
return print_usage(argv[0], true);
}
- const uint8_t* in_filename = (const uint8_t*)argv[1];
+ FILE* in_fd = NULL;
+ SerdSyntax output_syntax = SERD_NTRIPLES;
+
+ int a = 1;
+ for (; a < argc && argv[a][0] == '-'; ++a) {
+ if (argv[a][1] == '\0') {
+ in_fd = stdin;
+ break;
+ } else if (argv[a][1] == 'o') {
+ if (++a == argc) {
+ fprintf(stderr, "missing value for -i\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]);
+ }
+ } else {
+ fprintf(stderr, "unknown option `%s'\n", argv[a]);
+ return print_usage(argv[0], true);
+ }
+ }
+
+ const uint8_t* in_filename = (const uint8_t*)argv[a];
- if (serd_uri_string_has_scheme(in_filename)) {
+ if (!in_fd && serd_uri_string_has_scheme(in_filename)) {
// Input is an absolute URI, ensure it's a file: URI and chop scheme
if (strncmp((const char*)in_filename, "file:", 5)) {
fprintf(stderr, "unsupported URI scheme `%s'\n", in_filename);
@@ -166,8 +194,11 @@ main(int argc, char** argv)
serd_uri_parse(base_uri_str->buf, &base_uri);
- FILE* const in_fd = fopen((const char*)in_filename, "r");
- FILE* out_fd = stdout;
+ if (!in_fd) {
+ in_fd = fopen((const char*)in_filename, "r");
+ }
+
+ FILE* out_fd = stdout;
if (!in_fd) {
fprintf(stderr, "failed to open file %s\n", in_filename);
@@ -175,8 +206,14 @@ main(int argc, char** argv)
}
SerdNamespaces ns = serd_namespaces_new();
+
+ SerdStyle output_style = (output_syntax == SERD_NTRIPLES)
+ ? SERD_STYLE_ASCII
+ : SERD_STYLE_ABBREVIATED;
+
State state = {
- serd_writer_new(SERD_NTRIPLES, ns, &base_uri, file_sink, out_fd),
+ serd_writer_new(output_syntax, output_style,
+ ns, &base_uri, file_sink, out_fd),
ns, base_uri_str, base_uri
};
@@ -186,8 +223,11 @@ main(int argc, char** argv)
const bool success = serd_reader_read_file(reader, in_fd, in_filename);
serd_reader_free(reader);
fclose(in_fd);
- serd_namespaces_free(state.ns);
+
+ serd_writer_finish(state.writer);
serd_writer_free(state.writer);
+
+ serd_namespaces_free(state.ns);
serd_string_free(state.base_uri_str);
if (success) {