1da0d961cSdjm /* 2*9e5c2ddcSdjm * Copyright (c) 2014-2019 Pavel Kalvoda <me@pavelkalvoda.com> 3da0d961cSdjm * 4da0d961cSdjm * libcbor is free software; you can redistribute it and/or modify 5da0d961cSdjm * it under the terms of the MIT license. See LICENSE for details. 6da0d961cSdjm */ 7da0d961cSdjm 8da0d961cSdjm #ifndef LIBCBOR_DATA_H 9da0d961cSdjm #define LIBCBOR_DATA_H 10da0d961cSdjm 11*9e5c2ddcSdjm #include <stdbool.h> 12da0d961cSdjm #include <stddef.h> 13da0d961cSdjm #include <stdint.h> 14*9e5c2ddcSdjm #include <stdlib.h> 15da0d961cSdjm 16da0d961cSdjm #ifdef __cplusplus 17da0d961cSdjm extern "C" { 18da0d961cSdjm #endif 19da0d961cSdjm 20da0d961cSdjm typedef const unsigned char* cbor_data; 21da0d961cSdjm typedef unsigned char* cbor_mutable_data; 22da0d961cSdjm 23da0d961cSdjm /** Specifies the Major type of ::cbor_item_t */ 24da0d961cSdjm typedef enum cbor_type { 25da0d961cSdjm CBOR_TYPE_UINT /** 0 - positive integers */ 26*9e5c2ddcSdjm , 27*9e5c2ddcSdjm CBOR_TYPE_NEGINT /** 1 - negative integers*/ 28*9e5c2ddcSdjm , 29*9e5c2ddcSdjm CBOR_TYPE_BYTESTRING /** 2 - byte strings */ 30*9e5c2ddcSdjm , 31*9e5c2ddcSdjm CBOR_TYPE_STRING /** 3 - strings */ 32*9e5c2ddcSdjm , 33*9e5c2ddcSdjm CBOR_TYPE_ARRAY /** 4 - arrays */ 34*9e5c2ddcSdjm , 35*9e5c2ddcSdjm CBOR_TYPE_MAP /** 5 - maps */ 36*9e5c2ddcSdjm , 37*9e5c2ddcSdjm CBOR_TYPE_TAG /** 6 - tags */ 38*9e5c2ddcSdjm , 39*9e5c2ddcSdjm CBOR_TYPE_FLOAT_CTRL /** 7 - decimals and special values (true, false, nil, 40*9e5c2ddcSdjm ...) */ 41da0d961cSdjm } cbor_type; 42da0d961cSdjm 43da0d961cSdjm /** Possible decoding errors */ 44da0d961cSdjm typedef enum { 45*9e5c2ddcSdjm CBOR_ERR_NONE, 46*9e5c2ddcSdjm CBOR_ERR_NOTENOUGHDATA, 47*9e5c2ddcSdjm CBOR_ERR_NODATA, 48*9e5c2ddcSdjm CBOR_ERR_MALFORMATED, 49*9e5c2ddcSdjm CBOR_ERR_MEMERROR /** Memory error - item allocation failed. Is it too big for 50*9e5c2ddcSdjm your allocator? */ 51*9e5c2ddcSdjm , 52*9e5c2ddcSdjm CBOR_ERR_SYNTAXERROR /** Stack parsing algorithm failed */ 53da0d961cSdjm } cbor_error_code; 54da0d961cSdjm 55da0d961cSdjm /** Possible widths of #CBOR_TYPE_UINT items */ 56da0d961cSdjm typedef enum { 57*9e5c2ddcSdjm CBOR_INT_8, 58*9e5c2ddcSdjm CBOR_INT_16, 59*9e5c2ddcSdjm CBOR_INT_32, 60*9e5c2ddcSdjm CBOR_INT_64 61da0d961cSdjm } cbor_int_width; 62da0d961cSdjm 63da0d961cSdjm /** Possible widths of #CBOR_TYPE_FLOAT_CTRL items */ 64da0d961cSdjm typedef enum { 65da0d961cSdjm CBOR_FLOAT_0 /** Internal use - ctrl and special values */ 66*9e5c2ddcSdjm , 67*9e5c2ddcSdjm CBOR_FLOAT_16 /** Half float */ 68*9e5c2ddcSdjm , 69*9e5c2ddcSdjm CBOR_FLOAT_32 /** Single float */ 70*9e5c2ddcSdjm , 71*9e5c2ddcSdjm CBOR_FLOAT_64 /** Double */ 72da0d961cSdjm } cbor_float_width; 73da0d961cSdjm 74da0d961cSdjm /** Metadata for dynamically sized types */ 75da0d961cSdjm typedef enum { 76*9e5c2ddcSdjm _CBOR_METADATA_DEFINITE, 77*9e5c2ddcSdjm _CBOR_METADATA_INDEFINITE 78da0d961cSdjm } _cbor_dst_metadata; 79da0d961cSdjm 80da0d961cSdjm /** Semantic mapping for CTRL simple values */ 81da0d961cSdjm typedef enum { 82da0d961cSdjm CBOR_CTRL_NONE = 0, 83da0d961cSdjm CBOR_CTRL_FALSE = 20, 84da0d961cSdjm CBOR_CTRL_TRUE = 21, 85da0d961cSdjm CBOR_CTRL_NULL = 22, 86da0d961cSdjm CBOR_CTRL_UNDEF = 23 87da0d961cSdjm } _cbor_ctrl; 88da0d961cSdjm 89da0d961cSdjm /** Integers specific metadata */ 90da0d961cSdjm struct _cbor_int_metadata { 91da0d961cSdjm cbor_int_width width; 92da0d961cSdjm }; 93da0d961cSdjm 94da0d961cSdjm /** Bytestrings specific metadata */ 95da0d961cSdjm struct _cbor_bytestring_metadata { 96da0d961cSdjm size_t length; 97da0d961cSdjm _cbor_dst_metadata type; 98da0d961cSdjm }; 99da0d961cSdjm 100da0d961cSdjm /** Strings specific metadata */ 101da0d961cSdjm struct _cbor_string_metadata { 102da0d961cSdjm size_t length; 103*9e5c2ddcSdjm size_t codepoint_count; /* Sum of chunks' codepoint_counts for indefinite 104*9e5c2ddcSdjm strings */ 105da0d961cSdjm _cbor_dst_metadata type; 106da0d961cSdjm }; 107da0d961cSdjm 108da0d961cSdjm /** Arrays specific metadata */ 109da0d961cSdjm struct _cbor_array_metadata { 110da0d961cSdjm size_t allocated; 111da0d961cSdjm size_t end_ptr; 112da0d961cSdjm _cbor_dst_metadata type; 113da0d961cSdjm }; 114da0d961cSdjm 115da0d961cSdjm /** Maps specific metadata */ 116da0d961cSdjm struct _cbor_map_metadata { 117da0d961cSdjm size_t allocated; 118da0d961cSdjm size_t end_ptr; 119da0d961cSdjm _cbor_dst_metadata type; 120da0d961cSdjm }; 121da0d961cSdjm 122da0d961cSdjm /** Arrays specific metadata 123da0d961cSdjm * 124da0d961cSdjm * The pointer is included - cbor_item_metadata is 125da0d961cSdjm * 2 * sizeof(size_t) + sizeof(_cbor_string_type_metadata), 126da0d961cSdjm * lets use the space 127da0d961cSdjm */ 128da0d961cSdjm struct _cbor_tag_metadata { 129da0d961cSdjm struct cbor_item_t* tagged_item; 130da0d961cSdjm uint64_t value; 131da0d961cSdjm }; 132da0d961cSdjm 133da0d961cSdjm /** Floats specific metadata - includes CTRL values */ 134da0d961cSdjm struct _cbor_float_ctrl_metadata { 135da0d961cSdjm cbor_float_width width; 136da0d961cSdjm uint8_t ctrl; 137da0d961cSdjm }; 138da0d961cSdjm 139da0d961cSdjm /** Raw memory casts helper */ 140da0d961cSdjm union _cbor_float_helper { 141da0d961cSdjm float as_float; 142da0d961cSdjm uint32_t as_uint; 143da0d961cSdjm }; 144da0d961cSdjm 145da0d961cSdjm /** Raw memory casts helper */ 146da0d961cSdjm union _cbor_double_helper { 147da0d961cSdjm double as_double; 148da0d961cSdjm uint64_t as_uint; 149da0d961cSdjm }; 150da0d961cSdjm 151*9e5c2ddcSdjm /** Union of metadata across all possible types - discriminated in #cbor_item_t 152*9e5c2ddcSdjm */ 153da0d961cSdjm union cbor_item_metadata { 154da0d961cSdjm struct _cbor_int_metadata int_metadata; 155da0d961cSdjm struct _cbor_bytestring_metadata bytestring_metadata; 156da0d961cSdjm struct _cbor_string_metadata string_metadata; 157da0d961cSdjm struct _cbor_array_metadata array_metadata; 158da0d961cSdjm struct _cbor_map_metadata map_metadata; 159da0d961cSdjm struct _cbor_tag_metadata tag_metadata; 160da0d961cSdjm struct _cbor_float_ctrl_metadata float_ctrl_metadata; 161da0d961cSdjm }; 162da0d961cSdjm 163da0d961cSdjm /** The item handle */ 164da0d961cSdjm typedef struct cbor_item_t { 165da0d961cSdjm /** Discriminated by type */ 166da0d961cSdjm union cbor_item_metadata metadata; 167da0d961cSdjm /** Reference count - initialize to 0 */ 168da0d961cSdjm size_t refcount; 169da0d961cSdjm /** Major type discriminator */ 170da0d961cSdjm cbor_type type; 171da0d961cSdjm /** Raw data block - interpretation depends on metadata */ 172da0d961cSdjm unsigned char* data; 173da0d961cSdjm } cbor_item_t; 174da0d961cSdjm 175da0d961cSdjm /** Defines cbor_item_t#data structure for indefinite strings and bytestrings 176da0d961cSdjm * 177da0d961cSdjm * Used to cast the raw representation for a sane manipulation 178da0d961cSdjm */ 179da0d961cSdjm struct cbor_indefinite_string_data { 180da0d961cSdjm size_t chunk_count; 181da0d961cSdjm size_t chunk_capacity; 182da0d961cSdjm cbor_item_t** chunks; 183da0d961cSdjm }; 184da0d961cSdjm 185da0d961cSdjm /** High-level decoding error */ 186da0d961cSdjm struct cbor_error { 187da0d961cSdjm /** Aproximate position */ 188da0d961cSdjm size_t position; 189da0d961cSdjm /** Description */ 190da0d961cSdjm cbor_error_code code; 191da0d961cSdjm }; 192da0d961cSdjm 193da0d961cSdjm /** Simple pair of items for use in maps */ 194da0d961cSdjm struct cbor_pair { 195da0d961cSdjm cbor_item_t *key, *value; 196da0d961cSdjm }; 197da0d961cSdjm 198da0d961cSdjm /** High-level decoding result */ 199da0d961cSdjm struct cbor_load_result { 200da0d961cSdjm /** Error indicator */ 201da0d961cSdjm struct cbor_error error; 202da0d961cSdjm /** Number of bytes read*/ 203da0d961cSdjm size_t read; 204da0d961cSdjm }; 205da0d961cSdjm 206da0d961cSdjm /** Streaming decoder result - status */ 207da0d961cSdjm enum cbor_decoder_status { 208da0d961cSdjm CBOR_DECODER_FINISHED /** OK, finished */ 209*9e5c2ddcSdjm , 210*9e5c2ddcSdjm CBOR_DECODER_NEDATA /** Not enough data - mismatch with MTB */ 211*9e5c2ddcSdjm , 212*9e5c2ddcSdjm CBOR_DECODER_EBUFFER /** Buffer manipulation problem */ 213*9e5c2ddcSdjm , 214*9e5c2ddcSdjm CBOR_DECODER_ERROR /** Malformed or reserved MTB/value */ 215da0d961cSdjm }; 216da0d961cSdjm 217da0d961cSdjm /** Streaming decoder result */ 218da0d961cSdjm struct cbor_decoder_result { 219da0d961cSdjm /** Bytes read */ 220da0d961cSdjm size_t read; 221da0d961cSdjm /** The result */ 222da0d961cSdjm enum cbor_decoder_status status; 223*9e5c2ddcSdjm /** When status == CBOR_DECODER_NEDATA, 224*9e5c2ddcSdjm * the minimum number of bytes required to continue parsing */ 225*9e5c2ddcSdjm size_t required; 226da0d961cSdjm }; 227da0d961cSdjm 228da0d961cSdjm #ifdef __cplusplus 229da0d961cSdjm } 230da0d961cSdjm #endif 231da0d961cSdjm 232da0d961cSdjm #endif // LIBCBOR_DATA_H 233