Coverage Report

Created: 2025-06-22 06:29

/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
1.15M
                          size_t buffer_size, uint8_t offset) {
13
1.15M
  if (value <= 23) {
14
693k
    if (buffer_size >= 1) {
15
693k
      buffer[0] = value + offset;
16
693k
      return 1;
17
693k
    }
18
693k
  } else {
19
456k
    if (buffer_size >= 2) {
20
456k
      buffer[0] = 0x18 + offset;
21
456k
      buffer[1] = value;
22
456k
      return 2;
23
456k
    }
24
456k
  }
25
0
  return 0;
26
1.15M
}
27
28
size_t _cbor_encode_uint16(uint16_t value, unsigned char *buffer,
29
18.6k
                           size_t buffer_size, uint8_t offset) {
30
18.6k
  if (buffer_size >= 3) {
31
18.6k
    buffer[0] = 0x19 + offset;
32
33
#ifdef IS_BIG_ENDIAN
34
    memcpy(buffer + 1, &value, 2);
35
#else
36
18.6k
    buffer[1] = (unsigned char)(value >> 8);
37
18.6k
    buffer[2] = (unsigned char)value;
38
18.6k
#endif
39
40
18.6k
    return 3;
41
18.6k
  } else
42
0
    return 0;
43
18.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
300
                           size_t buffer_size, uint8_t offset) {
66
300
  if (buffer_size >= 9) {
67
300
    buffer[0] = 0x1B + offset;
68
69
#ifdef IS_BIG_ENDIAN
70
    memcpy(buffer + 1, &value, 8);
71
#else
72
300
    buffer[1] = (unsigned char)(value >> 56);
73
300
    buffer[2] = (unsigned char)(value >> 48);
74
300
    buffer[3] = (unsigned char)(value >> 40);
75
300
    buffer[4] = (unsigned char)(value >> 32);
76
300
    buffer[5] = (unsigned char)(value >> 24);
77
300
    buffer[6] = (unsigned char)(value >> 16);
78
300
    buffer[7] = (unsigned char)(value >> 8);
79
300
    buffer[8] = (unsigned char)value;
80
300
#endif
81
82
300
    return 9;
83
300
  } else
84
0
    return 0;
85
300
}
86
87
size_t _cbor_encode_uint(uint64_t value, unsigned char *buffer,
88
56.1k
                         size_t buffer_size, uint8_t offset) {
89
56.1k
  if (value <= UINT16_MAX)
90
56.1k
    if (value <= UINT8_MAX)
91
56.0k
      return _cbor_encode_uint8((uint8_t)value, buffer, buffer_size, offset);
92
84
    else
93
84
      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
56.1k
}