Coverage Report

Created: 2025-08-26 06:55

/src/libcbor/src/cbor/internal/encoders.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 "encoders.h"
9
#include <string.h>
10
11
size_t _cbor_encode_uint8(uint8_t value, unsigned char *buffer,
12
2.35M
                          size_t buffer_size, uint8_t offset) {
13
2.35M
  if (value <= 23) {
14
1.38M
    if (buffer_size >= 1) {
15
1.38M
      buffer[0] = value + offset;
16
1.38M
      return 1;
17
1.38M
    }
18
1.38M
  } else {
19
969k
    if (buffer_size >= 2) {
20
969k
      buffer[0] = 0x18 + offset;
21
969k
      buffer[1] = value;
22
969k
      return 2;
23
969k
    }
24
969k
  }
25
0
  return 0;
26
2.35M
}
27
28
size_t _cbor_encode_uint16(uint16_t value, unsigned char *buffer,
29
23.6k
                           size_t buffer_size, uint8_t offset) {
30
23.6k
  if (buffer_size >= 3) {
31
23.6k
    buffer[0] = 0x19 + offset;
32
33
#ifdef IS_BIG_ENDIAN
34
    memcpy(buffer + 1, &value, 2);
35
#else
36
23.6k
    buffer[1] = (unsigned char)(value >> 8);
37
23.6k
    buffer[2] = (unsigned char)value;
38
23.6k
#endif
39
40
23.6k
    return 3;
41
23.6k
  } else
42
0
    return 0;
43
23.6k
}
44
45
size_t _cbor_encode_uint32(uint32_t value, unsigned char *buffer,
46
0
                           size_t buffer_size, uint8_t offset) {
47
0
  if (buffer_size >= 5) {
48
0
    buffer[0] = 0x1A + offset;
49
50
#ifdef IS_BIG_ENDIAN
51
    memcpy(buffer + 1, &value, 4);
52
#else
53
0
    buffer[1] = (unsigned char)(value >> 24);
54
0
    buffer[2] = (unsigned char)(value >> 16);
55
0
    buffer[3] = (unsigned char)(value >> 8);
56
0
    buffer[4] = (unsigned char)value;
57
0
#endif
58
59
0
    return 5;
60
0
  } else
61
0
    return 0;
62
0
}
63
64
size_t _cbor_encode_uint64(uint64_t value, unsigned char *buffer,
65
298
                           size_t buffer_size, uint8_t offset) {
66
298
  if (buffer_size >= 9) {
67
298
    buffer[0] = 0x1B + offset;
68
69
#ifdef IS_BIG_ENDIAN
70
    memcpy(buffer + 1, &value, 8);
71
#else
72
298
    buffer[1] = (unsigned char)(value >> 56);
73
298
    buffer[2] = (unsigned char)(value >> 48);
74
298
    buffer[3] = (unsigned char)(value >> 40);
75
298
    buffer[4] = (unsigned char)(value >> 32);
76
298
    buffer[5] = (unsigned char)(value >> 24);
77
298
    buffer[6] = (unsigned char)(value >> 16);
78
298
    buffer[7] = (unsigned char)(value >> 8);
79
298
    buffer[8] = (unsigned char)value;
80
298
#endif
81
82
298
    return 9;
83
298
  } else
84
0
    return 0;
85
298
}
86
87
size_t _cbor_encode_uint(uint64_t value, unsigned char *buffer,
88
247k
                         size_t buffer_size, uint8_t offset) {
89
247k
  if (value <= UINT16_MAX)
90
247k
    if (value <= UINT8_MAX)
91
247k
      return _cbor_encode_uint8((uint8_t)value, buffer, buffer_size, offset);
92
81
    else
93
81
      return _cbor_encode_uint16((uint16_t)value, buffer, buffer_size, offset);
94
0
  else if (value <= UINT32_MAX)
95
0
    return _cbor_encode_uint32((uint32_t)value, buffer, buffer_size, offset);
96
0
  else
97
0
    return _cbor_encode_uint64((uint64_t)value, buffer, buffer_size, offset);
98
247k
}