aboutsummaryrefslogtreecommitdiffstats
path: root/src/node.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-05-13 00:48:31 +0200
committerDavid Robillard <d@drobilla.net>2018-05-27 21:10:21 +0200
commit52d0ac81eee3462c6839c7374ffe57329f7702b7 (patch)
treee40ed9149fb64122f8e4bc349639762baed11c3f /src/node.c
parent48a9091b17435512f85d9ff202a5a7ea46c6af2a (diff)
downloadserd-52d0ac81eee3462c6839c7374ffe57329f7702b7.tar.gz
serd-52d0ac81eee3462c6839c7374ffe57329f7702b7.tar.bz2
serd-52d0ac81eee3462c6839c7374ffe57329f7702b7.zip
Zero node padding before passing to reader sinks
Diffstat (limited to 'src/node.c')
-rw-r--r--src/node.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/node.c b/src/node.c
index 32852dc1..0b0a51eb 100644
--- a/src/node.c
+++ b/src/node.c
@@ -217,6 +217,24 @@ serd_node_new_uri(const char* str)
return serd_node_new_simple(SERD_URI, str);
}
+/**
+ Zero node padding.
+
+ This is used for nodes which live in re-used stack memory during reading,
+ which must be normalized before being passed to a sink so comparison will
+ work correctly.
+*/
+void
+serd_node_zero_pad(SerdNode* node)
+{
+ char* buf = serd_node_buffer(node);
+ const size_t size = node->n_bytes;
+ const size_t padded_size = serd_node_pad_size(node->n_bytes);
+ if (padded_size > size) {
+ memset(buf + size, 0, padded_size - size);
+ }
+}
+
SERD_API
SerdNode*
serd_node_copy(const SerdNode* node)
@@ -226,6 +244,13 @@ serd_node_copy(const SerdNode* node)
}
const size_t size = serd_node_total_size(node);
+#ifndef NDEBUG
+ const size_t unpadded_size = node->n_bytes;
+ const size_t padded_size = serd_node_pad_size(node->n_bytes);
+ for (size_t i = 0; i < padded_size - unpadded_size; ++i) {
+ assert(serd_node_buffer_c(node)[unpadded_size + i] == '\0');
+ }
+#endif
SerdNode* copy = (SerdNode*)calloc(1, size + 3);
memcpy(copy, node, size);
return copy;