Coverage Report

Created: 2026-01-16 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libcbor/src/cbor/internal/loaders.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 "loaders.h"
9
#include <math.h>
10
#include <string.h>
11
12
14.1M
uint8_t _cbor_load_uint8(cbor_data source) { return (uint8_t)*source; }
13
14
99.8k
uint16_t _cbor_load_uint16(const unsigned char *source) {
15
#ifdef IS_BIG_ENDIAN
16
  uint16_t result;
17
  memcpy(&result, source, 2);
18
  return result;
19
#else
20
99.8k
  return ((uint16_t) * (source + 0) << 8) + (uint8_t) * (source + 1);
21
99.8k
#endif
22
99.8k
}
23
24
40.5k
uint32_t _cbor_load_uint32(const unsigned char *source) {
25
#ifdef IS_BIG_ENDIAN
26
  uint32_t result;
27
  memcpy(&result, source, 4);
28
  return result;
29
#else
30
40.5k
  return ((uint32_t) * (source + 0) << 0x18) +
31
40.5k
         ((uint32_t) * (source + 1) << 0x10) +
32
40.5k
         ((uint16_t) * (source + 2) << 0x08) + (uint8_t) * (source + 3);
33
40.5k
#endif
34
40.5k
}
35
36
36.4k
uint64_t _cbor_load_uint64(const unsigned char *source) {
37
#ifdef IS_BIG_ENDIAN
38
  uint64_t result;
39
  memcpy(&result, source, 8);
40
  return result;
41
#else
42
36.4k
  return ((uint64_t) * (source + 0) << 0x38) +
43
36.4k
         ((uint64_t) * (source + 1) << 0x30) +
44
36.4k
         ((uint64_t) * (source + 2) << 0x28) +
45
36.4k
         ((uint64_t) * (source + 3) << 0x20) +
46
36.4k
         ((uint32_t) * (source + 4) << 0x18) +
47
36.4k
         ((uint32_t) * (source + 5) << 0x10) +
48
36.4k
         ((uint16_t) * (source + 6) << 0x08) + (uint8_t) * (source + 7);
49
36.4k
#endif
50
36.4k
}
51
52
/* As per https://www.rfc-editor.org/rfc/rfc8949.html#name-half-precision */
53
14.7k
float _cbor_decode_half(unsigned char *halfp) {
54
14.7k
  int half = (halfp[0] << 8) + halfp[1];
55
14.7k
  int exp = (half >> 10) & 0x1f;
56
14.7k
  int mant = half & 0x3ff;
57
14.7k
  double val;
58
14.7k
  if (exp == 0)
59
2.62k
    val = ldexp(mant, -24);
60
12.1k
  else if (exp != 31)
61
10.9k
    val = ldexp(mant + 1024, exp - 25);
62
1.13k
  else
63
1.13k
    val = mant == 0 ? INFINITY : NAN;
64
14.7k
  return (float)(half & 0x8000 ? -val : val);
65
14.7k
}
66
67
14.7k
float _cbor_load_half(cbor_data source) {
68
  /* Discard const */
69
14.7k
  return _cbor_decode_half((unsigned char *)source);
70
14.7k
}
71
72
7.32k
float _cbor_load_float(cbor_data source) {
73
7.32k
  union _cbor_float_helper helper = {.as_uint = _cbor_load_uint32(source)};
74
7.32k
  return helper.as_float;
75
7.32k
}
76
77
2.70k
double _cbor_load_double(cbor_data source) {
78
2.70k
  union _cbor_double_helper helper = {.as_uint = _cbor_load_uint64(source)};
79
2.70k
  return helper.as_double;
80
2.70k
}