msgpack 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msgpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - FURUHASHI Sadayuki
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-08-16 00:00:00 +09:00
12
+ date: 2008-11-10 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -43,16 +43,12 @@ files:
43
43
  - ext/extconf.rb
44
44
  - ext/pack.c
45
45
  - ext/pack.h
46
- - ext/pack_inline.h
47
46
  - ext/rbinit.c
48
47
  - ext/unpack.c
49
48
  - ext/unpack.h
50
- - ext/unpack_context.h
51
- - ext/unpack_inline.c
52
- - msgpack/pack/inline_context.h
53
- - msgpack/pack/inline_impl.h
54
- - msgpack/unpack/inline_context.h
55
- - msgpack/unpack/inline_impl.h
49
+ - msgpack/pack_template.h
50
+ - msgpack/unpack_define.h
51
+ - msgpack/unpack_template.h
56
52
  - lib/msgpack/version.rb
57
53
  - script/console
58
54
  - script/destroy
@@ -1,33 +0,0 @@
1
- /*
2
- * MessagePack packing routine for Ruby
3
- *
4
- * Copyright (C) 2008 FURUHASHI Sadayuki
5
- *
6
- * Licensed under the Apache License, Version 2.0 (the "License");
7
- * you may not use this file except in compliance with the License.
8
- * You may obtain a copy of the License at
9
- *
10
- * http://www.apache.org/licenses/LICENSE-2.0
11
- *
12
- * Unless required by applicable law or agreed to in writing, software
13
- * distributed under the License is distributed on an "AS IS" BASIS,
14
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- * See the License for the specific language governing permissions and
16
- * limitations under the License.
17
- */
18
- #ifndef PACK_INLINE_H__
19
- #define PACK_INLINE_H__
20
-
21
- #include "ruby.h"
22
-
23
- typedef VALUE msgpack_pack_context;
24
-
25
- static inline void msgpack_pack_append_buffer(VALUE x, const unsigned char* b, unsigned int l)
26
- {
27
- rb_str_buf_cat(x, (const void*)b, l);
28
- }
29
-
30
- #include "msgpack/pack/inline_impl.h"
31
-
32
- #endif /* pack_inline.h */
33
-
@@ -1,35 +0,0 @@
1
- /*
2
- * MessagePack unpacking routine for Ruby
3
- *
4
- * Copyright (C) 2008 FURUHASHI Sadayuki
5
- *
6
- * Licensed under the Apache License, Version 2.0 (the "License");
7
- * you may not use this file except in compliance with the License.
8
- * You may obtain a copy of the License at
9
- *
10
- * http://www.apache.org/licenses/LICENSE-2.0
11
- *
12
- * Unless required by applicable law or agreed to in writing, software
13
- * distributed under the License is distributed on an "AS IS" BASIS,
14
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- * See the License for the specific language governing permissions and
16
- * limitations under the License.
17
- */
18
- #ifndef UNPACK_CONTEXT_H__
19
- #define UNPACK_CONTEXT_H__
20
-
21
- #include "ruby.h"
22
- #include <stddef.h>
23
- #include <stdbool.h>
24
-
25
- typedef VALUE msgpack_object;
26
-
27
- typedef struct {
28
- bool finished;
29
- } msgpack_unpack_context;
30
-
31
-
32
- #include "msgpack/unpack/inline_context.h"
33
-
34
- #endif /* unpack_context.h */
35
-
@@ -1,81 +0,0 @@
1
- /*
2
- * MessagePack unpacking routine for Ruby
3
- *
4
- * Copyright (C) 2008 FURUHASHI Sadayuki
5
- *
6
- * Licensed under the Apache License, Version 2.0 (the "License");
7
- * you may not use this file except in compliance with the License.
8
- * You may obtain a copy of the License at
9
- *
10
- * http://www.apache.org/licenses/LICENSE-2.0
11
- *
12
- * Unless required by applicable law or agreed to in writing, software
13
- * distributed under the License is distributed on an "AS IS" BASIS,
14
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- * See the License for the specific language governing permissions and
16
- * limitations under the License.
17
- */
18
- #include "unpack_context.h"
19
-
20
- static inline VALUE msgpack_unpack_init(msgpack_unpack_context* x)
21
- { return Qnil; }
22
-
23
- static inline VALUE msgpack_unpack_unsigned_int_8(msgpack_unpack_context* x, uint8_t d)
24
- { return INT2FIX(d); }
25
-
26
- static inline VALUE msgpack_unpack_unsigned_int_16(msgpack_unpack_context* x, uint16_t d)
27
- { return INT2FIX(d); }
28
-
29
- static inline VALUE msgpack_unpack_unsigned_int_32(msgpack_unpack_context* x, uint32_t d)
30
- { return UINT2NUM(d); }
31
-
32
- static inline VALUE msgpack_unpack_unsigned_int_64(msgpack_unpack_context* x, uint64_t d)
33
- { return UINT2NUM(d); } // FIXME
34
-
35
- static inline VALUE msgpack_unpack_signed_int_8(msgpack_unpack_context* x, int8_t d)
36
- { return INT2FIX((long)d); }
37
-
38
- static inline VALUE msgpack_unpack_signed_int_16(msgpack_unpack_context* x, int16_t d)
39
- { return INT2FIX((long)d); }
40
-
41
- static inline VALUE msgpack_unpack_signed_int_32(msgpack_unpack_context* x, int32_t d)
42
- { return INT2NUM((long)d); }
43
-
44
- static inline VALUE msgpack_unpack_signed_int_64(msgpack_unpack_context* x, int64_t d)
45
- { return INT2NUM(d); } // FIXME
46
-
47
- static inline VALUE msgpack_unpack_float(msgpack_unpack_context* x, float d)
48
- { return rb_float_new(d); }
49
-
50
- static inline VALUE msgpack_unpack_double(msgpack_unpack_context* x, double d)
51
- { return rb_float_new(d); }
52
-
53
- static inline VALUE msgpack_unpack_nil(msgpack_unpack_context* x)
54
- { return Qnil; }
55
-
56
- static inline VALUE msgpack_unpack_true(msgpack_unpack_context* x)
57
- { return Qtrue; }
58
-
59
- static inline VALUE msgpack_unpack_false(msgpack_unpack_context* x)
60
- { return Qfalse; }
61
-
62
- static inline VALUE msgpack_unpack_array_start(msgpack_unpack_context* x, unsigned int n)
63
- { return rb_ary_new2(n); }
64
-
65
- static inline void msgpack_unpack_array_item(msgpack_unpack_context* x, VALUE c, VALUE o)
66
- { rb_ary_push(c, o); }
67
-
68
- static inline VALUE msgpack_unpack_map_start(msgpack_unpack_context* x, unsigned int n)
69
- { return rb_hash_new(); }
70
-
71
- static inline void msgpack_unpack_map_item(msgpack_unpack_context* x, VALUE c, VALUE k, VALUE v)
72
- { rb_hash_aset(c, k, v); }
73
-
74
- static inline VALUE msgpack_unpack_string(msgpack_unpack_context* x, const void* b, size_t l)
75
- { return rb_str_new(b, l); }
76
-
77
- static inline VALUE msgpack_unpack_raw(msgpack_unpack_context* x, const void* b, size_t l)
78
- { return rb_str_new(b, l); }
79
-
80
- #include "msgpack/unpack/inline_impl.h"
81
-
@@ -1,2 +0,0 @@
1
-
2
-
@@ -1,52 +0,0 @@
1
- /*
2
- * MessagePack unpacking routine
3
- *
4
- * Copyright (C) 2008 FURUHASHI Sadayuki
5
- *
6
- * Licensed under the Apache License, Version 2.0 (the "License");
7
- * you may not use this file except in compliance with the License.
8
- * You may obtain a copy of the License at
9
- *
10
- * http://www.apache.org/licenses/LICENSE-2.0
11
- *
12
- * Unless required by applicable law or agreed to in writing, software
13
- * distributed under the License is distributed on an "AS IS" BASIS,
14
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- * See the License for the specific language governing permissions and
16
- * limitations under the License.
17
- */
18
- #ifndef MSGPACK_UNPACK_INLINE_CONTEXT_H__
19
- #define MSGPACK_UNPACK_INLINE_CONTEXT_H__
20
-
21
- #include <stddef.h>
22
- #include <stdint.h>
23
-
24
- #ifndef MSG_STACK_SIZE
25
- #define MSG_STACK_SIZE 16
26
- #endif
27
-
28
- typedef struct {
29
- msgpack_object obj;
30
- size_t count;
31
- unsigned int ct;
32
- union {
33
- const unsigned char* terminal_trail_start;
34
- msgpack_object map_key;
35
- } tmp;
36
- } msgpack_unpacker_stack;
37
-
38
- typedef struct {
39
- msgpack_unpack_context user; // must be first
40
- unsigned int cs;
41
- size_t trail;
42
- unsigned int top;
43
- msgpack_unpacker_stack stack[MSG_STACK_SIZE];
44
- } msgpack_unpacker;
45
-
46
- void msgpack_unpacker_init(msgpack_unpacker* ctx);
47
- int msgpack_unpacker_execute(msgpack_unpacker* ctx, const char* data, size_t len, size_t* off);
48
- #define msgpack_unpacker_data(unpacker) (unpacker)->stack[0].obj
49
-
50
-
51
- #endif /* msgpack/unpack/inline_context.h */
52
-
@@ -1,438 +0,0 @@
1
- /*
2
- * MessagePack unpacking routine
3
- *
4
- * Copyright (C) 2008 FURUHASHI Sadayuki
5
- *
6
- * Licensed under the Apache License, Version 2.0 (the "License");
7
- * you may not use this file except in compliance with the License.
8
- * You may obtain a copy of the License at
9
- *
10
- * http://www.apache.org/licenses/LICENSE-2.0
11
- *
12
- * Unless required by applicable law or agreed to in writing, software
13
- * distributed under the License is distributed on an "AS IS" BASIS,
14
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- * See the License for the specific language governing permissions and
16
- * limitations under the License.
17
- */
18
- #ifndef MSGPACK_UNPACK_INLINE_IMPL_H__
19
- #define MSGPACK_UNPACK_INLINE_IMPL_H__
20
-
21
- #include <string.h>
22
- #include <assert.h>
23
- #include <arpa/inet.h>
24
- /*#include <stdio.h>*/
25
-
26
- // Positive FixNum 0xxxxxxx 0x00 - 0x7f
27
- // Negative FixNum 111xxxxx 0xe0 - 0xff
28
- // Variable 110xxxxx 0xc0 - 0xdf
29
- // nil 00000 0xc0
30
- // string 00001 0xc1
31
- // false 00010 0xc2
32
- // true 00011 0xc3
33
- // (?) 00100 0xc4
34
- // (?) 00101 0xc5
35
- // (?) 00110 0xc6
36
- // (?) 00111 0xc7
37
- // (?) 01000 0xc8
38
- // (?) 01001 0xc9
39
- // float 01010 0xca
40
- // double 01011 0xcb
41
- // uint 8 01100 0xcc
42
- // uint 16 01101 0xcd
43
- // uint 32 01110 0xce
44
- // uint 64 01111 0xcf
45
- // int 8 10000 0xd0
46
- // int 16 10001 0xd1
47
- // int 32 10010 0xd2
48
- // int 64 10011 0xd3
49
- // (?) 10100 0xd4
50
- // (?) 10101 0xd5
51
- // (big float 16) 10110 0xd6
52
- // (big float 32) 10111 0xd7
53
- // (big integer 16) 11000 0xd8
54
- // (big integer 32) 11001 0xd9
55
- // raw 16 11010 0xda
56
- // raw 32 11011 0xdb
57
- // array 16 11100 0xdc
58
- // array 32 11101 0xdd
59
- // map 16 11110 0xde
60
- // map 32 11111 0xdf
61
- // FixRaw 101xxxxx 0xa0 - 0xbf
62
- // FixArray 1001xxxx 0x90 - 0x9f
63
- // FixMap 1000xxxx 0x80 - 0x8f
64
-
65
-
66
- #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
67
- #if __BYTE_ORDER == __LITTLE_ENDIAN
68
- #define __LITTLE_ENDIAN__
69
- #elif __BYTE_ORDER == __BIG_ENDIAN
70
- #define __BIG_ENDIAN__
71
- #endif
72
- #endif
73
-
74
- static inline uint64_t ntohll(uint64_t x) {
75
- #ifdef __LITTLE_ENDIAN__ // FIXME
76
- #if defined(__bswap_64)
77
- return __bswap_64(x);
78
- #elif defined(__DARWIN_OSSwapInt64)
79
- return __DARWIN_OSSwapInt64(x);
80
- #else
81
- return ((x << 56) & 0xff00000000000000ULL ) |
82
- ((x << 40) & 0x00ff000000000000ULL ) |
83
- ((x << 24) & 0x0000ff0000000000ULL ) |
84
- ((x << 8) & 0x000000ff00000000ULL ) |
85
- ((x >> 8) & 0x00000000ff000000ULL ) |
86
- ((x >> 24) & 0x0000000000ff0000ULL ) |
87
- ((x >> 40) & 0x000000000000ff00ULL ) |
88
- ((x >> 56) & 0x00000000000000ffULL ) ;
89
- #endif
90
- #else
91
- return x;
92
- #endif
93
- }
94
-
95
- typedef enum {
96
- CS_HEADER = 0x00, // nil
97
-
98
- CS_STRING = 0x01,
99
- //CS_ = 0x02, // false
100
- //CS_ = 0x03, // true
101
-
102
- //CS_ = 0x04,
103
- //CS_ = 0x05,
104
- //CS_ = 0x06,
105
- //CS_ = 0x07,
106
-
107
- //CS_ = 0x08,
108
- //CS_ = 0x09,
109
- CS_FLOAT = 0x0a,
110
- CS_DOUBLE = 0x0b,
111
- CS_UNSIGNED_INT_8 = 0x0c,
112
- CS_UNSIGNED_INT_16 = 0x0d,
113
- CS_UNSIGNED_INT_32 = 0x0e,
114
- CS_UNSIGNED_INT_64 = 0x0f,
115
- CS_SIGNED_INT_8 = 0x10,
116
- CS_SIGNED_INT_16 = 0x11,
117
- CS_SIGNED_INT_32 = 0x12,
118
- CS_SIGNED_INT_64 = 0x13,
119
-
120
- //CS_ = 0x14,
121
- //CS_ = 0x15,
122
- //CS_BIG_INT_16 = 0x16,
123
- //CS_BIG_INT_32 = 0x17,
124
- //CS_BIG_FLOAT_16 = 0x18,
125
- //CS_BIG_FLOAT_32 = 0x19,
126
- CS_RAW_16 = 0x1a,
127
- CS_RAW_32 = 0x1b,
128
- CS_ARRAY_16 = 0x1c,
129
- CS_ARRAY_32 = 0x1d,
130
- CS_MAP_16 = 0x1e,
131
- CS_MAP_32 = 0x1f,
132
-
133
- //ACS_BIG_INT_VALUE,
134
- //ACS_BIG_FLOAT_VALUE,
135
- ACS_RAW_VALUE,
136
- } current_state_t;
137
-
138
-
139
- typedef enum {
140
- CT_ARRAY_ITEM,
141
- CT_MAP_KEY,
142
- CT_MAP_VALUE,
143
- } container_type_t;
144
-
145
-
146
- void msgpack_unpacker_init(msgpack_unpacker* ctx)
147
- {
148
- memset(ctx, 0, sizeof(msgpack_unpacker)); // FIXME init ctx->user?
149
- ctx->cs = CS_HEADER;
150
- ctx->trail = 0;
151
- ctx->top = 0;
152
- ctx->stack[0].obj = msgpack_unpack_init(&ctx->user);
153
- }
154
-
155
- int msgpack_unpacker_execute(msgpack_unpacker* ctx, const char* data, size_t len, size_t* off)
156
- {
157
- assert(len >= *off);
158
-
159
- const unsigned char* p = (unsigned char*)data + *off;
160
- const unsigned char* const pe = (unsigned char*)data + len;
161
- const void* n = NULL;
162
-
163
- size_t trail = ctx->trail;
164
- unsigned int cs = ctx->cs;
165
- unsigned int top = ctx->top;
166
- msgpack_unpacker_stack* stack = ctx->stack;
167
- msgpack_unpack_context* user = &ctx->user;
168
-
169
- msgpack_object obj;
170
-
171
- int ret;
172
-
173
- #define push_simple_value(func) \
174
- obj = func(user); \
175
- /*printf("obj %d\n",obj);*/ \
176
- goto _push
177
- #define push_fixed_value(func, arg) \
178
- obj = func(user, arg); \
179
- /*printf("obj %d\n",obj);*/ \
180
- goto _push
181
- #define push_variable_value(func, arg, arglen) \
182
- obj = func(user, arg, arglen); \
183
- /*printf("obj %d\n",obj);*/ \
184
- goto _push
185
-
186
- #define again_terminal_trail(_cs, from) \
187
- cs = _cs; \
188
- stack[top].tmp.terminal_trail_start = from; \
189
- goto _terminal_trail_again
190
- #define again_fixed_trail(_cs, trail_len) \
191
- trail = trail_len; \
192
- cs = _cs; \
193
- goto _fixed_trail_again
194
- #define again_fixed_trail_if_zero(_cs, trail_len, ifzero) \
195
- trail = trail_len; \
196
- if(trail == 0) { goto ifzero; } \
197
- cs = _cs; \
198
- goto _fixed_trail_again
199
-
200
- #define start_container(func, count_, ct_) \
201
- stack[top].obj = func(user, count_); \
202
- if((count_) == 0) { obj = stack[top].obj; goto _push; } \
203
- if(top >= MSG_STACK_SIZE) { goto _failed; } \
204
- stack[top].ct = ct_; \
205
- stack[top].count = count_; \
206
- /*printf("container %d count %d stack %d\n",stack[top].obj,count_,top);*/ \
207
- /*printf("stack push %d\n", top);*/ \
208
- ++top; \
209
- goto _header_again
210
-
211
- #define NEXT_CS(p) \
212
- ((unsigned int)*p & 0x1f)
213
-
214
- #define PTR_CAST_8(ptr) (*(uint8_t*)ptr)
215
- #define PTR_CAST_16(ptr) ntohs(*(uint16_t*)ptr)
216
- #define PTR_CAST_32(ptr) ntohl(*(uint32_t*)ptr)
217
- #define PTR_CAST_64(ptr) ntohll(*(uint64_t*)ptr)
218
-
219
- if(p == pe) { goto _out; }
220
- do {
221
- switch(cs) {
222
- case CS_HEADER:
223
- switch(*p) {
224
- case 0x00 ... 0x7f: // Positive Fixnum
225
- push_fixed_value(msgpack_unpack_unsigned_int_8, *(uint8_t*)p);
226
- case 0xe0 ... 0xff: // Negative Fixnum
227
- push_fixed_value(msgpack_unpack_signed_int_8, *(int8_t*)p);
228
- case 0xc0 ... 0xdf: // Variable
229
- switch(*p) {
230
- case 0xc0: // nil
231
- push_simple_value(msgpack_unpack_nil);
232
- case 0xc1: // string
233
- again_terminal_trail(NEXT_CS(p), p+1);
234
- case 0xc2: // false
235
- push_simple_value(msgpack_unpack_false);
236
- case 0xc3: // true
237
- push_simple_value(msgpack_unpack_true);
238
- //case 0xc4:
239
- //case 0xc5:
240
- //case 0xc6:
241
- //case 0xc7:
242
- //case 0xc8:
243
- //case 0xc9:
244
- case 0xca: // float
245
- case 0xcb: // double
246
- case 0xcc: // unsigned int 8
247
- case 0xcd: // unsigned int 16
248
- case 0xce: // unsigned int 32
249
- case 0xcf: // unsigned int 64
250
- case 0xd0: // signed int 8
251
- case 0xd1: // signed int 16
252
- case 0xd2: // signed int 32
253
- case 0xd3: // signed int 64
254
- again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03));
255
- //case 0xd4:
256
- //case 0xd5:
257
- //case 0xd6: // big integer 16
258
- //case 0xd7: // big integer 32
259
- //case 0xd8: // big float 16
260
- //case 0xd9: // big float 32
261
- case 0xda: // raw 16
262
- case 0xdb: // raw 32
263
- case 0xdc: // array 16
264
- case 0xdd: // array 32
265
- case 0xde: // map 16
266
- case 0xdf: // map 32
267
- again_fixed_trail(NEXT_CS(p), 2 << (((unsigned int)*p) & 0x01));
268
- default:
269
- goto _failed;
270
- }
271
- case 0xa0 ... 0xbf: // FixRaw
272
- again_fixed_trail_if_zero(ACS_RAW_VALUE, ((unsigned int)*p & 0x1f), _raw_zero);
273
- case 0x90 ... 0x9f: // FixArray
274
- start_container(msgpack_unpack_array_start, ((unsigned int)*p) & 0x0f, CT_ARRAY_ITEM);
275
- case 0x80 ... 0x8f: // FixMap
276
- start_container(msgpack_unpack_map_start, ((unsigned int)*p) & 0x0f, CT_MAP_KEY);
277
-
278
- default:
279
- goto _failed;
280
- }
281
- // end CS_HEADER
282
-
283
-
284
- _terminal_trail_again:
285
- ++p;
286
-
287
- case CS_STRING:
288
- if(*p == 0) {
289
- const unsigned char* start = stack[top].tmp.terminal_trail_start;
290
- obj = msgpack_unpack_string(user, start, p-start);
291
- goto _push;
292
- }
293
- goto _terminal_trail_again;
294
-
295
-
296
- _fixed_trail_again:
297
- ++p;
298
-
299
- default:
300
- if((size_t)(pe - p) < trail) { goto _out; }
301
- n = p; p += trail - 1;
302
- switch(cs) {
303
- //case CS_
304
- //case CS_
305
- case CS_FLOAT: {
306
- uint32_t x = PTR_CAST_32(n); // FIXME
307
- push_fixed_value(msgpack_unpack_float, *((float*)&x)); }
308
- case CS_DOUBLE: {
309
- uint64_t x = PTR_CAST_64(n); // FIXME
310
- push_fixed_value(msgpack_unpack_double, *((double*)&x)); }
311
- case CS_UNSIGNED_INT_8:
312
- push_fixed_value(msgpack_unpack_unsigned_int_8, (uint8_t)PTR_CAST_8(n));
313
- case CS_UNSIGNED_INT_16:
314
- push_fixed_value(msgpack_unpack_unsigned_int_16, (uint16_t)PTR_CAST_16(n));
315
- case CS_UNSIGNED_INT_32:
316
- push_fixed_value(msgpack_unpack_unsigned_int_32, (uint32_t)PTR_CAST_32(n));
317
- case CS_UNSIGNED_INT_64:
318
- push_fixed_value(msgpack_unpack_unsigned_int_64, (uint64_t)PTR_CAST_64(n));
319
-
320
- case CS_SIGNED_INT_8:
321
- push_fixed_value(msgpack_unpack_signed_int_8, (int8_t)PTR_CAST_8(n));
322
- case CS_SIGNED_INT_16:
323
- push_fixed_value(msgpack_unpack_signed_int_16, (int16_t)PTR_CAST_16(n));
324
- case CS_SIGNED_INT_32:
325
- push_fixed_value(msgpack_unpack_signed_int_32, (int32_t)PTR_CAST_32(n));
326
- case CS_SIGNED_INT_64:
327
- push_fixed_value(msgpack_unpack_signed_int_64, (int64_t)PTR_CAST_64(n));
328
-
329
- //case CS_
330
- //case CS_
331
- //case CS_BIG_INT_16:
332
- // again_fixed_trail_if_zero(ACS_BIG_INT_VALUE, (uint16_t)PTR_CAST_16(n), _big_int_zero);
333
- //case CS_BIG_INT_32:
334
- // again_fixed_trail_if_zero(ACS_BIG_INT_VALUE, (uint32_t)PTR_CAST_32(n), _big_int_zero);
335
- //case ACS_BIG_INT_VALUE:
336
- //_big_int_zero:
337
- // // FIXME
338
- // push_variable_value(msgpack_unpack_big_int, n, trail);
339
-
340
- //case CS_BIG_FLOAT_16:
341
- // again_fixed_trail_if_zero(ACS_BIG_FLOAT_VALUE, (uint16_t)PTR_CAST_16(n), _big_float_zero);
342
- //case CS_BIG_FLOAT_32:
343
- // again_fixed_trail_if_zero(ACS_BIG_FLOAT_VALUE, (uint32_t)PTR_CAST_32(n), _big_float_zero);
344
- //case ACS_BIG_FLOAT_VALUE:
345
- //_big_float_zero:
346
- // // FIXME
347
- // push_variable_value(msgpack_unpack_big_float, n, trail);
348
-
349
- case CS_RAW_16:
350
- again_fixed_trail_if_zero(ACS_RAW_VALUE, (uint16_t)PTR_CAST_16(n), _raw_zero);
351
- case CS_RAW_32:
352
- again_fixed_trail_if_zero(ACS_RAW_VALUE, (uint32_t)PTR_CAST_32(n), _raw_zero);
353
- case ACS_RAW_VALUE:
354
- _raw_zero:
355
- push_variable_value(msgpack_unpack_raw, n, trail);
356
-
357
- case CS_ARRAY_16:
358
- start_container(msgpack_unpack_array_start, (uint16_t)PTR_CAST_16(n), CT_ARRAY_ITEM);
359
- case CS_ARRAY_32:
360
- start_container(msgpack_unpack_array_start, (uint32_t)PTR_CAST_32(n), CT_ARRAY_ITEM);
361
-
362
- case CS_MAP_16:
363
- start_container(msgpack_unpack_map_start, (uint16_t)PTR_CAST_16(n), CT_MAP_KEY);
364
- case CS_MAP_32:
365
- start_container(msgpack_unpack_map_start, (uint32_t)PTR_CAST_32(n), CT_MAP_KEY);
366
-
367
- default:
368
- goto _failed;
369
- }
370
- }
371
-
372
- _push:
373
- if(top == 0) { goto _finish; }
374
- msgpack_unpacker_stack* c = &stack[top-1];
375
- switch(c->ct) {
376
- case CT_ARRAY_ITEM:
377
- msgpack_unpack_array_item(user, c->obj, obj);
378
- if(--c->count == 0) {
379
- obj = c->obj;
380
- --top;
381
- /*printf("stack pop %d\n", top);*/
382
- goto _push;
383
- }
384
- goto _header_again;
385
- case CT_MAP_KEY:
386
- c->tmp.map_key = obj;
387
- c->ct = CT_MAP_VALUE;
388
- goto _header_again;
389
- case CT_MAP_VALUE:
390
- msgpack_unpack_map_item(user, c->obj, c->tmp.map_key, obj);
391
- if(--c->count == 0) {
392
- obj = c->obj;
393
- --top;
394
- /*printf("stack pop %d\n", top);*/
395
- goto _push;
396
- }
397
- c->ct = CT_MAP_KEY;
398
- goto _header_again;
399
-
400
- default:
401
- goto _failed;
402
- }
403
-
404
- _header_again:
405
- cs = CS_HEADER;
406
- ++p;
407
- } while(p != pe);
408
- goto _out;
409
-
410
-
411
- _finish:
412
- stack[0].obj = obj;
413
- ++p;
414
- ret = 1;
415
- /*printf("-- finish --\n"); */
416
- goto _end;
417
-
418
- _failed:
419
- /*printf("** FAILED **\n"); */
420
- ret = -1;
421
- goto _end;
422
-
423
- _out:
424
- ret = 0;
425
- goto _end;
426
-
427
- _end:
428
- ctx->cs = cs;
429
- ctx->trail = trail;
430
- ctx->top = top;
431
- *off = p - (const unsigned char*)data;
432
-
433
- return ret;
434
- }
435
-
436
-
437
- #endif /* msgpack/unpack/inline_impl.h */
438
-