--- /srv/rebuilderd/tmp/rebuilderdt4Q36F/inputs/libtinycbor-dev_0.6.1-1_amd64.deb +++ /srv/rebuilderd/tmp/rebuilderdt4Q36F/out/libtinycbor-dev_0.6.1-1_amd64.deb ├── file list │ @@ -1,3 +1,3 @@ │ -rw-r--r-- 0 0 0 4 2025-04-10 06:00:08.000000 debian-binary │ -rw-r--r-- 0 0 0 2396 2025-04-10 06:00:08.000000 control.tar.xz │ --rw-r--r-- 0 0 0 100764 2025-04-10 06:00:08.000000 data.tar.xz │ +-rw-r--r-- 0 0 0 100648 2025-04-10 06:00:08.000000 data.tar.xz ├── control.tar.xz │ ├── control.tar │ │ ├── ./md5sums │ │ │ ├── ./md5sums │ │ │ │┄ Files differ │ │ │ ├── line order │ │ │ │ @@ -2,20 +2,20 @@ │ │ │ │ usr/include/tinycbor/cborjson.h │ │ │ │ usr/include/tinycbor/tinycbor-version.h │ │ │ │ usr/lib/x86_64-linux-gnu/libtinycbor.a │ │ │ │ usr/lib/x86_64-linux-gnu/pkgconfig/tinycbor.pc │ │ │ │ usr/share/doc-base/libtinycbor-dev.libtinycbor-dev │ │ │ │ usr/share/doc/libtinycbor-dev/changelog.Debian.gz │ │ │ │ usr/share/doc/libtinycbor-dev/copyright │ │ │ │ +usr/share/doc/libtinycbor-dev/html/a00002.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00002_source.html │ │ │ │ +usr/share/doc/libtinycbor-dev/html/a00008.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00008_source.html │ │ │ │ -usr/share/doc/libtinycbor-dev/html/a00032.html │ │ │ │ -usr/share/doc/libtinycbor-dev/html/a00032_source.html │ │ │ │ -usr/share/doc/libtinycbor-dev/html/a00047.html │ │ │ │ -usr/share/doc/libtinycbor-dev/html/a00047_source.html │ │ │ │ +usr/share/doc/libtinycbor-dev/html/a00041_source.html │ │ │ │ +usr/share/doc/libtinycbor-dev/html/a00044_source.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00054.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00055.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00056.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00057.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00058.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00062.html │ │ │ │ usr/share/doc/libtinycbor-dev/html/a00082.html ├── data.tar.xz │ ├── data.tar │ │ ├── file list │ │ │ @@ -12,20 +12,20 @@ │ │ │ -rw-r--r-- 0 root (0) root (0) 257 2025-04-10 06:00:08.000000 ./usr/lib/x86_64-linux-gnu/pkgconfig/tinycbor.pc │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-04-10 06:00:08.000000 ./usr/share/ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-04-10 06:00:08.000000 ./usr/share/doc/ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/ │ │ │ -rw-r--r-- 0 root (0) root (0) 726 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/changelog.Debian.gz │ │ │ -rw-r--r-- 0 root (0) root (0) 1397 2024-10-19 16:35:58.000000 ./usr/share/doc/libtinycbor-dev/copyright │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/ │ │ │ --rw-r--r-- 0 root (0) root (0) 2641 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00002_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7462 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00008_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4218 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00032.html │ │ │ --rw-r--r-- 0 root (0) root (0) 12436 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00032_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 45995 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00047.html │ │ │ --rw-r--r-- 0 root (0) root (0) 137371 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00047_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 45995 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00002.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 137371 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00002_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4218 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00008.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 12436 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00008_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 2641 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00041_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7462 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00044_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 3029 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00054.html │ │ │ -rw-r--r-- 0 root (0) root (0) 51196 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00055.html │ │ │ -rw-r--r-- 0 root (0) root (0) 46890 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00056.html │ │ │ -rw-r--r-- 0 root (0) root (0) 11719 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00057.html │ │ │ -rw-r--r-- 0 root (0) root (0) 10695 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00058.html │ │ │ -rw-r--r-- 0 root (0) root (0) 2475 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00062.html │ │ │ -rw-r--r-- 0 root (0) root (0) 2695 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/a00082.html │ │ │ @@ -44,15 +44,15 @@ │ │ │ -rw-r--r-- 0 root (0) root (0) 1996 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/folderclosedd.svg │ │ │ -rw-r--r-- 0 root (0) root (0) 3269 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/folderopen.svg │ │ │ -rw-r--r-- 0 root (0) root (0) 3214 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/folderopend.svg │ │ │ -rw-r--r-- 0 root (0) root (0) 7245 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/globals.html │ │ │ -rw-r--r-- 0 root (0) root (0) 7204 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/globals_func.html │ │ │ -rw-r--r-- 0 root (0) root (0) 6113 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/graph_legend.html │ │ │ -rw-r--r-- 0 root (0) root (0) 23370 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/graph_legend.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1806 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/index.hhc.gz │ │ │ +-rw-r--r-- 0 root (0) root (0) 1805 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/index.hhc.gz │ │ │ -rw-r--r-- 0 root (0) root (0) 2026 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/index.hhk.gz │ │ │ -rw-r--r-- 0 root (0) root (0) 962 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/index.hhp │ │ │ -rw-r--r-- 0 root (0) root (0) 2575 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/index.html │ │ │ -rw-r--r-- 0 root (0) root (0) 2024 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/menudata.js │ │ │ -rw-r--r-- 0 root (0) root (0) 582 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/minus.svg │ │ │ -rw-r--r-- 0 root (0) root (0) 582 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/minusd.svg │ │ │ -rw-r--r-- 0 root (0) root (0) 153 2025-04-10 06:00:08.000000 ./usr/share/doc/libtinycbor-dev/html/nav_f.png │ │ ├── ./usr/share/doc/libtinycbor-dev/html/a00002_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -TinyCBOR 0.6.0 API: tinycbor-version.h Source File │ │ │ +TinyCBOR 0.6.0 API: cbor.h Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ @@ -39,20 +39,781 @@ │ │ │ │ │ │
│ │ │ │ │ │
│ │ │ -
tinycbor-version.h
│ │ │ +
cbor.h
│ │ │
│ │ │
│ │ │ -
1#define TINYCBOR_VERSION_MAJOR 0
│ │ │ -
2#define TINYCBOR_VERSION_MINOR 6
│ │ │ -
3#define TINYCBOR_VERSION_PATCH 0
│ │ │ +Go to the documentation of this file.
1/****************************************************************************
│ │ │ +
2**
│ │ │ +
3** Copyright (C) 2021 Intel Corporation
│ │ │ +
4**
│ │ │ +
5** Permission is hereby granted, free of charge, to any person obtaining a copy
│ │ │ +
6** of this software and associated documentation files (the "Software"), to deal
│ │ │ +
7** in the Software without restriction, including without limitation the rights
│ │ │ +
8** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
│ │ │ +
9** copies of the Software, and to permit persons to whom the Software is
│ │ │ +
10** furnished to do so, subject to the following conditions:
│ │ │ +
11**
│ │ │ +
12** The above copyright notice and this permission notice shall be included in
│ │ │ +
13** all copies or substantial portions of the Software.
│ │ │ +
14**
│ │ │ +
15** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
│ │ │ +
16** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
│ │ │ +
17** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
│ │ │ +
18** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
│ │ │ +
19** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
│ │ │ +
20** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
│ │ │ +
21** THE SOFTWARE.
│ │ │ +
22**
│ │ │ +
23****************************************************************************/
│ │ │ +
24
│ │ │ +
25#ifndef CBOR_H
│ │ │ +
26#define CBOR_H
│ │ │ +
27
│ │ │ +
28#ifndef assert
│ │ │ +
29#include <assert.h>
│ │ │ +
30#endif
│ │ │ +
31#include <limits.h>
│ │ │ +
32#include <stddef.h>
│ │ │ +
33#include <stdint.h>
│ │ │ +
34#include <string.h>
│ │ │ +
35#include <stdio.h>
│ │ │ +
36
│ │ │ +
37#ifdef CBOR_EXTERNAL_CFG
│ │ │ +
38#include "cbor_cfg.h"
│ │ │ +
39#endif
│ │ │ +
40
│ │ │ +
41#include "tinycbor-version.h"
│ │ │ +
42
│ │ │ +
43#define TINYCBOR_VERSION ((TINYCBOR_VERSION_MAJOR << 16) | (TINYCBOR_VERSION_MINOR << 8) | TINYCBOR_VERSION_PATCH)
│ │ │ +
44
│ │ │ +
45#ifdef __cplusplus
│ │ │ +
46extern "C" {
│ │ │ +
47#else
│ │ │ +
48#include <stdbool.h>
│ │ │ +
49#endif
│ │ │ +
50
│ │ │ +
51#ifndef SIZE_MAX
│ │ │ +
52/* Some systems fail to define SIZE_MAX in <stdint.h>, even though C99 requires it...
│ │ │ +
53 * Conversion from signed to unsigned is defined in 6.3.1.3 (Signed and unsigned integers) p2,
│ │ │ +
54 * which says: "the value is converted by repeatedly adding or subtracting one more than the
│ │ │ +
55 * maximum value that can be represented in the new type until the value is in the range of the
│ │ │ +
56 * new type."
│ │ │ +
57 * So -1 gets converted to size_t by adding SIZE_MAX + 1, which results in SIZE_MAX.
│ │ │ +
58 */
│ │ │ +
59# define SIZE_MAX ((size_t)-1)
│ │ │ +
60#endif
│ │ │ +
61
│ │ │ +
62#ifndef CBOR_API
│ │ │ +
63# define CBOR_API
│ │ │ +
64#endif
│ │ │ +
65#ifndef CBOR_PRIVATE_API
│ │ │ +
66# define CBOR_PRIVATE_API
│ │ │ +
67#endif
│ │ │ +
68#ifndef CBOR_INLINE_API
│ │ │ +
69# if defined(__cplusplus)
│ │ │ +
70# define CBOR_INLINE inline
│ │ │ +
71# define CBOR_INLINE_API inline
│ │ │ +
72# else
│ │ │ +
73# define CBOR_INLINE_API static CBOR_INLINE
│ │ │ +
74# if defined(_MSC_VER)
│ │ │ +
75# define CBOR_INLINE __inline
│ │ │ +
76# elif defined(__GNUC__)
│ │ │ +
77# define CBOR_INLINE __inline__
│ │ │ +
78# elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
│ │ │ +
79# define CBOR_INLINE inline
│ │ │ +
80# else
│ │ │ +
81# define CBOR_INLINE
│ │ │ +
82# endif
│ │ │ +
83# endif
│ │ │ +
84#endif
│ │ │ +
85
│ │ │ +
86typedef enum CborType {
│ │ │ +
87 CborIntegerType = 0x00,
│ │ │ +
88 CborByteStringType = 0x40,
│ │ │ +
89 CborTextStringType = 0x60,
│ │ │ +
90 CborArrayType = 0x80,
│ │ │ +
91 CborMapType = 0xa0,
│ │ │ +
92 CborTagType = 0xc0,
│ │ │ +
93 CborSimpleType = 0xe0,
│ │ │ +
94 CborBooleanType = 0xf5,
│ │ │ +
95 CborNullType = 0xf6,
│ │ │ +
96 CborUndefinedType = 0xf7,
│ │ │ +
97 CborHalfFloatType = 0xf9,
│ │ │ +
98 CborFloatType = 0xfa,
│ │ │ +
99 CborDoubleType = 0xfb,
│ │ │ +
100
│ │ │ +
101 CborInvalidType = 0xff /* equivalent to the break byte, so it will never be used */
│ │ │ +
102} CborType;
│ │ │ +
103
│ │ │ +
104typedef uint64_t CborTag;
│ │ │ +
105typedef enum CborKnownTags {
│ │ │ +
106 CborDateTimeStringTag = 0,
│ │ │ +
107 CborUnixTime_tTag = 1,
│ │ │ +
108 CborPositiveBignumTag = 2,
│ │ │ +
109 CborNegativeBignumTag = 3,
│ │ │ +
110 CborDecimalTag = 4,
│ │ │ +
111 CborBigfloatTag = 5,
│ │ │ +
112 CborCOSE_Encrypt0Tag = 16,
│ │ │ +
113 CborCOSE_Mac0Tag = 17,
│ │ │ +
114 CborCOSE_Sign1Tag = 18,
│ │ │ +
115 CborExpectedBase64urlTag = 21,
│ │ │ +
116 CborExpectedBase64Tag = 22,
│ │ │ +
117 CborExpectedBase16Tag = 23,
│ │ │ +
118 CborEncodedCborTag = 24,
│ │ │ +
119 CborUrlTag = 32,
│ │ │ +
120 CborBase64urlTag = 33,
│ │ │ +
121 CborBase64Tag = 34,
│ │ │ +
122 CborRegularExpressionTag = 35,
│ │ │ +
123 CborMimeMessageTag = 36,
│ │ │ +
124 CborCOSE_EncryptTag = 96,
│ │ │ +
125 CborCOSE_MacTag = 97,
│ │ │ +
126 CborCOSE_SignTag = 98,
│ │ │ +
127 CborSignatureTag = 55799
│ │ │ +
128} CborKnownTags;
│ │ │ +
129
│ │ │ +
130/* #define the constants so we can check with #ifdef */
│ │ │ +
131#define CborDateTimeStringTag CborDateTimeStringTag
│ │ │ +
132#define CborUnixTime_tTag CborUnixTime_tTag
│ │ │ +
133#define CborPositiveBignumTag CborPositiveBignumTag
│ │ │ +
134#define CborNegativeBignumTag CborNegativeBignumTag
│ │ │ +
135#define CborDecimalTag CborDecimalTag
│ │ │ +
136#define CborBigfloatTag CborBigfloatTag
│ │ │ +
137#define CborCOSE_Encrypt0Tag CborCOSE_Encrypt0Tag
│ │ │ +
138#define CborCOSE_Mac0Tag CborCOSE_Mac0Tag
│ │ │ +
139#define CborCOSE_Sign1Tag CborCOSE_Sign1Tag
│ │ │ +
140#define CborExpectedBase64urlTag CborExpectedBase64urlTag
│ │ │ +
141#define CborExpectedBase64Tag CborExpectedBase64Tag
│ │ │ +
142#define CborExpectedBase16Tag CborExpectedBase16Tag
│ │ │ +
143#define CborEncodedCborTag CborEncodedCborTag
│ │ │ +
144#define CborUrlTag CborUrlTag
│ │ │ +
145#define CborBase64urlTag CborBase64urlTag
│ │ │ +
146#define CborBase64Tag CborBase64Tag
│ │ │ +
147#define CborRegularExpressionTag CborRegularExpressionTag
│ │ │ +
148#define CborMimeMessageTag CborMimeMessageTag
│ │ │ +
149#define CborCOSE_EncryptTag CborCOSE_EncryptTag
│ │ │ +
150#define CborCOSE_MacTag CborCOSE_MacTag
│ │ │ +
151#define CborCOSE_SignTag CborCOSE_SignTag
│ │ │ +
152#define CborSignatureTag CborSignatureTag
│ │ │ +
153
│ │ │ +
154/* Error API */
│ │ │ +
155
│ │ │ +
156typedef enum CborError {
│ │ │ +
157 CborNoError = 0,
│ │ │ +
158
│ │ │ +
159 /* errors in all modes */
│ │ │ +
160 CborUnknownError,
│ │ │ +
161 CborErrorUnknownLength, /* request for length in array, map, or string with indeterminate length */
│ │ │ +
162 CborErrorAdvancePastEOF,
│ │ │ +
163 CborErrorIO,
│ │ │ +
164
│ │ │ +
165 /* parser errors streaming errors */
│ │ │ +
166 CborErrorGarbageAtEnd = 256,
│ │ │ +
167 CborErrorUnexpectedEOF,
│ │ │ +
168 CborErrorUnexpectedBreak,
│ │ │ +
169 CborErrorUnknownType, /* can only happen in major type 7 */
│ │ │ +
170 CborErrorIllegalType, /* type not allowed here */
│ │ │ +
171 CborErrorIllegalNumber,
│ │ │ +
172 CborErrorIllegalSimpleType, /* types of value less than 32 encoded in two bytes */
│ │ │ +
173 CborErrorNoMoreStringChunks,
│ │ │ +
174
│ │ │ +
175 /* parser errors in strict mode parsing only */
│ │ │ +
176 CborErrorUnknownSimpleType = 512,
│ │ │ +
177 CborErrorUnknownTag,
│ │ │ +
178 CborErrorInappropriateTagForType,
│ │ │ +
179 CborErrorDuplicateObjectKeys,
│ │ │ +
180 CborErrorInvalidUtf8TextString,
│ │ │ +
181 CborErrorExcludedType,
│ │ │ +
182 CborErrorExcludedValue,
│ │ │ +
183 CborErrorImproperValue,
│ │ │ +
184 CborErrorOverlongEncoding,
│ │ │ +
185 CborErrorMapKeyNotString,
│ │ │ +
186 CborErrorMapNotSorted,
│ │ │ +
187 CborErrorMapKeysNotUnique,
│ │ │ +
188
│ │ │ +
189 /* encoder errors */
│ │ │ +
190 CborErrorTooManyItems = 768,
│ │ │ +
191 CborErrorTooFewItems,
│ │ │ +
192
│ │ │ +
193 /* internal implementation errors */
│ │ │ +
194 CborErrorDataTooLarge = 1024,
│ │ │ +
195 CborErrorNestingTooDeep,
│ │ │ +
196 CborErrorUnsupportedType,
│ │ │ +
197 CborErrorUnimplementedValidation,
│ │ │ +
198
│ │ │ +
199 /* errors in converting to JSON */
│ │ │ +
200 CborErrorJsonObjectKeyIsAggregate = 1280,
│ │ │ +
201 CborErrorJsonObjectKeyNotString,
│ │ │ +
202 CborErrorJsonNotImplemented,
│ │ │ +
203
│ │ │ +
204 CborErrorOutOfMemory = (int) (~0U / 2 + 1),
│ │ │ +
205 CborErrorInternalError = (int) (~0U / 2) /* INT_MAX on two's complement machines */
│ │ │ +
206} CborError;
│ │ │ +
207
│ │ │ +
208CBOR_API const char *cbor_error_string(CborError error);
│ │ │ +
209
│ │ │ +
210/* Encoder API */
│ │ │ +
211
│ │ │ +
212typedef enum CborEncoderAppendType
│ │ │ +
213{
│ │ │ +
214 CborEncoderAppendCborData = 0,
│ │ │ +
215 CborEncoderAppendStringData = 1
│ │ │ +
216} CborEncoderAppendType;
│ │ │ +
217
│ │ │ +
218typedef CborError (*CborEncoderWriteFunction)(void *, const void *, size_t, CborEncoderAppendType);
│ │ │ +
219
│ │ │ +
220enum CborEncoderFlags
│ │ │ +
221{
│ │ │ +
222 CborIteratorFlag_WriterFunction = 0x01,
│ │ │ +
223 CborIteratorFlag_ContainerIsMap_ = 0x20
│ │ │ +
224};
│ │ │ +
225
│ │ │ + │ │ │ +
227{
│ │ │ +
228 union {
│ │ │ +
229 uint8_t *ptr;
│ │ │ +
230 ptrdiff_t bytes_needed;
│ │ │ +
231 CborEncoderWriteFunction writer;
│ │ │ +
232 } data;
│ │ │ +
233 uint8_t *end;
│ │ │ +
234 size_t remaining;
│ │ │ +
235 int flags;
│ │ │ +
236};
│ │ │ +
237typedef struct CborEncoder CborEncoder;
│ │ │ +
238
│ │ │ +
239static const size_t CborIndefiniteLength = SIZE_MAX;
│ │ │ +
240
│ │ │ +
241#ifndef CBOR_NO_ENCODER_API
│ │ │ +
242CBOR_API void cbor_encoder_init(CborEncoder *encoder, uint8_t *buffer, size_t size, int flags);
│ │ │ +
243CBOR_API void cbor_encoder_init_writer(CborEncoder *encoder, CborEncoderWriteFunction writer, void *);
│ │ │ +
244CBOR_API CborError cbor_encode_uint(CborEncoder *encoder, uint64_t value);
│ │ │ +
245CBOR_API CborError cbor_encode_int(CborEncoder *encoder, int64_t value);
│ │ │ +
246CBOR_API CborError cbor_encode_negative_int(CborEncoder *encoder, uint64_t absolute_value);
│ │ │ +
247CBOR_API CborError cbor_encode_simple_value(CborEncoder *encoder, uint8_t value);
│ │ │ +
248CBOR_API CborError cbor_encode_tag(CborEncoder *encoder, CborTag tag);
│ │ │ +
249CBOR_API CborError cbor_encode_text_string(CborEncoder *encoder, const char *string, size_t length);
│ │ │ +
250CBOR_INLINE_API CborError cbor_encode_text_stringz(CborEncoder *encoder, const char *string)
│ │ │ +
251{ return cbor_encode_text_string(encoder, string, strlen(string)); }
│ │ │ +
252CBOR_API CborError cbor_encode_byte_string(CborEncoder *encoder, const uint8_t *string, size_t length);
│ │ │ +
253CBOR_API CborError cbor_encode_floating_point(CborEncoder *encoder, CborType fpType, const void *value);
│ │ │ +
254
│ │ │ +
255CBOR_INLINE_API CborError cbor_encode_boolean(CborEncoder *encoder, bool value)
│ │ │ +
256{ return cbor_encode_simple_value(encoder, (int)value - 1 + (CborBooleanType & 0x1f)); }
│ │ │ +
257CBOR_INLINE_API CborError cbor_encode_null(CborEncoder *encoder)
│ │ │ +
258{ return cbor_encode_simple_value(encoder, CborNullType & 0x1f); }
│ │ │ +
259CBOR_INLINE_API CborError cbor_encode_undefined(CborEncoder *encoder)
│ │ │ +
260{ return cbor_encode_simple_value(encoder, CborUndefinedType & 0x1f); }
│ │ │ +
261
│ │ │ +
262CBOR_INLINE_API CborError cbor_encode_half_float(CborEncoder *encoder, const void *value)
│ │ │ +
263{ return cbor_encode_floating_point(encoder, CborHalfFloatType, value); }
│ │ │ +
264CBOR_API CborError cbor_encode_float_as_half_float(CborEncoder *encoder, float value);
│ │ │ +
265CBOR_INLINE_API CborError cbor_encode_float(CborEncoder *encoder, float value)
│ │ │ +
266{ return cbor_encode_floating_point(encoder, CborFloatType, &value); }
│ │ │ +
267CBOR_INLINE_API CborError cbor_encode_double(CborEncoder *encoder, double value)
│ │ │ +
268{ return cbor_encode_floating_point(encoder, CborDoubleType, &value); }
│ │ │ +
269
│ │ │ +
270CBOR_API CborError cbor_encoder_create_array(CborEncoder *parentEncoder, CborEncoder *arrayEncoder, size_t length);
│ │ │ +
271CBOR_API CborError cbor_encoder_create_map(CborEncoder *parentEncoder, CborEncoder *mapEncoder, size_t length);
│ │ │ +
272CBOR_API CborError cbor_encoder_close_container(CborEncoder *parentEncoder, const CborEncoder *containerEncoder);
│ │ │ +
273CBOR_API CborError cbor_encoder_close_container_checked(CborEncoder *parentEncoder, const CborEncoder *containerEncoder);
│ │ │ +
274
│ │ │ +
275CBOR_INLINE_API uint8_t *_cbor_encoder_get_buffer_pointer(const CborEncoder *encoder)
│ │ │ +
276{
│ │ │ +
277 return encoder->data.ptr;
│ │ │ +
278}
│ │ │ +
279
│ │ │ +
280CBOR_INLINE_API size_t cbor_encoder_get_buffer_size(const CborEncoder *encoder, const uint8_t *buffer)
│ │ │ +
281{
│ │ │ +
282 return (size_t)(encoder->data.ptr - buffer);
│ │ │ +
283}
│ │ │ +
284
│ │ │ +
285CBOR_INLINE_API size_t cbor_encoder_get_extra_bytes_needed(const CborEncoder *encoder)
│ │ │ +
286{
│ │ │ +
287 return encoder->end ? 0 : (size_t)encoder->data.bytes_needed;
│ │ │ +
288}
│ │ │ +
289#endif /* CBOR_NO_ENCODER_API */
│ │ │ +
290
│ │ │ +
291/* Parser API */
│ │ │ +
292
│ │ │ +
293enum CborParserGlobalFlags
│ │ │ +
294{
│ │ │ +
295 CborParserFlag_ExternalSource = 0x01
│ │ │ +
296};
│ │ │ +
297
│ │ │ +
298enum CborParserIteratorFlags
│ │ │ +
299{
│ │ │ +
300 /* used for all types, but not during string chunk iteration
│ │ │ +
301 * (values are static-asserted, don't change) */
│ │ │ +
302 CborIteratorFlag_IntegerValueIs64Bit = 0x01,
│ │ │ +
303 CborIteratorFlag_IntegerValueTooLarge = 0x02,
│ │ │ +
304
│ │ │ +
305 /* used only for CborIntegerType */
│ │ │ +
306 CborIteratorFlag_NegativeInteger = 0x04,
│ │ │ +
307
│ │ │ +
308 /* used only during string iteration */
│ │ │ +
309 CborIteratorFlag_BeforeFirstStringChunk = 0x04,
│ │ │ +
310 CborIteratorFlag_IteratingStringChunks = 0x08,
│ │ │ +
311
│ │ │ +
312 /* used for arrays, maps and strings, including during chunk iteration */
│ │ │ +
313 CborIteratorFlag_UnknownLength = 0x10,
│ │ │ +
314
│ │ │ +
315 /* used for maps, but must be kept for all types
│ │ │ +
316 * (ContainerIsMap value must be CborMapType - CborArrayType) */
│ │ │ +
317 CborIteratorFlag_ContainerIsMap = 0x20,
│ │ │ +
318 CborIteratorFlag_NextIsMapKey = 0x40
│ │ │ +
319};
│ │ │ +
320
│ │ │ +
321struct CborValue;
│ │ │ +
322struct CborParserOperations
│ │ │ +
323{
│ │ │ +
324 bool (*can_read_bytes)(void *token, size_t len);
│ │ │ +
325 void *(*read_bytes)(void *token, void *dst, size_t offset, size_t len);
│ │ │ +
326 void (*advance_bytes)(void *token, size_t len);
│ │ │ +
327 CborError (*transfer_string)(void *token, const void **userptr, size_t offset, size_t len);
│ │ │ +
328};
│ │ │ +
329
│ │ │ +
330struct CborParser
│ │ │ +
331{
│ │ │ +
332 union {
│ │ │ +
333 const uint8_t *end;
│ │ │ +
334 const struct CborParserOperations *ops;
│ │ │ +
335 } source;
│ │ │ +
336 enum CborParserGlobalFlags flags;
│ │ │ +
337};
│ │ │ +
338typedef struct CborParser CborParser;
│ │ │ +
339
│ │ │ + │ │ │ +
341{
│ │ │ +
342 const CborParser *parser;
│ │ │ +
343 union {
│ │ │ +
344 const uint8_t *ptr;
│ │ │ +
345 void *token;
│ │ │ +
346 } source;
│ │ │ +
347 uint32_t remaining;
│ │ │ +
348 uint16_t extra;
│ │ │ +
349 uint8_t type;
│ │ │ +
350 uint8_t flags;
│ │ │ +
351};
│ │ │ +
352typedef struct CborValue CborValue;
│ │ │ +
353
│ │ │ +
354#ifndef CBOR_NO_PARSER_API
│ │ │ +
355CBOR_API CborError cbor_parser_init(const uint8_t *buffer, size_t size, uint32_t flags, CborParser *parser, CborValue *it);
│ │ │ +
356CBOR_API CborError cbor_parser_init_reader(const struct CborParserOperations *ops, CborParser *parser, CborValue *it, void *token);
│ │ │ +
357
│ │ │ +
358CBOR_API CborError cbor_value_validate_basic(const CborValue *it);
│ │ │ +
359
│ │ │ +
360CBOR_INLINE_API bool cbor_value_at_end(const CborValue *it)
│ │ │ +
361{ return it->remaining == 0; }
│ │ │ +
362CBOR_INLINE_API const uint8_t *cbor_value_get_next_byte(const CborValue *it)
│ │ │ +
363{ return it->source.ptr; }
│ │ │ +
364CBOR_API CborError cbor_value_reparse(CborValue *it);
│ │ │ +
365CBOR_API CborError cbor_value_advance_fixed(CborValue *it);
│ │ │ +
366CBOR_API CborError cbor_value_advance(CborValue *it);
│ │ │ +
367CBOR_INLINE_API bool cbor_value_is_container(const CborValue *it)
│ │ │ +
368{ return it->type == CborArrayType || it->type == CborMapType; }
│ │ │ +
369CBOR_API CborError cbor_value_enter_container(const CborValue *it, CborValue *recursed);
│ │ │ +
370CBOR_API CborError cbor_value_leave_container(CborValue *it, const CborValue *recursed);
│ │ │ +
371
│ │ │ +
372CBOR_PRIVATE_API uint64_t _cbor_value_decode_int64_internal(const CborValue *value);
│ │ │ +
373CBOR_INLINE_API uint64_t _cbor_value_extract_int64_helper(const CborValue *value)
│ │ │ +
374{
│ │ │ +
375 return value->flags & CborIteratorFlag_IntegerValueTooLarge ?
│ │ │ +
376 _cbor_value_decode_int64_internal(value) : value->extra;
│ │ │ +
377}
│ │ │ +
378
│ │ │ +
379CBOR_INLINE_API bool cbor_value_is_valid(const CborValue *value)
│ │ │ +
380{ return value && value->type != CborInvalidType; }
│ │ │ +
381CBOR_INLINE_API CborType cbor_value_get_type(const CborValue *value)
│ │ │ +
382{ return (CborType)value->type; }
│ │ │ +
383
│ │ │ +
384/* Null & undefined type */
│ │ │ +
385CBOR_INLINE_API bool cbor_value_is_null(const CborValue *value)
│ │ │ +
386{ return value->type == CborNullType; }
│ │ │ +
387CBOR_INLINE_API bool cbor_value_is_undefined(const CborValue *value)
│ │ │ +
388{ return value->type == CborUndefinedType; }
│ │ │ +
389
│ │ │ +
390/* Booleans */
│ │ │ +
391CBOR_INLINE_API bool cbor_value_is_boolean(const CborValue *value)
│ │ │ +
392{ return value->type == CborBooleanType; }
│ │ │ +
393CBOR_INLINE_API CborError cbor_value_get_boolean(const CborValue *value, bool *result)
│ │ │ +
394{
│ │ │ +
395 assert(cbor_value_is_boolean(value));
│ │ │ +
396 *result = !!value->extra;
│ │ │ +
397 return CborNoError;
│ │ │ +
398}
│ │ │ +
399
│ │ │ +
400/* Simple types */
│ │ │ +
401CBOR_INLINE_API bool cbor_value_is_simple_type(const CborValue *value)
│ │ │ +
402{ return value->type == CborSimpleType; }
│ │ │ +
403CBOR_INLINE_API CborError cbor_value_get_simple_type(const CborValue *value, uint8_t *result)
│ │ │ +
404{
│ │ │ +
405 assert(cbor_value_is_simple_type(value));
│ │ │ +
406 *result = (uint8_t)value->extra;
│ │ │ +
407 return CborNoError;
│ │ │ +
408}
│ │ │ +
409
│ │ │ +
410/* Integers */
│ │ │ +
411CBOR_INLINE_API bool cbor_value_is_integer(const CborValue *value)
│ │ │ +
412{ return value->type == CborIntegerType; }
│ │ │ +
413CBOR_INLINE_API bool cbor_value_is_unsigned_integer(const CborValue *value)
│ │ │ +
414{ return cbor_value_is_integer(value) && (value->flags & CborIteratorFlag_NegativeInteger) == 0; }
│ │ │ +
415CBOR_INLINE_API bool cbor_value_is_negative_integer(const CborValue *value)
│ │ │ +
416{ return cbor_value_is_integer(value) && (value->flags & CborIteratorFlag_NegativeInteger); }
│ │ │ +
417
│ │ │ +
418CBOR_INLINE_API CborError cbor_value_get_raw_integer(const CborValue *value, uint64_t *result)
│ │ │ +
419{
│ │ │ +
420 assert(cbor_value_is_integer(value));
│ │ │ +
421 *result = _cbor_value_extract_int64_helper(value);
│ │ │ +
422 return CborNoError;
│ │ │ +
423}
│ │ │ +
424
│ │ │ +
425CBOR_INLINE_API CborError cbor_value_get_uint64(const CborValue *value, uint64_t *result)
│ │ │ +
426{
│ │ │ +
427 assert(cbor_value_is_unsigned_integer(value));
│ │ │ +
428 *result = _cbor_value_extract_int64_helper(value);
│ │ │ +
429 return CborNoError;
│ │ │ +
430}
│ │ │ +
431
│ │ │ +
432CBOR_INLINE_API CborError cbor_value_get_int64(const CborValue *value, int64_t *result)
│ │ │ +
433{
│ │ │ +
434 assert(cbor_value_is_integer(value));
│ │ │ +
435 *result = (int64_t) _cbor_value_extract_int64_helper(value);
│ │ │ +
436 if (value->flags & CborIteratorFlag_NegativeInteger)
│ │ │ +
437 *result = -*result - 1;
│ │ │ +
438 return CborNoError;
│ │ │ +
439}
│ │ │ +
440
│ │ │ +
441CBOR_INLINE_API CborError cbor_value_get_int(const CborValue *value, int *result)
│ │ │ +
442{
│ │ │ +
443 assert(cbor_value_is_integer(value));
│ │ │ +
444 *result = (int) _cbor_value_extract_int64_helper(value);
│ │ │ +
445 if (value->flags & CborIteratorFlag_NegativeInteger)
│ │ │ +
446 *result = -*result - 1;
│ │ │ +
447 return CborNoError;
│ │ │ +
448}
│ │ │ +
449
│ │ │ +
450CBOR_API CborError cbor_value_get_int64_checked(const CborValue *value, int64_t *result);
│ │ │ +
451CBOR_API CborError cbor_value_get_int_checked(const CborValue *value, int *result);
│ │ │ +
452
│ │ │ +
453CBOR_INLINE_API bool cbor_value_is_length_known(const CborValue *value)
│ │ │ +
454{ return (value->flags & CborIteratorFlag_UnknownLength) == 0; }
│ │ │ +
455
│ │ │ +
456/* Tags */
│ │ │ +
457CBOR_INLINE_API bool cbor_value_is_tag(const CborValue *value)
│ │ │ +
458{ return value->type == CborTagType; }
│ │ │ +
459CBOR_INLINE_API CborError cbor_value_get_tag(const CborValue *value, CborTag *result)
│ │ │ +
460{
│ │ │ +
461 assert(cbor_value_is_tag(value));
│ │ │ +
462 *result = _cbor_value_extract_int64_helper(value);
│ │ │ +
463 return CborNoError;
│ │ │ +
464}
│ │ │ +
465CBOR_API CborError cbor_value_skip_tag(CborValue *it);
│ │ │ +
466
│ │ │ +
467/* Strings */
│ │ │ +
468CBOR_INLINE_API bool cbor_value_is_byte_string(const CborValue *value)
│ │ │ +
469{ return value->type == CborByteStringType; }
│ │ │ +
470CBOR_INLINE_API bool cbor_value_is_text_string(const CborValue *value)
│ │ │ +
471{ return value->type == CborTextStringType; }
│ │ │ +
472
│ │ │ +
473CBOR_INLINE_API CborError cbor_value_get_string_length(const CborValue *value, size_t *length)
│ │ │ +
474{
│ │ │ +
475 uint64_t v;
│ │ │ +
476 assert(cbor_value_is_byte_string(value) || cbor_value_is_text_string(value));
│ │ │ +
477 if (!cbor_value_is_length_known(value))
│ │ │ +
478 return CborErrorUnknownLength;
│ │ │ +
479 v = _cbor_value_extract_int64_helper(value);
│ │ │ +
480 *length = (size_t)v;
│ │ │ +
481 if (*length != v)
│ │ │ +
482 return CborErrorDataTooLarge;
│ │ │ +
483 return CborNoError;
│ │ │ +
484}
│ │ │ +
485
│ │ │ +
486CBOR_PRIVATE_API CborError _cbor_value_copy_string(const CborValue *value, void *buffer,
│ │ │ +
487 size_t *buflen, CborValue *next);
│ │ │ +
488CBOR_PRIVATE_API CborError _cbor_value_dup_string(const CborValue *value, void **buffer,
│ │ │ +
489 size_t *buflen, CborValue *next);
│ │ │ +
490
│ │ │ +
491CBOR_API CborError cbor_value_calculate_string_length(const CborValue *value, size_t *length);
│ │ │ +
492
│ │ │ +
493CBOR_INLINE_API CborError cbor_value_copy_text_string(const CborValue *value, char *buffer,
│ │ │ +
494 size_t *buflen, CborValue *next)
│ │ │ +
495{
│ │ │ +
496 assert(cbor_value_is_text_string(value));
│ │ │ +
497 return _cbor_value_copy_string(value, buffer, buflen, next);
│ │ │ +
498}
│ │ │ +
499CBOR_INLINE_API CborError cbor_value_copy_byte_string(const CborValue *value, uint8_t *buffer,
│ │ │ +
500 size_t *buflen, CborValue *next)
│ │ │ +
501{
│ │ │ +
502 assert(cbor_value_is_byte_string(value));
│ │ │ +
503 return _cbor_value_copy_string(value, buffer, buflen, next);
│ │ │ +
504}
│ │ │ +
505
│ │ │ +
506CBOR_INLINE_API CborError cbor_value_dup_text_string(const CborValue *value, char **buffer,
│ │ │ +
507 size_t *buflen, CborValue *next)
│ │ │ +
508{
│ │ │ +
509 assert(cbor_value_is_text_string(value));
│ │ │ +
510 return _cbor_value_dup_string(value, (void **)buffer, buflen, next);
│ │ │ +
511}
│ │ │ +
512CBOR_INLINE_API CborError cbor_value_dup_byte_string(const CborValue *value, uint8_t **buffer,
│ │ │ +
513 size_t *buflen, CborValue *next)
│ │ │ +
514{
│ │ │ +
515 assert(cbor_value_is_byte_string(value));
│ │ │ +
516 return _cbor_value_dup_string(value, (void **)buffer, buflen, next);
│ │ │ +
517}
│ │ │ +
518
│ │ │ +
519CBOR_PRIVATE_API CborError _cbor_value_get_string_chunk_size(const CborValue *value, size_t *len);
│ │ │ +
520CBOR_INLINE_API CborError cbor_value_get_string_chunk_size(const CborValue *value, size_t *len)
│ │ │ +
521{
│ │ │ +
522 assert(value->flags & CborIteratorFlag_IteratingStringChunks);
│ │ │ +
523 return _cbor_value_get_string_chunk_size(value, len);
│ │ │ +
524}
│ │ │ +
525
│ │ │ +
526CBOR_INLINE_API bool cbor_value_string_iteration_at_end(const CborValue *value)
│ │ │ +
527{
│ │ │ +
528 size_t dummy;
│ │ │ +
529 return cbor_value_get_string_chunk_size(value, &dummy) == CborErrorNoMoreStringChunks;
│ │ │ +
530}
│ │ │ +
531
│ │ │ +
532CBOR_PRIVATE_API CborError _cbor_value_begin_string_iteration(CborValue *value);
│ │ │ +
533CBOR_INLINE_API CborError cbor_value_begin_string_iteration(CborValue *value)
│ │ │ +
534{
│ │ │ +
535 assert(cbor_value_is_text_string(value) || cbor_value_is_byte_string(value));
│ │ │ +
536 assert(!(value->flags & CborIteratorFlag_IteratingStringChunks));
│ │ │ +
537 return _cbor_value_begin_string_iteration(value);
│ │ │ +
538}
│ │ │ +
539
│ │ │ +
540CBOR_PRIVATE_API CborError _cbor_value_finish_string_iteration(CborValue *value);
│ │ │ +
541CBOR_INLINE_API CborError cbor_value_finish_string_iteration(CborValue *value)
│ │ │ +
542{
│ │ │ +
543 assert(cbor_value_string_iteration_at_end(value));
│ │ │ +
544 return _cbor_value_finish_string_iteration(value);
│ │ │ +
545}
│ │ │ +
546
│ │ │ +
547CBOR_PRIVATE_API CborError _cbor_value_get_string_chunk(const CborValue *value, const void **bufferptr,
│ │ │ +
548 size_t *len, CborValue *next);
│ │ │ +
549CBOR_INLINE_API CborError cbor_value_get_text_string_chunk(const CborValue *value, const char **bufferptr,
│ │ │ +
550 size_t *len, CborValue *next)
│ │ │ +
551{
│ │ │ +
552 assert(cbor_value_is_text_string(value));
│ │ │ +
553 return _cbor_value_get_string_chunk(value, (const void **)bufferptr, len, next);
│ │ │ +
554}
│ │ │ +
555CBOR_INLINE_API CborError cbor_value_get_byte_string_chunk(const CborValue *value, const uint8_t **bufferptr,
│ │ │ +
556 size_t *len, CborValue *next)
│ │ │ +
557{
│ │ │ +
558 assert(cbor_value_is_byte_string(value));
│ │ │ +
559 return _cbor_value_get_string_chunk(value, (const void **)bufferptr, len, next);
│ │ │ +
560}
│ │ │ +
561
│ │ │ +
562CBOR_API CborError cbor_value_text_string_equals(const CborValue *value, const char *string, bool *result);
│ │ │ +
563
│ │ │ +
564/* Maps and arrays */
│ │ │ +
565CBOR_INLINE_API bool cbor_value_is_array(const CborValue *value)
│ │ │ +
566{ return value->type == CborArrayType; }
│ │ │ +
567CBOR_INLINE_API bool cbor_value_is_map(const CborValue *value)
│ │ │ +
568{ return value->type == CborMapType; }
│ │ │ +
569
│ │ │ +
570CBOR_INLINE_API CborError cbor_value_get_array_length(const CborValue *value, size_t *length)
│ │ │ +
571{
│ │ │ +
572 uint64_t v;
│ │ │ +
573 assert(cbor_value_is_array(value));
│ │ │ +
574 if (!cbor_value_is_length_known(value))
│ │ │ +
575 return CborErrorUnknownLength;
│ │ │ +
576 v = _cbor_value_extract_int64_helper(value);
│ │ │ +
577 *length = (size_t)v;
│ │ │ +
578 if (*length != v)
│ │ │ +
579 return CborErrorDataTooLarge;
│ │ │ +
580 return CborNoError;
│ │ │ +
581}
│ │ │ +
582
│ │ │ +
583CBOR_INLINE_API CborError cbor_value_get_map_length(const CborValue *value, size_t *length)
│ │ │ +
584{
│ │ │ +
585 uint64_t v;
│ │ │ +
586 assert(cbor_value_is_map(value));
│ │ │ +
587 if (!cbor_value_is_length_known(value))
│ │ │ +
588 return CborErrorUnknownLength;
│ │ │ +
589 v = _cbor_value_extract_int64_helper(value);
│ │ │ +
590 *length = (size_t)v;
│ │ │ +
591 if (*length != v)
│ │ │ +
592 return CborErrorDataTooLarge;
│ │ │ +
593 return CborNoError;
│ │ │ +
594}
│ │ │ +
595
│ │ │ +
596CBOR_API CborError cbor_value_map_find_value(const CborValue *map, const char *string, CborValue *element);
│ │ │ +
597
│ │ │ +
598/* Floating point */
│ │ │ +
599CBOR_INLINE_API bool cbor_value_is_half_float(const CborValue *value)
│ │ │ +
600{ return value->type == CborHalfFloatType; }
│ │ │ +
601CBOR_API CborError cbor_value_get_half_float_as_float(const CborValue *value, float *result);
│ │ │ +
602CBOR_INLINE_API CborError cbor_value_get_half_float(const CborValue *value, void *result)
│ │ │ +
603{
│ │ │ +
604 assert(cbor_value_is_half_float(value));
│ │ │ +
605 assert((value->flags & CborIteratorFlag_IntegerValueTooLarge) == 0);
│ │ │ +
606
│ │ │ +
607 /* size has already been computed */
│ │ │ +
608 memcpy(result, &value->extra, sizeof(value->extra));
│ │ │ +
609 return CborNoError;
│ │ │ +
610}
│ │ │ +
611
│ │ │ +
612CBOR_INLINE_API bool cbor_value_is_float(const CborValue *value)
│ │ │ +
613{ return value->type == CborFloatType; }
│ │ │ +
614CBOR_INLINE_API CborError cbor_value_get_float(const CborValue *value, float *result)
│ │ │ +
615{
│ │ │ +
616 uint32_t data;
│ │ │ +
617 assert(cbor_value_is_float(value));
│ │ │ +
618 assert(value->flags & CborIteratorFlag_IntegerValueTooLarge);
│ │ │ +
619 data = (uint32_t)_cbor_value_decode_int64_internal(value);
│ │ │ +
620 memcpy(result, &data, sizeof(*result));
│ │ │ +
621 return CborNoError;
│ │ │ +
622}
│ │ │ +
623
│ │ │ +
624CBOR_INLINE_API bool cbor_value_is_double(const CborValue *value)
│ │ │ +
625{ return value->type == CborDoubleType; }
│ │ │ +
626CBOR_INLINE_API CborError cbor_value_get_double(const CborValue *value, double *result)
│ │ │ +
627{
│ │ │ +
628 uint64_t data;
│ │ │ +
629 assert(cbor_value_is_double(value));
│ │ │ +
630 assert(value->flags & CborIteratorFlag_IntegerValueTooLarge);
│ │ │ +
631 data = _cbor_value_decode_int64_internal(value);
│ │ │ +
632 memcpy(result, &data, sizeof(*result));
│ │ │ +
633 return CborNoError;
│ │ │ +
634}
│ │ │ +
635
│ │ │ +
636/* Validation API */
│ │ │ +
637#ifndef CBOR_NO_VALIDATION_API
│ │ │ +
638
│ │ │ +
639enum CborValidationFlags {
│ │ │ +
640 /* Bit mapping:
│ │ │ +
641 * bits 0-7 (8 bits): canonical format
│ │ │ +
642 * bits 8-11 (4 bits): canonical format & strict mode
│ │ │ +
643 * bits 12-20 (8 bits): strict mode
│ │ │ +
644 * bits 21-31 (10 bits): other
│ │ │ +
645 */
│ │ │ +
646
│ │ │ +
647 CborValidateShortestIntegrals = 0x0001,
│ │ │ +
648 CborValidateShortestFloatingPoint = 0x0002,
│ │ │ +
649 CborValidateShortestNumbers = CborValidateShortestIntegrals | CborValidateShortestFloatingPoint,
│ │ │ +
650 CborValidateNoIndeterminateLength = 0x0100,
│ │ │ +
651 CborValidateMapIsSorted = 0x0200 | CborValidateNoIndeterminateLength,
│ │ │ +
652
│ │ │ +
653 CborValidateCanonicalFormat = 0x0fff,
│ │ │ +
654
│ │ │ +
655 CborValidateMapKeysAreUnique = 0x1000 | CborValidateMapIsSorted,
│ │ │ +
656 CborValidateTagUse = 0x2000,
│ │ │ +
657 CborValidateUtf8 = 0x4000,
│ │ │ +
658
│ │ │ +
659 CborValidateStrictMode = 0xfff00,
│ │ │ +
660
│ │ │ +
661 CborValidateMapKeysAreString = 0x100000,
│ │ │ +
662 CborValidateNoUndefined = 0x200000,
│ │ │ +
663 CborValidateNoTags = 0x400000,
│ │ │ +
664 CborValidateFiniteFloatingPoint = 0x800000,
│ │ │ +
665 /* unused = 0x1000000, */
│ │ │ +
666 /* unused = 0x2000000, */
│ │ │ +
667
│ │ │ +
668 CborValidateNoUnknownSimpleTypesSA = 0x4000000,
│ │ │ +
669 CborValidateNoUnknownSimpleTypes = 0x8000000 | CborValidateNoUnknownSimpleTypesSA,
│ │ │ +
670 CborValidateNoUnknownTagsSA = 0x10000000,
│ │ │ +
671 CborValidateNoUnknownTagsSR = 0x20000000 | CborValidateNoUnknownTagsSA,
│ │ │ +
672 CborValidateNoUnknownTags = 0x40000000 | CborValidateNoUnknownTagsSR,
│ │ │ +
673
│ │ │ +
674 CborValidateCompleteData = (int)0x80000000,
│ │ │ +
675
│ │ │ +
676 CborValidateStrictest = (int)~0U,
│ │ │ +
677 CborValidateBasic = 0
│ │ │ +
678};
│ │ │ +
679
│ │ │ +
680CBOR_API CborError cbor_value_validate(const CborValue *it, uint32_t flags);
│ │ │ +
681#endif /* CBOR_NO_VALIDATION_API */
│ │ │ +
682
│ │ │ +
683/* Human-readable (dump) API */
│ │ │ +
684#ifndef CBOR_NO_PRETTY_API
│ │ │ +
685
│ │ │ +
686enum CborPrettyFlags {
│ │ │ +
687 CborPrettyNumericEncodingIndicators = 0x01,
│ │ │ +
688 CborPrettyTextualEncodingIndicators = 0,
│ │ │ +
689
│ │ │ +
690 CborPrettyIndicateIndeterminateLength = 0x02,
│ │ │ +
691 CborPrettyIndicateIndetermineLength = CborPrettyIndicateIndeterminateLength, /* deprecated */
│ │ │ +
692 CborPrettyIndicateOverlongNumbers = 0x04,
│ │ │ +
693
│ │ │ +
694 CborPrettyShowStringFragments = 0x100,
│ │ │ +
695 CborPrettyMergeStringFragments = 0,
│ │ │ +
696
│ │ │ +
697 CborPrettyDefaultFlags = CborPrettyIndicateIndeterminateLength
│ │ │ +
698};
│ │ │ +
699
│ │ │ +
700typedef CborError (*CborStreamFunction)(void *token, const char *fmt, ...)
│ │ │ +
701#ifdef __GNUC__
│ │ │ +
702 __attribute__((__format__(printf, 2, 3)))
│ │ │ +
703#endif
│ │ │ +
704;
│ │ │ +
705
│ │ │ +
706CBOR_API CborError cbor_value_to_pretty_stream(CborStreamFunction streamFunction, void *token, CborValue *value, int flags);
│ │ │ +
707
│ │ │ +
708/* The following API requires a hosted C implementation (uses FILE*) */
│ │ │ +
709#if !defined(__STDC_HOSTED__) || __STDC_HOSTED__-0 == 1
│ │ │ +
710CBOR_API CborError cbor_value_to_pretty_advance_flags(FILE *out, CborValue *value, int flags);
│ │ │ +
711CBOR_API CborError cbor_value_to_pretty_advance(FILE *out, CborValue *value);
│ │ │ +
712CBOR_INLINE_API CborError cbor_value_to_pretty(FILE *out, const CborValue *value)
│ │ │ +
713{
│ │ │ +
714 CborValue copy = *value;
│ │ │ +
715 return cbor_value_to_pretty_advance_flags(out, &copy, CborPrettyDefaultFlags);
│ │ │ +
716}
│ │ │ +
717#endif /* __STDC_HOSTED__ check */
│ │ │ +
718
│ │ │ +
719#endif /* CBOR_NO_PRETTY_API */
│ │ │ +
720
│ │ │ +
721#endif /* CBOR_NO_PARSER_API */
│ │ │ +
722
│ │ │ +
723#ifdef __cplusplus
│ │ │ +
724}
│ │ │ +
725#endif
│ │ │ +
726
│ │ │ +
727#endif /* CBOR_H */
│ │ │ +
728
│ │ │ +
CborError cbor_value_to_pretty(FILE *out, const CborValue *value)
Converts the current CBOR type pointed to by value to its textual representation and writes it to the...
Definition cbor.h:712
│ │ │ +
CborError cbor_value_dup_text_string(const CborValue *value, char **buffer, size_t *buflen, CborValue *next)
Allocates memory for the string pointed by value and copies it into this buffer.
Definition cbor.h:506
│ │ │ +
CBOR_API CborError cbor_value_get_half_float_as_float(const CborValue *value, float *result)
Retrieves the CBOR half-precision floating point (16-bit) value that value points to,...
Definition cborparser_float.c:45
│ │ │ +
CBOR_API CborError cbor_value_to_pretty_advance_flags(FILE *out, CborValue *value, int flags)
Converts the current CBOR type pointed to by value to its textual representation and writes it to the...
Definition cborpretty_stdio.c:83
│ │ │ +
CborError cbor_value_dup_byte_string(const CborValue *value, uint8_t **buffer, size_t *buflen, CborValue *next)
Allocates memory for the string pointed by value and copies it into this buffer.
Definition cbor.h:512
│ │ │ +
CBOR_API CborError cbor_value_to_pretty_advance(FILE *out, CborValue *value)
Converts the current CBOR type pointed to by value to its textual representation and writes it to the...
Definition cborpretty_stdio.c:63
│ │ │ +
CBOR_API const char * cbor_error_string(CborError error)
Returns the error string corresponding to the CBOR error condition error.
Definition cborerrorstrings.c:80
│ │ │ +
CBOR_API CborError cbor_encode_negative_int(CborEncoder *encoder, uint64_t absolute_value)
Appends the negative 64-bit integer whose absolute value is absolute_value to the CBOR stream provide...
Definition cborencoder.c:370
│ │ │ +
CBOR_API CborError cbor_encode_byte_string(CborEncoder *encoder, const uint8_t *string, size_t length)
Appends the byte string string of length length to the CBOR stream provided by encoder.
Definition cborencoder.c:472
│ │ │ +
CBOR_API void cbor_encoder_init(CborEncoder *encoder, uint8_t *buffer, size_t size, int flags)
Initializes a CborEncoder structure encoder by pointing it to buffer buffer of size size.
Definition cborencoder.c:204
│ │ │ +
CBOR_API CborError cbor_encode_uint(CborEncoder *encoder, uint64_t value)
Appends the unsigned 64-bit integer value to the CBOR stream provided by encoder.
Definition cborencoder.c:357
│ │ │ +
CBOR_API CborError cbor_encode_text_string(CborEncoder *encoder, const char *string, size_t length)
Appends the text string string of length length to the CBOR stream provided by encoder.
Definition cborencoder.c:484
│ │ │ +
CBOR_API CborError cbor_encoder_close_container(CborEncoder *parentEncoder, const CborEncoder *containerEncoder)
Closes the CBOR container (array or map) provided by containerEncoder and updates the CBOR stream pro...
Definition cborencoder.c:575
│ │ │ +
CBOR_API CborError cbor_encode_tag(CborEncoder *encoder, CborTag tag)
Appends the CBOR tag tag to the CBOR stream provided by encoder.
Definition cborencoder.c:441
│ │ │ +
CBOR_API CborError cbor_encode_simple_value(CborEncoder *encoder, uint8_t value)
Appends the CBOR Simple Type of value value to the CBOR stream provided by encoder.
Definition cborencoder.c:397
│ │ │ +
CBOR_API CborError cbor_encoder_create_array(CborEncoder *parentEncoder, CborEncoder *arrayEncoder, size_t length)
Creates a CBOR array in the CBOR stream provided by parentEncoder and initializes arrayEncoder so tha...
Definition cborencoder.c:532
│ │ │ +
CBOR_API CborError cbor_encoder_close_container_checked(CborEncoder *parentEncoder, const CborEncoder *containerEncoder)
Definition cborencoder_close_container_checked.c:53
│ │ │ +
CBOR_API CborError cbor_encoder_create_map(CborEncoder *parentEncoder, CborEncoder *mapEncoder, size_t length)
Creates a CBOR map in the CBOR stream provided by parentEncoder and initializes mapEncoder so that it...
Definition cborencoder.c:556
│ │ │ +
CBOR_API CborError cbor_encode_int(CborEncoder *encoder, int64_t value)
Appends the signed 64-bit integer value to the CBOR stream provided by encoder.
Definition cborencoder.c:381
│ │ │ +
CBOR_API CborError cbor_encode_floating_point(CborEncoder *encoder, CborType fpType, const void *value)
Appends the floating-point value of type fpType and pointed to by value to the CBOR stream provided b...
Definition cborencoder.c:418
│ │ │ +
CBOR_API CborError cbor_value_enter_container(const CborValue *it, CborValue *recursed)
Creates a CborValue iterator pointing to the first element of the container represented by it and sav...
Definition cborparser.c:578
│ │ │ +
CBOR_API CborError cbor_value_validate_basic(const CborValue *it)
Performs a basic validation of the CBOR stream pointed by it and returns the error it found.
Definition cborparser.c:442
│ │ │ +
CBOR_API CborError cbor_value_skip_tag(CborValue *it)
Advances the CBOR value it until it no longer points to a tag.
Definition cborparser.c:551
│ │ │ +
CBOR_API CborError cbor_value_validate(const CborValue *it, uint32_t flags)
Performs a full validation, controlled by the flags options, of the CBOR stream pointed by it and ret...
Definition cborvalidation.c:645
│ │ │ +
CBOR_API CborError cbor_value_leave_container(CborValue *it, const CborValue *recursed)
Updates it to point to the next element after the container.
Definition cborparser.c:627
│ │ │ +
CBOR_API CborError cbor_value_get_int64_checked(const CborValue *value, int64_t *result)
Retrieves the CBOR integer value that value points to and stores it in result.
Definition cborparser.c:812
│ │ │ +
CBOR_API CborError cbor_parser_init(const uint8_t *buffer, size_t size, uint32_t flags, CborParser *parser, CborValue *it)
Initializes the CBOR parser for parsing size bytes beginning at buffer.
Definition cborparser.c:345
│ │ │ +
CBOR_API CborError cbor_value_advance_fixed(CborValue *it)
Advances the CBOR value it by one fixed-size position.
Definition cborparser.c:463
│ │ │ +
CBOR_API CborError cbor_value_text_string_equals(const CborValue *value, const char *string, bool *result)
Compares the entry value with the string string and stores the result in result.
Definition cborparser.c:1323
│ │ │ +
CBOR_API CborError cbor_value_calculate_string_length(const CborValue *value, size_t *length)
Calculates the length of the byte or text string that value points to and stores it in len.
Definition cborparser.c:963
│ │ │ +
CBOR_API CborError cbor_value_advance(CborValue *it)
Advances the CBOR value it by one element, skipping over containers.
Definition cborparser.c:515
│ │ │ +
CBOR_API CborError cbor_value_map_find_value(const CborValue *map, const char *string, CborValue *element)
Attempts to find the value in map map that corresponds to the text string entry string.
Definition cborparser.c:1411
│ │ │ +
CBOR_API CborError cbor_value_get_int_checked(const CborValue *value, int *result)
Retrieves the CBOR integer value that value points to and stores it in result.
Definition cborparser.c:852
│ │ │ +
CBOR_API CborError cbor_value_to_pretty_stream(CborStreamFunction streamFunction, void *token, CborValue *value, int flags)
Converts the current CBOR type pointed by value to its textual representation and writes it to the st...
Definition cborpretty.c:578
│ │ │ +
Structure used to encode to CBOR.
Definition cbor.h:227
│ │ │ +
This type contains one value parsed from the CBOR stream.
Definition cbor.h:341
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,13 +1,1020 @@ │ │ │ │ TinyCBOR 0.6.0 API │ │ │ │ * _M_a_i_n_ _P_a_g_e │ │ │ │ * _T_o_p_i_c_s │ │ │ │ * _D_a_t_a_ _S_t_r_u_c_t_u_r_e_s │ │ │ │ * _F_i_l_e_s │ │ │ │ * _F_i_l_e_ _L_i_s_t │ │ │ │ * _G_l_o_b_a_l_s │ │ │ │ -tinycbor-version.h │ │ │ │ -1#define TINYCBOR_VERSION_MAJOR 0 │ │ │ │ -2#define TINYCBOR_VERSION_MINOR 6 │ │ │ │ -3#define TINYCBOR_VERSION_PATCH 0 │ │ │ │ +cbor.h │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ +1/**************************************************************************** │ │ │ │ +2** │ │ │ │ +3** Copyright (C) 2021 Intel Corporation │ │ │ │ +4** │ │ │ │ +5** Permission is hereby granted, free of charge, to any person obtaining a │ │ │ │ +copy │ │ │ │ +6** of this software and associated documentation files (the "Software"), to │ │ │ │ +deal │ │ │ │ +7** in the Software without restriction, including without limitation the │ │ │ │ +rights │ │ │ │ +8** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell │ │ │ │ +9** copies of the Software, and to permit persons to whom the Software is │ │ │ │ +10** furnished to do so, subject to the following conditions: │ │ │ │ +11** │ │ │ │ +12** The above copyright notice and this permission notice shall be included in │ │ │ │ +13** all copies or substantial portions of the Software. │ │ │ │ +14** │ │ │ │ +15** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR │ │ │ │ +16** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, │ │ │ │ +17** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL │ │ │ │ +THE │ │ │ │ +18** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER │ │ │ │ +19** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING │ │ │ │ +FROM, │ │ │ │ +20** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN │ │ │ │ +21** THE SOFTWARE. │ │ │ │ +22** │ │ │ │ +23****************************************************************************/ │ │ │ │ +24 │ │ │ │ +25#ifndef CBOR_H │ │ │ │ +26#define CBOR_H │ │ │ │ +27 │ │ │ │ +28#ifndef assert │ │ │ │ +29#include │ │ │ │ +30#endif │ │ │ │ +31#include │ │ │ │ +32#include │ │ │ │ +33#include │ │ │ │ +34#include │ │ │ │ +35#include │ │ │ │ +36 │ │ │ │ +37#ifdef CBOR_EXTERNAL_CFG │ │ │ │ +38#include "cbor_cfg.h" │ │ │ │ +39#endif │ │ │ │ +40 │ │ │ │ +41#include "tinycbor-version.h" │ │ │ │ +42 │ │ │ │ +43#define TINYCBOR_VERSION ((TINYCBOR_VERSION_MAJOR << 16) | │ │ │ │ +(TINYCBOR_VERSION_MINOR << 8) | TINYCBOR_VERSION_PATCH) │ │ │ │ +44 │ │ │ │ +45#ifdef __cplusplus │ │ │ │ +46extern "C" { │ │ │ │ +47#else │ │ │ │ +48#include │ │ │ │ +49#endif │ │ │ │ +50 │ │ │ │ +51#ifndef SIZE_MAX │ │ │ │ +52/* Some systems fail to define SIZE_MAX in , even though C99 │ │ │ │ +requires it... │ │ │ │ +53 * Conversion from signed to unsigned is defined in 6.3.1.3 (Signed and │ │ │ │ +unsigned integers) p2, │ │ │ │ +54 * which says: "the value is converted by repeatedly adding or subtracting │ │ │ │ +one more than the │ │ │ │ +55 * maximum value that can be represented in the new type until the value is │ │ │ │ +in the range of the │ │ │ │ +56 * new type." │ │ │ │ +57 * So -1 gets converted to size_t by adding SIZE_MAX + 1, which results in │ │ │ │ +SIZE_MAX. │ │ │ │ +58 */ │ │ │ │ +59# define SIZE_MAX ((size_t)-1) │ │ │ │ +60#endif │ │ │ │ +61 │ │ │ │ +62#ifndef CBOR_API │ │ │ │ +63# define CBOR_API │ │ │ │ +64#endif │ │ │ │ +65#ifndef CBOR_PRIVATE_API │ │ │ │ +66# define CBOR_PRIVATE_API │ │ │ │ +67#endif │ │ │ │ +68#ifndef CBOR_INLINE_API │ │ │ │ +69# if defined(__cplusplus) │ │ │ │ +70# define CBOR_INLINE inline │ │ │ │ +71# define CBOR_INLINE_API inline │ │ │ │ +72# else │ │ │ │ +73# define CBOR_INLINE_API static CBOR_INLINE │ │ │ │ +74# if defined(_MSC_VER) │ │ │ │ +75# define CBOR_INLINE __inline │ │ │ │ +76# elif defined(__GNUC__) │ │ │ │ +77# define CBOR_INLINE __inline__ │ │ │ │ +78# elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L │ │ │ │ +79# define CBOR_INLINE inline │ │ │ │ +80# else │ │ │ │ +81# define CBOR_INLINE │ │ │ │ +82# endif │ │ │ │ +83# endif │ │ │ │ +84#endif │ │ │ │ +85 │ │ │ │ +86typedef enum CborType { │ │ │ │ +87 CborIntegerType = 0x00, │ │ │ │ +88 CborByteStringType = 0x40, │ │ │ │ +89 CborTextStringType = 0x60, │ │ │ │ +90 CborArrayType = 0x80, │ │ │ │ +91 CborMapType = 0xa0, │ │ │ │ +92 CborTagType = 0xc0, │ │ │ │ +93 CborSimpleType = 0xe0, │ │ │ │ +94 CborBooleanType = 0xf5, │ │ │ │ +95 CborNullType = 0xf6, │ │ │ │ +96 CborUndefinedType = 0xf7, │ │ │ │ +97 CborHalfFloatType = 0xf9, │ │ │ │ +98 CborFloatType = 0xfa, │ │ │ │ +99 CborDoubleType = 0xfb, │ │ │ │ +100 │ │ │ │ +101 CborInvalidType = 0xff /* equivalent to the break byte, so it will never be │ │ │ │ +used */ │ │ │ │ +102} CborType; │ │ │ │ +103 │ │ │ │ +104typedef uint64_t CborTag; │ │ │ │ +105typedef enum CborKnownTags { │ │ │ │ +106 CborDateTimeStringTag = 0, │ │ │ │ +107 CborUnixTime_tTag = 1, │ │ │ │ +108 CborPositiveBignumTag = 2, │ │ │ │ +109 CborNegativeBignumTag = 3, │ │ │ │ +110 CborDecimalTag = 4, │ │ │ │ +111 CborBigfloatTag = 5, │ │ │ │ +112 CborCOSE_Encrypt0Tag = 16, │ │ │ │ +113 CborCOSE_Mac0Tag = 17, │ │ │ │ +114 CborCOSE_Sign1Tag = 18, │ │ │ │ +115 CborExpectedBase64urlTag = 21, │ │ │ │ +116 CborExpectedBase64Tag = 22, │ │ │ │ +117 CborExpectedBase16Tag = 23, │ │ │ │ +118 CborEncodedCborTag = 24, │ │ │ │ +119 CborUrlTag = 32, │ │ │ │ +120 CborBase64urlTag = 33, │ │ │ │ +121 CborBase64Tag = 34, │ │ │ │ +122 CborRegularExpressionTag = 35, │ │ │ │ +123 CborMimeMessageTag = 36, │ │ │ │ +124 CborCOSE_EncryptTag = 96, │ │ │ │ +125 CborCOSE_MacTag = 97, │ │ │ │ +126 CborCOSE_SignTag = 98, │ │ │ │ +127 CborSignatureTag = 55799 │ │ │ │ +128} CborKnownTags; │ │ │ │ +129 │ │ │ │ +130/* #define the constants so we can check with #ifdef */ │ │ │ │ +131#define CborDateTimeStringTag CborDateTimeStringTag │ │ │ │ +132#define CborUnixTime_tTag CborUnixTime_tTag │ │ │ │ +133#define CborPositiveBignumTag CborPositiveBignumTag │ │ │ │ +134#define CborNegativeBignumTag CborNegativeBignumTag │ │ │ │ +135#define CborDecimalTag CborDecimalTag │ │ │ │ +136#define CborBigfloatTag CborBigfloatTag │ │ │ │ +137#define CborCOSE_Encrypt0Tag CborCOSE_Encrypt0Tag │ │ │ │ +138#define CborCOSE_Mac0Tag CborCOSE_Mac0Tag │ │ │ │ +139#define CborCOSE_Sign1Tag CborCOSE_Sign1Tag │ │ │ │ +140#define CborExpectedBase64urlTag CborExpectedBase64urlTag │ │ │ │ +141#define CborExpectedBase64Tag CborExpectedBase64Tag │ │ │ │ +142#define CborExpectedBase16Tag CborExpectedBase16Tag │ │ │ │ +143#define CborEncodedCborTag CborEncodedCborTag │ │ │ │ +144#define CborUrlTag CborUrlTag │ │ │ │ +145#define CborBase64urlTag CborBase64urlTag │ │ │ │ +146#define CborBase64Tag CborBase64Tag │ │ │ │ +147#define CborRegularExpressionTag CborRegularExpressionTag │ │ │ │ +148#define CborMimeMessageTag CborMimeMessageTag │ │ │ │ +149#define CborCOSE_EncryptTag CborCOSE_EncryptTag │ │ │ │ +150#define CborCOSE_MacTag CborCOSE_MacTag │ │ │ │ +151#define CborCOSE_SignTag CborCOSE_SignTag │ │ │ │ +152#define CborSignatureTag CborSignatureTag │ │ │ │ +153 │ │ │ │ +154/* Error API */ │ │ │ │ +155 │ │ │ │ +156typedef enum CborError { │ │ │ │ +157 CborNoError = 0, │ │ │ │ +158 │ │ │ │ +159 /* errors in all modes */ │ │ │ │ +160 CborUnknownError, │ │ │ │ +161 CborErrorUnknownLength, /* request for length in array, map, or string with │ │ │ │ +indeterminate length */ │ │ │ │ +162 CborErrorAdvancePastEOF, │ │ │ │ +163 CborErrorIO, │ │ │ │ +164 │ │ │ │ +165 /* parser errors streaming errors */ │ │ │ │ +166 CborErrorGarbageAtEnd = 256, │ │ │ │ +167 CborErrorUnexpectedEOF, │ │ │ │ +168 CborErrorUnexpectedBreak, │ │ │ │ +169 CborErrorUnknownType, /* can only happen in major type 7 */ │ │ │ │ +170 CborErrorIllegalType, /* type not allowed here */ │ │ │ │ +171 CborErrorIllegalNumber, │ │ │ │ +172 CborErrorIllegalSimpleType, /* types of value less than 32 encoded in two │ │ │ │ +bytes */ │ │ │ │ +173 CborErrorNoMoreStringChunks, │ │ │ │ +174 │ │ │ │ +175 /* parser errors in strict mode parsing only */ │ │ │ │ +176 CborErrorUnknownSimpleType = 512, │ │ │ │ +177 CborErrorUnknownTag, │ │ │ │ +178 CborErrorInappropriateTagForType, │ │ │ │ +179 CborErrorDuplicateObjectKeys, │ │ │ │ +180 CborErrorInvalidUtf8TextString, │ │ │ │ +181 CborErrorExcludedType, │ │ │ │ +182 CborErrorExcludedValue, │ │ │ │ +183 CborErrorImproperValue, │ │ │ │ +184 CborErrorOverlongEncoding, │ │ │ │ +185 CborErrorMapKeyNotString, │ │ │ │ +186 CborErrorMapNotSorted, │ │ │ │ +187 CborErrorMapKeysNotUnique, │ │ │ │ +188 │ │ │ │ +189 /* encoder errors */ │ │ │ │ +190 CborErrorTooManyItems = 768, │ │ │ │ +191 CborErrorTooFewItems, │ │ │ │ +192 │ │ │ │ +193 /* internal implementation errors */ │ │ │ │ +194 CborErrorDataTooLarge = 1024, │ │ │ │ +195 CborErrorNestingTooDeep, │ │ │ │ +196 CborErrorUnsupportedType, │ │ │ │ +197 CborErrorUnimplementedValidation, │ │ │ │ +198 │ │ │ │ +199 /* errors in converting to JSON */ │ │ │ │ +200 CborErrorJsonObjectKeyIsAggregate = 1280, │ │ │ │ +201 CborErrorJsonObjectKeyNotString, │ │ │ │ +202 CborErrorJsonNotImplemented, │ │ │ │ +203 │ │ │ │ +204 CborErrorOutOfMemory = (int) (~0U / 2 + 1), │ │ │ │ +205 CborErrorInternalError = (int) (~0U / 2) /* INT_MAX on two's complement │ │ │ │ +machines */ │ │ │ │ +206} CborError; │ │ │ │ +207 │ │ │ │ +208CBOR_API const char *_c_b_o_r___e_r_r_o_r___s_t_r_i_n_g(CborError error); │ │ │ │ +209 │ │ │ │ +210/* Encoder API */ │ │ │ │ +211 │ │ │ │ +212typedef enum CborEncoderAppendType │ │ │ │ +213{ │ │ │ │ +214 CborEncoderAppendCborData = 0, │ │ │ │ +215 CborEncoderAppendStringData = 1 │ │ │ │ +216} CborEncoderAppendType; │ │ │ │ +217 │ │ │ │ +218typedef CborError (*CborEncoderWriteFunction)(void *, const void *, size_t, │ │ │ │ +CborEncoderAppendType); │ │ │ │ +219 │ │ │ │ +220enum CborEncoderFlags │ │ │ │ +221{ │ │ │ │ +222 CborIteratorFlag_WriterFunction = 0x01, │ │ │ │ +223 CborIteratorFlag_ContainerIsMap_ = 0x20 │ │ │ │ +224}; │ │ │ │ +225 │ │ │ │ +_2_2_6struct _C_b_o_r_E_n_c_o_d_e_r │ │ │ │ +227{ │ │ │ │ +228 union { │ │ │ │ +229 uint8_t *ptr; │ │ │ │ +230 ptrdiff_t bytes_needed; │ │ │ │ +231 CborEncoderWriteFunction writer; │ │ │ │ +232 } data; │ │ │ │ +233 uint8_t *end; │ │ │ │ +234 size_t remaining; │ │ │ │ +235 int flags; │ │ │ │ +236}; │ │ │ │ +237typedef struct _C_b_o_r_E_n_c_o_d_e_r _C_b_o_r_E_n_c_o_d_e_r; │ │ │ │ +238 │ │ │ │ +239static const size_t CborIndefiniteLength = SIZE_MAX; │ │ │ │ +240 │ │ │ │ +241#ifndef CBOR_NO_ENCODER_API │ │ │ │ +242CBOR_API void _c_b_o_r___e_n_c_o_d_e_r___i_n_i_t(_C_b_o_r_E_n_c_o_d_e_r *encoder, uint8_t *buffer, │ │ │ │ +size_t size, int flags); │ │ │ │ +243CBOR_API void cbor_encoder_init_writer(_C_b_o_r_E_n_c_o_d_e_r *encoder, │ │ │ │ +CborEncoderWriteFunction writer, void *); │ │ │ │ +244CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___u_i_n_t(_C_b_o_r_E_n_c_o_d_e_r *encoder, uint64_t value); │ │ │ │ +245CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___i_n_t(_C_b_o_r_E_n_c_o_d_e_r *encoder, int64_t value); │ │ │ │ +246CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___n_e_g_a_t_i_v_e___i_n_t(_C_b_o_r_E_n_c_o_d_e_r *encoder, uint64_t │ │ │ │ +absolute_value); │ │ │ │ +247CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___s_i_m_p_l_e___v_a_l_u_e(_C_b_o_r_E_n_c_o_d_e_r *encoder, uint8_t │ │ │ │ +value); │ │ │ │ +248CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___t_a_g(_C_b_o_r_E_n_c_o_d_e_r *encoder, CborTag tag); │ │ │ │ +249CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___t_e_x_t___s_t_r_i_n_g(_C_b_o_r_E_n_c_o_d_e_r *encoder, const char │ │ │ │ +*string, size_t length); │ │ │ │ +250CBOR_INLINE_API CborError cbor_encode_text_stringz(_C_b_o_r_E_n_c_o_d_e_r *encoder, │ │ │ │ +const char *string) │ │ │ │ +251{ return _c_b_o_r___e_n_c_o_d_e___t_e_x_t___s_t_r_i_n_g(encoder, string, strlen(string)); } │ │ │ │ +252CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___b_y_t_e___s_t_r_i_n_g(_C_b_o_r_E_n_c_o_d_e_r *encoder, const │ │ │ │ +uint8_t *string, size_t length); │ │ │ │ +253CBOR_API CborError _c_b_o_r___e_n_c_o_d_e___f_l_o_a_t_i_n_g___p_o_i_n_t(_C_b_o_r_E_n_c_o_d_e_r *encoder, CborType │ │ │ │ +fpType, const void *value); │ │ │ │ +254 │ │ │ │ +255CBOR_INLINE_API CborError cbor_encode_boolean(_C_b_o_r_E_n_c_o_d_e_r *encoder, bool │ │ │ │ +value) │ │ │ │ +256{ return _c_b_o_r___e_n_c_o_d_e___s_i_m_p_l_e___v_a_l_u_e(encoder, (int)value - 1 + (CborBooleanType │ │ │ │ +& 0x1f)); } │ │ │ │ +257CBOR_INLINE_API CborError cbor_encode_null(_C_b_o_r_E_n_c_o_d_e_r *encoder) │ │ │ │ +258{ return _c_b_o_r___e_n_c_o_d_e___s_i_m_p_l_e___v_a_l_u_e(encoder, CborNullType & 0x1f); } │ │ │ │ +259CBOR_INLINE_API CborError cbor_encode_undefined(_C_b_o_r_E_n_c_o_d_e_r *encoder) │ │ │ │ +260{ return _c_b_o_r___e_n_c_o_d_e___s_i_m_p_l_e___v_a_l_u_e(encoder, CborUndefinedType & 0x1f); } │ │ │ │ +261 │ │ │ │ +262CBOR_INLINE_API CborError cbor_encode_half_float(_C_b_o_r_E_n_c_o_d_e_r *encoder, const │ │ │ │ +void *value) │ │ │ │ +263{ return _c_b_o_r___e_n_c_o_d_e___f_l_o_a_t_i_n_g___p_o_i_n_t(encoder, CborHalfFloatType, value); } │ │ │ │ +264CBOR_API CborError cbor_encode_float_as_half_float(_C_b_o_r_E_n_c_o_d_e_r *encoder, │ │ │ │ +float value); │ │ │ │ +265CBOR_INLINE_API CborError cbor_encode_float(_C_b_o_r_E_n_c_o_d_e_r *encoder, float │ │ │ │ +value) │ │ │ │ +266{ return _c_b_o_r___e_n_c_o_d_e___f_l_o_a_t_i_n_g___p_o_i_n_t(encoder, CborFloatType, &value); } │ │ │ │ +267CBOR_INLINE_API CborError cbor_encode_double(_C_b_o_r_E_n_c_o_d_e_r *encoder, double │ │ │ │ +value) │ │ │ │ +268{ return _c_b_o_r___e_n_c_o_d_e___f_l_o_a_t_i_n_g___p_o_i_n_t(encoder, CborDoubleType, &value); } │ │ │ │ +269 │ │ │ │ +270CBOR_API CborError _c_b_o_r___e_n_c_o_d_e_r___c_r_e_a_t_e___a_r_r_a_y(_C_b_o_r_E_n_c_o_d_e_r *parentEncoder, │ │ │ │ +_C_b_o_r_E_n_c_o_d_e_r *arrayEncoder, size_t length); │ │ │ │ +271CBOR_API CborError _c_b_o_r___e_n_c_o_d_e_r___c_r_e_a_t_e___m_a_p(_C_b_o_r_E_n_c_o_d_e_r *parentEncoder, │ │ │ │ +_C_b_o_r_E_n_c_o_d_e_r *mapEncoder, size_t length); │ │ │ │ +272CBOR_API CborError _c_b_o_r___e_n_c_o_d_e_r___c_l_o_s_e___c_o_n_t_a_i_n_e_r(_C_b_o_r_E_n_c_o_d_e_r *parentEncoder, │ │ │ │ +const _C_b_o_r_E_n_c_o_d_e_r *containerEncoder); │ │ │ │ +273CBOR_API CborError _c_b_o_r___e_n_c_o_d_e_r___c_l_o_s_e___c_o_n_t_a_i_n_e_r___c_h_e_c_k_e_d(_C_b_o_r_E_n_c_o_d_e_r │ │ │ │ +*parentEncoder, const _C_b_o_r_E_n_c_o_d_e_r *containerEncoder); │ │ │ │ +274 │ │ │ │ +275CBOR_INLINE_API uint8_t *_cbor_encoder_get_buffer_pointer(const _C_b_o_r_E_n_c_o_d_e_r │ │ │ │ +*encoder) │ │ │ │ +276{ │ │ │ │ +277 return encoder->data.ptr; │ │ │ │ +278} │ │ │ │ +279 │ │ │ │ +280CBOR_INLINE_API size_t cbor_encoder_get_buffer_size(const _C_b_o_r_E_n_c_o_d_e_r │ │ │ │ +*encoder, const uint8_t *buffer) │ │ │ │ +281{ │ │ │ │ +282 return (size_t)(encoder->data.ptr - buffer); │ │ │ │ +283} │ │ │ │ +284 │ │ │ │ +285CBOR_INLINE_API size_t cbor_encoder_get_extra_bytes_needed(const _C_b_o_r_E_n_c_o_d_e_r │ │ │ │ +*encoder) │ │ │ │ +286{ │ │ │ │ +287 return encoder->end ? 0 : (size_t)encoder->data.bytes_needed; │ │ │ │ +288} │ │ │ │ +289#endif /* CBOR_NO_ENCODER_API */ │ │ │ │ +290 │ │ │ │ +291/* Parser API */ │ │ │ │ +292 │ │ │ │ +293enum CborParserGlobalFlags │ │ │ │ +294{ │ │ │ │ +295 CborParserFlag_ExternalSource = 0x01 │ │ │ │ +296}; │ │ │ │ +297 │ │ │ │ +298enum CborParserIteratorFlags │ │ │ │ +299{ │ │ │ │ +300 /* used for all types, but not during string chunk iteration │ │ │ │ +301 * (values are static-asserted, don't change) */ │ │ │ │ +302 CborIteratorFlag_IntegerValueIs64Bit = 0x01, │ │ │ │ +303 CborIteratorFlag_IntegerValueTooLarge = 0x02, │ │ │ │ +304 │ │ │ │ +305 /* used only for CborIntegerType */ │ │ │ │ +306 CborIteratorFlag_NegativeInteger = 0x04, │ │ │ │ +307 │ │ │ │ +308 /* used only during string iteration */ │ │ │ │ +309 CborIteratorFlag_BeforeFirstStringChunk = 0x04, │ │ │ │ +310 CborIteratorFlag_IteratingStringChunks = 0x08, │ │ │ │ +311 │ │ │ │ +312 /* used for arrays, maps and strings, including during chunk iteration */ │ │ │ │ +313 CborIteratorFlag_UnknownLength = 0x10, │ │ │ │ +314 │ │ │ │ +315 /* used for maps, but must be kept for all types │ │ │ │ +316 * (ContainerIsMap value must be CborMapType - CborArrayType) */ │ │ │ │ +317 CborIteratorFlag_ContainerIsMap = 0x20, │ │ │ │ +318 CborIteratorFlag_NextIsMapKey = 0x40 │ │ │ │ +319}; │ │ │ │ +320 │ │ │ │ +321struct _C_b_o_r_V_a_l_u_e; │ │ │ │ +322struct CborParserOperations │ │ │ │ +323{ │ │ │ │ +324 bool (*can_read_bytes)(void *token, size_t len); │ │ │ │ +325 void *(*read_bytes)(void *token, void *dst, size_t offset, size_t len); │ │ │ │ +326 void (*advance_bytes)(void *token, size_t len); │ │ │ │ +327 CborError (*transfer_string)(void *token, const void **userptr, size_t │ │ │ │ +offset, size_t len); │ │ │ │ +328}; │ │ │ │ +329 │ │ │ │ +330struct CborParser │ │ │ │ +331{ │ │ │ │ +332 union { │ │ │ │ +333 const uint8_t *end; │ │ │ │ +334 const struct CborParserOperations *ops; │ │ │ │ +335 } source; │ │ │ │ +336 enum CborParserGlobalFlags flags; │ │ │ │ +337}; │ │ │ │ +338typedef struct CborParser CborParser; │ │ │ │ +339 │ │ │ │ +_3_4_0struct _C_b_o_r_V_a_l_u_e │ │ │ │ +341{ │ │ │ │ +342 const CborParser *parser; │ │ │ │ +343 union { │ │ │ │ +344 const uint8_t *ptr; │ │ │ │ +345 void *token; │ │ │ │ +346 } source; │ │ │ │ +347 uint32_t remaining; │ │ │ │ +348 uint16_t extra; │ │ │ │ +349 uint8_t type; │ │ │ │ +350 uint8_t flags; │ │ │ │ +351}; │ │ │ │ +352typedef struct _C_b_o_r_V_a_l_u_e _C_b_o_r_V_a_l_u_e; │ │ │ │ +353 │ │ │ │ +354#ifndef CBOR_NO_PARSER_API │ │ │ │ +355CBOR_API CborError _c_b_o_r___p_a_r_s_e_r___i_n_i_t(const uint8_t *buffer, size_t size, │ │ │ │ +uint32_t flags, CborParser *parser, _C_b_o_r_V_a_l_u_e *it); │ │ │ │ +356CBOR_API CborError cbor_parser_init_reader(const struct CborParserOperations │ │ │ │ +*ops, CborParser *parser, _C_b_o_r_V_a_l_u_e *it, void *token); │ │ │ │ +357 │ │ │ │ +358CBOR_API CborError _c_b_o_r___v_a_l_u_e___v_a_l_i_d_a_t_e___b_a_s_i_c(const _C_b_o_r_V_a_l_u_e *it); │ │ │ │ +359 │ │ │ │ +360CBOR_INLINE_API bool cbor_value_at_end(const _C_b_o_r_V_a_l_u_e *it) │ │ │ │ +361{ return it->remaining == 0; } │ │ │ │ +362CBOR_INLINE_API const uint8_t *cbor_value_get_next_byte(const _C_b_o_r_V_a_l_u_e *it) │ │ │ │ +363{ return it->source.ptr; } │ │ │ │ +364CBOR_API CborError cbor_value_reparse(_C_b_o_r_V_a_l_u_e *it); │ │ │ │ +365CBOR_API CborError _c_b_o_r___v_a_l_u_e___a_d_v_a_n_c_e___f_i_x_e_d(_C_b_o_r_V_a_l_u_e *it); │ │ │ │ +366CBOR_API CborError _c_b_o_r___v_a_l_u_e___a_d_v_a_n_c_e(_C_b_o_r_V_a_l_u_e *it); │ │ │ │ +367CBOR_INLINE_API bool cbor_value_is_container(const _C_b_o_r_V_a_l_u_e *it) │ │ │ │ +368{ return it->type == CborArrayType || it->type == CborMapType; } │ │ │ │ +369CBOR_API CborError _c_b_o_r___v_a_l_u_e___e_n_t_e_r___c_o_n_t_a_i_n_e_r(const _C_b_o_r_V_a_l_u_e *it, _C_b_o_r_V_a_l_u_e │ │ │ │ +*recursed); │ │ │ │ +370CBOR_API CborError _c_b_o_r___v_a_l_u_e___l_e_a_v_e___c_o_n_t_a_i_n_e_r(_C_b_o_r_V_a_l_u_e *it, const _C_b_o_r_V_a_l_u_e │ │ │ │ +*recursed); │ │ │ │ +371 │ │ │ │ +372CBOR_PRIVATE_API uint64_t _cbor_value_decode_int64_internal(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value); │ │ │ │ +373CBOR_INLINE_API uint64_t _cbor_value_extract_int64_helper(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value) │ │ │ │ +374{ │ │ │ │ +375 return value->flags & CborIteratorFlag_IntegerValueTooLarge ? │ │ │ │ +376 _cbor_value_decode_int64_internal(value) : value->extra; │ │ │ │ +377} │ │ │ │ +378 │ │ │ │ +379CBOR_INLINE_API bool cbor_value_is_valid(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +380{ return value && value->type != CborInvalidType; } │ │ │ │ +381CBOR_INLINE_API CborType cbor_value_get_type(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +382{ return (CborType)value->type; } │ │ │ │ +383 │ │ │ │ +384/* Null & undefined type */ │ │ │ │ +385CBOR_INLINE_API bool cbor_value_is_null(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +386{ return value->type == CborNullType; } │ │ │ │ +387CBOR_INLINE_API bool cbor_value_is_undefined(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +388{ return value->type == CborUndefinedType; } │ │ │ │ +389 │ │ │ │ +390/* Booleans */ │ │ │ │ +391CBOR_INLINE_API bool cbor_value_is_boolean(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +392{ return value->type == CborBooleanType; } │ │ │ │ +393CBOR_INLINE_API CborError cbor_value_get_boolean(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +bool *result) │ │ │ │ +394{ │ │ │ │ +395 assert(cbor_value_is_boolean(value)); │ │ │ │ +396 *result = !!value->extra; │ │ │ │ +397 return CborNoError; │ │ │ │ +398} │ │ │ │ +399 │ │ │ │ +400/* Simple types */ │ │ │ │ +401CBOR_INLINE_API bool cbor_value_is_simple_type(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +402{ return value->type == CborSimpleType; } │ │ │ │ +403CBOR_INLINE_API CborError cbor_value_get_simple_type(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +uint8_t *result) │ │ │ │ +404{ │ │ │ │ +405 assert(cbor_value_is_simple_type(value)); │ │ │ │ +406 *result = (uint8_t)value->extra; │ │ │ │ +407 return CborNoError; │ │ │ │ +408} │ │ │ │ +409 │ │ │ │ +410/* Integers */ │ │ │ │ +411CBOR_INLINE_API bool cbor_value_is_integer(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +412{ return value->type == CborIntegerType; } │ │ │ │ +413CBOR_INLINE_API bool cbor_value_is_unsigned_integer(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +414{ return cbor_value_is_integer(value) && (value->flags & │ │ │ │ +CborIteratorFlag_NegativeInteger) == 0; } │ │ │ │ +415CBOR_INLINE_API bool cbor_value_is_negative_integer(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +416{ return cbor_value_is_integer(value) && (value->flags & │ │ │ │ +CborIteratorFlag_NegativeInteger); } │ │ │ │ +417 │ │ │ │ +418CBOR_INLINE_API CborError cbor_value_get_raw_integer(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +uint64_t *result) │ │ │ │ +419{ │ │ │ │ +420 assert(cbor_value_is_integer(value)); │ │ │ │ +421 *result = _cbor_value_extract_int64_helper(value); │ │ │ │ +422 return CborNoError; │ │ │ │ +423} │ │ │ │ +424 │ │ │ │ +425CBOR_INLINE_API CborError cbor_value_get_uint64(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +uint64_t *result) │ │ │ │ +426{ │ │ │ │ +427 assert(cbor_value_is_unsigned_integer(value)); │ │ │ │ +428 *result = _cbor_value_extract_int64_helper(value); │ │ │ │ +429 return CborNoError; │ │ │ │ +430} │ │ │ │ +431 │ │ │ │ +432CBOR_INLINE_API CborError cbor_value_get_int64(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +int64_t *result) │ │ │ │ +433{ │ │ │ │ +434 assert(cbor_value_is_integer(value)); │ │ │ │ +435 *result = (int64_t) _cbor_value_extract_int64_helper(value); │ │ │ │ +436 if (value->flags & CborIteratorFlag_NegativeInteger) │ │ │ │ +437 *result = -*result - 1; │ │ │ │ +438 return CborNoError; │ │ │ │ +439} │ │ │ │ +440 │ │ │ │ +441CBOR_INLINE_API CborError cbor_value_get_int(const _C_b_o_r_V_a_l_u_e *value, int │ │ │ │ +*result) │ │ │ │ +442{ │ │ │ │ +443 assert(cbor_value_is_integer(value)); │ │ │ │ +444 *result = (int) _cbor_value_extract_int64_helper(value); │ │ │ │ +445 if (value->flags & CborIteratorFlag_NegativeInteger) │ │ │ │ +446 *result = -*result - 1; │ │ │ │ +447 return CborNoError; │ │ │ │ +448} │ │ │ │ +449 │ │ │ │ +450CBOR_API CborError _c_b_o_r___v_a_l_u_e___g_e_t___i_n_t_6_4___c_h_e_c_k_e_d(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +int64_t *result); │ │ │ │ +451CBOR_API CborError _c_b_o_r___v_a_l_u_e___g_e_t___i_n_t___c_h_e_c_k_e_d(const _C_b_o_r_V_a_l_u_e *value, int │ │ │ │ +*result); │ │ │ │ +452 │ │ │ │ +453CBOR_INLINE_API bool cbor_value_is_length_known(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +454{ return (value->flags & CborIteratorFlag_UnknownLength) == 0; } │ │ │ │ +455 │ │ │ │ +456/* Tags */ │ │ │ │ +457CBOR_INLINE_API bool cbor_value_is_tag(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +458{ return value->type == CborTagType; } │ │ │ │ +459CBOR_INLINE_API CborError cbor_value_get_tag(const _C_b_o_r_V_a_l_u_e *value, CborTag │ │ │ │ +*result) │ │ │ │ +460{ │ │ │ │ +461 assert(cbor_value_is_tag(value)); │ │ │ │ +462 *result = _cbor_value_extract_int64_helper(value); │ │ │ │ +463 return CborNoError; │ │ │ │ +464} │ │ │ │ +465CBOR_API CborError _c_b_o_r___v_a_l_u_e___s_k_i_p___t_a_g(_C_b_o_r_V_a_l_u_e *it); │ │ │ │ +466 │ │ │ │ +467/* Strings */ │ │ │ │ +468CBOR_INLINE_API bool cbor_value_is_byte_string(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +469{ return value->type == CborByteStringType; } │ │ │ │ +470CBOR_INLINE_API bool cbor_value_is_text_string(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +471{ return value->type == CborTextStringType; } │ │ │ │ +472 │ │ │ │ +473CBOR_INLINE_API CborError cbor_value_get_string_length(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, size_t *length) │ │ │ │ +474{ │ │ │ │ +475 uint64_t v; │ │ │ │ +476 assert(cbor_value_is_byte_string(value) || cbor_value_is_text_string │ │ │ │ +(value)); │ │ │ │ +477 if (!cbor_value_is_length_known(value)) │ │ │ │ +478 return CborErrorUnknownLength; │ │ │ │ +479 v = _cbor_value_extract_int64_helper(value); │ │ │ │ +480 *length = (size_t)v; │ │ │ │ +481 if (*length != v) │ │ │ │ +482 return CborErrorDataTooLarge; │ │ │ │ +483 return CborNoError; │ │ │ │ +484} │ │ │ │ +485 │ │ │ │ +486CBOR_PRIVATE_API CborError _cbor_value_copy_string(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +void *buffer, │ │ │ │ +487 size_t *buflen, _C_b_o_r_V_a_l_u_e *next); │ │ │ │ +488CBOR_PRIVATE_API CborError _cbor_value_dup_string(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +void **buffer, │ │ │ │ +489 size_t *buflen, _C_b_o_r_V_a_l_u_e *next); │ │ │ │ +490 │ │ │ │ +491CBOR_API CborError _c_b_o_r___v_a_l_u_e___c_a_l_c_u_l_a_t_e___s_t_r_i_n_g___l_e_n_g_t_h(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, size_t *length); │ │ │ │ +492 │ │ │ │ +493CBOR_INLINE_API CborError cbor_value_copy_text_string(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, char *buffer, │ │ │ │ +494 size_t *buflen, _C_b_o_r_V_a_l_u_e *next) │ │ │ │ +495{ │ │ │ │ +496 assert(cbor_value_is_text_string(value)); │ │ │ │ +497 return _cbor_value_copy_string(value, buffer, buflen, next); │ │ │ │ +498} │ │ │ │ +499CBOR_INLINE_API CborError cbor_value_copy_byte_string(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, uint8_t *buffer, │ │ │ │ +500 size_t *buflen, _C_b_o_r_V_a_l_u_e *next) │ │ │ │ +501{ │ │ │ │ +502 assert(cbor_value_is_byte_string(value)); │ │ │ │ +503 return _cbor_value_copy_string(value, buffer, buflen, next); │ │ │ │ +504} │ │ │ │ +505 │ │ │ │ +_5_0_6CBOR_INLINE_API CborError _c_b_o_r___v_a_l_u_e___d_u_p___t_e_x_t___s_t_r_i_n_g(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +char **buffer, │ │ │ │ +507 size_t *buflen, _C_b_o_r_V_a_l_u_e *next) │ │ │ │ +508{ │ │ │ │ +509 assert(cbor_value_is_text_string(value)); │ │ │ │ +510 return _cbor_value_dup_string(value, (void **)buffer, buflen, next); │ │ │ │ +511} │ │ │ │ +_5_1_2CBOR_INLINE_API CborError _c_b_o_r___v_a_l_u_e___d_u_p___b_y_t_e___s_t_r_i_n_g(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +uint8_t **buffer, │ │ │ │ +513 size_t *buflen, _C_b_o_r_V_a_l_u_e *next) │ │ │ │ +514{ │ │ │ │ +515 assert(cbor_value_is_byte_string(value)); │ │ │ │ +516 return _cbor_value_dup_string(value, (void **)buffer, buflen, next); │ │ │ │ +517} │ │ │ │ +518 │ │ │ │ +519CBOR_PRIVATE_API CborError _cbor_value_get_string_chunk_size(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, size_t *len); │ │ │ │ +520CBOR_INLINE_API CborError cbor_value_get_string_chunk_size(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, size_t *len) │ │ │ │ +521{ │ │ │ │ +522 assert(value->flags & CborIteratorFlag_IteratingStringChunks); │ │ │ │ +523 return _cbor_value_get_string_chunk_size(value, len); │ │ │ │ +524} │ │ │ │ +525 │ │ │ │ +526CBOR_INLINE_API bool cbor_value_string_iteration_at_end(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value) │ │ │ │ +527{ │ │ │ │ +528 size_t dummy; │ │ │ │ +529 return cbor_value_get_string_chunk_size(value, &dummy) == │ │ │ │ +CborErrorNoMoreStringChunks; │ │ │ │ +530} │ │ │ │ +531 │ │ │ │ +532CBOR_PRIVATE_API CborError _cbor_value_begin_string_iteration(_C_b_o_r_V_a_l_u_e │ │ │ │ +*value); │ │ │ │ +533CBOR_INLINE_API CborError cbor_value_begin_string_iteration(_C_b_o_r_V_a_l_u_e │ │ │ │ +*value) │ │ │ │ +534{ │ │ │ │ +535 assert(cbor_value_is_text_string(value) || cbor_value_is_byte_string │ │ │ │ +(value)); │ │ │ │ +536 assert(!(value->flags & CborIteratorFlag_IteratingStringChunks)); │ │ │ │ +537 return _cbor_value_begin_string_iteration(value); │ │ │ │ +538} │ │ │ │ +539 │ │ │ │ +540CBOR_PRIVATE_API CborError _cbor_value_finish_string_iteration(_C_b_o_r_V_a_l_u_e │ │ │ │ +*value); │ │ │ │ +541CBOR_INLINE_API CborError cbor_value_finish_string_iteration(_C_b_o_r_V_a_l_u_e │ │ │ │ +*value) │ │ │ │ +542{ │ │ │ │ +543 assert(cbor_value_string_iteration_at_end(value)); │ │ │ │ +544 return _cbor_value_finish_string_iteration(value); │ │ │ │ +545} │ │ │ │ +546 │ │ │ │ +547CBOR_PRIVATE_API CborError _cbor_value_get_string_chunk(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, const void **bufferptr, │ │ │ │ +548 size_t *len, _C_b_o_r_V_a_l_u_e *next); │ │ │ │ +549CBOR_INLINE_API CborError cbor_value_get_text_string_chunk(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, const char **bufferptr, │ │ │ │ +550 size_t *len, _C_b_o_r_V_a_l_u_e *next) │ │ │ │ +551{ │ │ │ │ +552 assert(cbor_value_is_text_string(value)); │ │ │ │ +553 return _cbor_value_get_string_chunk(value, (const void **)bufferptr, len, │ │ │ │ +next); │ │ │ │ +554} │ │ │ │ +555CBOR_INLINE_API CborError cbor_value_get_byte_string_chunk(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, const uint8_t **bufferptr, │ │ │ │ +556 size_t *len, _C_b_o_r_V_a_l_u_e *next) │ │ │ │ +557{ │ │ │ │ +558 assert(cbor_value_is_byte_string(value)); │ │ │ │ +559 return _cbor_value_get_string_chunk(value, (const void **)bufferptr, len, │ │ │ │ +next); │ │ │ │ +560} │ │ │ │ +561 │ │ │ │ +562CBOR_API CborError _c_b_o_r___v_a_l_u_e___t_e_x_t___s_t_r_i_n_g___e_q_u_a_l_s(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +const char *string, bool *result); │ │ │ │ +563 │ │ │ │ +564/* Maps and arrays */ │ │ │ │ +565CBOR_INLINE_API bool cbor_value_is_array(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +566{ return value->type == CborArrayType; } │ │ │ │ +567CBOR_INLINE_API bool cbor_value_is_map(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +568{ return value->type == CborMapType; } │ │ │ │ +569 │ │ │ │ +570CBOR_INLINE_API CborError cbor_value_get_array_length(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, size_t *length) │ │ │ │ +571{ │ │ │ │ +572 uint64_t v; │ │ │ │ +573 assert(cbor_value_is_array(value)); │ │ │ │ +574 if (!cbor_value_is_length_known(value)) │ │ │ │ +575 return CborErrorUnknownLength; │ │ │ │ +576 v = _cbor_value_extract_int64_helper(value); │ │ │ │ +577 *length = (size_t)v; │ │ │ │ +578 if (*length != v) │ │ │ │ +579 return CborErrorDataTooLarge; │ │ │ │ +580 return CborNoError; │ │ │ │ +581} │ │ │ │ +582 │ │ │ │ +583CBOR_INLINE_API CborError cbor_value_get_map_length(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +size_t *length) │ │ │ │ +584{ │ │ │ │ +585 uint64_t v; │ │ │ │ +586 assert(cbor_value_is_map(value)); │ │ │ │ +587 if (!cbor_value_is_length_known(value)) │ │ │ │ +588 return CborErrorUnknownLength; │ │ │ │ +589 v = _cbor_value_extract_int64_helper(value); │ │ │ │ +590 *length = (size_t)v; │ │ │ │ +591 if (*length != v) │ │ │ │ +592 return CborErrorDataTooLarge; │ │ │ │ +593 return CborNoError; │ │ │ │ +594} │ │ │ │ +595 │ │ │ │ +596CBOR_API CborError _c_b_o_r___v_a_l_u_e___m_a_p___f_i_n_d___v_a_l_u_e(const _C_b_o_r_V_a_l_u_e *map, const │ │ │ │ +char *string, _C_b_o_r_V_a_l_u_e *element); │ │ │ │ +597 │ │ │ │ +598/* Floating point */ │ │ │ │ +599CBOR_INLINE_API bool cbor_value_is_half_float(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +600{ return value->type == CborHalfFloatType; } │ │ │ │ +601CBOR_API CborError _c_b_o_r___v_a_l_u_e___g_e_t___h_a_l_f___f_l_o_a_t___a_s___f_l_o_a_t(const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, float *result); │ │ │ │ +602CBOR_INLINE_API CborError cbor_value_get_half_float(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +void *result) │ │ │ │ +603{ │ │ │ │ +604 assert(cbor_value_is_half_float(value)); │ │ │ │ +605 assert((value->flags & CborIteratorFlag_IntegerValueTooLarge) == 0); │ │ │ │ +606 │ │ │ │ +607 /* size has already been computed */ │ │ │ │ +608 memcpy(result, &value->extra, sizeof(value->extra)); │ │ │ │ +609 return CborNoError; │ │ │ │ +610} │ │ │ │ +611 │ │ │ │ +612CBOR_INLINE_API bool cbor_value_is_float(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +613{ return value->type == CborFloatType; } │ │ │ │ +614CBOR_INLINE_API CborError cbor_value_get_float(const _C_b_o_r_V_a_l_u_e *value, float │ │ │ │ +*result) │ │ │ │ +615{ │ │ │ │ +616 uint32_t data; │ │ │ │ +617 assert(cbor_value_is_float(value)); │ │ │ │ +618 assert(value->flags & CborIteratorFlag_IntegerValueTooLarge); │ │ │ │ +619 data = (uint32_t)_cbor_value_decode_int64_internal(value); │ │ │ │ +620 memcpy(result, &data, sizeof(*result)); │ │ │ │ +621 return CborNoError; │ │ │ │ +622} │ │ │ │ +623 │ │ │ │ +624CBOR_INLINE_API bool cbor_value_is_double(const _C_b_o_r_V_a_l_u_e *value) │ │ │ │ +625{ return value->type == CborDoubleType; } │ │ │ │ +626CBOR_INLINE_API CborError cbor_value_get_double(const _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +double *result) │ │ │ │ +627{ │ │ │ │ +628 uint64_t data; │ │ │ │ +629 assert(cbor_value_is_double(value)); │ │ │ │ +630 assert(value->flags & CborIteratorFlag_IntegerValueTooLarge); │ │ │ │ +631 data = _cbor_value_decode_int64_internal(value); │ │ │ │ +632 memcpy(result, &data, sizeof(*result)); │ │ │ │ +633 return CborNoError; │ │ │ │ +634} │ │ │ │ +635 │ │ │ │ +636/* Validation API */ │ │ │ │ +637#ifndef CBOR_NO_VALIDATION_API │ │ │ │ +638 │ │ │ │ +639enum CborValidationFlags { │ │ │ │ +640 /* Bit mapping: │ │ │ │ +641 * bits 0-7 (8 bits): canonical format │ │ │ │ +642 * bits 8-11 (4 bits): canonical format & strict mode │ │ │ │ +643 * bits 12-20 (8 bits): strict mode │ │ │ │ +644 * bits 21-31 (10 bits): other │ │ │ │ +645 */ │ │ │ │ +646 │ │ │ │ +647 CborValidateShortestIntegrals = 0x0001, │ │ │ │ +648 CborValidateShortestFloatingPoint = 0x0002, │ │ │ │ +649 CborValidateShortestNumbers = CborValidateShortestIntegrals | │ │ │ │ +CborValidateShortestFloatingPoint, │ │ │ │ +650 CborValidateNoIndeterminateLength = 0x0100, │ │ │ │ +651 CborValidateMapIsSorted = 0x0200 | CborValidateNoIndeterminateLength, │ │ │ │ +652 │ │ │ │ +653 CborValidateCanonicalFormat = 0x0fff, │ │ │ │ +654 │ │ │ │ +655 CborValidateMapKeysAreUnique = 0x1000 | CborValidateMapIsSorted, │ │ │ │ +656 CborValidateTagUse = 0x2000, │ │ │ │ +657 CborValidateUtf8 = 0x4000, │ │ │ │ +658 │ │ │ │ +659 CborValidateStrictMode = 0xfff00, │ │ │ │ +660 │ │ │ │ +661 CborValidateMapKeysAreString = 0x100000, │ │ │ │ +662 CborValidateNoUndefined = 0x200000, │ │ │ │ +663 CborValidateNoTags = 0x400000, │ │ │ │ +664 CborValidateFiniteFloatingPoint = 0x800000, │ │ │ │ +665 /* unused = 0x1000000, */ │ │ │ │ +666 /* unused = 0x2000000, */ │ │ │ │ +667 │ │ │ │ +668 CborValidateNoUnknownSimpleTypesSA = 0x4000000, │ │ │ │ +669 CborValidateNoUnknownSimpleTypes = 0x8000000 | │ │ │ │ +CborValidateNoUnknownSimpleTypesSA, │ │ │ │ +670 CborValidateNoUnknownTagsSA = 0x10000000, │ │ │ │ +671 CborValidateNoUnknownTagsSR = 0x20000000 | CborValidateNoUnknownTagsSA, │ │ │ │ +672 CborValidateNoUnknownTags = 0x40000000 | CborValidateNoUnknownTagsSR, │ │ │ │ +673 │ │ │ │ +674 CborValidateCompleteData = (int)0x80000000, │ │ │ │ +675 │ │ │ │ +676 CborValidateStrictest = (int)~0U, │ │ │ │ +677 CborValidateBasic = 0 │ │ │ │ +678}; │ │ │ │ +679 │ │ │ │ +680CBOR_API CborError _c_b_o_r___v_a_l_u_e___v_a_l_i_d_a_t_e(const _C_b_o_r_V_a_l_u_e *it, uint32_t flags); │ │ │ │ +681#endif /* CBOR_NO_VALIDATION_API */ │ │ │ │ +682 │ │ │ │ +683/* Human-readable (dump) API */ │ │ │ │ +684#ifndef CBOR_NO_PRETTY_API │ │ │ │ +685 │ │ │ │ +686enum CborPrettyFlags { │ │ │ │ +687 CborPrettyNumericEncodingIndicators = 0x01, │ │ │ │ +688 CborPrettyTextualEncodingIndicators = 0, │ │ │ │ +689 │ │ │ │ +690 CborPrettyIndicateIndeterminateLength = 0x02, │ │ │ │ +691 CborPrettyIndicateIndetermineLength = │ │ │ │ +CborPrettyIndicateIndeterminateLength, /* deprecated */ │ │ │ │ +692 CborPrettyIndicateOverlongNumbers = 0x04, │ │ │ │ +693 │ │ │ │ +694 CborPrettyShowStringFragments = 0x100, │ │ │ │ +695 CborPrettyMergeStringFragments = 0, │ │ │ │ +696 │ │ │ │ +697 CborPrettyDefaultFlags = CborPrettyIndicateIndeterminateLength │ │ │ │ +698}; │ │ │ │ +699 │ │ │ │ +700typedef CborError (*CborStreamFunction)(void *token, const char *fmt, ...) │ │ │ │ +701#ifdef __GNUC__ │ │ │ │ +702 __attribute__((__format__(printf, 2, 3))) │ │ │ │ +703#endif │ │ │ │ +704; │ │ │ │ +705 │ │ │ │ +706CBOR_API CborError _c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y___s_t_r_e_a_m(CborStreamFunction │ │ │ │ +streamFunction, void *token, _C_b_o_r_V_a_l_u_e *value, int flags); │ │ │ │ +707 │ │ │ │ +708/* The following API requires a hosted C implementation (uses FILE*) */ │ │ │ │ +709#if !defined(__STDC_HOSTED__) || __STDC_HOSTED__-0 == 1 │ │ │ │ +710CBOR_API CborError _c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y___a_d_v_a_n_c_e___f_l_a_g_s(FILE *out, _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, int flags); │ │ │ │ +711CBOR_API CborError _c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y___a_d_v_a_n_c_e(FILE *out, _C_b_o_r_V_a_l_u_e │ │ │ │ +*value); │ │ │ │ +_7_1_2CBOR_INLINE_API CborError _c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y(FILE *out, const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value) │ │ │ │ +713{ │ │ │ │ +714 _C_b_o_r_V_a_l_u_e copy = *value; │ │ │ │ +715 return _c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y___a_d_v_a_n_c_e___f_l_a_g_s(out, ©, │ │ │ │ +CborPrettyDefaultFlags); │ │ │ │ +716} │ │ │ │ +717#endif /* __STDC_HOSTED__ check */ │ │ │ │ +718 │ │ │ │ +719#endif /* CBOR_NO_PRETTY_API */ │ │ │ │ +720 │ │ │ │ +721#endif /* CBOR_NO_PARSER_API */ │ │ │ │ +722 │ │ │ │ +723#ifdef __cplusplus │ │ │ │ +724} │ │ │ │ +725#endif │ │ │ │ +726 │ │ │ │ +727#endif /* CBOR_H */ │ │ │ │ +728 │ │ │ │ +_c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y │ │ │ │ +CborError cbor_value_to_pretty(FILE *out, const CborValue *value) │ │ │ │ +Converts the current CBOR type pointed to by value to its textual │ │ │ │ +representation and writes it to the... │ │ │ │ +DDeeffiinniittiioonn cbor.h:712 │ │ │ │ +_c_b_o_r___v_a_l_u_e___d_u_p___t_e_x_t___s_t_r_i_n_g │ │ │ │ +CborError cbor_value_dup_text_string(const CborValue *value, char **buffer, │ │ │ │ +size_t *buflen, CborValue *next) │ │ │ │ +Allocates memory for the string pointed by value and copies it into this │ │ │ │ +buffer. │ │ │ │ +DDeeffiinniittiioonn cbor.h:506 │ │ │ │ +_c_b_o_r___v_a_l_u_e___g_e_t___h_a_l_f___f_l_o_a_t___a_s___f_l_o_a_t │ │ │ │ +CBOR_API CborError cbor_value_get_half_float_as_float(const CborValue *value, │ │ │ │ +float *result) │ │ │ │ +Retrieves the CBOR half-precision floating point (16-bit) value that value │ │ │ │ +points to,... │ │ │ │ +DDeeffiinniittiioonn cborparser_float.c:45 │ │ │ │ +_c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y___a_d_v_a_n_c_e___f_l_a_g_s │ │ │ │ +CBOR_API CborError cbor_value_to_pretty_advance_flags(FILE *out, CborValue │ │ │ │ +*value, int flags) │ │ │ │ +Converts the current CBOR type pointed to by value to its textual │ │ │ │ +representation and writes it to the... │ │ │ │ +DDeeffiinniittiioonn cborpretty_stdio.c:83 │ │ │ │ +_c_b_o_r___v_a_l_u_e___d_u_p___b_y_t_e___s_t_r_i_n_g │ │ │ │ +CborError cbor_value_dup_byte_string(const CborValue *value, uint8_t **buffer, │ │ │ │ +size_t *buflen, CborValue *next) │ │ │ │ +Allocates memory for the string pointed by value and copies it into this │ │ │ │ +buffer. │ │ │ │ +DDeeffiinniittiioonn cbor.h:512 │ │ │ │ +_c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y___a_d_v_a_n_c_e │ │ │ │ +CBOR_API CborError cbor_value_to_pretty_advance(FILE *out, CborValue *value) │ │ │ │ +Converts the current CBOR type pointed to by value to its textual │ │ │ │ +representation and writes it to the... │ │ │ │ +DDeeffiinniittiioonn cborpretty_stdio.c:63 │ │ │ │ +_c_b_o_r___e_r_r_o_r___s_t_r_i_n_g │ │ │ │ +CBOR_API const char * cbor_error_string(CborError error) │ │ │ │ +Returns the error string corresponding to the CBOR error condition error. │ │ │ │ +DDeeffiinniittiioonn cborerrorstrings.c:80 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___n_e_g_a_t_i_v_e___i_n_t │ │ │ │ +CBOR_API CborError cbor_encode_negative_int(CborEncoder *encoder, uint64_t │ │ │ │ +absolute_value) │ │ │ │ +Appends the negative 64-bit integer whose absolute value is absolute_value to │ │ │ │ +the CBOR stream provide... │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:370 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___b_y_t_e___s_t_r_i_n_g │ │ │ │ +CBOR_API CborError cbor_encode_byte_string(CborEncoder *encoder, const uint8_t │ │ │ │ +*string, size_t length) │ │ │ │ +Appends the byte string string of length length to the CBOR stream provided by │ │ │ │ +encoder. │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:472 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e_r___i_n_i_t │ │ │ │ +CBOR_API void cbor_encoder_init(CborEncoder *encoder, uint8_t *buffer, size_t │ │ │ │ +size, int flags) │ │ │ │ +Initializes a CborEncoder structure encoder by pointing it to buffer buffer of │ │ │ │ +size size. │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:204 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___u_i_n_t │ │ │ │ +CBOR_API CborError cbor_encode_uint(CborEncoder *encoder, uint64_t value) │ │ │ │ +Appends the unsigned 64-bit integer value to the CBOR stream provided by │ │ │ │ +encoder. │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:357 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___t_e_x_t___s_t_r_i_n_g │ │ │ │ +CBOR_API CborError cbor_encode_text_string(CborEncoder *encoder, const char │ │ │ │ +*string, size_t length) │ │ │ │ +Appends the text string string of length length to the CBOR stream provided by │ │ │ │ +encoder. │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:484 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e_r___c_l_o_s_e___c_o_n_t_a_i_n_e_r │ │ │ │ +CBOR_API CborError cbor_encoder_close_container(CborEncoder *parentEncoder, │ │ │ │ +const CborEncoder *containerEncoder) │ │ │ │ +Closes the CBOR container (array or map) provided by containerEncoder and │ │ │ │ +updates the CBOR stream pro... │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:575 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___t_a_g │ │ │ │ +CBOR_API CborError cbor_encode_tag(CborEncoder *encoder, CborTag tag) │ │ │ │ +Appends the CBOR tag tag to the CBOR stream provided by encoder. │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:441 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___s_i_m_p_l_e___v_a_l_u_e │ │ │ │ +CBOR_API CborError cbor_encode_simple_value(CborEncoder *encoder, uint8_t │ │ │ │ +value) │ │ │ │ +Appends the CBOR Simple Type of value value to the CBOR stream provided by │ │ │ │ +encoder. │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:397 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e_r___c_r_e_a_t_e___a_r_r_a_y │ │ │ │ +CBOR_API CborError cbor_encoder_create_array(CborEncoder *parentEncoder, │ │ │ │ +CborEncoder *arrayEncoder, size_t length) │ │ │ │ +Creates a CBOR array in the CBOR stream provided by parentEncoder and │ │ │ │ +initializes arrayEncoder so tha... │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:532 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e_r___c_l_o_s_e___c_o_n_t_a_i_n_e_r___c_h_e_c_k_e_d │ │ │ │ +CBOR_API CborError cbor_encoder_close_container_checked(CborEncoder │ │ │ │ +*parentEncoder, const CborEncoder *containerEncoder) │ │ │ │ +DDeeffiinniittiioonn cborencoder_close_container_checked.c:53 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e_r___c_r_e_a_t_e___m_a_p │ │ │ │ +CBOR_API CborError cbor_encoder_create_map(CborEncoder *parentEncoder, │ │ │ │ +CborEncoder *mapEncoder, size_t length) │ │ │ │ +Creates a CBOR map in the CBOR stream provided by parentEncoder and initializes │ │ │ │ +mapEncoder so that it... │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:556 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___i_n_t │ │ │ │ +CBOR_API CborError cbor_encode_int(CborEncoder *encoder, int64_t value) │ │ │ │ +Appends the signed 64-bit integer value to the CBOR stream provided by encoder. │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:381 │ │ │ │ +_c_b_o_r___e_n_c_o_d_e___f_l_o_a_t_i_n_g___p_o_i_n_t │ │ │ │ +CBOR_API CborError cbor_encode_floating_point(CborEncoder *encoder, CborType │ │ │ │ +fpType, const void *value) │ │ │ │ +Appends the floating-point value of type fpType and pointed to by value to the │ │ │ │ +CBOR stream provided b... │ │ │ │ +DDeeffiinniittiioonn cborencoder.c:418 │ │ │ │ +_c_b_o_r___v_a_l_u_e___e_n_t_e_r___c_o_n_t_a_i_n_e_r │ │ │ │ +CBOR_API CborError cbor_value_enter_container(const CborValue *it, CborValue │ │ │ │ +*recursed) │ │ │ │ +Creates a CborValue iterator pointing to the first element of the container │ │ │ │ +represented by it and sav... │ │ │ │ +DDeeffiinniittiioonn cborparser.c:578 │ │ │ │ +_c_b_o_r___v_a_l_u_e___v_a_l_i_d_a_t_e___b_a_s_i_c │ │ │ │ +CBOR_API CborError cbor_value_validate_basic(const CborValue *it) │ │ │ │ +Performs a basic validation of the CBOR stream pointed by it and returns the │ │ │ │ +error it found. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:442 │ │ │ │ +_c_b_o_r___v_a_l_u_e___s_k_i_p___t_a_g │ │ │ │ +CBOR_API CborError cbor_value_skip_tag(CborValue *it) │ │ │ │ +Advances the CBOR value it until it no longer points to a tag. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:551 │ │ │ │ +_c_b_o_r___v_a_l_u_e___v_a_l_i_d_a_t_e │ │ │ │ +CBOR_API CborError cbor_value_validate(const CborValue *it, uint32_t flags) │ │ │ │ +Performs a full validation, controlled by the flags options, of the CBOR stream │ │ │ │ +pointed by it and ret... │ │ │ │ +DDeeffiinniittiioonn cborvalidation.c:645 │ │ │ │ +_c_b_o_r___v_a_l_u_e___l_e_a_v_e___c_o_n_t_a_i_n_e_r │ │ │ │ +CBOR_API CborError cbor_value_leave_container(CborValue *it, const CborValue │ │ │ │ +*recursed) │ │ │ │ +Updates it to point to the next element after the container. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:627 │ │ │ │ +_c_b_o_r___v_a_l_u_e___g_e_t___i_n_t_6_4___c_h_e_c_k_e_d │ │ │ │ +CBOR_API CborError cbor_value_get_int64_checked(const CborValue *value, int64_t │ │ │ │ +*result) │ │ │ │ +Retrieves the CBOR integer value that value points to and stores it in result. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:812 │ │ │ │ +_c_b_o_r___p_a_r_s_e_r___i_n_i_t │ │ │ │ +CBOR_API CborError cbor_parser_init(const uint8_t *buffer, size_t size, │ │ │ │ +uint32_t flags, CborParser *parser, CborValue *it) │ │ │ │ +Initializes the CBOR parser for parsing size bytes beginning at buffer. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:345 │ │ │ │ +_c_b_o_r___v_a_l_u_e___a_d_v_a_n_c_e___f_i_x_e_d │ │ │ │ +CBOR_API CborError cbor_value_advance_fixed(CborValue *it) │ │ │ │ +Advances the CBOR value it by one fixed-size position. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:463 │ │ │ │ +_c_b_o_r___v_a_l_u_e___t_e_x_t___s_t_r_i_n_g___e_q_u_a_l_s │ │ │ │ +CBOR_API CborError cbor_value_text_string_equals(const CborValue *value, const │ │ │ │ +char *string, bool *result) │ │ │ │ +Compares the entry value with the string string and stores the result in │ │ │ │ +result. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:1323 │ │ │ │ +_c_b_o_r___v_a_l_u_e___c_a_l_c_u_l_a_t_e___s_t_r_i_n_g___l_e_n_g_t_h │ │ │ │ +CBOR_API CborError cbor_value_calculate_string_length(const CborValue *value, │ │ │ │ +size_t *length) │ │ │ │ +Calculates the length of the byte or text string that value points to and │ │ │ │ +stores it in len. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:963 │ │ │ │ +_c_b_o_r___v_a_l_u_e___a_d_v_a_n_c_e │ │ │ │ +CBOR_API CborError cbor_value_advance(CborValue *it) │ │ │ │ +Advances the CBOR value it by one element, skipping over containers. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:515 │ │ │ │ +_c_b_o_r___v_a_l_u_e___m_a_p___f_i_n_d___v_a_l_u_e │ │ │ │ +CBOR_API CborError cbor_value_map_find_value(const CborValue *map, const char │ │ │ │ +*string, CborValue *element) │ │ │ │ +Attempts to find the value in map map that corresponds to the text string entry │ │ │ │ +string. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:1411 │ │ │ │ +_c_b_o_r___v_a_l_u_e___g_e_t___i_n_t___c_h_e_c_k_e_d │ │ │ │ +CBOR_API CborError cbor_value_get_int_checked(const CborValue *value, int │ │ │ │ +*result) │ │ │ │ +Retrieves the CBOR integer value that value points to and stores it in result. │ │ │ │ +DDeeffiinniittiioonn cborparser.c:852 │ │ │ │ +_c_b_o_r___v_a_l_u_e___t_o___p_r_e_t_t_y___s_t_r_e_a_m │ │ │ │ +CBOR_API CborError cbor_value_to_pretty_stream(CborStreamFunction │ │ │ │ +streamFunction, void *token, CborValue *value, int flags) │ │ │ │ +Converts the current CBOR type pointed by value to its textual representation │ │ │ │ +and writes it to the st... │ │ │ │ +DDeeffiinniittiioonn cborpretty.c:578 │ │ │ │ +_C_b_o_r_E_n_c_o_d_e_r │ │ │ │ +Structure used to encode to CBOR. │ │ │ │ +DDeeffiinniittiioonn cbor.h:227 │ │ │ │ +_C_b_o_r_V_a_l_u_e │ │ │ │ +This type contains one value parsed from the CBOR stream. │ │ │ │ +DDeeffiinniittiioonn cbor.h:341 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libtinycbor-dev/html/a00008_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -TinyCBOR 0.6.0 API: memory.h Source File │ │ │ +TinyCBOR 0.6.0 API: cborjson.h Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ @@ -39,20 +39,20 @@ │ │ │ │ │ │
│ │ │
│ │ │
│ │ │ -
memory.h
│ │ │ +
cborjson.h
│ │ │
│ │ │
│ │ │ -
1/****************************************************************************
│ │ │ +Go to the documentation of this file.
1/****************************************************************************
│ │ │
2**
│ │ │ -
3** Copyright (C) 2016 Intel Corporation
│ │ │ +
3** Copyright (C) 2015 Intel Corporation
│ │ │
4**
│ │ │
5** Permission is hereby granted, free of charge, to any person obtaining a copy
│ │ │
6** of this software and associated documentation files (the "Software"), to deal
│ │ │
7** in the Software without restriction, including without limitation the rights
│ │ │
8** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
│ │ │
9** copies of the Software, and to permit persons to whom the Software is
│ │ │
10** furnished to do so, subject to the following conditions:
│ │ │ @@ -66,22 +66,55 @@ │ │ │
18** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
│ │ │
19** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
│ │ │
20** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
│ │ │
21** THE SOFTWARE.
│ │ │
22**
│ │ │
23****************************************************************************/
│ │ │
24
│ │ │ -
25#if defined(CBOR_CUSTOM_ALLOC_INCLUDE)
│ │ │ -
26# include CBOR_CUSTOM_ALLOC_INCLUDE
│ │ │ -
27#else
│ │ │ -
28# include <stdlib.h>
│ │ │ -
29# define cbor_malloc malloc
│ │ │ -
30# define cbor_realloc realloc
│ │ │ -
31# define cbor_free free
│ │ │ +
25#ifndef CBORJSON_H
│ │ │ +
26#define CBORJSON_H
│ │ │ +
27
│ │ │ +
28#include "cbor.h"
│ │ │ +
29
│ │ │ +
30#ifdef __cplusplus
│ │ │ +
31extern "C" {
│ │ │
32#endif
│ │ │ +
33
│ │ │ +
34/* Conversion to JSON */
│ │ │ +
35enum CborToJsonFlags
│ │ │ +
36{
│ │ │ +
37 CborConvertAddMetadata = 1,
│ │ │ +
38 CborConvertTagsToObjects = 2,
│ │ │ +
39 CborConvertIgnoreTags = 0,
│ │ │ +
40
│ │ │ +
41 CborConvertObeyByteStringTags = 0,
│ │ │ +
42 CborConvertByteStringsToBase64Url = 4,
│ │ │ +
43
│ │ │ +
44 CborConvertRequireMapStringKeys = 0,
│ │ │ +
45 CborConvertStringifyMapKeys = 8,
│ │ │ +
46
│ │ │ +
47 CborConvertDefaultFlags = 0
│ │ │ +
48};
│ │ │ +
49
│ │ │ +
50CBOR_API CborError cbor_value_to_json_advance(FILE *out, CborValue *value, int flags);
│ │ │ +
51CBOR_INLINE_API CborError cbor_value_to_json(FILE *out, const CborValue *value, int flags)
│ │ │ +
52{
│ │ │ +
53 CborValue copy = *value;
│ │ │ +
54 return cbor_value_to_json_advance(out, &copy, flags);
│ │ │ +
55}
│ │ │ +
56
│ │ │ +
57#ifdef __cplusplus
│ │ │ +
58}
│ │ │ +
59#endif
│ │ │ +
60
│ │ │ +
61#endif /* CBORJSON_H */
│ │ │ +
62
│ │ │ +
> The <cbor.h> is the main header in TinyCBOR and defines the constants used by most functions as wel...
│ │ │ +
CborError cbor_value_to_json_advance(FILE *out, CborValue *value, int flags)
Converts the current CBOR type pointed to by value to JSON and writes that to the out stream.
Definition cbortojson.c:811
│ │ │ +
This type contains one value parsed from the CBOR stream.
Definition cbor.h:341
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,18 +1,19 @@ │ │ │ │ TinyCBOR 0.6.0 API │ │ │ │ * _M_a_i_n_ _P_a_g_e │ │ │ │ * _T_o_p_i_c_s │ │ │ │ * _D_a_t_a_ _S_t_r_u_c_t_u_r_e_s │ │ │ │ * _F_i_l_e_s │ │ │ │ * _F_i_l_e_ _L_i_s_t │ │ │ │ * _G_l_o_b_a_l_s │ │ │ │ -memory.h │ │ │ │ +cborjson.h │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/**************************************************************************** │ │ │ │ 2** │ │ │ │ -3** Copyright (C) 2016 Intel Corporation │ │ │ │ +3** Copyright (C) 2015 Intel Corporation │ │ │ │ 4** │ │ │ │ 5** Permission is hereby granted, free of charge, to any person obtaining a │ │ │ │ copy │ │ │ │ 6** of this software and associated documentation files (the "Software"), to │ │ │ │ deal │ │ │ │ 7** in the Software without restriction, including without limitation the │ │ │ │ rights │ │ │ │ @@ -31,17 +32,60 @@ │ │ │ │ 19** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING │ │ │ │ FROM, │ │ │ │ 20** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN │ │ │ │ 21** THE SOFTWARE. │ │ │ │ 22** │ │ │ │ 23****************************************************************************/ │ │ │ │ 24 │ │ │ │ -25#if defined(CBOR_CUSTOM_ALLOC_INCLUDE) │ │ │ │ -26# include CBOR_CUSTOM_ALLOC_INCLUDE │ │ │ │ -27#else │ │ │ │ -28# include │ │ │ │ -29# define cbor_malloc malloc │ │ │ │ -30# define cbor_realloc realloc │ │ │ │ -31# define cbor_free free │ │ │ │ +25#ifndef CBORJSON_H │ │ │ │ +26#define CBORJSON_H │ │ │ │ +27 │ │ │ │ +28#include "_c_b_o_r_._h" │ │ │ │ +29 │ │ │ │ +30#ifdef __cplusplus │ │ │ │ +31extern "C" { │ │ │ │ 32#endif │ │ │ │ +33 │ │ │ │ +34/* Conversion to JSON */ │ │ │ │ +35enum CborToJsonFlags │ │ │ │ +36{ │ │ │ │ +37 CborConvertAddMetadata = 1, │ │ │ │ +38 CborConvertTagsToObjects = 2, │ │ │ │ +39 CborConvertIgnoreTags = 0, │ │ │ │ +40 │ │ │ │ +41 CborConvertObeyByteStringTags = 0, │ │ │ │ +42 CborConvertByteStringsToBase64Url = 4, │ │ │ │ +43 │ │ │ │ +44 CborConvertRequireMapStringKeys = 0, │ │ │ │ +45 CborConvertStringifyMapKeys = 8, │ │ │ │ +46 │ │ │ │ +47 CborConvertDefaultFlags = 0 │ │ │ │ +48}; │ │ │ │ +49 │ │ │ │ +50CBOR_API CborError _c_b_o_r___v_a_l_u_e___t_o___j_s_o_n___a_d_v_a_n_c_e(FILE *out, _C_b_o_r_V_a_l_u_e *value, │ │ │ │ +int flags); │ │ │ │ +51CBOR_INLINE_API CborError cbor_value_to_json(FILE *out, const _C_b_o_r_V_a_l_u_e │ │ │ │ +*value, int flags) │ │ │ │ +52{ │ │ │ │ +53 _C_b_o_r_V_a_l_u_e copy = *value; │ │ │ │ +54 return _c_b_o_r___v_a_l_u_e___t_o___j_s_o_n___a_d_v_a_n_c_e(out, ©, flags); │ │ │ │ +55} │ │ │ │ +56 │ │ │ │ +57#ifdef __cplusplus │ │ │ │ +58} │ │ │ │ +59#endif │ │ │ │ +60 │ │ │ │ +61#endif /* CBORJSON_H */ │ │ │ │ +62 │ │ │ │ +_c_b_o_r_._h │ │ │ │ +> The is the main header in TinyCBOR and defines the constants used by │ │ │ │ +most functions as wel... │ │ │ │ +_c_b_o_r___v_a_l_u_e___t_o___j_s_o_n___a_d_v_a_n_c_e │ │ │ │ +CborError cbor_value_to_json_advance(FILE *out, CborValue *value, int flags) │ │ │ │ +Converts the current CBOR type pointed to by value to JSON and writes that to │ │ │ │ +the out stream. │ │ │ │ +DDeeffiinniittiioonn cbortojson.c:811 │ │ │ │ +_C_b_o_r_V_a_l_u_e │ │ │ │ +This type contains one value parsed from the CBOR stream. │ │ │ │ +DDeeffiinniittiioonn cbor.h:341 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libtinycbor-dev/html/a00057.html │ │ │ @@ -115,17 +115,17 @@ │ │ │
│ │ │ │ │ │

Converts the current CBOR type pointed by value to its textual representation and writes it to the stream by calling the streamFunction.

│ │ │

If an error occurs, this function returns an error code similar to Parsing CBOR streams.

│ │ │

The textual representation can be controlled by the flags parameter (see CborPrettyFlags for more information).

│ │ │

If no error ocurred, this function advances value to the next element. Often, concatenating the text representation of multiple elements can be done by appending a comma to the output stream in between calls to this function.

│ │ │

The streamFunction function will be called with the token value as the first parameter and a printf-style format string as the second, with a variable number of further parameters.

│ │ │ -
See also
cbor_value_to_pretty(), cbor_value_to_json_advance()
│ │ │ +
See also
cbor_value_to_pretty(), cbor_value_to_json_advance()
│ │ │ │ │ │ -

Referenced by cbor_value_to_pretty_advance(), and cbor_value_to_pretty_advance_flags().

│ │ │ +

Referenced by cbor_value_to_pretty_advance(), and cbor_value_to_pretty_advance_flags().

│ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │