Coverage Report

Created: 2025-08-03 06:57

/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
40.2k
cbor_float_width cbor_float_get_width(const cbor_item_t *item) {
13
40.2k
  CBOR_ASSERT(cbor_isa_float_ctrl(item));
14
40.2k
  return item->metadata.float_ctrl_metadata.width;
15
40.2k
}
16
17
40.2k
uint8_t cbor_ctrl_value(const cbor_item_t *item) {
18
40.2k
  CBOR_ASSERT(cbor_isa_float_ctrl(item));
19
40.2k
  CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_0);
20
40.2k
  return item->metadata.float_ctrl_metadata.ctrl;
21
40.2k
}
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
789
void cbor_set_float2(cbor_item_t *item, float value) {
67
789
  CBOR_ASSERT(cbor_is_float(item));
68
789
  CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_16);
69
789
  *((float *)item->data) = value;
70
789
}
71
72
1.24k
void cbor_set_float4(cbor_item_t *item, float value) {
73
1.24k
  CBOR_ASSERT(cbor_is_float(item));
74
1.24k
  CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_32);
75
1.24k
  *((float *)item->data) = value;
76
1.24k
}
77
78
733
void cbor_set_float8(cbor_item_t *item, double value) {
79
733
  CBOR_ASSERT(cbor_is_float(item));
80
733
  CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_64);
81
733
  *((double *)item->data) = value;
82
733
}
83
84
48.7k
void cbor_set_ctrl(cbor_item_t *item, uint8_t value) {
85
48.7k
  CBOR_ASSERT(cbor_isa_float_ctrl(item));
86
48.7k
  CBOR_ASSERT(cbor_float_get_width(item) == CBOR_FLOAT_0);
87
48.7k
  item->metadata.float_ctrl_metadata.ctrl = value;
88
48.7k
}
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
48.7k
cbor_item_t *cbor_new_ctrl(void) {
97
48.7k
  cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t));
98
48.7k
  _CBOR_NOTNULL(item);
99
100
48.7k
  *item = (cbor_item_t){
101
48.7k
      .type = CBOR_TYPE_FLOAT_CTRL,
102
48.7k
      .data = NULL,
103
48.7k
      .refcount = 1,
104
48.7k
      .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_0,
105
48.7k
                                           .ctrl = CBOR_CTRL_NONE}}};
106
48.7k
  return item;
107
48.7k
}
108
109
789
cbor_item_t *cbor_new_float2(void) {
110
789
  cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 4);
111
789
  _CBOR_NOTNULL(item);
112
113
789
  *item = (cbor_item_t){
114
789
      .type = CBOR_TYPE_FLOAT_CTRL,
115
789
      .data = (unsigned char *)item + sizeof(cbor_item_t),
116
789
      .refcount = 1,
117
789
      .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_16}}};
118
789
  return item;
119
789
}
120
121
1.24k
cbor_item_t *cbor_new_float4(void) {
122
1.24k
  cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 4);
123
1.24k
  _CBOR_NOTNULL(item);
124
125
1.24k
  *item = (cbor_item_t){
126
1.24k
      .type = CBOR_TYPE_FLOAT_CTRL,
127
1.24k
      .data = (unsigned char *)item + sizeof(cbor_item_t),
128
1.24k
      .refcount = 1,
129
1.24k
      .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_32}}};
130
1.24k
  return item;
131
1.24k
}
132
133
733
cbor_item_t *cbor_new_float8(void) {
134
733
  cbor_item_t *item = _cbor_malloc(sizeof(cbor_item_t) + 8);
135
733
  _CBOR_NOTNULL(item);
136
137
733
  *item = (cbor_item_t){
138
733
      .type = CBOR_TYPE_FLOAT_CTRL,
139
733
      .data = (unsigned char *)item + sizeof(cbor_item_t),
140
733
      .refcount = 1,
141
733
      .metadata = {.float_ctrl_metadata = {.width = CBOR_FLOAT_64}}};
142
733
  return item;
143
733
}
144
145
550
cbor_item_t *cbor_new_null(void) {
146
550
  cbor_item_t *item = cbor_new_ctrl();
147
550
  _CBOR_NOTNULL(item);
148
550
  cbor_set_ctrl(item, CBOR_CTRL_NULL);
149
550
  return item;
150
550
}
151
152
18.6k
cbor_item_t *cbor_new_undef(void) {
153
18.6k
  cbor_item_t *item = cbor_new_ctrl();
154
18.6k
  _CBOR_NOTNULL(item);
155
18.6k
  cbor_set_ctrl(item, CBOR_CTRL_UNDEF);
156
18.6k
  return item;
157
18.6k
}
158
159
29.4k
cbor_item_t *cbor_build_bool(bool value) {
160
29.4k
  return cbor_build_ctrl(value ? CBOR_CTRL_TRUE : CBOR_CTRL_FALSE);
161
29.4k
}
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
29.4k
cbor_item_t *cbor_build_ctrl(uint8_t value) {
185
29.4k
  cbor_item_t *item = cbor_new_ctrl();
186
29.4k
  _CBOR_NOTNULL(item);
187
29.4k
  cbor_set_ctrl(item, value);
188
29.4k
  return item;
189
29.4k
}