mpack_core.h (2383B)
1 #ifndef MPACK_CORE_H 2 #define MPACK_CORE_H 3 4 #ifndef MPACK_API 5 # define MPACK_API extern 6 #endif 7 8 #include <assert.h> 9 #include <limits.h> 10 #include <stddef.h> 11 #include <stdbool.h> 12 13 #ifdef __GNUC__ 14 # define FPURE __attribute__((const)) 15 # define FNONULL __attribute__((nonnull)) 16 # define FNONULL_ARG(x) __attribute__((nonnull x)) 17 # define FUNUSED __attribute__((unused)) 18 #else 19 # define FPURE 20 # define FNONULL 21 # define FNONULL_ARG(x) 22 # define FUNUSED 23 #endif 24 25 #if UINT_MAX == 0xffffffff 26 typedef int mpack_sint32_t; 27 typedef unsigned int mpack_uint32_t; 28 #elif ULONG_MAX == 0xffffffff 29 typedef long mpack_sint32_t; 30 typedef unsigned long mpack_uint32_t; 31 #else 32 # error "can't find unsigned 32-bit integer type" 33 #endif 34 35 typedef struct mpack_value_s { 36 mpack_uint32_t lo, hi; 37 } mpack_value_t; 38 39 40 enum { 41 MPACK_OK = 0, 42 MPACK_EOF = 1, 43 MPACK_ERROR = 2 44 }; 45 46 #define MPACK_MAX_TOKEN_LEN 9 /* 64-bit ints/floats plus type code */ 47 48 typedef enum { 49 MPACK_TOKEN_NIL = 1, 50 MPACK_TOKEN_BOOLEAN = 2, 51 MPACK_TOKEN_UINT = 3, 52 MPACK_TOKEN_SINT = 4, 53 MPACK_TOKEN_FLOAT = 5, 54 MPACK_TOKEN_CHUNK = 6, 55 MPACK_TOKEN_ARRAY = 7, 56 MPACK_TOKEN_MAP = 8, 57 MPACK_TOKEN_BIN = 9, 58 MPACK_TOKEN_STR = 10, 59 MPACK_TOKEN_EXT = 11 60 } mpack_token_type_t; 61 62 typedef struct mpack_token_s { 63 mpack_token_type_t type; /* Type of token */ 64 mpack_uint32_t length; /* Byte length for str/bin/ext/chunk/float/int/uint. 65 Item count for array/map. */ 66 union { 67 mpack_value_t value; /* 32-bit parts of primitives (bool,int,float) */ 68 const char *chunk_ptr; /* Chunk of data from str/bin/ext */ 69 int ext_type; /* Type field for ext tokens */ 70 } data; 71 } mpack_token_t; 72 73 typedef struct mpack_tokbuf_s { 74 char pending[MPACK_MAX_TOKEN_LEN]; 75 mpack_token_t pending_tok; 76 size_t ppos, plen; 77 mpack_uint32_t passthrough; 78 } mpack_tokbuf_t; 79 80 #define MPACK_TOKBUF_INITIAL_VALUE { { 0 }, { 0, 0, { { 0, 0 } } }, 0, 0, 0 } 81 82 MPACK_API void mpack_tokbuf_init(mpack_tokbuf_t *tb) FUNUSED FNONULL; 83 MPACK_API int mpack_read(mpack_tokbuf_t *tb, const char **b, size_t *bl, 84 mpack_token_t *tok) FUNUSED FNONULL; 85 MPACK_API int mpack_write(mpack_tokbuf_t *tb, char **b, size_t *bl, 86 const mpack_token_t *tok) FUNUSED FNONULL; 87 int mpack_rtoken(const char **buf, size_t *buflen, 88 mpack_token_t *tok); 89 90 #endif /* MPACK_CORE_H */