Coverage Report

Created: 2025-12-14 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libcbor/src/cbor/internal/encoders.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 "encoders.h"
9
#include <string.h>
10
11
size_t _cbor_encode_uint8(uint8_t value, unsigned char *buffer,
12
2.34M
                          size_t buffer_size, uint8_t offset) {
13
2.34M
  if (value <= 23) {
14
1.36M
    if (buffer_size >= 1) {
15
1.36M
      buffer[0] = value + offset;
16
1.36M
      return 1;
17
1.36M
    }
18
1.36M
  } else {
19
983k
    if (buffer_size >= 2) {
20
983k
      buffer[0] = 0x18 + offset;
21
983k
      buffer[1] = value;
22
983k
      return 2;
23
983k
    }
24
983k
  }
25
0
  return 0;
26
2.34M
}
27
28
size_t _cbor_encode_uint16(uint16_t value, unsigned char *buffer,
29
25.2k
                           size_t buffer_size, uint8_t offset) {
30
25.2k
  if (buffer_size >= 3) {
31
25.2k
    buffer[0] = 0x19 + offset;
32
33
#ifdef IS_BIG_ENDIAN
34
    memcpy(buffer + 1, &value, 2);
35
#else
36
25.2k
    buffer[1] = (unsigned char)(value >> 8);
37
25.2k
    buffer[2] = (unsigned char)value;
38
25.2k
#endif
39
40
25.2k
    return 3;
41
25.2k
  } else
42
0
    return 0;
43
25.2k
}
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
445
                           size_t buffer_size, uint8_t offset) {
66
445
  if (buffer_size >= 9) {
67
445
    buffer[0] = 0x1B + offset;
68
69
#ifdef IS_BIG_ENDIAN
70
    memcpy(buffer + 1, &value, 8);
71
#else
72
445
    buffer[1] = (unsigned char)(value >> 56);
73
445
    buffer[2] = (unsigned char)(value >> 48);
74
445
    buffer[3] = (unsigned char)(value >> 40);
75
445
    buffer[4] = (unsigned char)(value >> 32);
76
445
    buffer[5] = (unsigned char)(value >> 24);
77
445
    buffer[6] = (unsigned char)(value >> 16);
78
445
    buffer[7] = (unsigned char)(value >> 8);
79
445
    buffer[8] = (unsigned char)value;
80
445
#endif
81
82
445
    return 9;
83
445
  } else
84
0
    return 0;
85
445
}
86
87
size_t _cbor_encode_uint(uint64_t value, unsigned char *buffer,
88
201k
                         size_t buffer_size, uint8_t offset) {
89
201k
  if (value <= UINT16_MAX)
90
201k
    if (value <= UINT8_MAX)
91
201k
      return _cbor_encode_uint8((uint8_t)value, buffer, buffer_size, offset);
92
98
    else
93
98
      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
201k
}