/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 | } |