1 /* 2 * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com> 3 * 4 * libcbor is free software; you can redistribute it and/or modify 5 * it under the terms of the MIT license. See LICENSE for details. 6 */ 7 8 #include "ints.h" 9 10 cbor_int_width cbor_int_get_width(const cbor_item_t* item) { 11 CBOR_ASSERT(cbor_is_int(item)); 12 return item->metadata.int_metadata.width; 13 } 14 15 uint8_t cbor_get_uint8(const cbor_item_t* item) { 16 CBOR_ASSERT(cbor_is_int(item)); 17 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_8); 18 return *item->data; 19 } 20 21 uint16_t cbor_get_uint16(const cbor_item_t* item) { 22 CBOR_ASSERT(cbor_is_int(item)); 23 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_16); 24 return *(uint16_t*)item->data; 25 } 26 27 uint32_t cbor_get_uint32(const cbor_item_t* item) { 28 CBOR_ASSERT(cbor_is_int(item)); 29 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_32); 30 return *(uint32_t*)item->data; 31 } 32 33 uint64_t cbor_get_uint64(const cbor_item_t* item) { 34 CBOR_ASSERT(cbor_is_int(item)); 35 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_64); 36 return *(uint64_t*)item->data; 37 } 38 39 uint64_t cbor_get_int(const cbor_item_t* item) { 40 CBOR_ASSERT(cbor_is_int(item)); 41 CBOR_ASSERT(cbor_int_get_width(item) >= CBOR_INT_8 && 42 cbor_int_get_width(item) <= CBOR_INT_64); 43 switch (cbor_int_get_width(item)) { 44 case CBOR_INT_8: 45 return cbor_get_uint8(item); 46 case CBOR_INT_16: 47 return cbor_get_uint16(item); 48 case CBOR_INT_32: 49 return cbor_get_uint32(item); 50 case CBOR_INT_64: 51 return cbor_get_uint64(item); 52 default: // LCOV_EXCL_START 53 _CBOR_UNREACHABLE; 54 return 0; // LCOV_EXCL_STOP 55 } 56 } 57 58 void cbor_set_uint8(cbor_item_t* item, uint8_t value) { 59 CBOR_ASSERT(cbor_is_int(item)); 60 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_8); 61 *item->data = value; 62 } 63 64 void cbor_set_uint16(cbor_item_t* item, uint16_t value) { 65 CBOR_ASSERT(cbor_is_int(item)); 66 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_16); 67 *(uint16_t*)item->data = value; 68 } 69 70 void cbor_set_uint32(cbor_item_t* item, uint32_t value) { 71 CBOR_ASSERT(cbor_is_int(item)); 72 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_32); 73 *(uint32_t*)item->data = value; 74 } 75 76 void cbor_set_uint64(cbor_item_t* item, uint64_t value) { 77 CBOR_ASSERT(cbor_is_int(item)); 78 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_64); 79 *(uint64_t*)item->data = value; 80 } 81 82 void cbor_mark_uint(cbor_item_t* item) { 83 CBOR_ASSERT(cbor_is_int(item)); 84 item->type = CBOR_TYPE_UINT; 85 } 86 87 void cbor_mark_negint(cbor_item_t* item) { 88 CBOR_ASSERT(cbor_is_int(item)); 89 item->type = CBOR_TYPE_NEGINT; 90 } 91 92 cbor_item_t* cbor_new_int8(void) { 93 cbor_item_t* item = _cbor_malloc(sizeof(cbor_item_t) + 1); 94 _CBOR_NOTNULL(item); 95 *item = (cbor_item_t){.data = (unsigned char*)item + sizeof(cbor_item_t), 96 .refcount = 1, 97 .metadata = {.int_metadata = {.width = CBOR_INT_8}}, 98 .type = CBOR_TYPE_UINT}; 99 return item; 100 } 101 102 cbor_item_t* cbor_new_int16(void) { 103 cbor_item_t* item = _cbor_malloc(sizeof(cbor_item_t) + 2); 104 _CBOR_NOTNULL(item); 105 *item = (cbor_item_t){.data = (unsigned char*)item + sizeof(cbor_item_t), 106 .refcount = 1, 107 .metadata = {.int_metadata = {.width = CBOR_INT_16}}, 108 .type = CBOR_TYPE_UINT}; 109 return item; 110 } 111 112 cbor_item_t* cbor_new_int32(void) { 113 cbor_item_t* item = _cbor_malloc(sizeof(cbor_item_t) + 4); 114 _CBOR_NOTNULL(item); 115 *item = (cbor_item_t){.data = (unsigned char*)item + sizeof(cbor_item_t), 116 .refcount = 1, 117 .metadata = {.int_metadata = {.width = CBOR_INT_32}}, 118 .type = CBOR_TYPE_UINT}; 119 return item; 120 } 121 122 cbor_item_t* cbor_new_int64(void) { 123 cbor_item_t* item = _cbor_malloc(sizeof(cbor_item_t) + 8); 124 _CBOR_NOTNULL(item); 125 *item = (cbor_item_t){.data = (unsigned char*)item + sizeof(cbor_item_t), 126 .refcount = 1, 127 .metadata = {.int_metadata = {.width = CBOR_INT_64}}, 128 .type = CBOR_TYPE_UINT}; 129 return item; 130 } 131 132 cbor_item_t* cbor_build_uint8(uint8_t value) { 133 cbor_item_t* item = cbor_new_int8(); 134 _CBOR_NOTNULL(item); 135 cbor_set_uint8(item, value); 136 cbor_mark_uint(item); 137 return item; 138 } 139 140 cbor_item_t* cbor_build_uint16(uint16_t value) { 141 cbor_item_t* item = cbor_new_int16(); 142 _CBOR_NOTNULL(item); 143 cbor_set_uint16(item, value); 144 cbor_mark_uint(item); 145 return item; 146 } 147 148 cbor_item_t* cbor_build_uint32(uint32_t value) { 149 cbor_item_t* item = cbor_new_int32(); 150 _CBOR_NOTNULL(item); 151 cbor_set_uint32(item, value); 152 cbor_mark_uint(item); 153 return item; 154 } 155 156 cbor_item_t* cbor_build_uint64(uint64_t value) { 157 cbor_item_t* item = cbor_new_int64(); 158 _CBOR_NOTNULL(item); 159 cbor_set_uint64(item, value); 160 cbor_mark_uint(item); 161 return item; 162 } 163 164 cbor_item_t* cbor_build_negint8(uint8_t value) { 165 cbor_item_t* item = cbor_new_int8(); 166 _CBOR_NOTNULL(item); 167 cbor_set_uint8(item, value); 168 cbor_mark_negint(item); 169 return item; 170 } 171 172 cbor_item_t* cbor_build_negint16(uint16_t value) { 173 cbor_item_t* item = cbor_new_int16(); 174 _CBOR_NOTNULL(item); 175 cbor_set_uint16(item, value); 176 cbor_mark_negint(item); 177 return item; 178 } 179 180 cbor_item_t* cbor_build_negint32(uint32_t value) { 181 cbor_item_t* item = cbor_new_int32(); 182 _CBOR_NOTNULL(item); 183 cbor_set_uint32(item, value); 184 cbor_mark_negint(item); 185 return item; 186 } 187 188 cbor_item_t* cbor_build_negint64(uint64_t value) { 189 cbor_item_t* item = cbor_new_int64(); 190 _CBOR_NOTNULL(item); 191 cbor_set_uint64(item, value); 192 cbor_mark_negint(item); 193 return item; 194 } 195