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