Skip to content

Commit 85b5e10

Browse files
committed
str 8 and bin 8/16/32 support in deserializer
1 parent 44fff52 commit 85b5e10

File tree

3 files changed

+109
-20
lines changed

3 files changed

+109
-20
lines changed

test/msgpackc_test.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,3 +422,83 @@ TEST(MSGPACKC, simple_buffer_raw)
422422
msgpack_zone_destroy(&z);
423423
msgpack_sbuffer_destroy(&sbuf);
424424
}
425+
426+
TEST(MSGPACKC, unpack_str8)
427+
{
428+
size_t raw_size = 7;
429+
const char buf[] = {
430+
0xd9, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
431+
};
432+
433+
msgpack_zone z;
434+
msgpack_zone_init(&z, 2048);
435+
msgpack_object obj;
436+
msgpack_unpack_return ret;
437+
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
438+
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
439+
EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type);
440+
EXPECT_EQ(raw_size, obj.via.raw.size);
441+
EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size));
442+
443+
msgpack_zone_destroy(&z);
444+
}
445+
446+
TEST(MSGPACKC, unpack_bin8)
447+
{
448+
size_t raw_size = 7;
449+
const char buf[] = {
450+
0xc4, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
451+
};
452+
453+
msgpack_zone z;
454+
msgpack_zone_init(&z, 2048);
455+
msgpack_object obj;
456+
msgpack_unpack_return ret;
457+
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
458+
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
459+
EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type);
460+
EXPECT_EQ(raw_size, obj.via.raw.size);
461+
EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size));
462+
463+
msgpack_zone_destroy(&z);
464+
}
465+
466+
TEST(MSGPACKC, unpack_bin16)
467+
{
468+
size_t raw_size = 7;
469+
const char buf[] = {
470+
0xc5, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
471+
};
472+
473+
msgpack_zone z;
474+
msgpack_zone_init(&z, 2048);
475+
msgpack_object obj;
476+
msgpack_unpack_return ret;
477+
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
478+
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
479+
EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type);
480+
EXPECT_EQ(raw_size, obj.via.raw.size);
481+
EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size));
482+
483+
msgpack_zone_destroy(&z);
484+
}
485+
486+
TEST(MSGPACKC, unpack_bin32)
487+
{
488+
size_t raw_size = 7;
489+
const char buf[] = {
490+
0xc6, 0, 0, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
491+
};
492+
493+
msgpack_zone z;
494+
msgpack_zone_init(&z, 2048);
495+
msgpack_object obj;
496+
msgpack_unpack_return ret;
497+
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
498+
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
499+
EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type);
500+
EXPECT_EQ(raw_size, obj.via.raw.size);
501+
EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size));
502+
503+
msgpack_zone_destroy(&z);
504+
}

unpack_define.h

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,14 @@ typedef enum {
4141
//CS_ = 0x02, // false
4242
//CS_ = 0x03, // true
4343

44-
//CS_ = 0x04,
45-
//CS_ = 0x05,
46-
//CS_ = 0x06,
47-
//CS_ = 0x07,
44+
CS_BIN_8 = 0x04,
45+
CS_BIN_16 = 0x05,
46+
CS_BIN_32 = 0x06,
47+
48+
//CS_EXT_8 = 0x07,
49+
//CS_EXT_16 = 0x08,
50+
//CS_EXT_32 = 0x09,
4851

49-
//CS_ = 0x08,
50-
//CS_ = 0x09,
5152
CS_FLOAT = 0x0a,
5253
CS_DOUBLE = 0x0b,
5354
CS_UINT_8 = 0x0c,
@@ -59,14 +60,15 @@ typedef enum {
5960
CS_INT_32 = 0x12,
6061
CS_INT_64 = 0x13,
6162

62-
//CS_ = 0x14,
63-
//CS_ = 0x15,
64-
//CS_BIG_INT_16 = 0x16,
65-
//CS_BIG_INT_32 = 0x17,
66-
//CS_BIG_FLOAT_16 = 0x18,
67-
//CS_BIG_FLOAT_32 = 0x19,
68-
CS_RAW_16 = 0x1a,
69-
CS_RAW_32 = 0x1b,
63+
//CS_FIXEXT_1 = 0x14,
64+
//CS_FIXEXT_2 = 0x15,
65+
//CS_FIXEXT_4 = 0x16,
66+
//CS_FIXEXT_8 = 0x17,
67+
//CS_FIXEXT_16 = 0x18,
68+
69+
CS_RAW_8 = 0x19, // str8
70+
CS_RAW_16 = 0x1a, // str16
71+
CS_RAW_32 = 0x1b, // str32
7072
CS_ARRAY_16 = 0x1c,
7173
CS_ARRAY_32 = 0x1d,
7274
CS_MAP_16 = 0x1e,

unpack_template.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,10 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c
201201
push_simple_value(_false);
202202
case 0xc3: // true
203203
push_simple_value(_true);
204-
//case 0xc4:
205-
//case 0xc5:
206-
//case 0xc6:
204+
case 0xc4: // bin 8
205+
case 0xc5: // bin 16
206+
case 0xc6: // bin 32
207+
again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03));
207208
//case 0xc7:
208209
//case 0xc8:
209210
//case 0xc9:
@@ -223,9 +224,10 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c
223224
//case 0xd6: // big integer 16
224225
//case 0xd7: // big integer 32
225226
//case 0xd8: // big float 16
226-
//case 0xd9: // big float 32
227-
case 0xda: // raw 16
228-
case 0xdb: // raw 32
227+
case 0xd9: // raw 8 (str 9)
228+
case 0xda: // raw 16 (str 16)
229+
case 0xdb: // raw 32 (str 32)
230+
again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) & 0x03) - 1));
229231
case 0xdc: // array 16
230232
case 0xdd: // array 32
231233
case 0xde: // map 16
@@ -306,8 +308,13 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c
306308
// // FIXME
307309
// push_variable_value(_big_float, data, n, trail);
308310

311+
case CS_BIN_8:
312+
case CS_RAW_8:
313+
again_fixed_trail_if_zero(ACS_RAW_VALUE, *(uint8_t*)n, _raw_zero);
314+
case CS_BIN_16:
309315
case CS_RAW_16:
310316
again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load16(uint16_t,n), _raw_zero);
317+
case CS_BIN_32:
311318
case CS_RAW_32:
312319
again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load32(uint32_t,n), _raw_zero);
313320
case ACS_RAW_VALUE:

0 commit comments

Comments
 (0)