/src/libcbor/src/cbor/floats_ctrls.c
Line | Count | Source (jump to first uncovered line) |
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 "floats_ctrls.h" |
9 | | #include <math.h> |
10 | | #include "assert.h" |
11 | | |
12 | 37.6k | cbor_float_width cbor_float_get_width(const cbor_item_t *item) { |
13 | 37.6k | CBOR_ASSERT(cbor_isa_float_ctrl(item)); |
14 | 37.6k | return item->metadata.float_ctrl_metadata.width; |
15 | 37.6k | } |
16 | | |
17 | 37.6k | uint8_t cbor_ctrl_value(const cbor_item_t *item) { |
18 | 37.6k | CBOR_ASSERT(cbor_isa_float_ctrl(item)); |
19 | 37.6k | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_0); |
20 | 37.6k | return item->metadata.float_ctrl_metadata.ctrl; |
21 | 37.6k | } |
22 | | |
23 | 0 | bool cbor_float_ctrl_is_ctrl(const cbor_item_t *item) { |
24 | 0 | CBOR_ASSERT(cbor_isa_float_ctrl(item)); |
25 | 0 | return cbor_float_get_width(item) == CBOR_FLOAT_0; |
26 | 0 | } |
27 | | |
28 | 0 | float cbor_float_get_float2(const cbor_item_t *item) { |
29 | 0 | CBOR_ASSERT(cbor_is_float(item)); |
30 | 0 | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_16); |
31 | 0 | return *(float *)item->data; |
32 | 0 | } |
33 | | |
34 | 0 | float cbor_float_get_float4(const cbor_item_t *item) { |
35 | 0 | CBOR_ASSERT(cbor_is_float(item)); |
36 | 0 | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_32); |
37 | 0 | return *(float *)item->data; |
38 | 0 | } |
39 | | |
40 | 0 | double cbor_float_get_float8(const cbor_item_t *item) { |
41 | 0 | CBOR_ASSERT(cbor_is_float(item)); |
42 | 0 | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_64); |
43 | 0 | return *(double *)item->data; |
44 | 0 | } |
45 | | |
46 | 0 | double cbor_float_get_float(const cbor_item_t *item) { |
47 | 0 | CBOR_ASSERT(cbor_is_float(item)); |
48 | | // cppcheck-suppress missingReturn |
49 | 0 | switch (cbor_float_get_width(item)) { |
50 | 0 | case CBOR_FLOAT_0: |
51 | 0 | return NAN; |
52 | 0 | case CBOR_FLOAT_16: |
53 | 0 | return cbor_float_get_float2(item); |
54 | 0 | case CBOR_FLOAT_32: |
55 | 0 | return cbor_float_get_float4(item); |
56 | 0 | case CBOR_FLOAT_64: |
57 | 0 | return cbor_float_get_float8(item); |
58 | 0 | } |
59 | 0 | } |
60 | | |
61 | 0 | bool cbor_get_bool(const cbor_item_t *item) { |
62 | 0 | CBOR_ASSERT(cbor_is_bool(item)); |
63 | 0 | return item->metadata.float_ctrl_metadata.ctrl == CBOR_CTRL_TRUE; |
64 | 0 | } |
65 | | |
66 | 972 | void cbor_set_float2(cbor_item_t *item, float value) { |
67 | 972 | CBOR_ASSERT(cbor_is_float(item)); |
68 | 972 | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_16); |
69 | 972 | *((float *)item->data) = value; |
70 | 972 | } |
71 | | |
72 | 2.19k | void cbor_set_float4(cbor_item_t *item, float value) { |
73 | 2.19k | CBOR_ASSERT(cbor_is_float(item)); |
74 | 2.19k | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_32); |
75 | 2.19k | *((float *)item->data) = value; |
76 | 2.19k | } |
77 | | |
78 | 565 | void cbor_set_float8(cbor_item_t *item, double value) { |
79 | 565 | CBOR_ASSERT(cbor_is_float(item)); |
80 | 565 | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_64); |
81 | 565 | *((double *)item->data) = value; |
82 | 565 | } |
83 | | |
84 | 37.3k | void cbor_set_ctrl(cbor_item_t *item, uint8_t value) { |
85 | 37.3k | CBOR_ASSERT(cbor_isa_float_ctrl(item)); |
86 | 37.3k | CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_0); |
87 | 37.3k | item->metadata.float_ctrl_metadata.ctrl = value; |
88 | 37.3k | } |
89 | | |
90 | 0 | void cbor_set_bool(cbor_item_t *item, bool value) { |
91 | 0 | CBOR_ASSERT(cbor_is_bool(item)); |
92 | 0 | item->metadata.float_ctrl_metadata.ctrl = |
93 | 0 | value ? CBOR_CTRL_TRUE : CBOR_CTRL_FALSE; |
94 | 0 | } |
95 | | |
96 | 37.3k | cbor_item_t *cbor_new_ctrl(void) { |
97 | 37.3k | cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t)); |
98 | 37.3k | _CBOR_NOTNULL(item); |
99 | | |
100 | 37.3k | *item = (cbor_item_t){ |
101 | 37.3k | .type = CBOR_TYPE_FLOAT_CTRL, |
102 | 37.3k | .data = NULL, |
103 | 37.3k | .refcount = 1, |
104 | 37.3k | .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_0, |
105 | 37.3k | .ctrl = CBOR_CTRL_NONE}}}; |
106 | 37.3k | return item; |
107 | 37.3k | } |
108 | | |
109 | 972 | cbor_item_t *cbor_new_float2(void) { |
110 | 972 | cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 4); |
111 | 972 | _CBOR_NOTNULL(item); |
112 | | |
113 | 972 | *item = (cbor_item_t){ |
114 | 972 | .type = CBOR_TYPE_FLOAT_CTRL, |
115 | 972 | .data = (unsigned char *)item + sizeof(cbor_item_t), |
116 | 972 | .refcount = 1, |
117 | 972 | .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_16}}}; |
118 | 972 | return item; |
119 | 972 | } |
120 | | |
121 | 2.19k | cbor_item_t *cbor_new_float4(void) { |
122 | 2.19k | cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 4); |
123 | 2.19k | _CBOR_NOTNULL(item); |
124 | | |
125 | 2.19k | *item = (cbor_item_t){ |
126 | 2.19k | .type = CBOR_TYPE_FLOAT_CTRL, |
127 | 2.19k | .data = (unsigned char *)item + sizeof(cbor_item_t), |
128 | 2.19k | .refcount = 1, |
129 | 2.19k | .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_32}}}; |
130 | 2.19k | return item; |
131 | 2.19k | } |
132 | | |
133 | 565 | cbor_item_t *cbor_new_float8(void) { |
134 | 565 | cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 8); |
135 | 565 | _CBOR_NOTNULL(item); |
136 | | |
137 | 565 | *item = (cbor_item_t){ |
138 | 565 | .type = CBOR_TYPE_FLOAT_CTRL, |
139 | 565 | .data = (unsigned char *)item + sizeof(cbor_item_t), |
140 | 565 | .refcount = 1, |
141 | 565 | .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_64}}}; |
142 | 565 | return item; |
143 | 565 | } |
144 | | |
145 | 479 | cbor_item_t *cbor_new_null(void) { |
146 | 479 | cbor_item_t *item = cbor_new_ctrl(); |
147 | 479 | _CBOR_NOTNULL(item); |
148 | 479 | cbor_set_ctrl(item, CBOR_CTRL_NULL); |
149 | 479 | return item; |
150 | 479 | } |
151 | | |
152 | 14.4k | cbor_item_t *cbor_new_undef(void) { |
153 | 14.4k | cbor_item_t *item = cbor_new_ctrl(); |
154 | 14.4k | _CBOR_NOTNULL(item); |
155 | 14.4k | cbor_set_ctrl(item, CBOR_CTRL_UNDEF); |
156 | 14.4k | return item; |
157 | 14.4k | } |
158 | | |
159 | 22.3k | cbor_item_t *cbor_build_bool(bool value) { |
160 | 22.3k | return cbor_build_ctrl(value ? CBOR_CTRL_TRUE : CBOR_CTRL_FALSE); |
161 | 22.3k | } |
162 | | |
163 | 0 | cbor_item_t *cbor_build_float2(float value) { |
164 | 0 | cbor_item_t *item = cbor_new_float2(); |
165 | 0 | _CBOR_NOTNULL(item); |
166 | 0 | cbor_set_float2(item, value); |
167 | 0 | return item; |
168 | 0 | } |
169 | | |
170 | 0 | cbor_item_t *cbor_build_float4(float value) { |
171 | 0 | cbor_item_t *item = cbor_new_float4(); |
172 | 0 | _CBOR_NOTNULL(item); |
173 | 0 | cbor_set_float4(item, value); |
174 | 0 | return item; |
175 | 0 | } |
176 | | |
177 | 0 | cbor_item_t *cbor_build_float8(double value) { |
178 | 0 | cbor_item_t *item = cbor_new_float8(); |
179 | 0 | _CBOR_NOTNULL(item); |
180 | 0 | cbor_set_float8(item, value); |
181 | 0 | return item; |
182 | 0 | } |
183 | | |
184 | 22.3k | cbor_item_t *cbor_build_ctrl(uint8_t value) { |
185 | 22.3k | cbor_item_t *item = cbor_new_ctrl(); |
186 | 22.3k | _CBOR_NOTNULL(item); |
187 | 22.3k | cbor_set_ctrl(item, value); |
188 | 22.3k | return item; |
189 | 22.3k | } |