119 lines
3.0 KiB
C
119 lines
3.0 KiB
C
#ifndef CBOR_PROTOCOL_H__
|
|
#define CBOR_PROTOCOL_H__
|
|
|
|
/* The 8 major types */
|
|
#define MT_UNSIGNED 0
|
|
#define MT_NEGATIVE 1
|
|
#define MT_BYTES 2
|
|
#define MT_TEXT 3
|
|
#define MT_ARRAY 4
|
|
#define MT_MAP 5
|
|
#define MT_TAG 6
|
|
#define MT_PRIM 7
|
|
|
|
/* The initial bytes resulting from those */
|
|
#define IB_UNSIGNED (MT_UNSIGNED << 5)
|
|
#define IB_NEGATIVE (MT_NEGATIVE << 5)
|
|
#define IB_BYTES (MT_BYTES << 5)
|
|
#define IB_TEXT (MT_TEXT << 5)
|
|
#define IB_ARRAY (MT_ARRAY << 5)
|
|
#define IB_MAP (MT_MAP << 5)
|
|
#define IB_TAG (MT_TAG << 5)
|
|
#define IB_PRIM (MT_PRIM << 5)
|
|
|
|
#define IB_NEGFLAG (IB_NEGATIVE - IB_UNSIGNED)
|
|
#define IB_NEGFLAG_AS_BIT(ib) ((ib) >> 5)
|
|
#define IB_TEXTFLAG (IB_TEXT - IB_BYTES)
|
|
|
|
#define IB_AI(ib) ((ib) & 0x1F)
|
|
#define IB_MT(ib) ((ib) >> 5)
|
|
|
|
/* Tag numbers handled by this implementation */
|
|
#define TAG_TIME_EPOCH 1
|
|
#define TAG_BIGNUM 2
|
|
#define TAG_BIGNUM_NEG 3
|
|
#define TAG_URI 32
|
|
#define TAG_RE 35
|
|
|
|
/* Initial bytes of those tag numbers */
|
|
#define IB_TIME_EPOCH (IB_TAG | TAG_TIME_EPOCH)
|
|
#define IB_BIGNUM (IB_TAG | TAG_BIGNUM)
|
|
#define IB_BIGNUM_NEG (IB_TAG | TAG_BIGNUM_NEG)
|
|
/* TAG_URI and TAG_RE are non-immediate tags */
|
|
|
|
/* Simple values handled by this implementation */
|
|
#define VAL_FALSE 20
|
|
#define VAL_TRUE 21
|
|
#define VAL_NIL 22
|
|
#define VAL_UNDEF 23
|
|
|
|
/* Initial bytes of those simple values */
|
|
#define IB_FALSE (IB_PRIM | VAL_FALSE)
|
|
#define IB_TRUE (IB_PRIM | VAL_TRUE)
|
|
#define IB_NIL (IB_PRIM | VAL_NIL)
|
|
#define IB_UNDEF (IB_PRIM | VAL_UNDEF)
|
|
|
|
/* AI values with more data in head */
|
|
#define AI_1 24
|
|
#define AI_2 25
|
|
#define AI_4 26
|
|
#define AI_8 27
|
|
#define AI_INDEF 31
|
|
#define IB_BREAK (IB_PRIM | AI_INDEF)
|
|
/* For */
|
|
#define IB_UNUSED (IB_TAG | AI_INDEF)
|
|
|
|
/* Floating point initial bytes */
|
|
#define IB_FLOAT2 (IB_PRIM | AI_2)
|
|
#define IB_FLOAT4 (IB_PRIM | AI_4)
|
|
#define IB_FLOAT8 (IB_PRIM | AI_8)
|
|
|
|
// These definitions are here because they aren't required for the public
|
|
// interface, and they were quite confusing in cn-cbor.h
|
|
|
|
#ifdef USE_CBOR_CONTEXT
|
|
/**
|
|
* Allocate enough space for 1 `cn_cbor` structure.
|
|
*
|
|
* @param[in] ctx The allocation context, or NULL for calloc.
|
|
* @return A pointer to a `cn_cbor` or NULL on failure
|
|
*/
|
|
#define CN_CALLOC(ctx) ((ctx) && (ctx)->calloc_func) ? \
|
|
(ctx)->calloc_func(1, sizeof(cn_cbor), (ctx)->context) : \
|
|
calloc(1, sizeof(cn_cbor));
|
|
|
|
/**
|
|
* Free a
|
|
* @param free_func [description]
|
|
* @return [description]
|
|
*/
|
|
#define CN_FREE(ptr, ctx) ((ctx) && (ctx)->free_func) ? \
|
|
(ctx)->free_func((ptr), (ctx)->context) : \
|
|
free((ptr));
|
|
|
|
#define CBOR_CONTEXT_PARAM , context
|
|
#define CN_CALLOC_CONTEXT() CN_CALLOC(context)
|
|
#define CN_CBOR_FREE_CONTEXT(p) CN_FREE(p, context)
|
|
|
|
#else
|
|
|
|
#define CBOR_CONTEXT_PARAM
|
|
#define CN_CALLOC_CONTEXT() CN_CALLOC
|
|
#define CN_CBOR_FREE_CONTEXT(p) CN_FREE(p)
|
|
|
|
#ifndef CN_CALLOC
|
|
#define CN_CALLOC calloc(1, sizeof(cn_cbor))
|
|
#endif
|
|
|
|
#ifndef CN_FREE
|
|
#define CN_FREE free
|
|
#endif
|
|
|
|
#endif // USE_CBOR_CONTEXT
|
|
|
|
#ifndef UNUSED_PARAM
|
|
#define UNUSED_PARAM(p) ((void)&(p))
|
|
#endif
|
|
|
|
#endif // CBOR_PROTOCOL_H__
|