xref: /openbsd-src/lib/libcbor/src/cbor/encoding.h (revision 4dcc46c4d04180142eda526ce521dfb137776d05)
1da0d961cSdjm /*
2d3425be1Sdjm  * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
3da0d961cSdjm  *
4da0d961cSdjm  * libcbor is free software; you can redistribute it and/or modify
5da0d961cSdjm  * it under the terms of the MIT license. See LICENSE for details.
6da0d961cSdjm  */
7da0d961cSdjm 
8da0d961cSdjm #ifndef LIBCBOR_ENCODING_H
9da0d961cSdjm #define LIBCBOR_ENCODING_H
10da0d961cSdjm 
11*4dcc46c4Sdjm #include "cbor/cbor_export.h"
12da0d961cSdjm #include "cbor/common.h"
13da0d961cSdjm 
14da0d961cSdjm #ifdef __cplusplus
15da0d961cSdjm extern "C" {
16da0d961cSdjm #endif
17da0d961cSdjm 
18da0d961cSdjm /*
19*4dcc46c4Sdjm  * All cbor_encode_* methods take 2 or 3 arguments:
20*4dcc46c4Sdjm  * - a logical `value` to encode (except for trivial items such as NULLs)
21*4dcc46c4Sdjm  * - an output `buffer` pointer
22*4dcc46c4Sdjm  * - a `buffer_size` specification
23*4dcc46c4Sdjm  *
24*4dcc46c4Sdjm  * They serialize the `value` into one or more bytes and write the bytes to the
25*4dcc46c4Sdjm  * output `buffer` and return either the number of bytes written, or 0 if the
26*4dcc46c4Sdjm  * `buffer_size` was too small to small to fit the serialized value (in which
27*4dcc46c4Sdjm  * case it is not modified).
28da0d961cSdjm  */
29da0d961cSdjm 
30*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_uint8(uint8_t, unsigned char *,
31*4dcc46c4Sdjm                                                      size_t);
32da0d961cSdjm 
33*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_uint16(uint16_t, unsigned char *,
34*4dcc46c4Sdjm                                                       size_t);
35da0d961cSdjm 
36*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_uint32(uint32_t, unsigned char *,
37*4dcc46c4Sdjm                                                       size_t);
38da0d961cSdjm 
39*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_uint64(uint64_t, unsigned char *,
40*4dcc46c4Sdjm                                                       size_t);
41da0d961cSdjm 
42*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_uint(uint64_t, unsigned char *,
43*4dcc46c4Sdjm                                                     size_t);
44da0d961cSdjm 
45*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_negint8(uint8_t, unsigned char *,
46*4dcc46c4Sdjm                                                        size_t);
47da0d961cSdjm 
48*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_negint16(uint16_t,
49*4dcc46c4Sdjm                                                         unsigned char *,
50*4dcc46c4Sdjm                                                         size_t);
51da0d961cSdjm 
52*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_negint32(uint32_t,
53*4dcc46c4Sdjm                                                         unsigned char *,
54*4dcc46c4Sdjm                                                         size_t);
55da0d961cSdjm 
56*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_negint64(uint64_t,
57*4dcc46c4Sdjm                                                         unsigned char *,
58*4dcc46c4Sdjm                                                         size_t);
59da0d961cSdjm 
60*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_negint(uint64_t, unsigned char *,
61*4dcc46c4Sdjm                                                       size_t);
62da0d961cSdjm 
63*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_bytestring_start(size_t,
64*4dcc46c4Sdjm                                                                 unsigned char *,
65*4dcc46c4Sdjm                                                                 size_t);
66da0d961cSdjm 
67*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t
68*4dcc46c4Sdjm cbor_encode_indef_bytestring_start(unsigned char *, size_t);
69da0d961cSdjm 
70*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_string_start(size_t,
71*4dcc46c4Sdjm                                                             unsigned char *,
72*4dcc46c4Sdjm                                                             size_t);
73da0d961cSdjm 
74*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t
75*4dcc46c4Sdjm cbor_encode_indef_string_start(unsigned char *, size_t);
76da0d961cSdjm 
77*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_array_start(size_t,
78*4dcc46c4Sdjm                                                            unsigned char *,
79*4dcc46c4Sdjm                                                            size_t);
80da0d961cSdjm 
81*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t
82*4dcc46c4Sdjm cbor_encode_indef_array_start(unsigned char *, size_t);
83da0d961cSdjm 
84*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_map_start(size_t,
85*4dcc46c4Sdjm                                                          unsigned char *,
86*4dcc46c4Sdjm                                                          size_t);
87da0d961cSdjm 
88*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_indef_map_start(unsigned char *,
89*4dcc46c4Sdjm                                                                size_t);
90da0d961cSdjm 
91*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_tag(uint64_t, unsigned char *,
92*4dcc46c4Sdjm                                                    size_t);
93da0d961cSdjm 
94*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_bool(bool, unsigned char *,
95*4dcc46c4Sdjm                                                     size_t);
96da0d961cSdjm 
97*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_null(unsigned char *, size_t);
98da0d961cSdjm 
99*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_undef(unsigned char *, size_t);
100da0d961cSdjm 
101da0d961cSdjm /** Encodes a half-precision float
102da0d961cSdjm  *
103da0d961cSdjm  * Since there is no native representation or semantics for half floats
104da0d961cSdjm  * in the language, we use single-precision floats, as every value that
105da0d961cSdjm  * can be expressed as a half-float can also be expressed as a float.
106da0d961cSdjm  *
107da0d961cSdjm  * This however means that not all floats passed to this function can be
108da0d961cSdjm  * unambiguously encoded. The behavior is as follows:
109da0d961cSdjm  *  - Infinity, NaN are preserved
110da0d961cSdjm  *  - Zero is preserved
1119e5c2ddcSdjm  *  - Denormalized numbers keep their sign bit and 10 most significant bit of
1129e5c2ddcSdjm  * the significand
113da0d961cSdjm  *  - All other numbers
114da0d961cSdjm  *   - If the logical value of the exponent is < -24, the output is zero
115da0d961cSdjm  *   - If the logical value of the exponent is between -23 and -14, the output
116da0d961cSdjm  *     is cut off to represent the 'magnitude' of the input, by which we
1179e5c2ddcSdjm  *     mean (-1)^{signbit} x 1.0e{exponent}. The value in the significand is
1189e5c2ddcSdjm  * lost.
1199e5c2ddcSdjm  *   - In all other cases, the sign bit, the exponent, and 10 most significant
1209e5c2ddcSdjm  * bits of the significand are kept
121da0d961cSdjm  */
122*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_half(float, unsigned char *,
123*4dcc46c4Sdjm                                                     size_t);
124da0d961cSdjm 
125*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_single(float, unsigned char *,
126*4dcc46c4Sdjm                                                       size_t);
127da0d961cSdjm 
128*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_double(double, unsigned char *,
129*4dcc46c4Sdjm                                                       size_t);
130da0d961cSdjm 
131*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_break(unsigned char *, size_t);
132da0d961cSdjm 
133*4dcc46c4Sdjm _CBOR_NODISCARD CBOR_EXPORT size_t cbor_encode_ctrl(uint8_t, unsigned char *,
134*4dcc46c4Sdjm                                                     size_t);
135da0d961cSdjm 
136da0d961cSdjm #ifdef __cplusplus
137da0d961cSdjm }
138da0d961cSdjm #endif
139da0d961cSdjm 
140da0d961cSdjm #endif  // LIBCBOR_ENCODING_H
141