From a63a8f19c54dfee75e092819d6622b8d36fe1d39 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 22 Jul 2021 23:39:39 -0400 Subject: Expose low-level node construction API --- src/node.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'src/node.h') 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 #include #include #include @@ -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); -- cgit v1.2.1