From 8dbb1edfd28c73b02b3295a4f7a01869bd2237ec Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 29 Apr 2018 18:36:11 +0200 Subject: Add blank node API --- serd/serd.h | 10 ++++++++++ src/node.c | 14 ++++++++++++++ tests/serd_test.c | 16 ++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/serd/serd.h b/serd/serd.h index 9688ad4e..be819d55 100644 --- a/serd/serd.h +++ b/serd/serd.h @@ -484,6 +484,16 @@ serd_node_new_literal(const char* str, const SerdNode* datatype, 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); + /** Simple wrapper for serd_node_new_uri() to resolve a URI node. */ diff --git a/src/node.c b/src/node.c index 3c6c9d45..abe9304c 100644 --- a/src/node.c +++ b/src/node.c @@ -169,6 +169,20 @@ serd_node_new_literal(const char* str, return node; } +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) { diff --git a/tests/serd_test.c b/tests/serd_test.c index 2b50e647..d46e01ba 100644 --- a/tests/serd_test.c +++ b/tests/serd_test.c @@ -472,9 +472,23 @@ test_relative_uri(void) serd_node_free(base); } +static void +test_blank(void) +{ + 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); +} + static void test_env(void) { + SerdWorld* world = serd_world_new(); + SerdNode* u = serd_node_new_string(SERD_URI, "http://example.org/foo"); SerdNode* b = serd_node_new_string(SERD_CURIE, "invalid"); SerdNode* c = serd_node_new_string(SERD_CURIE, "eg.2:b"); @@ -527,6 +541,7 @@ test_env(void) serd_node_free(u); serd_env_free(env); + serd_world_free(world); } static void @@ -689,6 +704,7 @@ main(void) test_literal(); test_uri_from_string(); test_relative_uri(); + test_blank(); test_env(); test_read_chunks(); -- cgit v1.2.1