diff options
Diffstat (limited to 'src/mpack/core.h')
| -rw-r--r-- | src/mpack/core.h | 87 | 
1 files changed, 87 insertions, 0 deletions
| diff --git a/src/mpack/core.h b/src/mpack/core.h new file mode 100644 index 0000000000..9edd13c41e --- /dev/null +++ b/src/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 */ | 
