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 "streaming.h"
9da0d961cSdjm #include "internal/loaders.h"
10da0d961cSdjm
claim_bytes(size_t required,size_t provided,struct cbor_decoder_result * result)11*4dcc46c4Sdjm static bool claim_bytes(size_t required, size_t provided,
129e5c2ddcSdjm struct cbor_decoder_result *result) {
13da0d961cSdjm if (required > (provided - result->read)) {
14*4dcc46c4Sdjm result->required = required + result->read;
15da0d961cSdjm result->read = 0;
16da0d961cSdjm result->status = CBOR_DECODER_NEDATA;
17da0d961cSdjm return false;
18da0d961cSdjm } else {
19da0d961cSdjm result->read += required;
209e5c2ddcSdjm result->required = 0;
21da0d961cSdjm return true;
22da0d961cSdjm }
23da0d961cSdjm }
24da0d961cSdjm
25*4dcc46c4Sdjm // Use implicit capture as an exception to avoid the super long parameter list
26*4dcc46c4Sdjm #define CLAIM_BYTES_AND_INVOKE(callback_name, length, source_extra_offset) \
27*4dcc46c4Sdjm do { \
28*4dcc46c4Sdjm if (claim_bytes(length, source_size, &result)) { \
29*4dcc46c4Sdjm callbacks->callback_name(context, source + 1 + source_extra_offset, \
30*4dcc46c4Sdjm length); \
31*4dcc46c4Sdjm } \
32*4dcc46c4Sdjm } while (0)
33*4dcc46c4Sdjm
34*4dcc46c4Sdjm #define READ_CLAIM_INVOKE(callback_name, length_reader, length_bytes) \
35*4dcc46c4Sdjm do { \
36*4dcc46c4Sdjm if (claim_bytes(length_bytes, source_size, &result)) { \
37*4dcc46c4Sdjm uint64_t length = length_reader(source + 1); \
38*4dcc46c4Sdjm CLAIM_BYTES_AND_INVOKE(callback_name, length, length_bytes); \
39*4dcc46c4Sdjm } \
40*4dcc46c4Sdjm return result; \
41*4dcc46c4Sdjm } while (0)
42*4dcc46c4Sdjm
cbor_stream_decode(cbor_data source,size_t source_size,const struct cbor_callbacks * callbacks,void * context)439e5c2ddcSdjm struct cbor_decoder_result cbor_stream_decode(
449e5c2ddcSdjm cbor_data source, size_t source_size,
459e5c2ddcSdjm const struct cbor_callbacks *callbacks, void *context) {
46*4dcc46c4Sdjm // Attempt to claim the initial MTB byte
47*4dcc46c4Sdjm struct cbor_decoder_result result = {.status = CBOR_DECODER_FINISHED};
48*4dcc46c4Sdjm if (!claim_bytes(1, source_size, &result)) {
49*4dcc46c4Sdjm return result;
50da0d961cSdjm }
51da0d961cSdjm
52da0d961cSdjm switch (*source) {
53da0d961cSdjm case 0x00: /* Fallthrough */
54da0d961cSdjm case 0x01: /* Fallthrough */
55da0d961cSdjm case 0x02: /* Fallthrough */
56da0d961cSdjm case 0x03: /* Fallthrough */
57da0d961cSdjm case 0x04: /* Fallthrough */
58da0d961cSdjm case 0x05: /* Fallthrough */
59da0d961cSdjm case 0x06: /* Fallthrough */
60da0d961cSdjm case 0x07: /* Fallthrough */
61da0d961cSdjm case 0x08: /* Fallthrough */
62da0d961cSdjm case 0x09: /* Fallthrough */
63da0d961cSdjm case 0x0A: /* Fallthrough */
64da0d961cSdjm case 0x0B: /* Fallthrough */
65da0d961cSdjm case 0x0C: /* Fallthrough */
66da0d961cSdjm case 0x0D: /* Fallthrough */
67da0d961cSdjm case 0x0E: /* Fallthrough */
68da0d961cSdjm case 0x0F: /* Fallthrough */
69da0d961cSdjm case 0x10: /* Fallthrough */
70da0d961cSdjm case 0x11: /* Fallthrough */
71da0d961cSdjm case 0x12: /* Fallthrough */
72da0d961cSdjm case 0x13: /* Fallthrough */
73da0d961cSdjm case 0x14: /* Fallthrough */
74da0d961cSdjm case 0x15: /* Fallthrough */
75da0d961cSdjm case 0x16: /* Fallthrough */
76da0d961cSdjm case 0x17:
77da0d961cSdjm /* Embedded one byte unsigned integer */
78da0d961cSdjm {
79da0d961cSdjm callbacks->uint8(context, _cbor_load_uint8(source));
80da0d961cSdjm return result;
81da0d961cSdjm }
82da0d961cSdjm case 0x18:
83da0d961cSdjm /* One byte unsigned integer */
84da0d961cSdjm {
85*4dcc46c4Sdjm if (claim_bytes(1, source_size, &result)) {
86da0d961cSdjm callbacks->uint8(context, _cbor_load_uint8(source + 1));
87da0d961cSdjm }
88da0d961cSdjm return result;
89da0d961cSdjm }
90da0d961cSdjm case 0x19:
91da0d961cSdjm /* Two bytes unsigned integer */
92da0d961cSdjm {
93*4dcc46c4Sdjm if (claim_bytes(2, source_size, &result)) {
94da0d961cSdjm callbacks->uint16(context, _cbor_load_uint16(source + 1));
95da0d961cSdjm }
96da0d961cSdjm return result;
97da0d961cSdjm }
98da0d961cSdjm case 0x1A:
99da0d961cSdjm /* Four bytes unsigned integer */
100da0d961cSdjm {
101*4dcc46c4Sdjm if (claim_bytes(4, source_size, &result)) {
102da0d961cSdjm callbacks->uint32(context, _cbor_load_uint32(source + 1));
103da0d961cSdjm }
104da0d961cSdjm return result;
105da0d961cSdjm }
106da0d961cSdjm case 0x1B:
107da0d961cSdjm /* Eight bytes unsigned integer */
108da0d961cSdjm {
109*4dcc46c4Sdjm if (claim_bytes(8, source_size, &result)) {
110da0d961cSdjm callbacks->uint64(context, _cbor_load_uint64(source + 1));
111da0d961cSdjm }
112da0d961cSdjm return result;
113da0d961cSdjm }
114da0d961cSdjm case 0x1C: /* Fallthrough */
115da0d961cSdjm case 0x1D: /* Fallthrough */
116da0d961cSdjm case 0x1E: /* Fallthrough */
117da0d961cSdjm case 0x1F:
118da0d961cSdjm /* Reserved */
119*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
120da0d961cSdjm case 0x20: /* Fallthrough */
121da0d961cSdjm case 0x21: /* Fallthrough */
122da0d961cSdjm case 0x22: /* Fallthrough */
123da0d961cSdjm case 0x23: /* Fallthrough */
124da0d961cSdjm case 0x24: /* Fallthrough */
125da0d961cSdjm case 0x25: /* Fallthrough */
126da0d961cSdjm case 0x26: /* Fallthrough */
127da0d961cSdjm case 0x27: /* Fallthrough */
128da0d961cSdjm case 0x28: /* Fallthrough */
129da0d961cSdjm case 0x29: /* Fallthrough */
130da0d961cSdjm case 0x2A: /* Fallthrough */
131da0d961cSdjm case 0x2B: /* Fallthrough */
132da0d961cSdjm case 0x2C: /* Fallthrough */
133da0d961cSdjm case 0x2D: /* Fallthrough */
134da0d961cSdjm case 0x2E: /* Fallthrough */
135da0d961cSdjm case 0x2F: /* Fallthrough */
136da0d961cSdjm case 0x30: /* Fallthrough */
137da0d961cSdjm case 0x31: /* Fallthrough */
138da0d961cSdjm case 0x32: /* Fallthrough */
139da0d961cSdjm case 0x33: /* Fallthrough */
140da0d961cSdjm case 0x34: /* Fallthrough */
141da0d961cSdjm case 0x35: /* Fallthrough */
142da0d961cSdjm case 0x36: /* Fallthrough */
143da0d961cSdjm case 0x37:
144da0d961cSdjm /* Embedded one byte negative integer */
145da0d961cSdjm {
1469e5c2ddcSdjm callbacks->negint8(context,
1479e5c2ddcSdjm _cbor_load_uint8(source) - 0x20); /* 0x20 offset */
148da0d961cSdjm return result;
149da0d961cSdjm }
150da0d961cSdjm case 0x38:
151da0d961cSdjm /* One byte negative integer */
152da0d961cSdjm {
153*4dcc46c4Sdjm if (claim_bytes(1, source_size, &result)) {
154da0d961cSdjm callbacks->negint8(context, _cbor_load_uint8(source + 1));
155da0d961cSdjm }
156da0d961cSdjm return result;
157da0d961cSdjm }
158da0d961cSdjm case 0x39:
159da0d961cSdjm /* Two bytes negative integer */
160da0d961cSdjm {
161*4dcc46c4Sdjm if (claim_bytes(2, source_size, &result)) {
162da0d961cSdjm callbacks->negint16(context, _cbor_load_uint16(source + 1));
163da0d961cSdjm }
164da0d961cSdjm return result;
165da0d961cSdjm }
166da0d961cSdjm case 0x3A:
167da0d961cSdjm /* Four bytes negative integer */
168da0d961cSdjm {
169*4dcc46c4Sdjm if (claim_bytes(4, source_size, &result)) {
170da0d961cSdjm callbacks->negint32(context, _cbor_load_uint32(source + 1));
171da0d961cSdjm }
172da0d961cSdjm return result;
173da0d961cSdjm }
174da0d961cSdjm case 0x3B:
175da0d961cSdjm /* Eight bytes negative integer */
176da0d961cSdjm {
177*4dcc46c4Sdjm if (claim_bytes(8, source_size, &result)) {
178da0d961cSdjm callbacks->negint64(context, _cbor_load_uint64(source + 1));
179da0d961cSdjm }
180da0d961cSdjm return result;
181da0d961cSdjm }
182da0d961cSdjm case 0x3C: /* Fallthrough */
183da0d961cSdjm case 0x3D: /* Fallthrough */
184da0d961cSdjm case 0x3E: /* Fallthrough */
185da0d961cSdjm case 0x3F:
186da0d961cSdjm /* Reserved */
187*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
188da0d961cSdjm case 0x40: /* Fallthrough */
189da0d961cSdjm case 0x41: /* Fallthrough */
190da0d961cSdjm case 0x42: /* Fallthrough */
191da0d961cSdjm case 0x43: /* Fallthrough */
192da0d961cSdjm case 0x44: /* Fallthrough */
193da0d961cSdjm case 0x45: /* Fallthrough */
194da0d961cSdjm case 0x46: /* Fallthrough */
195da0d961cSdjm case 0x47: /* Fallthrough */
196da0d961cSdjm case 0x48: /* Fallthrough */
197da0d961cSdjm case 0x49: /* Fallthrough */
198da0d961cSdjm case 0x4A: /* Fallthrough */
199da0d961cSdjm case 0x4B: /* Fallthrough */
200da0d961cSdjm case 0x4C: /* Fallthrough */
201da0d961cSdjm case 0x4D: /* Fallthrough */
202da0d961cSdjm case 0x4E: /* Fallthrough */
203da0d961cSdjm case 0x4F: /* Fallthrough */
204da0d961cSdjm case 0x50: /* Fallthrough */
205da0d961cSdjm case 0x51: /* Fallthrough */
206da0d961cSdjm case 0x52: /* Fallthrough */
207da0d961cSdjm case 0x53: /* Fallthrough */
208da0d961cSdjm case 0x54: /* Fallthrough */
209da0d961cSdjm case 0x55: /* Fallthrough */
210da0d961cSdjm case 0x56: /* Fallthrough */
211da0d961cSdjm case 0x57:
212da0d961cSdjm /* Embedded length byte string */
213da0d961cSdjm {
214*4dcc46c4Sdjm uint64_t length = _cbor_load_uint8(source) - 0x40; /* 0x40 offset */
215*4dcc46c4Sdjm CLAIM_BYTES_AND_INVOKE(byte_string, length, 0);
216da0d961cSdjm return result;
217da0d961cSdjm }
218da0d961cSdjm case 0x58:
219da0d961cSdjm /* One byte length byte string */
220*4dcc46c4Sdjm READ_CLAIM_INVOKE(byte_string, _cbor_load_uint8, 1);
221da0d961cSdjm case 0x59:
222da0d961cSdjm /* Two bytes length byte string */
223*4dcc46c4Sdjm READ_CLAIM_INVOKE(byte_string, _cbor_load_uint16, 2);
224da0d961cSdjm case 0x5A:
225da0d961cSdjm /* Four bytes length byte string */
226*4dcc46c4Sdjm READ_CLAIM_INVOKE(byte_string, _cbor_load_uint32, 4);
227da0d961cSdjm case 0x5B:
228da0d961cSdjm /* Eight bytes length byte string */
229*4dcc46c4Sdjm READ_CLAIM_INVOKE(byte_string, _cbor_load_uint64, 8);
230da0d961cSdjm case 0x5C: /* Fallthrough */
231da0d961cSdjm case 0x5D: /* Fallthrough */
232da0d961cSdjm case 0x5E:
233da0d961cSdjm /* Reserved */
234*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
235da0d961cSdjm case 0x5F:
236da0d961cSdjm /* Indefinite byte string */
237da0d961cSdjm {
238da0d961cSdjm callbacks->byte_string_start(context);
239da0d961cSdjm return result;
240da0d961cSdjm }
241da0d961cSdjm case 0x60: /* Fallthrough */
242da0d961cSdjm case 0x61: /* Fallthrough */
243da0d961cSdjm case 0x62: /* Fallthrough */
244da0d961cSdjm case 0x63: /* Fallthrough */
245da0d961cSdjm case 0x64: /* Fallthrough */
246da0d961cSdjm case 0x65: /* Fallthrough */
247da0d961cSdjm case 0x66: /* Fallthrough */
248da0d961cSdjm case 0x67: /* Fallthrough */
249da0d961cSdjm case 0x68: /* Fallthrough */
250da0d961cSdjm case 0x69: /* Fallthrough */
251da0d961cSdjm case 0x6A: /* Fallthrough */
252da0d961cSdjm case 0x6B: /* Fallthrough */
253da0d961cSdjm case 0x6C: /* Fallthrough */
254da0d961cSdjm case 0x6D: /* Fallthrough */
255da0d961cSdjm case 0x6E: /* Fallthrough */
256da0d961cSdjm case 0x6F: /* Fallthrough */
257da0d961cSdjm case 0x70: /* Fallthrough */
258da0d961cSdjm case 0x71: /* Fallthrough */
259da0d961cSdjm case 0x72: /* Fallthrough */
260da0d961cSdjm case 0x73: /* Fallthrough */
261da0d961cSdjm case 0x74: /* Fallthrough */
262da0d961cSdjm case 0x75: /* Fallthrough */
263da0d961cSdjm case 0x76: /* Fallthrough */
264da0d961cSdjm case 0x77:
265da0d961cSdjm /* Embedded one byte length string */
266da0d961cSdjm {
267*4dcc46c4Sdjm uint64_t length = _cbor_load_uint8(source) - 0x60; /* 0x60 offset */
268*4dcc46c4Sdjm CLAIM_BYTES_AND_INVOKE(string, length, 0);
269da0d961cSdjm return result;
270da0d961cSdjm }
271da0d961cSdjm case 0x78:
272da0d961cSdjm /* One byte length string */
273*4dcc46c4Sdjm READ_CLAIM_INVOKE(string, _cbor_load_uint8, 1);
274da0d961cSdjm case 0x79:
275da0d961cSdjm /* Two bytes length string */
276*4dcc46c4Sdjm READ_CLAIM_INVOKE(string, _cbor_load_uint16, 2);
277da0d961cSdjm case 0x7A:
278da0d961cSdjm /* Four bytes length string */
279*4dcc46c4Sdjm READ_CLAIM_INVOKE(string, _cbor_load_uint32, 4);
280da0d961cSdjm case 0x7B:
281da0d961cSdjm /* Eight bytes length string */
282*4dcc46c4Sdjm READ_CLAIM_INVOKE(string, _cbor_load_uint64, 8);
283da0d961cSdjm case 0x7C: /* Fallthrough */
284da0d961cSdjm case 0x7D: /* Fallthrough */
285da0d961cSdjm case 0x7E:
286da0d961cSdjm /* Reserved */
287*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
288da0d961cSdjm case 0x7F:
289da0d961cSdjm /* Indefinite length string */
290da0d961cSdjm {
291da0d961cSdjm callbacks->string_start(context);
292da0d961cSdjm return result;
293da0d961cSdjm }
294da0d961cSdjm case 0x80: /* Fallthrough */
295da0d961cSdjm case 0x81: /* Fallthrough */
296da0d961cSdjm case 0x82: /* Fallthrough */
297da0d961cSdjm case 0x83: /* Fallthrough */
298da0d961cSdjm case 0x84: /* Fallthrough */
299da0d961cSdjm case 0x85: /* Fallthrough */
300da0d961cSdjm case 0x86: /* Fallthrough */
301da0d961cSdjm case 0x87: /* Fallthrough */
302da0d961cSdjm case 0x88: /* Fallthrough */
303da0d961cSdjm case 0x89: /* Fallthrough */
304da0d961cSdjm case 0x8A: /* Fallthrough */
305da0d961cSdjm case 0x8B: /* Fallthrough */
306da0d961cSdjm case 0x8C: /* Fallthrough */
307da0d961cSdjm case 0x8D: /* Fallthrough */
308da0d961cSdjm case 0x8E: /* Fallthrough */
309da0d961cSdjm case 0x8F: /* Fallthrough */
310da0d961cSdjm case 0x90: /* Fallthrough */
311da0d961cSdjm case 0x91: /* Fallthrough */
312da0d961cSdjm case 0x92: /* Fallthrough */
313da0d961cSdjm case 0x93: /* Fallthrough */
314da0d961cSdjm case 0x94: /* Fallthrough */
315da0d961cSdjm case 0x95: /* Fallthrough */
316da0d961cSdjm case 0x96: /* Fallthrough */
317da0d961cSdjm case 0x97:
318da0d961cSdjm /* Embedded one byte length array */
319da0d961cSdjm {
3209e5c2ddcSdjm callbacks->array_start(
321*4dcc46c4Sdjm context, _cbor_load_uint8(source) - 0x80); /* 0x40 offset */
322da0d961cSdjm return result;
323da0d961cSdjm }
324da0d961cSdjm case 0x98:
325da0d961cSdjm /* One byte length array */
326da0d961cSdjm {
327*4dcc46c4Sdjm if (claim_bytes(1, source_size, &result)) {
328*4dcc46c4Sdjm callbacks->array_start(context, _cbor_load_uint8(source + 1));
329da0d961cSdjm }
330da0d961cSdjm return result;
331da0d961cSdjm }
332da0d961cSdjm case 0x99:
3339e5c2ddcSdjm /* Two bytes length array */
334da0d961cSdjm {
335*4dcc46c4Sdjm if (claim_bytes(2, source_size, &result)) {
336*4dcc46c4Sdjm callbacks->array_start(context, _cbor_load_uint16(source + 1));
337da0d961cSdjm }
338da0d961cSdjm return result;
339da0d961cSdjm }
340da0d961cSdjm case 0x9A:
3419e5c2ddcSdjm /* Four bytes length array */
342da0d961cSdjm {
343*4dcc46c4Sdjm if (claim_bytes(4, source_size, &result)) {
344*4dcc46c4Sdjm callbacks->array_start(context, _cbor_load_uint32(source + 1));
345da0d961cSdjm }
346da0d961cSdjm return result;
347da0d961cSdjm }
348da0d961cSdjm case 0x9B:
3499e5c2ddcSdjm /* Eight bytes length array */
350da0d961cSdjm {
351*4dcc46c4Sdjm if (claim_bytes(8, source_size, &result)) {
352*4dcc46c4Sdjm callbacks->array_start(context, _cbor_load_uint64(source + 1));
353da0d961cSdjm }
354da0d961cSdjm return result;
355da0d961cSdjm }
356da0d961cSdjm case 0x9C: /* Fallthrough */
357da0d961cSdjm case 0x9D: /* Fallthrough */
358da0d961cSdjm case 0x9E:
359da0d961cSdjm /* Reserved */
360*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
361da0d961cSdjm case 0x9F:
362da0d961cSdjm /* Indefinite length array */
363da0d961cSdjm {
364da0d961cSdjm callbacks->indef_array_start(context);
365da0d961cSdjm return result;
366da0d961cSdjm }
367da0d961cSdjm case 0xA0: /* Fallthrough */
368da0d961cSdjm case 0xA1: /* Fallthrough */
369da0d961cSdjm case 0xA2: /* Fallthrough */
370da0d961cSdjm case 0xA3: /* Fallthrough */
371da0d961cSdjm case 0xA4: /* Fallthrough */
372da0d961cSdjm case 0xA5: /* Fallthrough */
373da0d961cSdjm case 0xA6: /* Fallthrough */
374da0d961cSdjm case 0xA7: /* Fallthrough */
375da0d961cSdjm case 0xA8: /* Fallthrough */
376da0d961cSdjm case 0xA9: /* Fallthrough */
377da0d961cSdjm case 0xAA: /* Fallthrough */
378da0d961cSdjm case 0xAB: /* Fallthrough */
379da0d961cSdjm case 0xAC: /* Fallthrough */
380da0d961cSdjm case 0xAD: /* Fallthrough */
381da0d961cSdjm case 0xAE: /* Fallthrough */
382da0d961cSdjm case 0xAF: /* Fallthrough */
383da0d961cSdjm case 0xB0: /* Fallthrough */
384da0d961cSdjm case 0xB1: /* Fallthrough */
385da0d961cSdjm case 0xB2: /* Fallthrough */
386da0d961cSdjm case 0xB3: /* Fallthrough */
387da0d961cSdjm case 0xB4: /* Fallthrough */
388da0d961cSdjm case 0xB5: /* Fallthrough */
389da0d961cSdjm case 0xB6: /* Fallthrough */
390da0d961cSdjm case 0xB7:
391da0d961cSdjm /* Embedded one byte length map */
392da0d961cSdjm {
393*4dcc46c4Sdjm callbacks->map_start(context,
394*4dcc46c4Sdjm _cbor_load_uint8(source) - 0xA0); /* 0xA0 offset */
395da0d961cSdjm return result;
396da0d961cSdjm }
397da0d961cSdjm case 0xB8:
398da0d961cSdjm /* One byte length map */
399da0d961cSdjm {
400*4dcc46c4Sdjm if (claim_bytes(1, source_size, &result)) {
401*4dcc46c4Sdjm callbacks->map_start(context, _cbor_load_uint8(source + 1));
402da0d961cSdjm }
403da0d961cSdjm return result;
404da0d961cSdjm }
405da0d961cSdjm case 0xB9:
406da0d961cSdjm /* Two bytes length map */
407da0d961cSdjm {
408*4dcc46c4Sdjm if (claim_bytes(2, source_size, &result)) {
409*4dcc46c4Sdjm callbacks->map_start(context, _cbor_load_uint16(source + 1));
410da0d961cSdjm }
411da0d961cSdjm return result;
412da0d961cSdjm }
413da0d961cSdjm case 0xBA:
414da0d961cSdjm /* Four bytes length map */
415da0d961cSdjm {
416*4dcc46c4Sdjm if (claim_bytes(4, source_size, &result)) {
417*4dcc46c4Sdjm callbacks->map_start(context, _cbor_load_uint32(source + 1));
418da0d961cSdjm }
419da0d961cSdjm return result;
420da0d961cSdjm }
421da0d961cSdjm case 0xBB:
422da0d961cSdjm /* Eight bytes length map */
423da0d961cSdjm {
424*4dcc46c4Sdjm if (claim_bytes(8, source_size, &result)) {
425*4dcc46c4Sdjm callbacks->map_start(context, _cbor_load_uint64(source + 1));
426da0d961cSdjm }
427da0d961cSdjm return result;
428da0d961cSdjm }
429da0d961cSdjm case 0xBC: /* Fallthrough */
430da0d961cSdjm case 0xBD: /* Fallthrough */
431da0d961cSdjm case 0xBE:
432da0d961cSdjm /* Reserved */
433*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
434da0d961cSdjm case 0xBF:
435da0d961cSdjm /* Indefinite length map */
436da0d961cSdjm {
437da0d961cSdjm callbacks->indef_map_start(context);
438da0d961cSdjm return result;
439da0d961cSdjm }
440da0d961cSdjm case 0xC0:
441da0d961cSdjm /* Text date/time - RFC 3339 tag, fallthrough */
442da0d961cSdjm case 0xC1:
443da0d961cSdjm /* Epoch date tag, fallthrough */
444da0d961cSdjm case 0xC2:
445da0d961cSdjm /* Positive bignum tag, fallthrough */
446da0d961cSdjm case 0xC3:
447da0d961cSdjm /* Negative bignum tag, fallthrough */
448da0d961cSdjm case 0xC4:
449da0d961cSdjm /* Fraction, fallthrough */
450da0d961cSdjm case 0xC5:
451da0d961cSdjm /* Big float */
452da0d961cSdjm {
453*4dcc46c4Sdjm callbacks->tag(context, (uint64_t)(_cbor_load_uint8(source) -
454*4dcc46c4Sdjm 0xC0)); /* 0xC0 offset */
455da0d961cSdjm return result;
456da0d961cSdjm }
457da0d961cSdjm case 0xC6: /* Fallthrough */
458da0d961cSdjm case 0xC7: /* Fallthrough */
459da0d961cSdjm case 0xC8: /* Fallthrough */
460da0d961cSdjm case 0xC9: /* Fallthrough */
461da0d961cSdjm case 0xCA: /* Fallthrough */
462da0d961cSdjm case 0xCB: /* Fallthrough */
463da0d961cSdjm case 0xCC: /* Fallthrough */
464da0d961cSdjm case 0xCD: /* Fallthrough */
465da0d961cSdjm case 0xCE: /* Fallthrough */
466da0d961cSdjm case 0xCF: /* Fallthrough */
467da0d961cSdjm case 0xD0: /* Fallthrough */
468da0d961cSdjm case 0xD1: /* Fallthrough */
469da0d961cSdjm case 0xD2: /* Fallthrough */
470da0d961cSdjm case 0xD3: /* Fallthrough */
471da0d961cSdjm case 0xD4: /* Unassigned tag value */
472da0d961cSdjm {
473*4dcc46c4Sdjm return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR};
474da0d961cSdjm }
475da0d961cSdjm case 0xD5: /* Expected b64url conversion tag - fallthrough */
476da0d961cSdjm case 0xD6: /* Expected b64 conversion tag - fallthrough */
477da0d961cSdjm case 0xD7: /* Expected b16 conversion tag */
478da0d961cSdjm {
479*4dcc46c4Sdjm callbacks->tag(context, (uint64_t)(_cbor_load_uint8(source) -
480*4dcc46c4Sdjm 0xC0)); /* 0xC0 offset */
481da0d961cSdjm return result;
482da0d961cSdjm }
483da0d961cSdjm case 0xD8: /* 1B tag */
484da0d961cSdjm {
485*4dcc46c4Sdjm if (claim_bytes(1, source_size, &result)) {
486da0d961cSdjm callbacks->tag(context, _cbor_load_uint8(source + 1));
487da0d961cSdjm }
488da0d961cSdjm return result;
489da0d961cSdjm }
490da0d961cSdjm case 0xD9: /* 2B tag */
491da0d961cSdjm {
492*4dcc46c4Sdjm if (claim_bytes(2, source_size, &result)) {
493da0d961cSdjm callbacks->tag(context, _cbor_load_uint16(source + 1));
494da0d961cSdjm }
495da0d961cSdjm return result;
496da0d961cSdjm }
497da0d961cSdjm case 0xDA: /* 4B tag */
498da0d961cSdjm {
499*4dcc46c4Sdjm if (claim_bytes(4, source_size, &result)) {
500da0d961cSdjm callbacks->tag(context, _cbor_load_uint32(source + 1));
501da0d961cSdjm }
502da0d961cSdjm return result;
503da0d961cSdjm }
504da0d961cSdjm case 0xDB: /* 8B tag */
505da0d961cSdjm {
506*4dcc46c4Sdjm if (claim_bytes(8, source_size, &result)) {
507da0d961cSdjm callbacks->tag(context, _cbor_load_uint64(source + 1));
508da0d961cSdjm }
509da0d961cSdjm return result;
510da0d961cSdjm }
511da0d961cSdjm case 0xDC: /* Fallthrough */
512da0d961cSdjm case 0xDD: /* Fallthrough */
513da0d961cSdjm case 0xDE: /* Fallthrough */
514da0d961cSdjm case 0xDF: /* Reserved */
515da0d961cSdjm {
516*4dcc46c4Sdjm return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR};
517da0d961cSdjm }
518da0d961cSdjm case 0xE0: /* Fallthrough */
519da0d961cSdjm case 0xE1: /* Fallthrough */
520da0d961cSdjm case 0xE2: /* Fallthrough */
521da0d961cSdjm case 0xE3: /* Fallthrough */
522da0d961cSdjm case 0xE4: /* Fallthrough */
523da0d961cSdjm case 0xE5: /* Fallthrough */
524da0d961cSdjm case 0xE6: /* Fallthrough */
525da0d961cSdjm case 0xE7: /* Fallthrough */
526da0d961cSdjm case 0xE8: /* Fallthrough */
527da0d961cSdjm case 0xE9: /* Fallthrough */
528da0d961cSdjm case 0xEA: /* Fallthrough */
529da0d961cSdjm case 0xEB: /* Fallthrough */
530da0d961cSdjm case 0xEC: /* Fallthrough */
531da0d961cSdjm case 0xED: /* Fallthrough */
532da0d961cSdjm case 0xEE: /* Fallthrough */
533da0d961cSdjm case 0xEF: /* Fallthrough */
534da0d961cSdjm case 0xF0: /* Fallthrough */
535da0d961cSdjm case 0xF1: /* Fallthrough */
536da0d961cSdjm case 0xF2: /* Fallthrough */
537da0d961cSdjm case 0xF3: /* Simple value - unassigned */
538da0d961cSdjm {
539*4dcc46c4Sdjm return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR};
540da0d961cSdjm }
541da0d961cSdjm case 0xF4:
542da0d961cSdjm /* False */
543da0d961cSdjm {
544da0d961cSdjm callbacks->boolean(context, false);
545da0d961cSdjm return result;
546da0d961cSdjm }
547da0d961cSdjm case 0xF5:
548da0d961cSdjm /* True */
549da0d961cSdjm {
550da0d961cSdjm callbacks->boolean(context, true);
551da0d961cSdjm return result;
552da0d961cSdjm }
553da0d961cSdjm case 0xF6:
554da0d961cSdjm /* Null */
555da0d961cSdjm {
556da0d961cSdjm callbacks->null(context);
557da0d961cSdjm return result;
558da0d961cSdjm }
559da0d961cSdjm case 0xF7:
560da0d961cSdjm /* Undefined */
561da0d961cSdjm {
562da0d961cSdjm callbacks->undefined(context);
563da0d961cSdjm return result;
564da0d961cSdjm }
565da0d961cSdjm case 0xF8:
566da0d961cSdjm /* 1B simple value, unassigned */
567*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
568da0d961cSdjm case 0xF9:
569da0d961cSdjm /* 2B float */
570da0d961cSdjm {
571*4dcc46c4Sdjm if (claim_bytes(2, source_size, &result)) {
572da0d961cSdjm callbacks->float2(context, _cbor_load_half(source + 1));
573da0d961cSdjm }
574da0d961cSdjm return result;
575da0d961cSdjm }
576da0d961cSdjm case 0xFA:
577da0d961cSdjm /* 4B float */
578da0d961cSdjm {
579*4dcc46c4Sdjm if (claim_bytes(4, source_size, &result)) {
580da0d961cSdjm callbacks->float4(context, _cbor_load_float(source + 1));
581da0d961cSdjm }
582da0d961cSdjm return result;
583da0d961cSdjm }
584da0d961cSdjm case 0xFB:
585da0d961cSdjm /* 8B float */
586da0d961cSdjm {
587*4dcc46c4Sdjm if (claim_bytes(8, source_size, &result)) {
588da0d961cSdjm callbacks->float8(context, _cbor_load_double(source + 1));
589da0d961cSdjm }
590da0d961cSdjm return result;
591da0d961cSdjm }
592da0d961cSdjm case 0xFC: /* Fallthrough */
593da0d961cSdjm case 0xFD: /* Fallthrough */
594da0d961cSdjm case 0xFE:
595da0d961cSdjm /* Reserved */
596*4dcc46c4Sdjm { return (struct cbor_decoder_result){.status = CBOR_DECODER_ERROR}; }
597da0d961cSdjm case 0xFF:
598da0d961cSdjm /* Break */
599da0d961cSdjm callbacks->indef_break(context);
600*4dcc46c4Sdjm // Never happens, the switch statement is exhaustive on the 1B range; make
601*4dcc46c4Sdjm // compiler happy
602*4dcc46c4Sdjm default:
603da0d961cSdjm return result;
604da0d961cSdjm }
605da0d961cSdjm }
606