11#ifndef msgpack_unpack_func
12#error msgpack_unpack_func template is not defined
15#ifndef msgpack_unpack_callback
16#error msgpack_unpack_callback template is not defined
19#ifndef msgpack_unpack_struct
20#error msgpack_unpack_struct template is not defined
23#ifndef msgpack_unpack_struct_decl
24#define msgpack_unpack_struct_decl(name) msgpack_unpack_struct(name)
27#ifndef msgpack_unpack_object
28#error msgpack_unpack_object type is not defined
31#ifndef msgpack_unpack_user
32#error msgpack_unpack_user type is not defined
41#if defined(_KERNEL_MODE)
43#define assert NT_ASSERT
47 msgpack_unpack_object
obj;
50 msgpack_unpack_object map_key;
54 msgpack_unpack_user
user;
76 ctx->stack[0].obj = msgpack_unpack_callback(_root)(&ctx->user);
90 return (ctx)->stack[0].obj;
98 const unsigned char*
p = (
unsigned char*)
data + *
off;
99 const unsigned char*
const pe = (
unsigned char*)
data +
len;
100 const void*
n = NULL;
103 unsigned int cs = ctx->cs;
104 unsigned int top = ctx->top;
109 msgpack_unpack_user*
user = &ctx->user;
111 msgpack_unpack_object
obj;
116#define push_simple_value(func) \
117 ret = msgpack_unpack_callback(func)(user, &obj); \
118 if(ret < 0) { goto _failed; } \
120#define push_fixed_value(func, arg) \
121 ret = msgpack_unpack_callback(func)(user, arg, &obj); \
122 if(ret < 0) { goto _failed; } \
124#define push_variable_value(func, base, pos, len) \
125 ret = msgpack_unpack_callback(func)(user, \
126 (const char*)base, (const char*)pos, len, &obj); \
127 if(ret < 0) { goto _failed; } \
130#define again_fixed_trail(_cs, trail_len) \
133 goto _fixed_trail_again
134#define again_fixed_trail_if_zero(_cs, trail_len, ifzero) \
136 if(trail == 0) { goto ifzero; } \
138 goto _fixed_trail_again
140#define start_container(func, count_, ct_) \
141 if(top >= MSGPACK_EMBED_STACK_SIZE) { \
142 ret = MSGPACK_UNPACK_NOMEM_ERROR; \
145 ret = msgpack_unpack_callback(func)(user, count_, &stack[top].obj); \
146 if(ret < 0) { goto _failed; } \
147 if((count_) == 0) { obj = stack[top].obj; goto _push; } \
148 stack[top].ct = ct_; \
149 stack[top].count = count_; \
154 ((unsigned int)*p & 0x1f)
157#define SWITCH_RANGE_BEGIN switch(*p) {
158#define SWITCH_RANGE(FROM, TO) case FROM ... TO:
159#define SWITCH_RANGE_DEFAULT default:
160#define SWITCH_RANGE_END }
162#define SWITCH_RANGE_BEGIN { if(0) {
163#define SWITCH_RANGE(FROM, TO) } else if(FROM <= *p && *p <= TO) {
164#define SWITCH_RANGE_DEFAULT } else {
165#define SWITCH_RANGE_END } }
211 (1 << (((
unsigned int)*
p) & 0x03)) + 1, _ext_zero);
253 union { uint32_t i;
float f; } mem;
254 _msgpack_load32(uint32_t,
n, &mem.i);
257 union { uint64_t i;
double f; } mem;
258 _msgpack_load64(uint64_t,
n, &mem.i);
259#if defined(TARGET_OS_IPHONE)
261#elif defined(__arm__) && !(__ARM_EABI__)
263 mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
270 _msgpack_load16(uint16_t,
n,&tmp);
275 _msgpack_load32(uint32_t,
n,&tmp);
280 _msgpack_load64(uint64_t,
n,&tmp);
287 _msgpack_load16(int16_t,
n,&tmp);
292 _msgpack_load32(int32_t,
n,&tmp);
297 _msgpack_load64(int64_t,
n,&tmp);
318 _msgpack_load16(uint16_t,
n,&tmp);
323 _msgpack_load16(uint16_t,
n,&tmp);
328 _msgpack_load16(uint16_t,
n,&tmp);
333 _msgpack_load32(uint32_t,
n,&tmp);
338 _msgpack_load32(uint32_t,
n,&tmp);
343 _msgpack_load32(uint32_t,
n,&tmp);
358 _msgpack_load16(uint16_t,
n,&tmp);
364 _msgpack_load32(uint32_t,
n,&tmp);
370 _msgpack_load16(uint16_t,
n,&tmp);
376 _msgpack_load32(uint32_t,
n,&tmp);
387 if(
top == 0) {
goto _finish; }
391 ret = msgpack_unpack_callback(_array_item)(
user, &c->obj,
obj); \
392 if(
ret < 0) {
goto _failed; }
393 if(--c->count == 0) {
405 ret = msgpack_unpack_callback(_map_item)(
user, &c->obj, c->map_key,
obj); \
406 if(
ret < 0) {
goto _failed; }
407 if(--c->count == 0) {
447 *
off = (size_t)(
p - (
const unsigned char*)
data);
453#undef msgpack_unpack_func
454#undef msgpack_unpack_callback
455#undef msgpack_unpack_struct
456#undef msgpack_unpack_object
457#undef msgpack_unpack_user
459#undef push_simple_value
460#undef push_fixed_value
461#undef push_variable_value
462#undef again_fixed_trail
463#undef again_fixed_trail_if_zero
464#undef start_container
468#undef SWITCH_RANGE_BEGIN
470#undef SWITCH_RANGE_DEFAULT
471#undef SWITCH_RANGE_END
@ MSGPACK_UNPACK_PARSE_ERROR
Definition unpack.h:37
@ MSGPACK_CT_ARRAY_ITEM
Definition unpack_define.h:78
@ MSGPACK_CT_MAP_VALUE
Definition unpack_define.h:80
@ MSGPACK_CT_MAP_KEY
Definition unpack_define.h:79
#define MSGPACK_EMBED_STACK_SIZE
Definition unpack_define.h:25
@ MSGPACK_CS_EXT_32
Definition unpack_define.h:42
@ MSGPACK_CS_EXT_16
Definition unpack_define.h:41
@ MSGPACK_CS_STR_8
Definition unpack_define.h:61
@ MSGPACK_CS_STR_32
Definition unpack_define.h:63
@ MSGPACK_CS_DOUBLE
Definition unpack_define.h:45
@ MSGPACK_CS_FIXEXT_4
Definition unpack_define.h:57
@ MSGPACK_CS_UINT_32
Definition unpack_define.h:48
@ MSGPACK_CS_MAP_16
Definition unpack_define.h:66
@ MSGPACK_CS_BIN_32
Definition unpack_define.h:38
@ MSGPACK_CS_BIN_16
Definition unpack_define.h:37
@ MSGPACK_CS_UINT_64
Definition unpack_define.h:49
@ MSGPACK_CS_FLOAT
Definition unpack_define.h:44
@ MSGPACK_CS_ARRAY_32
Definition unpack_define.h:65
@ MSGPACK_CS_FIXEXT_1
Definition unpack_define.h:55
@ MSGPACK_CS_INT_8
Definition unpack_define.h:50
@ MSGPACK_CS_INT_32
Definition unpack_define.h:52
@ MSGPACK_ACS_BIN_VALUE
Definition unpack_define.h:72
@ MSGPACK_CS_ARRAY_16
Definition unpack_define.h:64
@ MSGPACK_CS_FIXEXT_16
Definition unpack_define.h:59
@ MSGPACK_CS_STR_16
Definition unpack_define.h:62
@ MSGPACK_ACS_STR_VALUE
Definition unpack_define.h:71
@ MSGPACK_CS_BIN_8
Definition unpack_define.h:36
@ MSGPACK_CS_INT_64
Definition unpack_define.h:53
@ MSGPACK_CS_FIXEXT_2
Definition unpack_define.h:56
@ MSGPACK_CS_HEADER
Definition unpack_define.h:30
@ MSGPACK_CS_FIXEXT_8
Definition unpack_define.h:58
@ MSGPACK_CS_MAP_32
Definition unpack_define.h:67
@ MSGPACK_ACS_EXT_VALUE
Definition unpack_define.h:73
@ MSGPACK_CS_EXT_8
Definition unpack_define.h:40
@ MSGPACK_CS_INT_16
Definition unpack_define.h:51
@ MSGPACK_CS_UINT_16
Definition unpack_define.h:47
@ MSGPACK_CS_UINT_8
Definition unpack_define.h:46
#define push_variable_value(func, base, pos, len)
Definition unpack_template.h:124
#define NEXT_CS(p)
Definition unpack_template.h:153
unsigned int top
Definition unpack_template.h:104
const void * n
Definition unpack_template.h:100
msgpack_unpack_struct(_stack) *stack
goto _out
Definition unpack_template.h:425
#define start_container(func, count_, ct_)
Definition unpack_template.h:140
int ret
Definition unpack_template.h:114
#define push_fixed_value(func, arg)
Definition unpack_template.h:120
unsigned int cs
Definition unpack_template.h:103
const char size_t size_t * off
Definition unpack_template.h:95
#define SWITCH_RANGE_DEFAULT
Definition unpack_template.h:159
#define SWITCH_RANGE(FROM, TO)
Definition unpack_template.h:158
const char * data
Definition unpack_template.h:94
#define SWITCH_RANGE_BEGIN
Definition unpack_template.h:157
#define again_fixed_trail_if_zero(_cs, trail_len, ifzero)
Definition unpack_template.h:134
const unsigned char *const pe
Definition unpack_template.h:99
msgpack_unpack_object obj
Definition unpack_template.h:111
const char size_t len
Definition unpack_template.h:94
#define again_fixed_trail(_cs, trail_len)
Definition unpack_template.h:130
p
Definition unpack_template.h:423
#define SWITCH_RANGE_END
Definition unpack_template.h:160
goto _end
Definition unpack_template.h:433
#define msgpack_unpack_struct_decl(name)
Definition unpack_template.h:24
#define push_simple_value(func)
Definition unpack_template.h:116
msgpack_unpack_user * user
Definition unpack_template.h:109
unsigned int trail
Definition unpack_template.h:102
msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context) *ctx)
Definition unpack_template.h:67