From 85b5e1088f74abdee01798be286e2ed953e1124b Mon Sep 17 00:00:00 2001 From: Nobuyuki Kubota Date: Sat, 17 Aug 2013 17:24:50 +0900 Subject: [PATCH] str 8 and bin 8/16/32 support in deserializer --- test/msgpackc_test.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++ unpack_define.h | 30 ++++++++-------- unpack_template.h | 19 ++++++---- 3 files changed, 109 insertions(+), 20 deletions(-) diff --git a/test/msgpackc_test.cpp b/test/msgpackc_test.cpp index f5646ea7..4b719398 100644 --- a/test/msgpackc_test.cpp +++ b/test/msgpackc_test.cpp @@ -422,3 +422,83 @@ TEST(MSGPACKC, simple_buffer_raw) msgpack_zone_destroy(&z); msgpack_sbuffer_destroy(&sbuf); } + +TEST(MSGPACKC, unpack_str8) +{ + size_t raw_size = 7; + const char buf[] = { + 0xd9, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i' + }; + + msgpack_zone z; + msgpack_zone_init(&z, 2048); + msgpack_object obj; + msgpack_unpack_return ret; + ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj); + EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); + EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type); + EXPECT_EQ(raw_size, obj.via.raw.size); + EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size)); + + msgpack_zone_destroy(&z); +} + +TEST(MSGPACKC, unpack_bin8) +{ + size_t raw_size = 7; + const char buf[] = { + 0xc4, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i' + }; + + msgpack_zone z; + msgpack_zone_init(&z, 2048); + msgpack_object obj; + msgpack_unpack_return ret; + ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj); + EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); + EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type); + EXPECT_EQ(raw_size, obj.via.raw.size); + EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size)); + + msgpack_zone_destroy(&z); +} + +TEST(MSGPACKC, unpack_bin16) +{ + size_t raw_size = 7; + const char buf[] = { + 0xc5, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i' + }; + + msgpack_zone z; + msgpack_zone_init(&z, 2048); + msgpack_object obj; + msgpack_unpack_return ret; + ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj); + EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); + EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type); + EXPECT_EQ(raw_size, obj.via.raw.size); + EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size)); + + msgpack_zone_destroy(&z); +} + +TEST(MSGPACKC, unpack_bin32) +{ + size_t raw_size = 7; + const char buf[] = { + 0xc6, 0, 0, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i' + }; + + msgpack_zone z; + msgpack_zone_init(&z, 2048); + msgpack_object obj; + msgpack_unpack_return ret; + ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj); + EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); + EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type); + EXPECT_EQ(raw_size, obj.via.raw.size); + EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size)); + + msgpack_zone_destroy(&z); +} diff --git a/unpack_define.h b/unpack_define.h index 959d3519..c6ecb90d 100644 --- a/unpack_define.h +++ b/unpack_define.h @@ -41,13 +41,14 @@ typedef enum { //CS_ = 0x02, // false //CS_ = 0x03, // true - //CS_ = 0x04, - //CS_ = 0x05, - //CS_ = 0x06, - //CS_ = 0x07, + CS_BIN_8 = 0x04, + CS_BIN_16 = 0x05, + CS_BIN_32 = 0x06, + + //CS_EXT_8 = 0x07, + //CS_EXT_16 = 0x08, + //CS_EXT_32 = 0x09, - //CS_ = 0x08, - //CS_ = 0x09, CS_FLOAT = 0x0a, CS_DOUBLE = 0x0b, CS_UINT_8 = 0x0c, @@ -59,14 +60,15 @@ typedef enum { CS_INT_32 = 0x12, CS_INT_64 = 0x13, - //CS_ = 0x14, - //CS_ = 0x15, - //CS_BIG_INT_16 = 0x16, - //CS_BIG_INT_32 = 0x17, - //CS_BIG_FLOAT_16 = 0x18, - //CS_BIG_FLOAT_32 = 0x19, - CS_RAW_16 = 0x1a, - CS_RAW_32 = 0x1b, + //CS_FIXEXT_1 = 0x14, + //CS_FIXEXT_2 = 0x15, + //CS_FIXEXT_4 = 0x16, + //CS_FIXEXT_8 = 0x17, + //CS_FIXEXT_16 = 0x18, + + CS_RAW_8 = 0x19, // str8 + CS_RAW_16 = 0x1a, // str16 + CS_RAW_32 = 0x1b, // str32 CS_ARRAY_16 = 0x1c, CS_ARRAY_32 = 0x1d, CS_MAP_16 = 0x1e, diff --git a/unpack_template.h b/unpack_template.h index 711b163a..84ba7151 100644 --- a/unpack_template.h +++ b/unpack_template.h @@ -201,9 +201,10 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c push_simple_value(_false); case 0xc3: // true push_simple_value(_true); - //case 0xc4: - //case 0xc5: - //case 0xc6: + case 0xc4: // bin 8 + case 0xc5: // bin 16 + case 0xc6: // bin 32 + again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03)); //case 0xc7: //case 0xc8: //case 0xc9: @@ -223,9 +224,10 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c //case 0xd6: // big integer 16 //case 0xd7: // big integer 32 //case 0xd8: // big float 16 - //case 0xd9: // big float 32 - case 0xda: // raw 16 - case 0xdb: // raw 32 + case 0xd9: // raw 8 (str 9) + case 0xda: // raw 16 (str 16) + case 0xdb: // raw 32 (str 32) + again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) & 0x03) - 1)); case 0xdc: // array 16 case 0xdd: // array 32 case 0xde: // map 16 @@ -306,8 +308,13 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c // // FIXME // push_variable_value(_big_float, data, n, trail); + case CS_BIN_8: + case CS_RAW_8: + again_fixed_trail_if_zero(ACS_RAW_VALUE, *(uint8_t*)n, _raw_zero); + case CS_BIN_16: case CS_RAW_16: again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load16(uint16_t,n), _raw_zero); + case CS_BIN_32: case CS_RAW_32: again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load32(uint32_t,n), _raw_zero); case ACS_RAW_VALUE: