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
cbor_int_get_width(const cbor_item_t * item)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
cbor_get_uint8(const cbor_item_t * item)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
cbor_get_uint16(const cbor_item_t * item)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
cbor_get_uint32(const cbor_item_t * item)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
cbor_get_uint64(const cbor_item_t * item)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
cbor_get_int(const cbor_item_t * item)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
cbor_set_uint8(cbor_item_t * item,uint8_t value)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
cbor_set_uint16(cbor_item_t * item,uint16_t value)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
cbor_set_uint32(cbor_item_t * item,uint32_t value)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
cbor_set_uint64(cbor_item_t * item,uint64_t value)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
cbor_mark_uint(cbor_item_t * item)82 void cbor_mark_uint(cbor_item_t* item) {
83 CBOR_ASSERT(cbor_is_int(item));
84 item->type = CBOR_TYPE_UINT;
85 }
86
cbor_mark_negint(cbor_item_t * item)87 void cbor_mark_negint(cbor_item_t* item) {
88 CBOR_ASSERT(cbor_is_int(item));
89 item->type = CBOR_TYPE_NEGINT;
90 }
91
cbor_new_int8(void)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
cbor_new_int16(void)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
cbor_new_int32(void)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
cbor_new_int64(void)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
cbor_build_uint8(uint8_t value)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
cbor_build_uint16(uint16_t value)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
cbor_build_uint32(uint32_t value)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
cbor_build_uint64(uint64_t value)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
cbor_build_negint8(uint8_t value)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
cbor_build_negint16(uint16_t value)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
cbor_build_negint32(uint32_t value)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
cbor_build_negint64(uint64_t value)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