aboutsummaryrefslogtreecommitdiffstats
path: root/src/writer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/writer.c')
-rw-r--r--src/writer.c104
1 files changed, 55 insertions, 49 deletions
diff --git a/src/writer.c b/src/writer.c
index b4917052..227d516c 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -15,6 +15,7 @@
*/
#include "byte_sink.h"
+#include "env.h"
#include "node.h"
#include "serd_internal.h"
#include "stack.h"
@@ -96,7 +97,6 @@ struct SerdWriterImpl {
SerdEnv* env;
SerdNode* root_node;
SerdURIView root_uri;
- SerdURIView base_uri;
SerdStack anon_stack;
SerdByteSink byte_sink;
SerdErrorFunc error_func;
@@ -602,7 +602,7 @@ write_uri_node(SerdWriter* const writer,
}
if (!has_scheme && !supports_uriref(writer) &&
- !serd_env_base_uri(writer->env, NULL)) {
+ !serd_env_base_uri(writer->env)) {
w_err(writer,
SERD_ERR_BAD_ARG,
"syntax does not support URI reference <%s>\n",
@@ -611,22 +611,18 @@ write_uri_node(SerdWriter* const writer,
}
write_sep(writer, SEP_URI_BEGIN);
- if (writer->flags & SERD_WRITE_RESOLVED) {
- const SerdURIView uri = serd_parse_uri(node_str);
-
- SerdURIView in_base_uri;
- serd_env_base_uri(writer->env, &in_base_uri);
-
- const SerdURIView abs_uri = serd_resolve_uri(uri, in_base_uri);
- const bool rooted = uri_is_under(&in_base_uri, &writer->root_uri);
- const SerdURIView* root = rooted ? &writer->root_uri : &in_base_uri;
+ if ((writer->flags & SERD_WRITE_RESOLVED) && serd_env_base_uri(writer->env)) {
+ const SerdURIView base_uri = serd_env_base_uri_view(writer->env);
+ SerdURIView uri = serd_parse_uri(node_str);
+ SerdURIView abs_uri = serd_resolve_uri(uri, base_uri);
+ bool rooted = uri_is_under(&base_uri, &writer->root_uri);
+ const SerdURIView* root = rooted ? &writer->root_uri : &base_uri;
if (writer->syntax == SERD_NTRIPLES || writer->syntax == SERD_NQUADS ||
- !uri_is_under(&abs_uri, root) ||
- !uri_is_related(&abs_uri, &in_base_uri)) {
+ !uri_is_under(&abs_uri, root) || !uri_is_related(&abs_uri, &base_uri)) {
serd_write_uri(abs_uri, uri_sink, writer);
} else {
- serd_write_uri(serd_relative_uri(uri, in_base_uri), uri_sink, writer);
+ serd_write_uri(serd_relative_uri(uri, base_uri), uri_sink, writer);
}
} else {
write_uri_from_node(writer, node);
@@ -939,12 +935,11 @@ serd_writer_finish(SerdWriter* writer)
}
SerdWriter*
-serd_writer_new(SerdSyntax syntax,
- SerdWriterFlags flags,
- SerdEnv* env,
- const SerdURIView* base_uri,
- SerdSink ssink,
- void* stream)
+serd_writer_new(SerdSyntax syntax,
+ SerdWriterFlags flags,
+ SerdEnv* env,
+ SerdSink ssink,
+ void* stream)
{
const WriteContext context = WRITE_CONTEXT_NULL;
SerdWriter* writer = (SerdWriter*)calloc(1, sizeof(SerdWriter));
@@ -954,7 +949,6 @@ serd_writer_new(SerdSyntax syntax,
writer->env = env;
writer->root_node = NULL;
writer->root_uri = SERD_URI_NULL;
- writer->base_uri = base_uri ? *base_uri : SERD_URI_NULL;
writer->anon_stack = serd_stack_new(4 * sizeof(WriteContext));
writer->context = context;
writer->list_subj = NULL;
@@ -992,22 +986,24 @@ serd_writer_chop_blank_prefix(SerdWriter* writer, const char* prefix)
SerdStatus
serd_writer_set_base_uri(SerdWriter* writer, const SerdNode* uri)
{
- if (!serd_env_set_base_uri(writer->env, uri)) {
- serd_env_base_uri(writer->env, &writer->base_uri);
+ if (uri->type != SERD_URI) {
+ return SERD_ERR_BAD_ARG;
+ }
- if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) {
- if (ctx(writer, FIELD_GRAPH) || ctx(writer, FIELD_SUBJECT)) {
- sink(" .\n\n", 4, writer);
- reset_context(writer, true);
- }
- sink("@base <", 7, writer);
- sink(serd_node_string(uri), uri->length, writer);
- sink("> .\n", 4, writer);
+ serd_env_set_base_uri(writer->env, serd_node_string_view(uri));
+
+ if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) {
+ if (ctx(writer, FIELD_GRAPH) || ctx(writer, FIELD_SUBJECT)) {
+ sink(" .\n\n", 4, writer);
+ reset_context(writer, true);
}
- writer->indent = 0;
- return reset_context(writer, true);
+ sink("@base <", 7, writer);
+ sink(serd_node_string(uri), uri->length, writer);
+ sink("> .\n", 4, writer);
}
- return SERD_ERR_UNKNOWN;
+
+ writer->indent = 0;
+ return reset_context(writer, true);
}
SerdStatus
@@ -1019,7 +1015,7 @@ serd_writer_set_root_uri(SerdWriter* writer, const SerdNode* uri)
if (uri) {
writer->root_node = serd_node_copy(uri);
- writer->root_uri = serd_parse_uri(serd_node_string(writer->root_node));
+ writer->root_uri = serd_node_uri_view(writer->root_node);
}
return SERD_SUCCESS;
@@ -1030,22 +1026,32 @@ serd_writer_set_prefix(SerdWriter* writer,
const SerdNode* name,
const SerdNode* uri)
{
- if (!serd_env_set_prefix(writer->env, name, uri)) {
- if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) {
- if (ctx(writer, FIELD_GRAPH) || ctx(writer, FIELD_SUBJECT)) {
- sink(" .\n\n", 4, writer);
- reset_context(writer, true);
- }
- sink("@prefix ", 8, writer);
- sink(serd_node_string(name), name->length, writer);
- sink(": <", 3, writer);
- write_uri_from_node(writer, uri);
- sink("> .\n", 4, writer);
+ SerdStatus st = SERD_SUCCESS;
+
+ if (name->type != SERD_LITERAL || uri->type != SERD_URI) {
+ return SERD_ERR_BAD_ARG;
+ }
+
+ if ((st = serd_env_set_prefix(writer->env,
+ serd_node_string_view(name),
+ serd_node_string_view(uri)))) {
+ return st;
+ }
+
+ if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) {
+ if (ctx(writer, FIELD_GRAPH) || ctx(writer, FIELD_SUBJECT)) {
+ sink(" .\n\n", 4, writer);
+ reset_context(writer, true);
}
- writer->indent = 0;
- return reset_context(writer, true);
+ sink("@prefix ", 8, writer);
+ sink(serd_node_string(name), name->length, writer);
+ sink(": <", 3, writer);
+ write_uri_from_node(writer, uri);
+ sink("> .\n", 4, writer);
}
- return SERD_ERR_UNKNOWN;
+
+ writer->indent = 0;
+ return reset_context(writer, true);
}
void