aboutsummaryrefslogtreecommitdiffstats
path: root/src/node.h
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-07-22 23:39:39 -0400
committerDavid Robillard <d@drobilla.net>2022-01-14 19:37:51 -0500
commita63a8f19c54dfee75e092819d6622b8d36fe1d39 (patch)
tree3c2fe49c257e27d369365a0c08c1524baaf74a4c /src/node.h
parent64e81dfd6ec04995fd396269deb6b32fe2d1192d (diff)
downloadserd-a63a8f19c54dfee75e092819d6622b8d36fe1d39.tar.gz
serd-a63a8f19c54dfee75e092819d6622b8d36fe1d39.tar.bz2
serd-a63a8f19c54dfee75e092819d6622b8d36fe1d39.zip
Expose low-level node construction API
Diffstat (limited to 'src/node.h')
-rw-r--r--src/node.h52
1 files changed, 50 insertions, 2 deletions
diff --git a/src/node.h b/src/node.h
index affa2efc..ab10a3e7 100644
--- a/src/node.h
+++ b/src/node.h
@@ -20,6 +20,7 @@
#include "exess/exess.h"
#include "serd/serd.h"
+#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
@@ -32,6 +33,31 @@ struct SerdNodeImpl {
static const size_t serd_node_align = 2 * sizeof(uint64_t);
+#if SIZE_MAX == UINT64_MAX
+
+static inline size_t
+serd_node_pad_length(const size_t n_bytes)
+{
+ const size_t align = sizeof(SerdNode);
+
+ assert((align & (align - 1u)) == 0u);
+
+ return (n_bytes + align + 2u) & ~(align - 1u);
+}
+
+#else
+
+static inline size_t
+serd_node_pad_length(const size_t n_bytes)
+{
+ const size_t pad = sizeof(SerdNode) - (n_bytes + 2) % sizeof(SerdNode);
+ const size_t size = n_bytes + 2 + pad;
+ assert(size % sizeof(SerdNode) == 0);
+ return size;
+}
+
+#endif
+
static inline char* SERD_NONNULL
serd_node_buffer(SerdNode* SERD_NONNULL node)
{
@@ -44,6 +70,19 @@ serd_node_buffer_c(const SerdNode* SERD_NONNULL node)
return (const char*)(node + 1);
}
+static inline SerdNode* SERD_NONNULL
+serd_node_meta(SerdNode* const SERD_NONNULL node)
+{
+ return node + 1 + (serd_node_pad_length(node->length) / sizeof(SerdNode));
+}
+
+static inline const SerdNode* SERD_NONNULL
+serd_node_meta_c(const SerdNode* const SERD_NONNULL node)
+{
+ assert(node->flags & (SERD_HAS_DATATYPE | SERD_HAS_LANGUAGE));
+ return node + 1 + (serd_node_pad_length(node->length) / sizeof(SerdNode));
+}
+
static inline const char* SERD_NONNULL
serd_node_string_i(const SerdNode* const SERD_NONNULL node)
{
@@ -57,8 +96,17 @@ serd_node_pattern_match(const SerdNode* SERD_NULLABLE a,
return !a || !b || serd_node_equals(a, b);
}
+SERD_PURE_FUNC
+bool
+is_langtag(SerdStringView string);
+
+SERD_MALLOC_FUNC
+SerdNode* SERD_ALLOCATED
+serd_node_malloc(size_t size);
+
+SERD_MALLOC_FUNC
SerdNode* SERD_ALLOCATED
-serd_node_malloc(size_t length, SerdNodeFlags flags, SerdNodeType type);
+serd_node_try_malloc(SerdWriteResult result);
void
serd_node_set(SerdNode* SERD_NULLABLE* SERD_NONNULL dst,
@@ -66,7 +114,7 @@ serd_node_set(SerdNode* SERD_NULLABLE* SERD_NONNULL dst,
SERD_PURE_FUNC
size_t
-serd_node_total_size(const SerdNode* SERD_NULLABLE node);
+serd_node_total_size(const SerdNode* SERD_NONNULL node);
void
serd_node_zero_pad(SerdNode* SERD_NONNULL node);