Skip to content

Commit 2cabc6c

Browse files
committed
WIP towards bytestrings
1 parent 196f3c8 commit 2cabc6c

File tree

5 files changed

+200
-14
lines changed

5 files changed

+200
-14
lines changed

misc/seq.rb

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env ruby
2+
3+
Integer($*[0]).times {|i| print "0x%02X, " % ((Integer($*[1]) + i) % 0xFF) }

src/cbor.c

+83-6
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ void cbor_decref(cbor_item_t * * item)
1515
/* Fallthrough */
1616
case CBOR_TYPE_NEGINT:
1717
/* Fixed size, simple free suffices */
18+
/* Fallthrough */
19+
case CBOR_TYPE_BYTESTRING:
20+
// TODO variable chunking
1821
{
1922
free((*item)->data);
2023
break;
2124
}
22-
case CBOR_TYPE_BYTESTRING:
2325
case CBOT_TYPE_STRING:
2426
case CBOR_TYPE_ARRAY:
2527
case CBOR_TYPE_MAP:
@@ -48,6 +50,7 @@ cbor_item_t * cbor_load(const unsigned char * source,
4850
res->refcount = 1;
4951
result->read = 1; /* We always attempt to read the MTB */
5052
result->error = (struct cbor_error) { 0, CBOR_ERR_NONE };
53+
5154
switch (*source) {
5255
case 0x00:
5356
case 0x01:
@@ -95,14 +98,14 @@ cbor_item_t * cbor_load(const unsigned char * source,
9598
break;
9699
}
97100
/* Four byte uint */
98-
case 0x1a:
101+
case 0x1A:
99102
{
100103
res->type = CBOR_TYPE_UINT;
101104
_cbor_handle_load_uint32(source + 1, source_size - 1, res, result);
102105
break;
103106
}
104107
/* Glorious eight byte uint */
105-
case 0x1b:
108+
case 0x1B:
106109
{
107110
res->type = CBOR_TYPE_UINT;
108111
_cbor_handle_load_uint64(source + 1, source_size - 1, res, result);
@@ -154,21 +157,21 @@ cbor_item_t * cbor_load(const unsigned char * source,
154157
_cbor_handle_load_uint16(source + 1, source_size - 1, res, result);
155158
break;
156159
}
157-
case 0x3a:
160+
case 0x3A:
158161
/* Four byte negint */
159162
{
160163
res->type = CBOR_TYPE_NEGINT;
161164
_cbor_handle_load_uint32(source + 1, source_size - 1, res, result);
162165
break;
163166
}
164-
case 0x3b:
167+
case 0x3B:
165168
/* Eight byte negint */
166169
{
167170
res->type = CBOR_TYPE_NEGINT;
168171
_cbor_handle_load_uint64(source + 1, source_size - 1, res, result);
169172
break;
170173
}
171-
/* RESERVED */
174+
/* RESERVED - 0x3C - 0x3F*/
172175
case 0x40:
173176
case 0x41:
174177
case 0x42:
@@ -200,11 +203,80 @@ cbor_item_t * cbor_load(const unsigned char * source,
200203
_cbor_handle_load_bytestring(source + 1, source_size - 1, length, res, result);
201204
break;
202205
}
206+
case 0x58:
207+
/* Bytestring with one byte length */
208+
{
209+
res->type = CBOR_TYPE_BYTESTRING;
210+
/* We have read one byte, need at least one more for the uint8_t */
211+
if (!_cbor_assert_avail_bytes(1, source_size - 1, result)) {
212+
result->error.position = 1;
213+
} else {
214+
result->read++;
215+
uint8_t length = _cbor_load_uint8(source + 1);
216+
_cbor_handle_load_bytestring(source + 2, source_size - 2, length, res, result);
217+
}
218+
break;
219+
}
220+
case 0x59:
221+
/* Bytestring with two bytes length */
222+
{
223+
res->type = CBOR_TYPE_BYTESTRING;
224+
/* We have read one byte, need at least one more for the uint8_t */
225+
if (!_cbor_assert_avail_bytes(2, source_size - 1, result)) {
226+
result->error.position = 1;
227+
} else {
228+
result->read += 2;
229+
uint16_t length = _cbor_load_uint16(source + 1);
230+
_cbor_handle_load_bytestring(source + 3, source_size - 3, length, res, result);
231+
}
232+
break;
233+
}
234+
case 0x5A:
235+
/* Bytestring with four bytes length */
236+
{
237+
res->type = CBOR_TYPE_BYTESTRING;
238+
/* We have read one byte, need at least one more for the uint8_t */
239+
if (!_cbor_assert_avail_bytes(4, source_size - 1, result)) {
240+
result->error.position = 1;
241+
} else {
242+
result->read += 4;
243+
uint32_t length = _cbor_load_uint32(source + 1);
244+
_cbor_handle_load_bytestring(source + 5, source_size - 5, length, res, result);
245+
}
246+
break;
247+
}
248+
case 0x5B:
249+
/* Bytestring with eight bytes length */
250+
{
251+
res->type = CBOR_TYPE_BYTESTRING;
252+
/* We have read one byte, need at least one more for the uint8_t */
253+
if (!_cbor_assert_avail_bytes(8, source_size - 1, result)) {
254+
result->error.position = 1;
255+
} else {
256+
result->read += 8;
257+
uint64_t length = _cbor_load_uint64(source + 1);
258+
_cbor_handle_load_bytestring(source + 9, source_size - 9, length, res, result);
259+
}
260+
break;
261+
}
262+
/* RESERVED - 0x5C - 0x5E */
263+
case 0x5F:
264+
/* Indefinite length bytestring */
265+
{
266+
267+
}
268+
203269
/* TODO */
204270
/* Short arrays */
205271
case 0x80:
206272
{
207273
}
274+
case 0xFF:
275+
/* Indefinite length item break */
276+
{
277+
278+
break;
279+
}
208280
default:
209281
{
210282
}
@@ -372,4 +444,9 @@ inline bool cbor_is_undef(cbor_item_t * item)
372444
size_t cbor_bytestring_length(cbor_item_t * item) {
373445
assert(cbor_isa_bytestring(item));
374446
return ((struct _cbor_bytesting_metadata *)&item->data[METADATA_WIDTH])->length;
447+
}
448+
449+
unsigned char * cbor_bytestring_handle(cbor_item_t * item) {
450+
assert(cbor_isa_bytestring(item));
451+
return &item->data[METADATA_WIDTH + _CBOR_BYTESTRING_METADATA_WIDTH];
375452
}

src/cbor.h

+10-4
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ typedef enum {
4141
} cbor_int_width;
4242

4343
typedef struct cbor_item_t {
44-
cbor_type type;
45-
size_t refcount;
46-
char * data;
44+
cbor_type type;
45+
size_t refcount;
46+
unsigned char * data;
4747
} cbor_item_t;
4848

4949
struct cbor_error {
50-
size_t postion;
50+
size_t position;
5151
cbor_error_code code;
5252
};
5353

@@ -104,5 +104,11 @@ cbor_item_t * cbor_make_int32();
104104
cbor_item_t * cbor_make_int64();
105105

106106
size_t cbor_bytestring_length(cbor_item_t * item);
107+
unsigned char * cbor_bytestring_handle(cbor_item_t * item);
108+
bool cbor_bytestring_is_indefinite(cbor_item_t * item);
109+
/* has to be called at least one - to decref the chunk */
110+
cbor_item_t * cbor_bytestring_get_chunk(cbor_item_t * item);
111+
/* once you call this, previous chunk is lost (avoiding realloc)*/
112+
void cbor_bytestring_read_chunk(cbor_item_t * item, const unsigned char * source, size_t source_size, struct cbor_load_result * result);
107113

108114
#endif

src/cbor_internal.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,5 @@ void _cbor_handle_load_bytestring(const unsigned char * source,
114114
result->read += length;
115115
item->data = malloc(METADATA_WIDTH + _CBOR_BYTESTRING_METADATA_WIDTH + length);
116116
*(struct _cbor_bytesting_metadata *)&item->data[METADATA_WIDTH] = (struct _cbor_bytesting_metadata) { length };
117-
memcpy(item->data, source, length);
117+
memcpy(&item->data[METADATA_WIDTH + _CBOR_BYTESTRING_METADATA_WIDTH], source, length);
118118
}

test/type_2_test.c

+103-3
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,119 @@ cbor_item_t * bs;
1111
struct cbor_load_result res;
1212

1313
unsigned char data1[] = { 0x40, 0xFF };
14-
unsigned char data2[] = { 0x40, 0xA1 };
14+
unsigned char data2[] = { 0x41, 0xA1 };
15+
unsigned char data3[] = { 0x58, 0x01, 0xA1, 0xFF };
16+
unsigned char data4[] = { 0x58, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF};
17+
unsigned char data5[] = { 0x59, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF};
18+
unsigned char data6[] = { 0x5A, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF};
19+
unsigned char data7[] = { 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF};
20+
unsigned char data8[] = { 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF};
21+
1522

1623
static void test_empty_bs(void **state) {
17-
bs = cbor_load(data1, 1, 0, &res);
24+
bs = cbor_load(data1, 2, 0, &res);
1825
assert_non_null(bs);
1926
assert_true(cbor_typeof(bs) == CBOR_TYPE_BYTESTRING);
2027
assert_true(cbor_isa_bytestring(bs));
2128
assert_true(cbor_bytestring_length(bs) == 0);
29+
assert_true(res.read == 1);
30+
cbor_decref(&bs);
31+
assert_null(bs);
32+
}
33+
34+
35+
static void test_embedded_bs(void **state) {
36+
bs = cbor_load(data2, 2, 0, &res);
37+
assert_non_null(bs);
38+
assert_true(cbor_typeof(bs) == CBOR_TYPE_BYTESTRING);
39+
assert_true(cbor_isa_bytestring(bs));
40+
assert_true(cbor_bytestring_length(bs) == 1);
41+
assert_true(res.read == 2);
42+
assert_true(*cbor_bytestring_handle(bs) == 0xA1);
43+
assert_memory_equal(cbor_bytestring_handle(bs), data2 + 1, 1);
44+
cbor_decref(&bs);
45+
assert_null(bs);
46+
}
47+
48+
49+
static void test_notenough_data(void **state) {
50+
bs = cbor_load(data3, 2, 0, &res);
51+
assert_null(bs);
52+
assert_true(res.error.code == CBOR_ERR_NOTENOUGHDATA);
53+
}
54+
55+
static void test_short_bs1(void **state) {
56+
bs = cbor_load(data3, 4, 0, &res);
57+
assert_non_null(bs);
58+
assert_true(cbor_typeof(bs) == CBOR_TYPE_BYTESTRING);
59+
assert_true(cbor_isa_bytestring(bs));
60+
assert_true(cbor_bytestring_length(bs) == 1);
61+
assert_true(res.read == 3);
62+
assert_true(*cbor_bytestring_handle(bs) == 0xA1);
63+
assert_memory_equal(cbor_bytestring_handle(bs), data3 + 2, 1);
64+
cbor_decref(&bs);
65+
assert_null(bs);
66+
}
67+
68+
static void test_short_bs2(void **state) {
69+
bs = cbor_load(data4, 259, 0, &res);
70+
assert_non_null(bs);
71+
assert_true(cbor_typeof(bs) == CBOR_TYPE_BYTESTRING);
72+
assert_true(cbor_isa_bytestring(bs));
73+
assert_true(cbor_bytestring_length(bs) == 255);
74+
assert_true(res.read == 257);
75+
assert_memory_equal(cbor_bytestring_handle(bs), data4 + 2, 0xFF);
76+
cbor_decref(&bs);
77+
assert_null(bs);
78+
}
79+
80+
static void test_half_bs(void **state) {
81+
bs = cbor_load(data5, 259, 0, &res);
82+
assert_non_null(bs);
83+
assert_true(cbor_typeof(bs) == CBOR_TYPE_BYTESTRING);
84+
assert_true(cbor_isa_bytestring(bs));
85+
assert_true(cbor_bytestring_length(bs) == 255);
86+
assert_true(res.read == 258);
87+
assert_memory_equal(cbor_bytestring_handle(bs), data5 + 3, 0xFF);
88+
cbor_decref(&bs);
89+
assert_null(bs);
90+
}
91+
92+
static void test_int_bs(void **state) {
93+
bs = cbor_load(data6, 261, 0, &res);
94+
assert_non_null(bs);
95+
assert_true(cbor_typeof(bs) == CBOR_TYPE_BYTESTRING);
96+
assert_true(cbor_isa_bytestring(bs));
97+
assert_true(cbor_bytestring_length(bs) == 255);
98+
assert_true(res.read == 260);
99+
assert_memory_equal(cbor_bytestring_handle(bs), data6 + 5, 0xFF);
100+
cbor_decref(&bs);
101+
assert_null(bs);
22102
}
23103

104+
static void test_long_bs(void **state) {
105+
bs = cbor_load(data7, 265, 0, &res);
106+
assert_non_null(bs);
107+
assert_true(cbor_typeof(bs) == CBOR_TYPE_BYTESTRING);
108+
assert_true(cbor_isa_bytestring(bs));
109+
assert_true(cbor_bytestring_length(bs) == 255);
110+
assert_true(res.read == 264);
111+
assert_memory_equal(cbor_bytestring_handle(bs), data7 + 9, 0xFF);
112+
cbor_decref(&bs);
113+
assert_null(bs);
114+
}
115+
116+
24117
int main(void) {
25118
const UnitTest tests[] = {
26-
unit_test(test_empty_bs)
119+
unit_test(test_empty_bs),
120+
unit_test(test_embedded_bs),
121+
unit_test(test_notenough_data),
122+
unit_test(test_short_bs1),
123+
unit_test(test_short_bs2),
124+
unit_test(test_half_bs),
125+
unit_test(test_int_bs),
126+
unit_test(test_long_bs)
27127
};
28128
return run_tests(tests);
29129
}

0 commit comments

Comments
 (0)