aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--serd/serd.h10
-rw-r--r--src/node.c14
-rw-r--r--tests/serd_test.c10
3 files changed, 34 insertions, 0 deletions
diff --git a/serd/serd.h b/serd/serd.h
index fd0912e2..ffdca47f 100644
--- a/serd/serd.h
+++ b/serd/serd.h
@@ -493,6 +493,16 @@ serd_node_new_literal(const char* str,
const char* lang);
/**
+ Create a new blank node.
+
+ Note this function measures `str`, which is a common bottleneck.
+ Use sord_node_from_serd_node() instead if `str` is already measured.
+*/
+SERD_API
+SerdNode*
+serd_node_new_blank(const char* str);
+
+/**
Return a deep copy of `node`.
*/
SERD_API
diff --git a/src/node.c b/src/node.c
index c06cb88d..a40ac937 100644
--- a/src/node.c
+++ b/src/node.c
@@ -160,6 +160,20 @@ serd_node_new_literal(const char* str,
}
SerdNode*
+serd_node_new_blank(const char* str)
+{
+ if (!str) {
+ return NULL;
+ }
+
+ const size_t n_bytes = strlen(str);
+ SerdNode* node = serd_node_malloc(n_bytes, 0, SERD_BLANK);
+ memcpy(serd_node_buffer(node), str, n_bytes);
+ node->n_bytes = n_bytes;
+ return node;
+}
+
+SerdNode*
serd_node_copy(const SerdNode* node)
{
if (!node) {
diff --git a/tests/serd_test.c b/tests/serd_test.c
index 816eb83c..5d5633b3 100644
--- a/tests/serd_test.c
+++ b/tests/serd_test.c
@@ -366,6 +366,16 @@ main(void)
serd_node_free(rel);
serd_node_free(base);
+ // Test serd_node_new_blank
+
+ assert(!serd_node_new_blank(NULL));
+
+ SerdNode* blank = serd_node_new_blank("b0");
+ assert(serd_node_get_length(blank) == 2);
+ assert(serd_node_get_flags(blank) == 0);
+ assert(!strcmp(serd_node_get_string(blank), "b0"));
+ serd_node_free(blank);
+
// Test SerdEnv
SerdWorld* world = serd_world_new();