aboutsummaryrefslogtreecommitdiff
path: root/lib/internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/internal.h')
-rw-r--r--lib/internal.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/lib/internal.h b/lib/internal.h
new file mode 100644
index 0000000..3ad3ac5
--- /dev/null
+++ b/lib/internal.h
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+
+#pragma once
+
+#define HKVS_API extern __attribute__((__visibility__("protected"), __nothrow__))
+#define HKVS_INTERNAL extern __attribute__((__visibility__("hidden"), __nothrow__))
+
+#define HKVS_PURE __attribute__((__pure__))
+
+#define HKVS_CONST __attribute__((__const__))
+
+#define HKVS_NORETURN __attribute__((__noreturn__, __cold__))
+
+#define HKVS_FALLTHROUGH __attribute__((__fallthrough__))
+
+#include <hkvs.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+HKVS_INLINE void hkvs_assume(bool cond) {
+ if(!cond) {
+#ifdef HKVS_FUZZING
+ hkvs_die("assumption failed");
+#else
+ __builtin_unreachable();
+#endif
+ }
+}
+
+HKVS_INLINE uint8_t hkvs_read_u8(const char *pv) {
+ const uint8_t *p = (const uint8_t*)pv;
+ return *p;
+}
+
+HKVS_INLINE void hkvs_write_u8(char *pv, uint8_t v) {
+ uint8_t *p = (uint8_t*)pv;
+ p[0] = v;
+}
+HKVS_INLINE uint16_t hkvs_read_u16(const char *pv) {
+ const uint8_t *p = (const uint8_t*)pv;
+ return (uint16_t)(
+ (uint16_t)p[0] |
+ (uint16_t)p[1] << 8
+ );
+}
+
+HKVS_INLINE void hkvs_write_u16(char *pv, uint16_t v) {
+ uint8_t *p = (uint8_t*)pv;
+ p[0] = (uint8_t)(v >> 0);
+ p[1] = (uint8_t)(v >> 8);
+}
+
+HKVS_INLINE uint32_t hkvs_read_u32(const char *pv) {
+ const uint8_t *p = (const uint8_t*)pv;
+ return (uint32_t)(
+ (uint32_t)p[0] |
+ (uint32_t)p[1] << 8 |
+ (uint32_t)p[2] << 16 |
+ (uint32_t)p[3] << 24
+ );
+}
+
+HKVS_INLINE void hkvs_write_u32(char *pv, uint32_t v) {
+ uint8_t *p = (uint8_t*)pv;
+ p[0] = (uint8_t)(v >> 0);
+ p[1] = (uint8_t)(v >> 8);
+ p[2] = (uint8_t)(v >> 16);
+ p[3] = (uint8_t)(v >> 24);
+}
+
+HKVS_INLINE uint64_t hkvs_read_u64(const char *pv) {
+ const uint8_t *p = (const uint8_t*)pv;
+ return (uint64_t)(
+ (uint64_t)p[0] |
+ (uint64_t)p[1] << 8 |
+ (uint64_t)p[2] << 16 |
+ (uint64_t)p[3] << 24 |
+ (uint64_t)p[4] << 32 |
+ (uint64_t)p[5] << 40 |
+ (uint64_t)p[6] << 48 |
+ (uint64_t)p[7] << 56
+ );
+}
+
+HKVS_INLINE void hkvs_write_u64(char *pv, uint64_t v) {
+ uint8_t *p = (uint8_t*)pv;
+ p[0] = (uint8_t)(v >> 0);
+ p[1] = (uint8_t)(v >> 8);
+ p[2] = (uint8_t)(v >> 16);
+ p[3] = (uint8_t)(v >> 24);
+ p[4] = (uint8_t)(v >> 32);
+ p[5] = (uint8_t)(v >> 40);
+ p[6] = (uint8_t)(v >> 48);
+ p[7] = (uint8_t)(v >> 56);
+}
+
+HKVS_INTERNAL HKVS_NORETURN void hkvs_die(const char *msg);
+
+HKVS_INTERNAL HKVS_NORETURN void hkvs_die_ext(const char *func, const char *file, int line, const char *msg);
+
+#define hkvs_die(msg) hkvs_die_ext(__func__, __FILE__, __LINE__, msg)
+
+HKVS_INTERNAL HKVS_PURE uint64_t hkvs_hash(const char *hk, const char *data, size_t data_size);