aboutsummaryrefslogtreecommitdiff
path: root/src/mpack/mpack_core.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mpack/mpack_core.h')
-rw-r--r--src/mpack/mpack_core.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/mpack/mpack_core.h b/src/mpack/mpack_core.h
new file mode 100644
index 0000000000..9edd13c41e
--- /dev/null
+++ b/src/mpack/mpack_core.h
@@ -0,0 +1,87 @@
+#ifndef MPACK_CORE_H
+#define MPACK_CORE_H
+
+#ifndef MPACK_API
+# define MPACK_API extern
+#endif
+
+#include <assert.h>
+#include <limits.h>
+#include <stddef.h>
+
+#ifdef __GNUC__
+# define FPURE __attribute__((const))
+# define FNONULL __attribute__((nonnull))
+# define FNONULL_ARG(x) __attribute__((nonnull x))
+# define FUNUSED __attribute__((unused))
+#else
+# define FPURE
+# define FNONULL
+# define FNONULL_ARG(x)
+# define FUNUSED
+#endif
+
+#if UINT_MAX == 0xffffffff
+typedef int mpack_sint32_t;
+typedef unsigned int mpack_uint32_t;
+#elif ULONG_MAX == 0xffffffff
+typedef long mpack_sint32_t;
+typedef unsigned long mpack_uint32_t;
+#else
+# error "can't find unsigned 32-bit integer type"
+#endif
+
+typedef struct mpack_value_s {
+ mpack_uint32_t lo, hi;
+} mpack_value_t;
+
+
+enum {
+ MPACK_OK = 0,
+ MPACK_EOF = 1,
+ MPACK_ERROR = 2
+};
+
+#define MPACK_MAX_TOKEN_LEN 9 /* 64-bit ints/floats plus type code */
+
+typedef enum {
+ MPACK_TOKEN_NIL = 1,
+ MPACK_TOKEN_BOOLEAN = 2,
+ MPACK_TOKEN_UINT = 3,
+ MPACK_TOKEN_SINT = 4,
+ MPACK_TOKEN_FLOAT = 5,
+ MPACK_TOKEN_CHUNK = 6,
+ MPACK_TOKEN_ARRAY = 7,
+ MPACK_TOKEN_MAP = 8,
+ MPACK_TOKEN_BIN = 9,
+ MPACK_TOKEN_STR = 10,
+ MPACK_TOKEN_EXT = 11
+} mpack_token_type_t;
+
+typedef struct mpack_token_s {
+ mpack_token_type_t type; /* Type of token */
+ mpack_uint32_t length; /* Byte length for str/bin/ext/chunk/float/int/uint.
+ Item count for array/map. */
+ union {
+ mpack_value_t value; /* 32-bit parts of primitives (bool,int,float) */
+ const char *chunk_ptr; /* Chunk of data from str/bin/ext */
+ int ext_type; /* Type field for ext tokens */
+ } data;
+} mpack_token_t;
+
+typedef struct mpack_tokbuf_s {
+ char pending[MPACK_MAX_TOKEN_LEN];
+ mpack_token_t pending_tok;
+ size_t ppos, plen;
+ mpack_uint32_t passthrough;
+} mpack_tokbuf_t;
+
+#define MPACK_TOKBUF_INITIAL_VALUE { { 0 }, { 0, 0, { { 0, 0 } } }, 0, 0, 0 }
+
+MPACK_API void mpack_tokbuf_init(mpack_tokbuf_t *tb) FUNUSED FNONULL;
+MPACK_API int mpack_read(mpack_tokbuf_t *tb, const char **b, size_t *bl,
+ mpack_token_t *tok) FUNUSED FNONULL;
+MPACK_API int mpack_write(mpack_tokbuf_t *tb, char **b, size_t *bl,
+ const mpack_token_t *tok) FUNUSED FNONULL;
+
+#endif /* MPACK_CORE_H */