1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#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>
#include <stdbool.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;
int mpack_rtoken(const char **buf, size_t *buflen,
mpack_token_t *tok);
#endif /* MPACK_CORE_H */
|