Coverage Report

Created: 2025-08-03 06:57

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