aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-06-28 19:54:33 -0400
committerDavid Robillard <d@drobilla.net>2022-01-13 23:04:19 -0500
commit3dbc6d05b83aca6178bc3831c33738d151b41f77 (patch)
tree36c5bfe6f57bee582d2a009013ed5b04232370fa
parent9b762570b088c8bed917b80ff3e96efba7ef4baf (diff)
downloadserd-3dbc6d05b83aca6178bc3831c33738d151b41f77.tar.gz
serd-3dbc6d05b83aca6178bc3831c33738d151b41f77.tar.bz2
serd-3dbc6d05b83aca6178bc3831c33738d151b41f77.zip
Reduce complexity of URI node writing functions
-rw-r--r--src/writer.c59
1 files changed, 38 insertions, 21 deletions
diff --git a/src/writer.c b/src/writer.c
index 07eae37f..4d808ead 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -741,6 +741,43 @@ is_name(const char* buf, const size_t len)
}
SERD_WARN_UNUSED_RESULT static SerdStatus
+write_full_uri_node(SerdWriter* const writer, const SerdNode* const node)
+{
+ SerdStatus st = SERD_SUCCESS;
+ const bool resolve_disabled = writer->flags & SERD_WRITE_UNRESOLVED;
+
+ if (resolve_disabled || !serd_env_base_uri(writer->env)) {
+ // Resolution disabled or we have no base URI, simply write the node
+ TRY(st, esink("<", 1, writer));
+ TRY(st, write_uri_from_node(writer, node));
+ TRY(st, esink(">", 1, writer));
+ return SERD_SUCCESS;
+ }
+
+ // Resolve the input node URI reference to a (hopefully) absolute URI
+ const SerdURIView base_uri = serd_env_base_uri_view(writer->env);
+ SerdURIView uri = serd_parse_uri(serd_node_string(node));
+ SerdURIView abs_uri = serd_resolve_uri(uri, base_uri);
+
+ // Determine if we should write the absolute URI or make it relative again
+ const bool base_rooted = uri_is_under(&base_uri, &writer->root_uri);
+ const SerdURIView* root = base_rooted ? &writer->root_uri : &base_uri;
+ const bool rooted = uri_is_under(&abs_uri, root);
+ const bool write_abs = !supports_abbrev(writer) || !rooted;
+
+ TRY(st, esink("<", 1, writer));
+
+ UriSinkContext context = {writer, SERD_SUCCESS};
+ if (write_abs) {
+ serd_write_uri(abs_uri, uri_sink, &context);
+ } else {
+ serd_write_uri(serd_relative_uri(uri, base_uri), uri_sink, &context);
+ }
+
+ return st ? st : esink(">", 1, writer);
+}
+
+SERD_WARN_UNUSED_RESULT static SerdStatus
write_uri_node(SerdWriter* const writer,
const SerdNode* const node,
const SerdField field)
@@ -779,27 +816,7 @@ write_uri_node(SerdWriter* const writer,
return SERD_ERR_BAD_ARG;
}
- TRY(st, esink("<", 1, writer));
- if (!(writer->flags & SERD_WRITE_UNRESOLVED) &&
- 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;
- UriSinkContext ctx = {writer, SERD_SUCCESS};
- const bool write_abs =
- (!supports_abbrev(writer) || !uri_is_under(&abs_uri, root));
-
- write_abs
- ? serd_write_uri(abs_uri, uri_sink, &ctx)
- : serd_write_uri(serd_relative_uri(uri, base_uri), uri_sink, &ctx);
-
- } else {
- TRY(st, write_uri_from_node(writer, node));
- }
-
- return st ? st : esink(">", 1, writer);
+ return write_full_uri_node(writer, node);
}
SERD_WARN_UNUSED_RESULT static SerdStatus