From 3dbc6d05b83aca6178bc3831c33738d151b41f77 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 28 Jun 2021 19:54:33 -0400 Subject: Reduce complexity of URI node writing functions --- src/writer.c | 59 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 21 deletions(-) (limited to 'src/writer.c') diff --git a/src/writer.c b/src/writer.c index 07eae37f..4d808ead 100644 --- a/src/writer.c +++ b/src/writer.c @@ -740,6 +740,43 @@ is_name(const char* buf, const size_t len) return true; } +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, @@ -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 -- cgit v1.2.1