1/*
2 * Copyright (c) 2014-2019 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#ifndef LIBCBOR_ENCODING_H
9#define LIBCBOR_ENCODING_H
10
11#include "cbor/common.h"
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17/*
18 * ============================================================================
19 * Primitives encoding
20 * ============================================================================
21 */
22
23size_t cbor_encode_uint8(uint8_t, unsigned char *, size_t);
24
25size_t cbor_encode_uint16(uint16_t, unsigned char *, size_t);
26
27size_t cbor_encode_uint32(uint32_t, unsigned char *, size_t);
28
29size_t cbor_encode_uint64(uint64_t, unsigned char *, size_t);
30
31size_t cbor_encode_uint(uint64_t, unsigned char *, size_t);
32
33size_t cbor_encode_negint8(uint8_t, unsigned char *, size_t);
34
35size_t cbor_encode_negint16(uint16_t, unsigned char *, size_t);
36
37size_t cbor_encode_negint32(uint32_t, unsigned char *, size_t);
38
39size_t cbor_encode_negint64(uint64_t, unsigned char *, size_t);
40
41size_t cbor_encode_negint(uint64_t, unsigned char *, size_t);
42
43size_t cbor_encode_bytestring_start(size_t, unsigned char *, size_t);
44
45size_t cbor_encode_indef_bytestring_start(unsigned char *, size_t);
46
47size_t cbor_encode_string_start(size_t, unsigned char *, size_t);
48
49size_t cbor_encode_indef_string_start(unsigned char *, size_t);
50
51size_t cbor_encode_array_start(size_t, unsigned char *, size_t);
52
53size_t cbor_encode_indef_array_start(unsigned char *, size_t);
54
55size_t cbor_encode_map_start(size_t, unsigned char *, size_t);
56
57size_t cbor_encode_indef_map_start(unsigned char *, size_t);
58
59size_t cbor_encode_tag(uint64_t, unsigned char *, size_t);
60
61size_t cbor_encode_bool(bool, unsigned char *, size_t);
62
63size_t cbor_encode_null(unsigned char *, size_t);
64
65size_t cbor_encode_undef(unsigned char *, size_t);
66
67/** Encodes a half-precision float
68 *
69 * Since there is no native representation or semantics for half floats
70 * in the language, we use single-precision floats, as every value that
71 * can be expressed as a half-float can also be expressed as a float.
72 *
73 * This however means that not all floats passed to this function can be
74 * unambiguously encoded. The behavior is as follows:
75 *  - Infinity, NaN are preserved
76 *  - Zero is preserved
77 *  - Denormalized numbers keep their sign bit and 10 most significant bit of
78 * the significand
79 *  - All other numbers
80 *   - If the logical value of the exponent is < -24, the output is zero
81 *   - If the logical value of the exponent is between -23 and -14, the output
82 *     is cut off to represent the 'magnitude' of the input, by which we
83 *     mean (-1)^{signbit} x 1.0e{exponent}. The value in the significand is
84 * lost.
85 *   - In all other cases, the sign bit, the exponent, and 10 most significant
86 * bits of the significand are kept
87 *
88 * @param value
89 * @param buffer Target buffer
90 * @param buffer_size Available space in the buffer
91 * @return number of bytes written
92 */
93size_t cbor_encode_half(float, unsigned char *, size_t);
94
95size_t cbor_encode_single(float, unsigned char *, size_t);
96
97size_t cbor_encode_double(double, unsigned char *, size_t);
98
99size_t cbor_encode_break(unsigned char *, size_t);
100
101size_t cbor_encode_ctrl(uint8_t, unsigned char *, size_t);
102
103#ifdef __cplusplus
104}
105#endif
106
107#endif  // LIBCBOR_ENCODING_H
108