blob: 2bf94163ff928a1f2d0bf433b5cd65a34eccf8bf [file] [log] [blame]
#ifndef CN_CBOR_H
#define CN_CBOR_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef EMACS_INDENTATION_HELPER
} /* Duh. */
#endif
typedef enum cn_cbor_type {
CN_CBOR_NULL,
CN_CBOR_FALSE, CN_CBOR_TRUE,
CN_CBOR_UINT, CN_CBOR_INT,
CN_CBOR_BYTES, CN_CBOR_TEXT,
CN_CBOR_BYTES_CHUNKED, CN_CBOR_TEXT_CHUNKED, /* += 2 */
CN_CBOR_ARRAY, CN_CBOR_MAP,
CN_CBOR_TAG,
CN_CBOR_SIMPLE, CN_CBOR_DOUBLE,
CN_CBOR_INVALID
} cn_cbor_type;
typedef enum cn_cbor_flags {
CN_CBOR_FL_COUNT = 1,
CN_CBOR_FL_INDEF = 2,
CN_CBOR_FL_OWNER = 0x80, /* of str */
} cn_cbor_flags;
typedef struct cn_cbor {
cn_cbor_type type;
cn_cbor_flags flags;
union {
const char* str;
long sint;
unsigned long uint;
double dbl;
unsigned long count; /* for use during filling */
} v; /* TBD: optimize immediate */
int length;
struct cn_cbor* first_child;
struct cn_cbor* last_child;
struct cn_cbor* next;
struct cn_cbor* parent;
} cn_cbor;
typedef enum cn_cbor_error {
CN_CBOR_NO_ERROR,
CN_CBOR_ERR_OUT_OF_DATA,
CN_CBOR_ERR_NOT_ALL_DATA_CONSUMED,
CN_CBOR_ERR_ODD_SIZE_INDEF_MAP,
CN_CBOR_ERR_BREAK_OUTSIDE_INDEF,
CN_CBOR_ERR_MT_UNDEF_FOR_INDEF,
CN_CBOR_ERR_RESERVED_AI,
CN_CBOR_ERR_WRONG_NESTING_IN_INDEF_STRING,
CN_CBOR_ERR_OUT_OF_MEMORY,
} cn_cbor_error;
extern const char *cn_cbor_error_str[];
typedef struct cn_cbor_errback {
int pos;
cn_cbor_error err;
} cn_cbor_errback;
const cn_cbor* cn_cbor_decode(const char* buf, size_t len, cn_cbor_errback *errp);
const cn_cbor* cn_cbor_mapget_string(const cn_cbor* cb, const char* key);
const cn_cbor* cn_cbor_mapget_int(const cn_cbor* cb, int key);
const cn_cbor* cn_cbor_index(const cn_cbor* cb, unsigned int idx);
const cn_cbor* cn_cbor_alloc(cn_cbor_type t);
void cn_cbor_free(const cn_cbor* js);
#ifdef __cplusplus
}
#endif
#endif /* CN_CBOR_H */