2 * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
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.
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;
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);
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;
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;
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;
39 uint64_t cbor_get_int(const cbor_item_t *item) {
40 CBOR_ASSERT(cbor_is_int(item));
41 // cppcheck-suppress missingReturn
42 switch (cbor_int_get_width(item)) {
44 return cbor_get_uint8(item);
46 return cbor_get_uint16(item);
48 return cbor_get_uint32(item);
50 return cbor_get_uint64(item);
54 void cbor_set_uint8(cbor_item_t *item, uint8_t value) {
55 CBOR_ASSERT(cbor_is_int(item));
56 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_8);
60 void cbor_set_uint16(cbor_item_t *item, uint16_t value) {
61 CBOR_ASSERT(cbor_is_int(item));
62 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_16);
63 *(uint16_t *)item->data = value;
66 void cbor_set_uint32(cbor_item_t *item, uint32_t value) {
67 CBOR_ASSERT(cbor_is_int(item));
68 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_32);
69 *(uint32_t *)item->data = value;
72 void cbor_set_uint64(cbor_item_t *item, uint64_t value) {
73 CBOR_ASSERT(cbor_is_int(item));
74 CBOR_ASSERT(cbor_int_get_width(item) == CBOR_INT_64);
75 *(uint64_t *)item->data = value;
78 void cbor_mark_uint(cbor_item_t *item) {
79 CBOR_ASSERT(cbor_is_int(item));
80 item->type = CBOR_TYPE_UINT;
83 void cbor_mark_negint(cbor_item_t *item) {
84 CBOR_ASSERT(cbor_is_int(item));
85 item->type = CBOR_TYPE_NEGINT;
88 cbor_item_t *cbor_new_int8(void) {
89 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 1);
91 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
93 .metadata = {.int_metadata = {.width = CBOR_INT_8}},
94 .type = CBOR_TYPE_UINT};
98 cbor_item_t *cbor_new_int16(void) {
99 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 2);
101 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
103 .metadata = {.int_metadata = {.width = CBOR_INT_16}},
104 .type = CBOR_TYPE_UINT};
108 cbor_item_t *cbor_new_int32(void) {
109 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 4);
111 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
113 .metadata = {.int_metadata = {.width = CBOR_INT_32}},
114 .type = CBOR_TYPE_UINT};
118 cbor_item_t *cbor_new_int64(void) {
119 cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 8);
121 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
123 .metadata = {.int_metadata = {.width = CBOR_INT_64}},
124 .type = CBOR_TYPE_UINT};
128 cbor_item_t *cbor_build_uint8(uint8_t value) {
129 cbor_item_t *item = cbor_new_int8();
131 cbor_set_uint8(item, value);
132 cbor_mark_uint(item);
136 cbor_item_t *cbor_build_uint16(uint16_t value) {
137 cbor_item_t *item = cbor_new_int16();
139 cbor_set_uint16(item, value);
140 cbor_mark_uint(item);
144 cbor_item_t *cbor_build_uint32(uint32_t value) {
145 cbor_item_t *item = cbor_new_int32();
147 cbor_set_uint32(item, value);
148 cbor_mark_uint(item);
152 cbor_item_t *cbor_build_uint64(uint64_t value) {
153 cbor_item_t *item = cbor_new_int64();
155 cbor_set_uint64(item, value);
156 cbor_mark_uint(item);
160 cbor_item_t *cbor_build_negint8(uint8_t value) {
161 cbor_item_t *item = cbor_new_int8();
163 cbor_set_uint8(item, value);
164 cbor_mark_negint(item);
168 cbor_item_t *cbor_build_negint16(uint16_t value) {
169 cbor_item_t *item = cbor_new_int16();
171 cbor_set_uint16(item, value);
172 cbor_mark_negint(item);
176 cbor_item_t *cbor_build_negint32(uint32_t value) {
177 cbor_item_t *item = cbor_new_int32();
179 cbor_set_uint32(item, value);
180 cbor_mark_negint(item);
184 cbor_item_t *cbor_build_negint64(uint64_t value) {
185 cbor_item_t *item = cbor_new_int64();
187 cbor_set_uint64(item, value);
188 cbor_mark_negint(item);