diff options
author | David Robillard <d@drobilla.net> | 2018-04-29 18:29:03 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2018-05-27 18:23:15 +0200 |
commit | b81b27fd762c3a3880070277a6d563a1c6913c1a (patch) | |
tree | ad3aa5def3cffa2f0d4abf564f748f0aea00e649 | |
parent | 3efbbdb49f4122d3879007227eafc5afe520d7c5 (diff) | |
download | serd-b81b27fd762c3a3880070277a6d563a1c6913c1a.tar.gz serd-b81b27fd762c3a3880070277a6d563a1c6913c1a.tar.bz2 serd-b81b27fd762c3a3880070277a6d563a1c6913c1a.zip |
Make serd_node_new_literal take datatype as a node
-rw-r--r-- | serd/serd.h | 4 | ||||
-rw-r--r-- | src/node.c | 14 | ||||
-rw-r--r-- | tests/serd_test.c | 15 |
3 files changed, 22 insertions, 11 deletions
diff --git a/serd/serd.h b/serd/serd.h index 715ff22a..ae581886 100644 --- a/serd/serd.h +++ b/serd/serd.h @@ -460,7 +460,9 @@ serd_node_new_substring(SerdType type, const char* str, size_t len); */ SERD_API SerdNode* -serd_node_new_literal(const char* str, const char* datatype, const char* lang); +serd_node_new_literal(const char* str, + const SerdNode* datatype, + const char* lang); /** Return a deep copy of `node`. @@ -113,9 +113,13 @@ serd_node_new_substring(SerdType type, const char* str, const size_t len) } SerdNode* -serd_node_new_literal(const char* str, const char* datatype, const char* lang) +serd_node_new_literal(const char* str, + const SerdNode* datatype, + const char* lang) { - if (!str || (lang && datatype && strcmp(datatype, NS_RDF "#langString"))) { + if (!str || (lang && datatype && + strcmp(serd_node_buffer_c(datatype), NS_RDF "#langString")) || + (datatype && serd_node_get_type(datatype) != SERD_URI)) { return NULL; } @@ -138,16 +142,14 @@ serd_node_new_literal(const char* str, const char* datatype, const char* lang) memcpy(serd_node_buffer(lang_node), lang, lang_len); } else if (datatype) { flags |= SERD_HAS_DATATYPE; - const size_t datatype_len = strlen(datatype); + const size_t datatype_len = strlen(serd_node_buffer_c(datatype)); const size_t total_len = len + sizeof(SerdNode) + datatype_len; node = serd_node_malloc(total_len, flags, SERD_LITERAL); memcpy(serd_node_buffer(node), str, n_bytes); node->n_bytes = n_bytes; SerdNode* datatype_node = node + 1 + (len / serd_node_align); - datatype_node->type = SERD_URI; - datatype_node->n_bytes = datatype_len; - memcpy(serd_node_buffer(datatype_node), datatype, datatype_len); + memcpy(datatype_node, datatype, sizeof(SerdNode) + datatype_len); } else { node = serd_node_malloc(n_bytes, flags, SERD_LITERAL); memcpy(serd_node_buffer(node), str, n_bytes); diff --git a/tests/serd_test.c b/tests/serd_test.c index ccb3c5b6..a7008e9f 100644 --- a/tests/serd_test.c +++ b/tests/serd_test.c @@ -356,9 +356,12 @@ main(void) } serd_node_free(hello_l); - SerdNode* hello_dt = - serd_node_new_literal("hello_dt\"", "http://example.org/Thing", NULL); - if (serd_node_get_length(hello_dt) != 9 || + SerdNode* eg_Thing = + serd_node_new_uri_from_string("http://example.org/Thing", NULL, NULL); + + SerdNode* hello_dt = + serd_node_new_literal("hello_dt\"", eg_Thing, NULL); + if (serd_node_get_length(hello_dt) != 9 || strcmp(serd_node_get_string(hello_dt), "hello_dt\"") || serd_node_get_flags(hello_dt) != (SERD_HAS_QUOTE | SERD_HAS_DATATYPE) || strcmp(serd_node_get_string(serd_node_get_datatype(hello_dt)), @@ -366,6 +369,7 @@ main(void) FAILF("Bad node %s\n", serd_node_get_string(hello_dt)); } serd_node_free(hello_dt); + serd_node_free(eg_Thing); // Test serd_node_new_uri_from_string @@ -542,7 +546,9 @@ main(void) } } - SerdNode* t = serd_node_new_literal((char*)buf, "urn:Type", NULL); + SerdNode* urn_Type = serd_node_new_uri_from_string("urn:Type", NULL, NULL); + + SerdNode* t = serd_node_new_literal((char*)buf, urn_Type, NULL); SerdNode* l = serd_node_new_literal((char*)buf, NULL, "en"); const SerdNode* good[][5] = { { s, p, o }, { s, p, o }, @@ -587,6 +593,7 @@ main(void) serd_node_free(o); serd_node_free(t); serd_node_free(l); + serd_node_free(urn_Type); // Test buffer sink SerdBuffer buffer = { NULL, 0 }; |