aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2022-01-12 16:18:17 -0500
committerDavid Robillard <d@drobilla.net>2022-01-28 21:57:29 -0500
commit77eebec72c0507309ce89f8cdaceff4adfd147cf (patch)
treea0ce99f34ed769e980d094b7df51761ecf9dcf1e
parentd91b3c9ec59976c40742c852d25dccf67b445e61 (diff)
downloadserd-77eebec72c0507309ce89f8cdaceff4adfd147cf.tar.gz
serd-77eebec72c0507309ce89f8cdaceff4adfd147cf.tar.bz2
serd-77eebec72c0507309ce89f8cdaceff4adfd147cf.zip
Add serd_nodes_file_uri()
-rw-r--r--include/serd/serd.h12
-rw-r--r--src/nodes.c26
-rw-r--r--test/test_uri.c10
3 files changed, 44 insertions, 4 deletions
diff --git a/include/serd/serd.h b/include/serd/serd.h
index 7a280b64..52245077 100644
--- a/include/serd/serd.h
+++ b/include/serd/serd.h
@@ -1460,6 +1460,18 @@ const SerdNode* SERD_ALLOCATED
serd_nodes_parsed_uri(SerdNodes* SERD_NONNULL nodes, SerdURIView uri);
/**
+ Make a file URI node from a path and optional hostname.
+
+ A new node will be constructed with serd_node_construct_file_uri() if an
+ equivalent one is not already in the set.
+*/
+SERD_API
+const SerdNode* SERD_ALLOCATED
+serd_nodes_file_uri(SerdNodes* SERD_NONNULL nodes,
+ SerdStringView path,
+ SerdStringView hostname);
+
+/**
Make a literal node with optional datatype or language.
This can create complex literals with an associated datatype URI or language
diff --git a/src/nodes.c b/src/nodes.c
index d488fc71..b989259d 100644
--- a/src/nodes.c
+++ b/src/nodes.c
@@ -504,6 +504,32 @@ serd_nodes_parsed_uri(SerdNodes* const nodes, const SerdURIView uri)
}
const SerdNode*
+serd_nodes_file_uri(SerdNodes* const nodes,
+ const SerdStringView path,
+ const SerdStringView hostname)
+{
+ assert(nodes);
+
+ /* Computing a hash for the serialised URI here would be quite complex, so,
+ since this isn't expected to be a particularly hot case, we just allocate
+ a new entry and try to do a normal insertion. */
+
+ // Determine how much space the node needs
+ SerdWriteResult r = serd_node_construct_file_uri(0u, NULL, path, hostname);
+ assert(r.status == SERD_OVERFLOW); // Currently no other errors
+
+ // Allocate a new entry to write the URI node into
+ NodesEntry* const entry = new_entry(nodes->allocator, r.count);
+ if (entry) {
+ r = serd_node_construct_file_uri(r.count, &entry->node, path, hostname);
+ assert(!r.status);
+ (void)r;
+ }
+
+ return serd_nodes_manage_entry(nodes, entry);
+}
+
+const SerdNode*
serd_nodes_blank(SerdNodes* const nodes, const SerdStringView string)
{
return serd_nodes_token(nodes, SERD_BLANK, string);
diff --git a/test/test_uri.c b/test/test_uri.c
index 2b0c9b16..ec102d6f 100644
--- a/test/test_uri.c
+++ b/test/test_uri.c
@@ -85,12 +85,14 @@ test_file_uri(const char* const hostname,
expected_path = path;
}
- SerdNode* node =
- serd_new_file_uri(NULL, SERD_STRING(path), SERD_OPTIONAL_STRING(hostname));
+ SerdNodes* const nodes = serd_nodes_new(NULL);
+
+ const SerdNode* node = serd_nodes_file_uri(
+ nodes, SERD_STRING(path), SERD_OPTIONAL_STRING(hostname));
const char* node_str = serd_node_string(node);
char* out_hostname = NULL;
- char* out_path = serd_parse_file_uri(NULL, node_str, &out_hostname);
+ char* const out_path = serd_parse_file_uri(NULL, node_str, &out_hostname);
assert(!strcmp(node_str, expected_uri));
assert((hostname && out_hostname) || (!hostname && !out_hostname));
@@ -99,7 +101,7 @@ test_file_uri(const char* const hostname,
serd_free(NULL, out_path);
serd_free(NULL, out_hostname);
- serd_node_free(NULL, node);
+ serd_nodes_free(nodes);
}
static void