xref: /freebsd/contrib/libcbor/src/cbor/ints.c (revision e64bea71c21eb42e97aa615188ba91f6cce0d36d)
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