Skip to content

Commit 1505b1b

Browse files
committed
Handle blank strings and binary data
Update example1 to use the proper formatting character for uint32_t
1 parent 2e10c8b commit 1505b1b

3 files changed

Lines changed: 156 additions & 26 deletions

File tree

cmp.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#include "cmp.h"
66

7-
static const uint32_t version = 3;
7+
static const uint32_t version = 4;
88
static const uint32_t mp_version = 5;
99

1010
enum {
@@ -433,6 +433,9 @@ bool cmp_write_fixstr(cmp_ctx_t *ctx, const char *data, uint8_t size) {
433433
if (!cmp_write_fixstr_marker(ctx, size))
434434
return false;
435435

436+
if (size == 0)
437+
return true;
438+
436439
if (ctx->write(ctx, data, size))
437440
return true;
438441

@@ -455,6 +458,9 @@ bool cmp_write_str8(cmp_ctx_t *ctx, const char *data, uint8_t size) {
455458
if (!cmp_write_str8_marker(ctx, size))
456459
return false;
457460

461+
if (size == 0)
462+
return true;
463+
458464
if (ctx->write(ctx, data, size))
459465
return true;
460466

@@ -479,6 +485,9 @@ bool cmp_write_str16(cmp_ctx_t *ctx, const char *data, uint16_t size) {
479485
if (!cmp_write_str16_marker(ctx, size))
480486
return false;
481487

488+
if (size == 0)
489+
return true;
490+
482491
if (ctx->write(ctx, data, size))
483492
return true;
484493

@@ -503,6 +512,9 @@ bool cmp_write_str32(cmp_ctx_t *ctx, const char *data, uint32_t size) {
503512
if (!cmp_write_str32_marker(ctx, size))
504513
return false;
505514

515+
if (size == 0)
516+
return true;
517+
506518
if (ctx->write(ctx, data, size))
507519
return true;
508520

@@ -547,6 +559,9 @@ bool cmp_write_bin8(cmp_ctx_t *ctx, const void *data, uint8_t size) {
547559
if (!cmp_write_bin8_marker(ctx, size))
548560
return false;
549561

562+
if (size == 0)
563+
return true;
564+
550565
if (ctx->write(ctx, data, size))
551566
return true;
552567

@@ -571,6 +586,9 @@ bool cmp_write_bin16(cmp_ctx_t *ctx, const void *data, uint16_t size) {
571586
if (!cmp_write_bin16_marker(ctx, size))
572587
return false;
573588

589+
if (size == 0)
590+
return true;
591+
574592
if (ctx->write(ctx, data, size))
575593
return true;
576594

@@ -595,6 +613,9 @@ bool cmp_write_bin32(cmp_ctx_t *ctx, const void *data, uint32_t size) {
595613
if (!cmp_write_bin32_marker(ctx, size))
596614
return false;
597615

616+
if (size == 0)
617+
return true;
618+
598619
if (ctx->write(ctx, data, size))
599620
return true;
600621

examples/example1.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ int main(void) {
7171
if (!cmp_read_str(&cmp, message_pack, &str_size))
7272
error_and_exit(cmp_strerror(&cmp));
7373

74-
printf("Array Length: %zu.\n", array_size);
74+
printf("Array Length: %u.\n", array_size);
7575
printf("[\"%s\", \"%s\"]\n", hello, message_pack);
7676

7777
fclose(fh);

test/test.c

Lines changed: 133 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -386,70 +386,112 @@ static void error_printbin(const char *data, size_t size) {
386386
static void error_print_object(cmp_object_t *obj) {
387387
switch (obj->type) {
388388
case CMP_TYPE_POSITIVE_FIXNUM:
389-
case CMP_TYPE_UINT8:
390-
error_printf("%u", obj->as.u8);
389+
error_printf("positive fixint: %u", obj->as.u8);
390+
break;
391+
case CMP_TYPE_NEGATIVE_FIXNUM:
392+
error_printf("negative fixnum: %d", obj->as.s8);
391393
break;
392394
case CMP_TYPE_FIXMAP:
395+
error_printf("fixmap: %u", obj->as.bin_size);
396+
break;
393397
case CMP_TYPE_MAP16:
398+
error_printf("map16: %u", obj->as.bin_size);
399+
break;
394400
case CMP_TYPE_MAP32:
401+
error_printf("map32: %u", obj->as.bin_size);
402+
break;
395403
case CMP_TYPE_FIXARRAY:
404+
error_printf("fixarray: %u", obj->as.bin_size);
405+
break;
396406
case CMP_TYPE_ARRAY16:
407+
error_printf("array16: %u", obj->as.bin_size);
408+
break;
397409
case CMP_TYPE_ARRAY32:
410+
error_printf("array32: %u", obj->as.bin_size);
411+
break;
398412
case CMP_TYPE_FIXSTR:
413+
error_printf("fixstr: %u", obj->as.bin_size);
414+
break;
399415
case CMP_TYPE_STR8:
416+
error_printf("str8: %u", obj->as.bin_size);
417+
break;
400418
case CMP_TYPE_STR16:
419+
error_printf("str16: %u", obj->as.bin_size);
420+
break;
401421
case CMP_TYPE_STR32:
422+
error_printf("str32: %u", obj->as.bin_size);
423+
break;
402424
case CMP_TYPE_BIN8:
425+
error_printf("bin8: %u", obj->as.bin_size);
426+
break;
403427
case CMP_TYPE_BIN16:
428+
error_printf("bin16: %u", obj->as.bin_size);
429+
break;
404430
case CMP_TYPE_BIN32:
405-
error_printf("%u", obj->as.bin_size);
431+
error_printf("bin32: %u", obj->as.bin_size);
406432
break;
407433
case CMP_TYPE_NIL:
408434
error_printf("NULL");
409435
break;
410436
case CMP_TYPE_BOOLEAN:
411437
if (obj->as.boolean)
412-
error_printf("true");
438+
error_printf("bool: true");
413439
else
414-
error_printf("false");
440+
error_printf("bool: false");
415441
break;
416442
case CMP_TYPE_EXT8:
443+
error_printf("ext8: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
444+
break;
417445
case CMP_TYPE_EXT16:
446+
error_printf("ext16: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
447+
break;
418448
case CMP_TYPE_EXT32:
449+
error_printf("ext32: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
450+
break;
419451
case CMP_TYPE_FIXEXT1:
452+
error_printf("fixext1: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
453+
break;
420454
case CMP_TYPE_FIXEXT2:
455+
error_printf("fixext2: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
456+
break;
421457
case CMP_TYPE_FIXEXT4:
458+
error_printf("fixext4: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
459+
break;
422460
case CMP_TYPE_FIXEXT8:
461+
error_printf("fixext8: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
462+
break;
423463
case CMP_TYPE_FIXEXT16:
424-
error_printf("{%d, %u}", obj->as.ext.type, obj->as.ext.size);
464+
error_printf("fixext16: {%d, %u}", obj->as.ext.type, obj->as.ext.size);
425465
break;
426466
case CMP_TYPE_FLOAT:
427-
error_printf("%f", obj->as.flt);
467+
error_printf("float: %f", obj->as.flt);
428468
break;
429469
case CMP_TYPE_DOUBLE:
430-
error_printf("%f", obj->as.dbl);
470+
error_printf("double: %f", obj->as.dbl);
471+
break;
472+
case CMP_TYPE_UINT8:
473+
error_printf("uint8: %u", obj->as.u8);
431474
break;
432475
case CMP_TYPE_UINT16:
433-
error_printf("%u", obj->as.u16);
476+
error_printf("uint16: %u", obj->as.u16);
434477
break;
435478
case CMP_TYPE_UINT32:
436-
error_printf("%u", obj->as.u32);
479+
error_printf("uint32: %u", obj->as.u32);
437480
break;
438481
case CMP_TYPE_UINT64:
439-
error_printf("%" PRIu64, obj->as.u64);
482+
error_printf("uint64: %" PRIu64, obj->as.u64);
440483
break;
441-
case CMP_TYPE_NEGATIVE_FIXNUM:
442484
case CMP_TYPE_SINT8:
443-
error_printf("%d", obj->as.s8);
485+
error_printf("int8: %d", obj->as.s8);
444486
break;
445487
case CMP_TYPE_SINT16:
446-
error_printf("%d", obj->as.s16);
488+
error_printf("int16: %d", obj->as.s16);
447489
break;
448490
case CMP_TYPE_SINT32:
449-
error_printf("%d", obj->as.s32);
491+
error_printf("int32: %d", obj->as.s32);
450492
break;
451493
case CMP_TYPE_SINT64:
452-
error_printf("%" PRId64, obj->as.s64);
494+
error_printf("int64: %" PRId64, obj->as.s64);
453495
break;
454496
}
455497
}
@@ -1203,15 +1245,27 @@ bool run_binary_tests(void) {
12031245

12041246
setup_cmp_and_buf(&cmp, &buf);
12051247

1248+
test_format_with_length(
1249+
cmp_write_bin8, cmp_read_bin, bin_size, "", 0, "\xc4\x00", 2
1250+
);
12061251
test_format_with_length(
12071252
cmp_write_bin8, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc4\x0aHey there\n", 12
12081253
);
1254+
test_format_with_length(
1255+
cmp_write_bin16, cmp_read_bin, bin_size, "", 0, "\xc5\x00\x00", 3
1256+
);
12091257
test_format_with_length(
12101258
cmp_write_bin16, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc5\x00\x0aHey there\n", 13
12111259
);
1260+
test_format_with_length(
1261+
cmp_write_bin32, cmp_read_bin, bin_size, "", 0, "\xc6\x00\x00\x00\x00", 5
1262+
);
12121263
test_format_with_length(
12131264
cmp_write_bin32, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc6\x00\x00\x00\x0aHey there\n", 15
12141265
);
1266+
test_format_with_length(
1267+
cmp_write_bin, cmp_read_bin, bin_size, "", 0, "\xc4\x00", 2
1268+
);
12151269
test_format_with_length(
12161270
cmp_write_bin, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc4\x0aHey there\n", 12
12171271
);
@@ -1226,18 +1280,33 @@ bool run_string_tests(void) {
12261280

12271281
setup_cmp_and_buf(&cmp, &buf);
12281282

1283+
test_format_with_length(
1284+
cmp_write_fixstr, cmp_read_str, str_size, "", 0, "\xa0", 1
1285+
);
12291286
test_format_with_length(
12301287
cmp_write_fixstr, cmp_read_str, str_size, "Hey there\n", 10, "\xaaHey there\n", 11
12311288
);
1289+
test_format_with_length(
1290+
cmp_write_str8, cmp_read_str, str_size, "", 0, "\xd9\x00", 2
1291+
);
12321292
test_format_with_length(
12331293
cmp_write_str8, cmp_read_str, str_size, "Hey there\n", 10, "\xd9\x0aHey there\n", 12
12341294
);
1295+
test_format_with_length(
1296+
cmp_write_str16, cmp_read_str, str_size, "", 0, "\xda\x00\x00", 3
1297+
);
12351298
test_format_with_length(
12361299
cmp_write_str16, cmp_read_str, str_size, "Hey there\n", 10, "\xda\x00\x0aHey there\n", 13
12371300
);
1301+
test_format_with_length(
1302+
cmp_write_str32, cmp_read_str, str_size, "", 0, "\xdb\x00\x00\x00\x00", 5
1303+
);
12381304
test_format_with_length(
12391305
cmp_write_str32, cmp_read_str, str_size, "Hey there\n", 10, "\xdb\x00\x00\x00\x0aHey there\n", 15
12401306
);
1307+
test_format_with_length(
1308+
cmp_write_str, cmp_read_str, str_size, "", 0, "\xa0", 1
1309+
);
12411310
test_format_with_length(
12421311
cmp_write_str, cmp_read_str, str_size, "Hey there\n", 10, "\xaaHey there\n", 11
12431312
);
@@ -1252,10 +1321,30 @@ bool run_array_tests(void) {
12521321

12531322
setup_cmp_and_buf(&cmp, &buf);
12541323

1255-
test_format(cmp_write_fixarray, cmp_read_array, array_size, uint32_t, 10, "\x9a", 1);
1256-
test_format(cmp_write_array16, cmp_read_array, array_size, uint32_t, 10, "\xdc\x00\x0a", 3);
1257-
test_format(cmp_write_array32, cmp_read_array, array_size, uint32_t, 10, "\xdd\x00\x00\x00\x0a", 5);
1258-
test_format(cmp_write_array, cmp_read_array, array_size, uint32_t, 10, "\x9a", 1);
1324+
test_format(
1325+
cmp_write_fixarray, cmp_read_array, array_size, uint32_t, 0, "\x90", 1
1326+
);
1327+
test_format(
1328+
cmp_write_fixarray, cmp_read_array, array_size, uint32_t, 10, "\x9a", 1
1329+
);
1330+
test_format(
1331+
cmp_write_array16, cmp_read_array, array_size, uint32_t, 0, "\xdc\x00\x00", 3
1332+
);
1333+
test_format(
1334+
cmp_write_array16, cmp_read_array, array_size, uint32_t, 10, "\xdc\x00\x0a", 3
1335+
);
1336+
test_format(
1337+
cmp_write_array32, cmp_read_array, array_size, uint32_t, 0, "\xdd\x00\x00\x00\x00", 5
1338+
);
1339+
test_format(
1340+
cmp_write_array32, cmp_read_array, array_size, uint32_t, 10, "\xdd\x00\x00\x00\x0a", 5
1341+
);
1342+
test_format(
1343+
cmp_write_array, cmp_read_array, array_size, uint32_t, 0, "\x90", 1
1344+
);
1345+
test_format(
1346+
cmp_write_array, cmp_read_array, array_size, uint32_t, 10, "\x9a", 1
1347+
);
12591348

12601349
return true;
12611350
}
@@ -1267,10 +1356,30 @@ bool run_map_tests(void) {
12671356

12681357
setup_cmp_and_buf(&cmp, &buf);
12691358

1270-
test_format(cmp_write_fixmap, cmp_read_map, map_size, uint32_t, 10, "\x8a", 1);
1271-
test_format(cmp_write_map16, cmp_read_map, map_size, uint32_t, 10, "\xde\x00\x0a", 3);
1272-
test_format(cmp_write_map32, cmp_read_map, map_size, uint32_t, 10, "\xdf\x00\x00\x00\x0a", 5);
1273-
test_format(cmp_write_map, cmp_read_map, map_size, uint32_t, 10, "\x8a", 1);
1359+
test_format(
1360+
cmp_write_fixmap, cmp_read_map, map_size, uint32_t, 0, "\x80", 1
1361+
);
1362+
test_format(
1363+
cmp_write_fixmap, cmp_read_map, map_size, uint32_t, 10, "\x8a", 1
1364+
);
1365+
test_format(
1366+
cmp_write_map16, cmp_read_map, map_size, uint32_t, 0, "\xde\x00\x00", 3
1367+
);
1368+
test_format(
1369+
cmp_write_map16, cmp_read_map, map_size, uint32_t, 10, "\xde\x00\x0a", 3
1370+
);
1371+
test_format(
1372+
cmp_write_map32, cmp_read_map, map_size, uint32_t, 0, "\xdf\x00\x00\x00\x00", 5
1373+
);
1374+
test_format(
1375+
cmp_write_map32, cmp_read_map, map_size, uint32_t, 10, "\xdf\x00\x00\x00\x0a", 5
1376+
);
1377+
test_format(
1378+
cmp_write_map, cmp_read_map, map_size, uint32_t, 0, "\x80", 1
1379+
);
1380+
test_format(
1381+
cmp_write_map, cmp_read_map, map_size, uint32_t, 10, "\x8a", 1
1382+
);
12741383

12751384
return true;
12761385
}

0 commit comments

Comments
 (0)