Coverage Report

Created: 2025-11-09 07:06

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