aboutsummaryrefslogtreecommitdiffstats
path: root/src/node.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-07-17 17:31:53 -0400
committerDavid Robillard <d@drobilla.net>2022-01-13 23:03:45 -0500
commit30f3e6fc2c1e24c429d5d0b7100dc449ade6703f (patch)
treeb8511de2276fbc23d06dab1c83fd86b4f1a96b10 /src/node.c
parentd88b5a797f8502c40d0da964d653a1cd3028c872 (diff)
downloadserd-30f3e6fc2c1e24c429d5d0b7100dc449ade6703f.tar.gz
serd-30f3e6fc2c1e24c429d5d0b7100dc449ade6703f.tar.bz2
serd-30f3e6fc2c1e24c429d5d0b7100dc449ade6703f.zip
Clean up base64 node construction and access API
Diffstat (limited to 'src/node.c')
-rw-r--r--src/node.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/node.c b/src/node.c
index 5016200d..eafcec38 100644
--- a/src/node.c
+++ b/src/node.c
@@ -182,6 +182,13 @@ serd_node_zero_pad(SerdNode* node)
}
}
+static SerdWriteResult
+result(const SerdStatus status, const size_t count)
+{
+ const SerdWriteResult result = {status, count};
+ return result;
+}
+
SerdNode*
serd_new_simple_node(const SerdNodeType type, const SerdStringView str)
{
@@ -386,6 +393,26 @@ serd_get_integer(const SerdNode* const node)
return value;
}
+size_t
+serd_get_base64_size(const SerdNode* const node)
+{
+ return exess_base64_decoded_size(serd_node_length(node));
+}
+
+SerdWriteResult
+serd_get_base64(const SerdNode* const node,
+ const size_t buf_size,
+ void* const buf)
+{
+ const size_t max_size = serd_get_base64_size(node);
+ const ExessVariableResult r =
+ exess_read_base64(buf_size, buf, serd_node_string(node));
+
+ return r.status == EXESS_NO_SPACE ? result(SERD_ERR_OVERFLOW, max_size)
+ : r.status ? result(SERD_ERR_BAD_SYNTAX, 0u)
+ : result(SERD_SUCCESS, r.write_count);
+}
+
SerdNode*
serd_node_copy(const SerdNode* node)
{