Coverage Report

Created: 2025-10-10 07:05

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