aboutsummaryrefslogtreecommitdiffstats
path: root/src/node.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2017-07-09 14:59:05 +0200
committerDavid Robillard <d@drobilla.net>2017-07-09 14:59:05 +0200
commit4d535bbe0390ed4f03c611e433145c9e49cbf3ad (patch)
tree3ec86327944909c214dabe419ef67c3400fb1aec /src/node.c
parent4270fbbc761e4d36e9fc28a361b7e8d7c21166d2 (diff)
downloadserd-4d535bbe0390ed4f03c611e433145c9e49cbf3ad.tar.gz
serd-4d535bbe0390ed4f03c611e433145c9e49cbf3ad.tar.bz2
serd-4d535bbe0390ed4f03c611e433145c9e49cbf3ad.zip
Add serd_node_from_substring()
This allows creating nodes in-place from substrings of other strings to allow zero-copy serialization from existing delimited buffers.
Diffstat (limited to 'src/node.c')
-rw-r--r--src/node.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/node.c b/src/node.c
index 42992917..10df10d9 100644
--- a/src/node.c
+++ b/src/node.c
@@ -48,6 +48,22 @@ serd_node_from_string(SerdType type, const uint8_t* str)
SERD_API
SerdNode
+serd_node_from_substring(SerdType type, const uint8_t* str, const size_t len)
+{
+ if (!str) {
+ return SERD_NODE_NULL;
+ }
+
+ uint32_t flags = 0;
+ size_t buf_n_bytes = 0;
+ const size_t buf_n_chars = serd_substrlen(str, len, &buf_n_bytes, &flags);
+ assert(buf_n_bytes <= len);
+ SerdNode ret = { str, buf_n_bytes, buf_n_chars, flags, type };
+ return ret;
+}
+
+SERD_API
+SerdNode
serd_node_copy(const SerdNode* node)
{
if (!node || !node->buf) {
@@ -187,7 +203,7 @@ serd_node_new_file_uri(const uint8_t* path,
serd_uri_parse(chunk.buf, out);
}
- return serd_node_from_string(SERD_URI, chunk.buf);
+ return serd_node_from_substring(SERD_URI, chunk.buf, chunk.len);
}
SERD_API