1 /*
2 * Copyright (c) 2014-2019 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 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 assert(cbor_is_int(item));
17 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 assert(cbor_is_int(item));
23 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 assert(cbor_is_int(item));
29 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 assert(cbor_is_int(item));
35 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 assert(cbor_is_int(item));
41 switch (cbor_int_get_width(item)) {
42 case CBOR_INT_8:
43 return cbor_get_uint8(item);
44 case CBOR_INT_16:
45 return cbor_get_uint16(item);
46 case CBOR_INT_32:
47 return cbor_get_uint32(item);
48 case CBOR_INT_64:
49 return cbor_get_uint64(item);
50 }
51 // TODO: This should be handled in a default branch
52 return 0xDEADBEEF; /* Compiler complaints */
53 }
54
cbor_set_uint8(cbor_item_t * item,uint8_t value)55 void cbor_set_uint8(cbor_item_t *item, uint8_t value) {
56 assert(cbor_is_int(item));
57 assert(cbor_int_get_width(item) == CBOR_INT_8);
58 *item->data = value;
59 }
60
cbor_set_uint16(cbor_item_t * item,uint16_t value)61 void cbor_set_uint16(cbor_item_t *item, uint16_t value) {
62 assert(cbor_is_int(item));
63 assert(cbor_int_get_width(item) == CBOR_INT_16);
64 *(uint16_t *)item->data = value;
65 }
66
cbor_set_uint32(cbor_item_t * item,uint32_t value)67 void cbor_set_uint32(cbor_item_t *item, uint32_t value) {
68 assert(cbor_is_int(item));
69 assert(cbor_int_get_width(item) == CBOR_INT_32);
70 *(uint32_t *)item->data = value;
71 }
72
cbor_set_uint64(cbor_item_t * item,uint64_t value)73 void cbor_set_uint64(cbor_item_t *item, uint64_t value) {
74 assert(cbor_is_int(item));
75 assert(cbor_int_get_width(item) == CBOR_INT_64);
76 *(uint64_t *)item->data = value;
77 }
78
cbor_mark_uint(cbor_item_t * item)79 void cbor_mark_uint(cbor_item_t *item) {
80 assert(cbor_is_int(item));
81 item->type = CBOR_TYPE_UINT;
82 }
83
cbor_mark_negint(cbor_item_t * item)84 void cbor_mark_negint(cbor_item_t *item) {
85 assert(cbor_is_int(item));
86 item->type = CBOR_TYPE_NEGINT;
87 }
88
cbor_new_int8()89 cbor_item_t *cbor_new_int8() {
90 cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t) + 1);
91 _CBOR_NOTNULL(item);
92 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
93 .refcount = 1,
94 .metadata = {.int_metadata = {.width = CBOR_INT_8}},
95 .type = CBOR_TYPE_UINT};
96 return item;
97 }
98
cbor_new_int16()99 cbor_item_t *cbor_new_int16() {
100 cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t) + 2);
101 _CBOR_NOTNULL(item);
102 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
103 .refcount = 1,
104 .metadata = {.int_metadata = {.width = CBOR_INT_16}},
105 .type = CBOR_TYPE_UINT};
106 return item;
107 }
108
cbor_new_int32()109 cbor_item_t *cbor_new_int32() {
110 cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t) + 4);
111 _CBOR_NOTNULL(item);
112 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
113 .refcount = 1,
114 .metadata = {.int_metadata = {.width = CBOR_INT_32}},
115 .type = CBOR_TYPE_UINT};
116 return item;
117 }
118
cbor_new_int64()119 cbor_item_t *cbor_new_int64() {
120 cbor_item_t *item = _CBOR_MALLOC(sizeof(cbor_item_t) + 8);
121 _CBOR_NOTNULL(item);
122 *item = (cbor_item_t){.data = (unsigned char *)item + sizeof(cbor_item_t),
123 .refcount = 1,
124 .metadata = {.int_metadata = {.width = CBOR_INT_64}},
125 .type = CBOR_TYPE_UINT};
126 return item;
127 }
128
cbor_build_uint8(uint8_t value)129 cbor_item_t *cbor_build_uint8(uint8_t value) {
130 cbor_item_t *item = cbor_new_int8();
131 _CBOR_NOTNULL(item);
132 cbor_set_uint8(item, value);
133 cbor_mark_uint(item);
134 return item;
135 }
136
cbor_build_uint16(uint16_t value)137 cbor_item_t *cbor_build_uint16(uint16_t value) {
138 cbor_item_t *item = cbor_new_int16();
139 _CBOR_NOTNULL(item);
140 cbor_set_uint16(item, value);
141 cbor_mark_uint(item);
142 return item;
143 }
144
cbor_build_uint32(uint32_t value)145 cbor_item_t *cbor_build_uint32(uint32_t value) {
146 cbor_item_t *item = cbor_new_int32();
147 _CBOR_NOTNULL(item);
148 cbor_set_uint32(item, value);
149 cbor_mark_uint(item);
150 return item;
151 }
152
cbor_build_uint64(uint64_t value)153 cbor_item_t *cbor_build_uint64(uint64_t value) {
154 cbor_item_t *item = cbor_new_int64();
155 _CBOR_NOTNULL(item);
156 cbor_set_uint64(item, value);
157 cbor_mark_uint(item);
158 return item;
159 }
160
cbor_build_negint8(uint8_t value)161 cbor_item_t *cbor_build_negint8(uint8_t value) {
162 cbor_item_t *item = cbor_new_int8();
163 _CBOR_NOTNULL(item);
164 cbor_set_uint8(item, value);
165 cbor_mark_negint(item);
166 return item;
167 }
168
cbor_build_negint16(uint16_t value)169 cbor_item_t *cbor_build_negint16(uint16_t value) {
170 cbor_item_t *item = cbor_new_int16();
171 _CBOR_NOTNULL(item);
172 cbor_set_uint16(item, value);
173 cbor_mark_negint(item);
174 return item;
175 }
176
cbor_build_negint32(uint32_t value)177 cbor_item_t *cbor_build_negint32(uint32_t value) {
178 cbor_item_t *item = cbor_new_int32();
179 _CBOR_NOTNULL(item);
180 cbor_set_uint32(item, value);
181 cbor_mark_negint(item);
182 return item;
183 }
184
cbor_build_negint64(uint64_t value)185 cbor_item_t *cbor_build_negint64(uint64_t value) {
186 cbor_item_t *item = cbor_new_int64();
187 _CBOR_NOTNULL(item);
188 cbor_set_uint64(item, value);
189 cbor_mark_negint(item);
190 return item;
191 }
192