summaryrefslogtreecommitdiff
path: root/src/libecbor/ecbor_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libecbor/ecbor_internal.h')
-rw-r--r--src/libecbor/ecbor_internal.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/libecbor/ecbor_internal.h b/src/libecbor/ecbor_internal.h
new file mode 100644
index 0000000..9612c1a
--- /dev/null
+++ b/src/libecbor/ecbor_internal.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2018 Vasile Vilvoiu <vasi.vilvoiu@gmail.com>
+ *
+ * libecbor is free software; you can redistribute it and/or modify
+ * it under the terms of the MIT license. See LICENSE for details.
+ */
+
+#ifndef _ECBOR_INTERNAL_H_
+#define _ECBOR_INTERNAL_H_
+
+#include <stdint.h>
+#include <stddef.h>
+
+/* Don't rely on <stdbool.h> for this */
+#define false 0
+#define true 1
+
+/* CBOR major type 7 must not be exposed to user, but translated to other types */
+enum {
+ ECBOR_TYPE_SPECIAL = 7
+};
+
+/* Additional value meanings */
+enum {
+ ECBOR_ADDITIONAL_LAST_INTEGER = 23,
+
+ ECBOR_ADDITIONAL_1BYTE = 24,
+ ECBOR_ADDITIONAL_2BYTE = 25,
+ ECBOR_ADDITIONAL_4BYTE = 26,
+ ECBOR_ADDITIONAL_8BYTE = 27,
+
+ ECBOR_ADDITIONAL_INDEFINITE = 31
+};
+
+/* Simple value meanings */
+enum {
+ ECBOR_SIMPLE_FALSE = 20,
+ ECBOR_SIMPLE_TRUE = 21,
+ ECBOR_SIMPLE_NULL = 22,
+ ECBOR_SIMPLE_UNDEFINED = 23
+};
+
+/* Static item, for various initializations */
+static ecbor_item_t null_item = {
+ .type = ECBOR_TYPE_NONE,
+ .value = {
+ .tag = {
+ .tag_value = 0,
+ .child = NULL
+ }
+ },
+ .size = 0,
+ .length = 0,
+ .is_indefinite = 0,
+ .parent = NULL,
+ .child = NULL,
+ .next = NULL,
+ .index = 0
+};
+
+/* Internal checks. Most of these macros rely on the function returning an
+ error code, and a 'rc' value being declared locally */
+#define ECBOR_INTERNAL_CHECK_CONTEXT_PTR(c) \
+ { \
+ if (!(c)) { \
+ return ECBOR_ERR_NULL_CONTEXT; \
+ } \
+ }
+#define ECBOR_INTERNAL_CHECK_ITEM_PTR(i) \
+ { \
+ if (!(i)) { \
+ return ECBOR_ERR_NULL_ITEM; \
+ } \
+ }
+
+#define ECBOR_INTERNAL_CHECK_VALUE_PTR(v) \
+ { \
+ if (!(v)) { \
+ return ECBOR_ERR_NULL_VALUE; \
+ } \
+ }
+
+#define ECBOR_INTERNAL_CHECK_TYPE(t1, ref) \
+ { \
+ if ((t1) != (ref)) { \
+ return ECBOR_ERR_INVALID_TYPE; \
+ } \
+ }
+
+#define ECBOR_INTERNAL_CHECK_BOUNDS(index, limit) \
+ { \
+ if ((index) >= (limit)) { \
+ return ECBOR_ERR_INDEX_OUT_OF_BOUNDS; \
+ } \
+ }
+
+/*
+ * Endianness
+ */
+extern uint16_t
+ecbor_uint16_from_big_endian (uint16_t value);
+
+extern uint32_t
+ecbor_uint32_from_big_endian (uint32_t value);
+
+extern uint64_t
+ecbor_uint64_from_big_endian (uint64_t value);
+
+extern float
+ecbor_fp32_from_big_endian (float value);
+
+extern double
+ecbor_fp64_from_big_endian (double value);
+
+
+extern uint16_t
+ecbor_uint16_to_big_endian (uint16_t value);
+
+extern uint32_t
+ecbor_uint32_to_big_endian (uint32_t value);
+
+extern uint64_t
+ecbor_uint64_to_big_endian (uint64_t value);
+
+extern float
+ecbor_fp32_to_big_endian (float value);
+
+extern double
+ecbor_fp64_to_big_endian (double value);
+
+
+/*
+ * Memory
+ */
+extern void
+ecbor_memcpy (void *dest, void *src, size_t num);
+
+#endif \ No newline at end of file