1da0d961cSdjm /*
2d3425be1Sdjm * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
3da0d961cSdjm *
4da0d961cSdjm * libcbor is free software; you can redistribute it and/or modify
5da0d961cSdjm * it under the terms of the MIT license. See LICENSE for details.
6da0d961cSdjm */
7da0d961cSdjm
8da0d961cSdjm #include "builder_callbacks.h"
9*4dcc46c4Sdjm
10da0d961cSdjm #include <string.h>
11*4dcc46c4Sdjm
12da0d961cSdjm #include "../arrays.h"
13da0d961cSdjm #include "../bytestrings.h"
14*4dcc46c4Sdjm #include "../common.h"
15da0d961cSdjm #include "../floats_ctrls.h"
16da0d961cSdjm #include "../ints.h"
17da0d961cSdjm #include "../maps.h"
18da0d961cSdjm #include "../strings.h"
19da0d961cSdjm #include "../tags.h"
209e5c2ddcSdjm #include "unicode.h"
21da0d961cSdjm
22*4dcc46c4Sdjm // `_cbor_builder_append` takes ownership of `item`. If adding the item to
23*4dcc46c4Sdjm // parent container fails, `item` will be deallocated to prevent memory.
_cbor_builder_append(cbor_item_t * item,struct _cbor_decoder_context * ctx)249e5c2ddcSdjm void _cbor_builder_append(cbor_item_t *item,
259e5c2ddcSdjm struct _cbor_decoder_context *ctx) {
26da0d961cSdjm if (ctx->stack->size == 0) {
27da0d961cSdjm /* Top level item */
28da0d961cSdjm ctx->root = item;
29*4dcc46c4Sdjm return;
30*4dcc46c4Sdjm }
31da0d961cSdjm /* Part of a bigger structure */
32da0d961cSdjm switch (ctx->stack->top->item->type) {
33*4dcc46c4Sdjm // Handle Arrays and Maps since they can contain subitems of any type.
34*4dcc46c4Sdjm // Byte/string construction from chunks is handled in the respective chunk
35*4dcc46c4Sdjm // handlers.
36da0d961cSdjm case CBOR_TYPE_ARRAY: {
37da0d961cSdjm if (cbor_array_is_definite(ctx->stack->top->item)) {
38*4dcc46c4Sdjm // We don't need an explicit check for whether the item still belongs
39*4dcc46c4Sdjm // into this array because if there are extra items, they will cause a
40*4dcc46c4Sdjm // syntax error when decoded.
41*4dcc46c4Sdjm CBOR_ASSERT(ctx->stack->top->subitems > 0);
42*4dcc46c4Sdjm // This should never happen since the definite array should be
43*4dcc46c4Sdjm // preallocated for the expected number of items.
44*4dcc46c4Sdjm if (!cbor_array_push(ctx->stack->top->item, item)) {
45*4dcc46c4Sdjm ctx->creation_failed = true;
46*4dcc46c4Sdjm cbor_decref(&item);
47*4dcc46c4Sdjm break;
48da0d961cSdjm }
49da0d961cSdjm cbor_decref(&item);
50*4dcc46c4Sdjm ctx->stack->top->subitems--;
51*4dcc46c4Sdjm if (ctx->stack->top->subitems == 0) {
52*4dcc46c4Sdjm cbor_item_t *stack_item = ctx->stack->top->item;
53*4dcc46c4Sdjm _cbor_stack_pop(ctx->stack);
54*4dcc46c4Sdjm _cbor_builder_append(stack_item, ctx);
55*4dcc46c4Sdjm }
56da0d961cSdjm } else {
57da0d961cSdjm /* Indefinite array, don't bother with subitems */
58*4dcc46c4Sdjm if (!cbor_array_push(ctx->stack->top->item, item)) {
59*4dcc46c4Sdjm ctx->creation_failed = true;
60*4dcc46c4Sdjm }
61da0d961cSdjm cbor_decref(&item);
62da0d961cSdjm }
63da0d961cSdjm break;
64da0d961cSdjm }
65da0d961cSdjm case CBOR_TYPE_MAP: {
66*4dcc46c4Sdjm // Handle both definite and indefinite maps the same initially.
67*4dcc46c4Sdjm // Note: We use 0 and 1 subitems to distinguish between keys and values in
68*4dcc46c4Sdjm // indefinite items
69da0d961cSdjm if (ctx->stack->top->subitems % 2) {
70da0d961cSdjm /* Odd record, this is a value */
71*4dcc46c4Sdjm if (!_cbor_map_add_value(ctx->stack->top->item, item)) {
72*4dcc46c4Sdjm ctx->creation_failed = true;
73*4dcc46c4Sdjm cbor_decref(&item);
74*4dcc46c4Sdjm break;
75*4dcc46c4Sdjm }
76da0d961cSdjm } else {
77da0d961cSdjm /* Even record, this is a key */
78*4dcc46c4Sdjm if (!_cbor_map_add_key(ctx->stack->top->item, item)) {
79*4dcc46c4Sdjm ctx->creation_failed = true;
80*4dcc46c4Sdjm cbor_decref(&item);
81*4dcc46c4Sdjm break;
82da0d961cSdjm }
83*4dcc46c4Sdjm }
84*4dcc46c4Sdjm cbor_decref(&item);
85da0d961cSdjm if (cbor_map_is_definite(ctx->stack->top->item)) {
86*4dcc46c4Sdjm CBOR_ASSERT(ctx->stack->top->subitems > 0);
87da0d961cSdjm ctx->stack->top->subitems--;
88da0d961cSdjm if (ctx->stack->top->subitems == 0) {
89*4dcc46c4Sdjm cbor_item_t *map_entry = ctx->stack->top->item;
90da0d961cSdjm _cbor_stack_pop(ctx->stack);
91*4dcc46c4Sdjm _cbor_builder_append(map_entry, ctx);
92da0d961cSdjm }
93da0d961cSdjm } else {
949e5c2ddcSdjm ctx->stack->top->subitems ^=
959e5c2ddcSdjm 1; /* Flip the indicator for indefinite items */
96da0d961cSdjm }
97da0d961cSdjm break;
98da0d961cSdjm }
99da0d961cSdjm case CBOR_TYPE_TAG: {
100*4dcc46c4Sdjm CBOR_ASSERT(ctx->stack->top->subitems == 1);
101da0d961cSdjm cbor_tag_set_item(ctx->stack->top->item, item);
102da0d961cSdjm cbor_decref(&item); /* Give up on our reference */
103*4dcc46c4Sdjm cbor_item_t *tagged_item = ctx->stack->top->item;
104da0d961cSdjm _cbor_stack_pop(ctx->stack);
105*4dcc46c4Sdjm _cbor_builder_append(tagged_item, ctx);
106da0d961cSdjm break;
107da0d961cSdjm }
108*4dcc46c4Sdjm // We have an item to append but nothing to append it to.
109da0d961cSdjm default: {
110da0d961cSdjm cbor_decref(&item);
111da0d961cSdjm ctx->syntax_error = true;
112da0d961cSdjm }
113da0d961cSdjm }
114da0d961cSdjm }
115da0d961cSdjm
116d3425be1Sdjm #define CHECK_RES(ctx, res) \
1179e5c2ddcSdjm do { \
1189e5c2ddcSdjm if (res == NULL) { \
1199e5c2ddcSdjm ctx->creation_failed = true; \
1209e5c2ddcSdjm return; \
1219e5c2ddcSdjm } \
1229e5c2ddcSdjm } while (0)
123da0d961cSdjm
124*4dcc46c4Sdjm // Check that the length fits into size_t. If not, we cannot possibly allocate
125*4dcc46c4Sdjm // the required memory and should fail fast.
126*4dcc46c4Sdjm #define CHECK_LENGTH(ctx, length) \
127*4dcc46c4Sdjm do { \
128*4dcc46c4Sdjm if (length > SIZE_MAX) { \
129*4dcc46c4Sdjm ctx->creation_failed = true; \
130*4dcc46c4Sdjm return; \
131*4dcc46c4Sdjm } \
132*4dcc46c4Sdjm } while (0)
133*4dcc46c4Sdjm
134d3425be1Sdjm #define PUSH_CTX_STACK(ctx, res, subitems) \
135d3425be1Sdjm do { \
136d3425be1Sdjm if (_cbor_stack_push(ctx->stack, res, subitems) == NULL) { \
137d3425be1Sdjm cbor_decref(&res); \
138d3425be1Sdjm ctx->creation_failed = true; \
139d3425be1Sdjm } \
140d3425be1Sdjm } while (0)
141d3425be1Sdjm
cbor_builder_uint8_callback(void * context,uint8_t value)1429e5c2ddcSdjm void cbor_builder_uint8_callback(void *context, uint8_t value) {
143da0d961cSdjm struct _cbor_decoder_context *ctx = context;
144da0d961cSdjm cbor_item_t *res = cbor_new_int8();
145d3425be1Sdjm CHECK_RES(ctx, res);
146da0d961cSdjm cbor_mark_uint(res);
147da0d961cSdjm cbor_set_uint8(res, value);
148da0d961cSdjm _cbor_builder_append(res, ctx);
149da0d961cSdjm }
150da0d961cSdjm
cbor_builder_uint16_callback(void * context,uint16_t value)1519e5c2ddcSdjm void cbor_builder_uint16_callback(void *context, uint16_t value) {
152da0d961cSdjm struct _cbor_decoder_context *ctx = context;
153da0d961cSdjm cbor_item_t *res = cbor_new_int16();
154d3425be1Sdjm CHECK_RES(ctx, res);
155da0d961cSdjm cbor_mark_uint(res);
156da0d961cSdjm cbor_set_uint16(res, value);
157da0d961cSdjm _cbor_builder_append(res, ctx);
158da0d961cSdjm }
159da0d961cSdjm
cbor_builder_uint32_callback(void * context,uint32_t value)1609e5c2ddcSdjm void cbor_builder_uint32_callback(void *context, uint32_t value) {
161da0d961cSdjm struct _cbor_decoder_context *ctx = context;
162da0d961cSdjm cbor_item_t *res = cbor_new_int32();
163d3425be1Sdjm CHECK_RES(ctx, res);
164da0d961cSdjm cbor_mark_uint(res);
165da0d961cSdjm cbor_set_uint32(res, value);
166da0d961cSdjm _cbor_builder_append(res, ctx);
167da0d961cSdjm }
168da0d961cSdjm
cbor_builder_uint64_callback(void * context,uint64_t value)1699e5c2ddcSdjm void cbor_builder_uint64_callback(void *context, uint64_t value) {
170da0d961cSdjm struct _cbor_decoder_context *ctx = context;
171da0d961cSdjm cbor_item_t *res = cbor_new_int64();
172d3425be1Sdjm CHECK_RES(ctx, res);
173da0d961cSdjm cbor_mark_uint(res);
174da0d961cSdjm cbor_set_uint64(res, value);
175da0d961cSdjm _cbor_builder_append(res, ctx);
176da0d961cSdjm }
177da0d961cSdjm
cbor_builder_negint8_callback(void * context,uint8_t value)1789e5c2ddcSdjm void cbor_builder_negint8_callback(void *context, uint8_t value) {
179da0d961cSdjm struct _cbor_decoder_context *ctx = context;
180da0d961cSdjm cbor_item_t *res = cbor_new_int8();
181d3425be1Sdjm CHECK_RES(ctx, res);
182da0d961cSdjm cbor_mark_negint(res);
183da0d961cSdjm cbor_set_uint8(res, value);
184da0d961cSdjm _cbor_builder_append(res, ctx);
185da0d961cSdjm }
186da0d961cSdjm
cbor_builder_negint16_callback(void * context,uint16_t value)1879e5c2ddcSdjm void cbor_builder_negint16_callback(void *context, uint16_t value) {
188da0d961cSdjm struct _cbor_decoder_context *ctx = context;
189da0d961cSdjm cbor_item_t *res = cbor_new_int16();
190*4dcc46c4Sdjm CHECK_RES(ctx, res);
191da0d961cSdjm cbor_mark_negint(res);
192da0d961cSdjm cbor_set_uint16(res, value);
193da0d961cSdjm _cbor_builder_append(res, ctx);
194da0d961cSdjm }
195da0d961cSdjm
cbor_builder_negint32_callback(void * context,uint32_t value)1969e5c2ddcSdjm void cbor_builder_negint32_callback(void *context, uint32_t value) {
197da0d961cSdjm struct _cbor_decoder_context *ctx = context;
198da0d961cSdjm cbor_item_t *res = cbor_new_int32();
199d3425be1Sdjm CHECK_RES(ctx, res);
200da0d961cSdjm cbor_mark_negint(res);
201da0d961cSdjm cbor_set_uint32(res, value);
202da0d961cSdjm _cbor_builder_append(res, ctx);
203da0d961cSdjm }
204da0d961cSdjm
cbor_builder_negint64_callback(void * context,uint64_t value)2059e5c2ddcSdjm void cbor_builder_negint64_callback(void *context, uint64_t value) {
206da0d961cSdjm struct _cbor_decoder_context *ctx = context;
207da0d961cSdjm cbor_item_t *res = cbor_new_int64();
208d3425be1Sdjm CHECK_RES(ctx, res);
209da0d961cSdjm cbor_mark_negint(res);
210da0d961cSdjm cbor_set_uint64(res, value);
211da0d961cSdjm _cbor_builder_append(res, ctx);
212da0d961cSdjm }
213da0d961cSdjm
cbor_builder_byte_string_callback(void * context,cbor_data data,uint64_t length)2149e5c2ddcSdjm void cbor_builder_byte_string_callback(void *context, cbor_data data,
215*4dcc46c4Sdjm uint64_t length) {
216da0d961cSdjm struct _cbor_decoder_context *ctx = context;
217*4dcc46c4Sdjm CHECK_LENGTH(ctx, length);
218*4dcc46c4Sdjm unsigned char *new_handle = _cbor_malloc(length);
219da0d961cSdjm if (new_handle == NULL) {
220da0d961cSdjm ctx->creation_failed = true;
221da0d961cSdjm return;
222da0d961cSdjm }
223da0d961cSdjm
224da0d961cSdjm memcpy(new_handle, data, length);
225*4dcc46c4Sdjm cbor_item_t *new_chunk = cbor_new_definite_bytestring();
226da0d961cSdjm
227*4dcc46c4Sdjm if (new_chunk == NULL) {
228*4dcc46c4Sdjm _cbor_free(new_handle);
229da0d961cSdjm ctx->creation_failed = true;
230da0d961cSdjm return;
231da0d961cSdjm }
232da0d961cSdjm
233*4dcc46c4Sdjm cbor_bytestring_set_handle(new_chunk, new_handle, length);
234da0d961cSdjm
235*4dcc46c4Sdjm // If an indef bytestring is on the stack, extend it (if it were closed, it
236*4dcc46c4Sdjm // would have been popped). Handle any syntax errors upstream.
237*4dcc46c4Sdjm if (ctx->stack->size > 0 && cbor_isa_bytestring(ctx->stack->top->item) &&
238*4dcc46c4Sdjm cbor_bytestring_is_indefinite(ctx->stack->top->item)) {
239*4dcc46c4Sdjm if (!cbor_bytestring_add_chunk(ctx->stack->top->item, new_chunk)) {
240*4dcc46c4Sdjm ctx->creation_failed = true;
241da0d961cSdjm }
242*4dcc46c4Sdjm cbor_decref(&new_chunk);
243da0d961cSdjm } else {
244*4dcc46c4Sdjm _cbor_builder_append(new_chunk, ctx);
245da0d961cSdjm }
246da0d961cSdjm }
247da0d961cSdjm
cbor_builder_byte_string_start_callback(void * context)2489e5c2ddcSdjm void cbor_builder_byte_string_start_callback(void *context) {
249da0d961cSdjm struct _cbor_decoder_context *ctx = context;
250da0d961cSdjm cbor_item_t *res = cbor_new_indefinite_bytestring();
251d3425be1Sdjm CHECK_RES(ctx, res);
252d3425be1Sdjm PUSH_CTX_STACK(ctx, res, 0);
253da0d961cSdjm }
254da0d961cSdjm
cbor_builder_string_callback(void * context,cbor_data data,uint64_t length)2559e5c2ddcSdjm void cbor_builder_string_callback(void *context, cbor_data data,
256*4dcc46c4Sdjm uint64_t length) {
257da0d961cSdjm struct _cbor_decoder_context *ctx = context;
258*4dcc46c4Sdjm CHECK_LENGTH(ctx, length);
259da0d961cSdjm struct _cbor_unicode_status unicode_status;
260*4dcc46c4Sdjm uint64_t codepoint_count =
2619e5c2ddcSdjm _cbor_unicode_codepoint_count(data, length, &unicode_status);
262da0d961cSdjm
263*4dcc46c4Sdjm if (unicode_status.status != _CBOR_UNICODE_OK) {
264da0d961cSdjm ctx->syntax_error = true;
265da0d961cSdjm return;
266da0d961cSdjm }
267*4dcc46c4Sdjm CBOR_ASSERT(codepoint_count <= length);
268da0d961cSdjm
269*4dcc46c4Sdjm unsigned char *new_handle = _cbor_malloc(length);
270da0d961cSdjm
271da0d961cSdjm if (new_handle == NULL) {
272da0d961cSdjm ctx->creation_failed = true;
273da0d961cSdjm return;
274da0d961cSdjm }
275da0d961cSdjm
276da0d961cSdjm memcpy(new_handle, data, length);
277*4dcc46c4Sdjm cbor_item_t *new_chunk = cbor_new_definite_string();
278*4dcc46c4Sdjm if (new_chunk == NULL) {
279*4dcc46c4Sdjm _cbor_free(new_handle);
280d3425be1Sdjm ctx->creation_failed = true;
281d3425be1Sdjm return;
282d3425be1Sdjm }
283*4dcc46c4Sdjm cbor_string_set_handle(new_chunk, new_handle, length);
284*4dcc46c4Sdjm new_chunk->metadata.string_metadata.codepoint_count = codepoint_count;
285da0d961cSdjm
286*4dcc46c4Sdjm // If an indef string is on the stack, extend it (if it were closed, it would
287*4dcc46c4Sdjm // have been popped). Handle any syntax errors upstream.
288*4dcc46c4Sdjm if (ctx->stack->size > 0 && cbor_isa_string(ctx->stack->top->item) &&
289*4dcc46c4Sdjm cbor_string_is_indefinite(ctx->stack->top->item)) {
290*4dcc46c4Sdjm if (!cbor_string_add_chunk(ctx->stack->top->item, new_chunk)) {
291*4dcc46c4Sdjm ctx->creation_failed = true;
292da0d961cSdjm }
293*4dcc46c4Sdjm cbor_decref(&new_chunk);
294da0d961cSdjm } else {
295*4dcc46c4Sdjm _cbor_builder_append(new_chunk, ctx);
296da0d961cSdjm }
297da0d961cSdjm }
298da0d961cSdjm
cbor_builder_string_start_callback(void * context)2999e5c2ddcSdjm void cbor_builder_string_start_callback(void *context) {
300da0d961cSdjm struct _cbor_decoder_context *ctx = context;
301da0d961cSdjm cbor_item_t *res = cbor_new_indefinite_string();
302d3425be1Sdjm CHECK_RES(ctx, res);
303d3425be1Sdjm PUSH_CTX_STACK(ctx, res, 0);
304da0d961cSdjm }
305da0d961cSdjm
cbor_builder_array_start_callback(void * context,uint64_t size)306*4dcc46c4Sdjm void cbor_builder_array_start_callback(void *context, uint64_t size) {
307da0d961cSdjm struct _cbor_decoder_context *ctx = context;
308*4dcc46c4Sdjm CHECK_LENGTH(ctx, size);
309da0d961cSdjm cbor_item_t *res = cbor_new_definite_array(size);
310d3425be1Sdjm CHECK_RES(ctx, res);
311da0d961cSdjm if (size > 0) {
312d3425be1Sdjm PUSH_CTX_STACK(ctx, res, size);
313da0d961cSdjm } else {
314da0d961cSdjm _cbor_builder_append(res, ctx);
315da0d961cSdjm }
316da0d961cSdjm }
317da0d961cSdjm
cbor_builder_indef_array_start_callback(void * context)3189e5c2ddcSdjm void cbor_builder_indef_array_start_callback(void *context) {
319da0d961cSdjm struct _cbor_decoder_context *ctx = context;
320da0d961cSdjm cbor_item_t *res = cbor_new_indefinite_array();
321d3425be1Sdjm CHECK_RES(ctx, res);
322d3425be1Sdjm PUSH_CTX_STACK(ctx, res, 0);
323da0d961cSdjm }
324da0d961cSdjm
cbor_builder_indef_map_start_callback(void * context)3259e5c2ddcSdjm void cbor_builder_indef_map_start_callback(void *context) {
326da0d961cSdjm struct _cbor_decoder_context *ctx = context;
327da0d961cSdjm cbor_item_t *res = cbor_new_indefinite_map();
328d3425be1Sdjm CHECK_RES(ctx, res);
329d3425be1Sdjm PUSH_CTX_STACK(ctx, res, 0);
330da0d961cSdjm }
331da0d961cSdjm
cbor_builder_map_start_callback(void * context,uint64_t size)332*4dcc46c4Sdjm void cbor_builder_map_start_callback(void *context, uint64_t size) {
333da0d961cSdjm struct _cbor_decoder_context *ctx = context;
334*4dcc46c4Sdjm CHECK_LENGTH(ctx, size);
335da0d961cSdjm cbor_item_t *res = cbor_new_definite_map(size);
336d3425be1Sdjm CHECK_RES(ctx, res);
337da0d961cSdjm if (size > 0) {
338d3425be1Sdjm PUSH_CTX_STACK(ctx, res, size * 2);
339da0d961cSdjm } else {
340da0d961cSdjm _cbor_builder_append(res, ctx);
341da0d961cSdjm }
342da0d961cSdjm }
343da0d961cSdjm
3449e5c2ddcSdjm /**
3459e5c2ddcSdjm * Is the (partially constructed) item indefinite?
3469e5c2ddcSdjm */
_cbor_is_indefinite(cbor_item_t * item)3479e5c2ddcSdjm bool _cbor_is_indefinite(cbor_item_t *item) {
3489e5c2ddcSdjm switch (item->type) {
3499e5c2ddcSdjm case CBOR_TYPE_BYTESTRING:
350*4dcc46c4Sdjm return cbor_bytestring_is_indefinite(item);
3519e5c2ddcSdjm case CBOR_TYPE_STRING:
352*4dcc46c4Sdjm return cbor_string_is_indefinite(item);
3539e5c2ddcSdjm case CBOR_TYPE_ARRAY:
354*4dcc46c4Sdjm return cbor_array_is_indefinite(item);
3559e5c2ddcSdjm case CBOR_TYPE_MAP:
356*4dcc46c4Sdjm return cbor_map_is_indefinite(item);
3579e5c2ddcSdjm default:
3589e5c2ddcSdjm return false;
359da0d961cSdjm }
360da0d961cSdjm }
361da0d961cSdjm
cbor_builder_indef_break_callback(void * context)3629e5c2ddcSdjm void cbor_builder_indef_break_callback(void *context) {
3639e5c2ddcSdjm struct _cbor_decoder_context *ctx = context;
3649e5c2ddcSdjm /* There must be an item to break out of*/
3659e5c2ddcSdjm if (ctx->stack->size > 0) {
3669e5c2ddcSdjm cbor_item_t *item = ctx->stack->top->item;
3679e5c2ddcSdjm if (_cbor_is_indefinite(
3689e5c2ddcSdjm item) && /* Only indefinite items can be terminated by 0xFF */
3699e5c2ddcSdjm /* Special case: we cannot append up if an indefinite map is incomplete
3709e5c2ddcSdjm (we are expecting a value). */
3719e5c2ddcSdjm (item->type != CBOR_TYPE_MAP || ctx->stack->top->subitems % 2 == 0)) {
3729e5c2ddcSdjm _cbor_stack_pop(ctx->stack);
3739e5c2ddcSdjm _cbor_builder_append(item, ctx);
3749e5c2ddcSdjm return;
3759e5c2ddcSdjm }
3769e5c2ddcSdjm }
3779e5c2ddcSdjm
3789e5c2ddcSdjm ctx->syntax_error = true;
3799e5c2ddcSdjm }
3809e5c2ddcSdjm
cbor_builder_float2_callback(void * context,float value)3819e5c2ddcSdjm void cbor_builder_float2_callback(void *context, float value) {
382da0d961cSdjm struct _cbor_decoder_context *ctx = context;
383da0d961cSdjm cbor_item_t *res = cbor_new_float2();
384*4dcc46c4Sdjm CHECK_RES(ctx, res);
385da0d961cSdjm cbor_set_float2(res, value);
386da0d961cSdjm _cbor_builder_append(res, ctx);
387da0d961cSdjm }
388da0d961cSdjm
cbor_builder_float4_callback(void * context,float value)3899e5c2ddcSdjm void cbor_builder_float4_callback(void *context, float value) {
390da0d961cSdjm struct _cbor_decoder_context *ctx = context;
391da0d961cSdjm cbor_item_t *res = cbor_new_float4();
392d3425be1Sdjm CHECK_RES(ctx, res);
393da0d961cSdjm cbor_set_float4(res, value);
394da0d961cSdjm _cbor_builder_append(res, ctx);
395da0d961cSdjm }
396da0d961cSdjm
cbor_builder_float8_callback(void * context,double value)3979e5c2ddcSdjm void cbor_builder_float8_callback(void *context, double value) {
398da0d961cSdjm struct _cbor_decoder_context *ctx = context;
399da0d961cSdjm cbor_item_t *res = cbor_new_float8();
400d3425be1Sdjm CHECK_RES(ctx, res);
401da0d961cSdjm cbor_set_float8(res, value);
402da0d961cSdjm _cbor_builder_append(res, ctx);
403da0d961cSdjm }
404da0d961cSdjm
cbor_builder_null_callback(void * context)4059e5c2ddcSdjm void cbor_builder_null_callback(void *context) {
406da0d961cSdjm struct _cbor_decoder_context *ctx = context;
407da0d961cSdjm cbor_item_t *res = cbor_new_null();
408d3425be1Sdjm CHECK_RES(ctx, res);
409da0d961cSdjm _cbor_builder_append(res, ctx);
410da0d961cSdjm }
411da0d961cSdjm
cbor_builder_undefined_callback(void * context)4129e5c2ddcSdjm void cbor_builder_undefined_callback(void *context) {
413da0d961cSdjm struct _cbor_decoder_context *ctx = context;
414da0d961cSdjm cbor_item_t *res = cbor_new_undef();
415d3425be1Sdjm CHECK_RES(ctx, res);
416da0d961cSdjm _cbor_builder_append(res, ctx);
417da0d961cSdjm }
418da0d961cSdjm
cbor_builder_boolean_callback(void * context,bool value)4199e5c2ddcSdjm void cbor_builder_boolean_callback(void *context, bool value) {
420da0d961cSdjm struct _cbor_decoder_context *ctx = context;
421da0d961cSdjm cbor_item_t *res = cbor_build_bool(value);
422d3425be1Sdjm CHECK_RES(ctx, res);
423da0d961cSdjm _cbor_builder_append(res, ctx);
424da0d961cSdjm }
425da0d961cSdjm
cbor_builder_tag_callback(void * context,uint64_t value)4269e5c2ddcSdjm void cbor_builder_tag_callback(void *context, uint64_t value) {
427da0d961cSdjm struct _cbor_decoder_context *ctx = context;
428da0d961cSdjm cbor_item_t *res = cbor_new_tag(value);
429d3425be1Sdjm CHECK_RES(ctx, res);
430d3425be1Sdjm PUSH_CTX_STACK(ctx, res, 1);
431da0d961cSdjm }
432