#ifndef MPACK_CORE_H #define MPACK_CORE_H #ifndef MPACK_API # define MPACK_API extern #endif #include #include #include #include #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 */