aboutsummaryrefslogtreecommitdiffstats
path: root/src/node.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-02-20 16:47:55 -0500
committerDavid Robillard <d@drobilla.net>2022-01-13 20:05:40 -0500
commita25c9927ce648bc83064bb8ea91c9ca8b8a9582f (patch)
tree26a80c2d82199263fb1dde9c0c453596e7948218 /src/node.c
parent33df293ad33cc2cd56e121770ecc2a684f181f2c (diff)
downloadserd-a25c9927ce648bc83064bb8ea91c9ca8b8a9582f.tar.gz
serd-a25c9927ce648bc83064bb8ea91c9ca8b8a9582f.tar.bz2
serd-a25c9927ce648bc83064bb8ea91c9ca8b8a9582f.zip
Simplify URI API and implementation
Diffstat (limited to 'src/node.c')
-rw-r--r--src/node.c120
1 files changed, 47 insertions, 73 deletions
diff --git a/src/node.c b/src/node.c
index 07010684..854772ac 100644
--- a/src/node.c
+++ b/src/node.c
@@ -45,7 +45,7 @@ static const size_t serd_node_align = 2 * sizeof(uint64_t);
static size_t
serd_uri_string_length(const SerdURIView* const uri)
{
- size_t len = uri->path_base.len;
+ size_t len = uri->path_prefix.len;
#define ADD_LEN(field, n_delims) \
if ((field).len) { \
@@ -164,29 +164,56 @@ serd_node_equals(const SerdNode* const a, const SerdNode* const b)
}
SerdNode*
-serd_new_uri_from_node(const SerdNode* const uri_node,
- const SerdURIView* const base,
- SerdURIView* const out)
+serd_new_uri(const char* const str)
{
- const char* uri_str = serd_node_string(uri_node);
- return (uri_node && uri_node->type == SERD_URI && uri_str)
- ? serd_new_uri_from_string(uri_str, base, out)
- : NULL;
+ const size_t length = strlen(str);
+ SerdNode* node = serd_node_malloc(length, 0, SERD_URI);
+ memcpy(serd_node_buffer(node), str, length);
+ node->length = length;
+ return node;
}
SerdNode*
-serd_new_uri_from_string(const char* const str,
- const SerdURIView* const base,
- SerdURIView* const out)
+serd_new_parsed_uri(const SerdURIView uri)
+{
+ const size_t len = serd_uri_string_length(&uri);
+ SerdNode* const node = serd_node_malloc(len, 0, SERD_URI);
+ char* ptr = serd_node_buffer(node);
+ const size_t actual_len = serd_write_uri(uri, string_sink, &ptr);
+
+ serd_node_buffer(node)[actual_len] = '\0';
+ node->length = actual_len;
+
+ return node;
+}
+
+static SerdNode*
+serd_new_from_uri(const SerdURIView uri, const SerdURIView base)
{
- if (!str || str[0] == '\0') {
- // Empty URI => Base URI, or nothing if no base is given
- return base ? serd_new_uri(base, NULL, out) : NULL;
+ const SerdURIView abs_uri = serd_resolve_uri(uri, base);
+ const size_t len = serd_uri_string_length(&abs_uri);
+ SerdNode* node = serd_node_malloc(len, 0, SERD_URI);
+ char* ptr = serd_node_buffer(node);
+ const size_t actual_len = serd_write_uri(abs_uri, string_sink, &ptr);
+
+ serd_node_buffer(node)[actual_len] = '\0';
+ node->length = actual_len;
+
+ return node;
+}
+
+SerdNode*
+serd_new_resolved_uri(const SerdStringView string, const SerdURIView base)
+{
+ const SerdURIView uri = serd_parse_uri(string.buf);
+ SerdNode* const result = serd_new_from_uri(uri, base);
+
+ if (!serd_uri_string_has_scheme(serd_node_string(result))) {
+ serd_node_free(result);
+ return NULL;
}
- SerdURIView uri;
- serd_uri_parse(str, &uri);
- return serd_new_uri(&uri, base, out); // Resolve/Serialise
+ return result;
}
static bool
@@ -270,61 +297,13 @@ serd_new_file_uri(const char* const path,
SerdNode* node =
serd_new_substring(SERD_URI, (const char*)buffer.buf, buffer.len);
if (out) {
- serd_uri_parse(serd_node_buffer(node), out);
+ *out = serd_parse_uri(serd_node_buffer(node));
}
free(buffer.buf);
return node;
}
-SerdNode*
-serd_new_uri(const SerdURIView* const uri,
- const SerdURIView* const base,
- SerdURIView* const out)
-{
- SerdURIView abs_uri = *uri;
- if (base) {
- serd_uri_resolve(uri, base, &abs_uri);
- }
-
- const size_t len = serd_uri_string_length(&abs_uri);
- SerdNode* node = serd_node_malloc(len, 0, SERD_URI);
- char* ptr = serd_node_buffer(node);
- const size_t actual_len = serd_uri_serialise(&abs_uri, string_sink, &ptr);
-
- serd_node_buffer(node)[actual_len] = '\0';
- node->length = actual_len;
-
- if (out) {
- serd_uri_parse(serd_node_buffer(node), out); // TODO: avoid double parse
- }
-
- return node;
-}
-
-SerdNode*
-serd_new_relative_uri(const SerdURIView* const uri,
- const SerdURIView* const base,
- const SerdURIView* const root,
- SerdURIView* const out)
-{
- const size_t uri_len = serd_uri_string_length(uri);
- const size_t base_len = serd_uri_string_length(base);
- SerdNode* node = serd_node_malloc(uri_len + base_len, 0, SERD_URI);
- char* ptr = serd_node_buffer(node);
- const size_t actual_len =
- serd_uri_serialise_relative(uri, base, root, string_sink, &ptr);
-
- serd_node_buffer(node)[actual_len] = '\0';
- node->length = actual_len;
-
- if (out) {
- serd_uri_parse(serd_node_buffer(node), out); // TODO: avoid double parse
- }
-
- return node;
-}
-
static unsigned
serd_digits(const double abs)
{
@@ -461,13 +440,8 @@ serd_node_string_view(const SerdNode* const node)
SerdURIView
serd_node_uri_view(const SerdNode* const node)
{
- SerdURIView result = SERD_URI_NULL;
-
- if (node->type == SERD_URI) {
- serd_uri_parse(serd_node_string(node), &result);
- }
-
- return result;
+ return (node->type == SERD_URI) ? serd_parse_uri(serd_node_string(node))
+ : SERD_URI_NULL;
}
SerdNodeFlags