sq_detailed_metrics 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/extconf.rb +26 -0
  3. data/include/half.hpp +4575 -0
  4. data/include/msgpack.h +24 -0
  5. data/include/msgpack/fbuffer.h +42 -0
  6. data/include/msgpack/gcc_atomic.h +25 -0
  7. data/include/msgpack/object.h +118 -0
  8. data/include/msgpack/pack.h +174 -0
  9. data/include/msgpack/pack_define.h +18 -0
  10. data/include/msgpack/pack_template.h +952 -0
  11. data/include/msgpack/sbuffer.h +115 -0
  12. data/include/msgpack/sysdep.h +221 -0
  13. data/include/msgpack/timestamp.h +58 -0
  14. data/include/msgpack/unpack.h +281 -0
  15. data/include/msgpack/unpack_define.h +89 -0
  16. data/include/msgpack/unpack_template.h +471 -0
  17. data/include/msgpack/util.h +15 -0
  18. data/include/msgpack/version.h +38 -0
  19. data/include/msgpack/version_master.h +3 -0
  20. data/include/msgpack/vrefbuffer.h +144 -0
  21. data/include/msgpack/zbuffer.h +205 -0
  22. data/include/msgpack/zone.h +163 -0
  23. data/include/rapidjson/allocators.h +271 -0
  24. data/include/rapidjson/document.h +2575 -0
  25. data/include/rapidjson/encodedstream.h +299 -0
  26. data/include/rapidjson/encodings.h +716 -0
  27. data/include/rapidjson/error/en.h +74 -0
  28. data/include/rapidjson/error/error.h +155 -0
  29. data/include/rapidjson/filereadstream.h +99 -0
  30. data/include/rapidjson/filewritestream.h +104 -0
  31. data/include/rapidjson/fwd.h +151 -0
  32. data/include/rapidjson/internal/biginteger.h +290 -0
  33. data/include/rapidjson/internal/diyfp.h +258 -0
  34. data/include/rapidjson/internal/dtoa.h +245 -0
  35. data/include/rapidjson/internal/ieee754.h +78 -0
  36. data/include/rapidjson/internal/itoa.h +304 -0
  37. data/include/rapidjson/internal/meta.h +181 -0
  38. data/include/rapidjson/internal/pow10.h +55 -0
  39. data/include/rapidjson/internal/regex.h +701 -0
  40. data/include/rapidjson/internal/stack.h +230 -0
  41. data/include/rapidjson/internal/strfunc.h +55 -0
  42. data/include/rapidjson/internal/strtod.h +269 -0
  43. data/include/rapidjson/internal/swap.h +46 -0
  44. data/include/rapidjson/istreamwrapper.h +115 -0
  45. data/include/rapidjson/memorybuffer.h +70 -0
  46. data/include/rapidjson/memorystream.h +71 -0
  47. data/include/rapidjson/msinttypes/inttypes.h +316 -0
  48. data/include/rapidjson/msinttypes/stdint.h +300 -0
  49. data/include/rapidjson/ostreamwrapper.h +81 -0
  50. data/include/rapidjson/pointer.h +1358 -0
  51. data/include/rapidjson/prettywriter.h +255 -0
  52. data/include/rapidjson/rapidjson.h +615 -0
  53. data/include/rapidjson/reader.h +1879 -0
  54. data/include/rapidjson/schema.h +2006 -0
  55. data/include/rapidjson/stream.h +179 -0
  56. data/include/rapidjson/stringbuffer.h +117 -0
  57. data/include/rapidjson/writer.h +610 -0
  58. data/include/xxhash.h +328 -0
  59. data/json_conv.cpp +284 -0
  60. data/json_conv.hpp +17 -0
  61. data/metrics.cpp +239 -0
  62. data/metrics.hpp +84 -0
  63. data/msgpack/objectc.c +482 -0
  64. data/msgpack/unpack.c +703 -0
  65. data/msgpack/version.c +22 -0
  66. data/msgpack/vrefbuffer.c +250 -0
  67. data/msgpack/zone.c +222 -0
  68. data/sq_detailed_metrics.cpp +248 -0
  69. metadata +199 -0
@@ -0,0 +1,703 @@
1
+ /*
2
+ * MessagePack for C unpacking routine
3
+ *
4
+ * Copyright (C) 2008-2009 FURUHASHI Sadayuki
5
+ *
6
+ * Distributed under the Boost Software License, Version 1.0.
7
+ * (See accompanying file LICENSE_1_0.txt or copy at
8
+ * http://www.boost.org/LICENSE_1_0.txt)
9
+ */
10
+ #include "msgpack/unpack.h"
11
+ #include "msgpack/unpack_define.h"
12
+ #include "msgpack/util.h"
13
+ #include <stdlib.h>
14
+ #include <stdint.h>
15
+
16
+ #ifdef _msgpack_atomic_counter_header
17
+ #include _msgpack_atomic_counter_header
18
+ #endif
19
+
20
+
21
+ typedef struct {
22
+ msgpack_zone** z;
23
+ bool referenced;
24
+ } unpack_user;
25
+
26
+
27
+ #define msgpack_unpack_struct(name) \
28
+ struct template ## name
29
+
30
+ #define msgpack_unpack_func(ret, name) \
31
+ ret template ## name
32
+
33
+ #define msgpack_unpack_callback(name) \
34
+ template_callback ## name
35
+
36
+ #define msgpack_unpack_object msgpack_object
37
+
38
+ #define msgpack_unpack_user unpack_user
39
+
40
+
41
+ struct template_context;
42
+ typedef struct template_context template_context;
43
+
44
+ static void template_init(template_context* ctx);
45
+
46
+ static msgpack_object template_data(template_context* ctx);
47
+
48
+ static int template_execute(
49
+ template_context* ctx, const char* data, size_t len, size_t* off);
50
+
51
+
52
+ static inline msgpack_object template_callback_root(unpack_user* u)
53
+ {
54
+ msgpack_object o;
55
+ MSGPACK_UNUSED(u);
56
+ o.type = MSGPACK_OBJECT_NIL;
57
+ return o;
58
+ }
59
+
60
+ static inline int template_callback_uint8(unpack_user* u, uint8_t d, msgpack_object* o)
61
+ {
62
+ MSGPACK_UNUSED(u);
63
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
64
+ o->via.u64 = d;
65
+ return 0;
66
+ }
67
+
68
+ static inline int template_callback_uint16(unpack_user* u, uint16_t d, msgpack_object* o)
69
+ {
70
+ MSGPACK_UNUSED(u);
71
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
72
+ o->via.u64 = d;
73
+ return 0;
74
+ }
75
+
76
+ static inline int template_callback_uint32(unpack_user* u, uint32_t d, msgpack_object* o)
77
+ {
78
+ MSGPACK_UNUSED(u);
79
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
80
+ o->via.u64 = d;
81
+ return 0;
82
+ }
83
+
84
+ static inline int template_callback_uint64(unpack_user* u, uint64_t d, msgpack_object* o)
85
+ {
86
+ MSGPACK_UNUSED(u);
87
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
88
+ o->via.u64 = d;
89
+ return 0;
90
+ }
91
+
92
+ static inline int template_callback_int8(unpack_user* u, int8_t d, msgpack_object* o)
93
+ {
94
+ MSGPACK_UNUSED(u);
95
+ if(d >= 0) {
96
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
97
+ o->via.u64 = (uint64_t)d;
98
+ return 0;
99
+ }
100
+ else {
101
+ o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER;
102
+ o->via.i64 = d;
103
+ return 0;
104
+ }
105
+ }
106
+
107
+ static inline int template_callback_int16(unpack_user* u, int16_t d, msgpack_object* o)
108
+ {
109
+ MSGPACK_UNUSED(u);
110
+ if(d >= 0) {
111
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
112
+ o->via.u64 = (uint64_t)d;
113
+ return 0;
114
+ }
115
+ else {
116
+ o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER;
117
+ o->via.i64 = d;
118
+ return 0;
119
+ }
120
+ }
121
+
122
+ static inline int template_callback_int32(unpack_user* u, int32_t d, msgpack_object* o)
123
+ {
124
+ MSGPACK_UNUSED(u);
125
+ if(d >= 0) {
126
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
127
+ o->via.u64 = (uint64_t)d;
128
+ return 0;
129
+ }
130
+ else {
131
+ o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER;
132
+ o->via.i64 = d;
133
+ return 0;
134
+ }
135
+ }
136
+
137
+ static inline int template_callback_int64(unpack_user* u, int64_t d, msgpack_object* o)
138
+ {
139
+ MSGPACK_UNUSED(u);
140
+ if(d >= 0) {
141
+ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
142
+ o->via.u64 = (uint64_t)d;
143
+ return 0;
144
+ }
145
+ else {
146
+ o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER;
147
+ o->via.i64 = d;
148
+ return 0;
149
+ }
150
+ }
151
+
152
+ static inline int template_callback_float(unpack_user* u, float d, msgpack_object* o)
153
+ {
154
+ MSGPACK_UNUSED(u);
155
+ o->type = MSGPACK_OBJECT_FLOAT32;
156
+ o->via.f64 = d;
157
+ return 0;
158
+ }
159
+
160
+ static inline int template_callback_double(unpack_user* u, double d, msgpack_object* o)
161
+ {
162
+ MSGPACK_UNUSED(u);
163
+ o->type = MSGPACK_OBJECT_FLOAT64;
164
+ o->via.f64 = d;
165
+ return 0;
166
+ }
167
+
168
+ static inline int template_callback_nil(unpack_user* u, msgpack_object* o)
169
+ {
170
+ MSGPACK_UNUSED(u);
171
+ o->type = MSGPACK_OBJECT_NIL;
172
+ return 0;
173
+ }
174
+
175
+ static inline int template_callback_true(unpack_user* u, msgpack_object* o)
176
+ {
177
+ MSGPACK_UNUSED(u);
178
+ o->type = MSGPACK_OBJECT_BOOLEAN;
179
+ o->via.boolean = true;
180
+ return 0;
181
+ }
182
+
183
+ static inline int template_callback_false(unpack_user* u, msgpack_object* o)
184
+ {
185
+ MSGPACK_UNUSED(u);
186
+ o->type = MSGPACK_OBJECT_BOOLEAN;
187
+ o->via.boolean = false;
188
+ return 0;
189
+ }
190
+
191
+ static inline int template_callback_array(unpack_user* u, unsigned int n, msgpack_object* o)
192
+ {
193
+ size_t size;
194
+ // Let's leverage the fact that sizeof(msgpack_object) is a compile time constant
195
+ // to check for int overflows.
196
+ // Note - while n is constrained to 32-bit, the product of n * sizeof(msgpack_object)
197
+ // might not be constrained to 4GB on 64-bit systems
198
+ #if SIZE_MAX == UINT_MAX
199
+ if (n > SIZE_MAX/sizeof(msgpack_object))
200
+ return MSGPACK_UNPACK_NOMEM_ERROR;
201
+ #endif
202
+
203
+ o->type = MSGPACK_OBJECT_ARRAY;
204
+ o->via.array.size = 0;
205
+
206
+ size = n * sizeof(msgpack_object);
207
+
208
+ if (*u->z == NULL) {
209
+ *u->z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
210
+ if(*u->z == NULL) {
211
+ return MSGPACK_UNPACK_NOMEM_ERROR;
212
+ }
213
+ }
214
+
215
+ // Unsure whether size = 0 should be an error, and if so, what to return
216
+ o->via.array.ptr = (msgpack_object*)msgpack_zone_malloc(*u->z, size);
217
+ if(o->via.array.ptr == NULL) { return MSGPACK_UNPACK_NOMEM_ERROR; }
218
+ return 0;
219
+ }
220
+
221
+ static inline int template_callback_array_item(unpack_user* u, msgpack_object* c, msgpack_object o)
222
+ {
223
+ MSGPACK_UNUSED(u);
224
+ #if defined(__GNUC__) && !defined(__clang__)
225
+ memcpy(&c->via.array.ptr[c->via.array.size], &o, sizeof(msgpack_object));
226
+ #else /* __GNUC__ && !__clang__ */
227
+ c->via.array.ptr[c->via.array.size] = o;
228
+ #endif /* __GNUC__ && !__clang__ */
229
+ ++c->via.array.size;
230
+ return 0;
231
+ }
232
+
233
+ static inline int template_callback_map(unpack_user* u, unsigned int n, msgpack_object* o)
234
+ {
235
+ size_t size;
236
+ // Let's leverage the fact that sizeof(msgpack_object_kv) is a compile time constant
237
+ // to check for int overflows
238
+ // Note - while n is constrained to 32-bit, the product of n * sizeof(msgpack_object)
239
+ // might not be constrained to 4GB on 64-bit systems
240
+
241
+ // Note - this will always be false on 64-bit systems
242
+ #if SIZE_MAX == UINT_MAX
243
+ if (n > SIZE_MAX/sizeof(msgpack_object_kv))
244
+ return MSGPACK_UNPACK_NOMEM_ERROR;
245
+ #endif
246
+
247
+ o->type = MSGPACK_OBJECT_MAP;
248
+ o->via.map.size = 0;
249
+
250
+ size = n * sizeof(msgpack_object_kv);
251
+
252
+ if (*u->z == NULL) {
253
+ *u->z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
254
+ if(*u->z == NULL) {
255
+ return MSGPACK_UNPACK_NOMEM_ERROR;
256
+ }
257
+ }
258
+
259
+ // Should size = 0 be an error? If so, what error to return?
260
+ o->via.map.ptr = (msgpack_object_kv*)msgpack_zone_malloc(*u->z, size);
261
+ if(o->via.map.ptr == NULL) { return MSGPACK_UNPACK_NOMEM_ERROR; }
262
+ return 0;
263
+ }
264
+
265
+ static inline int template_callback_map_item(unpack_user* u, msgpack_object* c, msgpack_object k, msgpack_object v)
266
+ {
267
+ MSGPACK_UNUSED(u);
268
+ #if defined(__GNUC__) && !defined(__clang__)
269
+ memcpy(&c->via.map.ptr[c->via.map.size].key, &k, sizeof(msgpack_object));
270
+ memcpy(&c->via.map.ptr[c->via.map.size].val, &v, sizeof(msgpack_object));
271
+ #else /* __GNUC__ && !__clang__ */
272
+ c->via.map.ptr[c->via.map.size].key = k;
273
+ c->via.map.ptr[c->via.map.size].val = v;
274
+ #endif /* __GNUC__ && !__clang__ */
275
+ ++c->via.map.size;
276
+ return 0;
277
+ }
278
+
279
+ static inline int template_callback_str(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_object* o)
280
+ {
281
+ MSGPACK_UNUSED(b);
282
+ if (*u->z == NULL) {
283
+ *u->z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
284
+ if(*u->z == NULL) {
285
+ return MSGPACK_UNPACK_NOMEM_ERROR;
286
+ }
287
+ }
288
+ o->type = MSGPACK_OBJECT_STR;
289
+ o->via.str.ptr = p;
290
+ o->via.str.size = l;
291
+ u->referenced = true;
292
+ return 0;
293
+ }
294
+
295
+ static inline int template_callback_bin(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_object* o)
296
+ {
297
+ MSGPACK_UNUSED(b);
298
+ if (*u->z == NULL) {
299
+ *u->z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
300
+ if(*u->z == NULL) {
301
+ return MSGPACK_UNPACK_NOMEM_ERROR;
302
+ }
303
+ }
304
+ o->type = MSGPACK_OBJECT_BIN;
305
+ o->via.bin.ptr = p;
306
+ o->via.bin.size = l;
307
+ u->referenced = true;
308
+ return 0;
309
+ }
310
+
311
+ static inline int template_callback_ext(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_object* o)
312
+ {
313
+ MSGPACK_UNUSED(b);
314
+ if (l == 0) {
315
+ return MSGPACK_UNPACK_PARSE_ERROR;
316
+ }
317
+ if (*u->z == NULL) {
318
+ *u->z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
319
+ if(*u->z == NULL) {
320
+ return MSGPACK_UNPACK_NOMEM_ERROR;
321
+ }
322
+ }
323
+ o->type = MSGPACK_OBJECT_EXT;
324
+ o->via.ext.type = *p;
325
+ o->via.ext.ptr = p + 1;
326
+ o->via.ext.size = l - 1;
327
+ u->referenced = true;
328
+ return 0;
329
+ }
330
+
331
+ #include "msgpack/unpack_template.h"
332
+
333
+
334
+ #define CTX_CAST(m) ((template_context*)(m))
335
+ #define CTX_REFERENCED(mpac) CTX_CAST((mpac)->ctx)->user.referenced
336
+
337
+ #define COUNTER_SIZE (sizeof(_msgpack_atomic_counter_t))
338
+
339
+
340
+ static inline void init_count(void* buffer)
341
+ {
342
+ *(volatile _msgpack_atomic_counter_t*)buffer = 1;
343
+ }
344
+
345
+ static inline void decr_count(void* buffer)
346
+ {
347
+ // atomic if(--*(_msgpack_atomic_counter_t*)buffer == 0) { free(buffer); }
348
+ if(_msgpack_sync_decr_and_fetch((volatile _msgpack_atomic_counter_t*)buffer) == 0) {
349
+ free(buffer);
350
+ }
351
+ }
352
+
353
+ static inline void incr_count(void* buffer)
354
+ {
355
+ // atomic ++*(_msgpack_atomic_counter_t*)buffer;
356
+ _msgpack_sync_incr_and_fetch((volatile _msgpack_atomic_counter_t*)buffer);
357
+ }
358
+
359
+ static inline _msgpack_atomic_counter_t get_count(void* buffer)
360
+ {
361
+ return *(volatile _msgpack_atomic_counter_t*)buffer;
362
+ }
363
+
364
+ bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size)
365
+ {
366
+ char* buffer;
367
+ void* ctx;
368
+
369
+ if(initial_buffer_size < COUNTER_SIZE) {
370
+ initial_buffer_size = COUNTER_SIZE;
371
+ }
372
+
373
+ buffer = (char*)malloc(initial_buffer_size);
374
+ if(buffer == NULL) {
375
+ return false;
376
+ }
377
+
378
+ ctx = malloc(sizeof(template_context));
379
+ if(ctx == NULL) {
380
+ free(buffer);
381
+ return false;
382
+ }
383
+
384
+ mpac->buffer = buffer;
385
+ mpac->used = COUNTER_SIZE;
386
+ mpac->free = initial_buffer_size - mpac->used;
387
+ mpac->off = COUNTER_SIZE;
388
+ mpac->parsed = 0;
389
+ mpac->initial_buffer_size = initial_buffer_size;
390
+ mpac->z = NULL;
391
+ mpac->ctx = ctx;
392
+
393
+ init_count(mpac->buffer);
394
+
395
+ template_init(CTX_CAST(mpac->ctx));
396
+ CTX_CAST(mpac->ctx)->user.z = &mpac->z;
397
+ CTX_CAST(mpac->ctx)->user.referenced = false;
398
+
399
+ return true;
400
+ }
401
+
402
+ void msgpack_unpacker_destroy(msgpack_unpacker* mpac)
403
+ {
404
+ msgpack_zone_free(mpac->z);
405
+ free(mpac->ctx);
406
+ decr_count(mpac->buffer);
407
+ }
408
+
409
+ msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size)
410
+ {
411
+ msgpack_unpacker* mpac = (msgpack_unpacker*)malloc(sizeof(msgpack_unpacker));
412
+ if(mpac == NULL) {
413
+ return NULL;
414
+ }
415
+
416
+ if(!msgpack_unpacker_init(mpac, initial_buffer_size)) {
417
+ free(mpac);
418
+ return NULL;
419
+ }
420
+
421
+ return mpac;
422
+ }
423
+
424
+ void msgpack_unpacker_free(msgpack_unpacker* mpac)
425
+ {
426
+ msgpack_unpacker_destroy(mpac);
427
+ free(mpac);
428
+ }
429
+
430
+ bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size)
431
+ {
432
+ if(mpac->used == mpac->off && get_count(mpac->buffer) == 1
433
+ && !CTX_REFERENCED(mpac)) {
434
+ // rewind buffer
435
+ mpac->free += mpac->used - COUNTER_SIZE;
436
+ mpac->used = COUNTER_SIZE;
437
+ mpac->off = COUNTER_SIZE;
438
+
439
+ if(mpac->free >= size) {
440
+ return true;
441
+ }
442
+ }
443
+
444
+ if(mpac->off == COUNTER_SIZE) {
445
+ char* tmp;
446
+ size_t next_size = (mpac->used + mpac->free) * 2; // include COUNTER_SIZE
447
+ while(next_size < size + mpac->used) {
448
+ size_t tmp_next_size = next_size * 2;
449
+ if (tmp_next_size <= next_size) {
450
+ next_size = size + mpac->used;
451
+ break;
452
+ }
453
+ next_size = tmp_next_size;
454
+ }
455
+
456
+ tmp = (char*)realloc(mpac->buffer, next_size);
457
+ if(tmp == NULL) {
458
+ return false;
459
+ }
460
+
461
+ mpac->buffer = tmp;
462
+ mpac->free = next_size - mpac->used;
463
+
464
+ } else {
465
+ char* tmp;
466
+ size_t next_size = mpac->initial_buffer_size; // include COUNTER_SIZE
467
+ size_t not_parsed = mpac->used - mpac->off;
468
+ while(next_size < size + not_parsed + COUNTER_SIZE) {
469
+ size_t tmp_next_size = next_size * 2;
470
+ if (tmp_next_size <= next_size) {
471
+ next_size = size + not_parsed + COUNTER_SIZE;
472
+ break;
473
+ }
474
+ next_size = tmp_next_size;
475
+ }
476
+
477
+ tmp = (char*)malloc(next_size);
478
+ if(tmp == NULL) {
479
+ return false;
480
+ }
481
+
482
+ init_count(tmp);
483
+
484
+ memcpy(tmp+COUNTER_SIZE, mpac->buffer+mpac->off, not_parsed);
485
+
486
+ if(CTX_REFERENCED(mpac)) {
487
+ if(!msgpack_zone_push_finalizer(mpac->z, decr_count, mpac->buffer)) {
488
+ free(tmp);
489
+ return false;
490
+ }
491
+ CTX_REFERENCED(mpac) = false;
492
+ } else {
493
+ decr_count(mpac->buffer);
494
+ }
495
+
496
+ mpac->buffer = tmp;
497
+ mpac->used = not_parsed + COUNTER_SIZE;
498
+ mpac->free = next_size - mpac->used;
499
+ mpac->off = COUNTER_SIZE;
500
+ }
501
+
502
+ return true;
503
+ }
504
+
505
+ int msgpack_unpacker_execute(msgpack_unpacker* mpac)
506
+ {
507
+ size_t off = mpac->off;
508
+ int ret = template_execute(CTX_CAST(mpac->ctx),
509
+ mpac->buffer, mpac->used, &mpac->off);
510
+ if(mpac->off > off) {
511
+ mpac->parsed += mpac->off - off;
512
+ }
513
+ return ret;
514
+ }
515
+
516
+ msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac)
517
+ {
518
+ return template_data(CTX_CAST(mpac->ctx));
519
+ }
520
+
521
+ msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac)
522
+ {
523
+ msgpack_zone* old = mpac->z;
524
+
525
+ if (old == NULL) return NULL;
526
+ if(!msgpack_unpacker_flush_zone(mpac)) {
527
+ return NULL;
528
+ }
529
+
530
+ mpac->z = NULL;
531
+ CTX_CAST(mpac->ctx)->user.z = &mpac->z;
532
+
533
+ return old;
534
+ }
535
+
536
+ void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac)
537
+ {
538
+ msgpack_zone_clear(mpac->z);
539
+ }
540
+
541
+ bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac)
542
+ {
543
+ if(CTX_REFERENCED(mpac)) {
544
+ if(!msgpack_zone_push_finalizer(mpac->z, decr_count, mpac->buffer)) {
545
+ return false;
546
+ }
547
+ CTX_REFERENCED(mpac) = false;
548
+
549
+ incr_count(mpac->buffer);
550
+ }
551
+
552
+ return true;
553
+ }
554
+
555
+ void msgpack_unpacker_reset(msgpack_unpacker* mpac)
556
+ {
557
+ template_init(CTX_CAST(mpac->ctx));
558
+ // don't reset referenced flag
559
+ mpac->parsed = 0;
560
+ }
561
+
562
+ static inline msgpack_unpack_return unpacker_next(msgpack_unpacker* mpac,
563
+ msgpack_unpacked* result)
564
+ {
565
+ int ret;
566
+
567
+ msgpack_unpacked_destroy(result);
568
+
569
+ ret = msgpack_unpacker_execute(mpac);
570
+
571
+ if(ret < 0) {
572
+ result->zone = NULL;
573
+ memset(&result->data, 0, sizeof(msgpack_object));
574
+ return (msgpack_unpack_return)ret;
575
+ }
576
+
577
+ if(ret == 0) {
578
+ return MSGPACK_UNPACK_CONTINUE;
579
+ }
580
+ result->zone = msgpack_unpacker_release_zone(mpac);
581
+ result->data = msgpack_unpacker_data(mpac);
582
+
583
+ return MSGPACK_UNPACK_SUCCESS;
584
+ }
585
+
586
+ msgpack_unpack_return msgpack_unpacker_next(msgpack_unpacker* mpac,
587
+ msgpack_unpacked* result)
588
+ {
589
+ msgpack_unpack_return ret;
590
+
591
+ ret = unpacker_next(mpac, result);
592
+ if (ret == MSGPACK_UNPACK_SUCCESS) {
593
+ msgpack_unpacker_reset(mpac);
594
+ }
595
+
596
+ return ret;
597
+ }
598
+
599
+ msgpack_unpack_return
600
+ msgpack_unpacker_next_with_size(msgpack_unpacker* mpac,
601
+ msgpack_unpacked* result, size_t *p_bytes)
602
+ {
603
+ msgpack_unpack_return ret;
604
+
605
+ ret = unpacker_next(mpac, result);
606
+ if (ret == MSGPACK_UNPACK_SUCCESS || ret == MSGPACK_UNPACK_CONTINUE) {
607
+ *p_bytes = mpac->parsed;
608
+ }
609
+
610
+ if (ret == MSGPACK_UNPACK_SUCCESS) {
611
+ msgpack_unpacker_reset(mpac);
612
+ }
613
+
614
+ return ret;
615
+ }
616
+
617
+ msgpack_unpack_return
618
+ msgpack_unpack(const char* data, size_t len, size_t* off,
619
+ msgpack_zone* result_zone, msgpack_object* result)
620
+ {
621
+ size_t noff = 0;
622
+ if(off != NULL) { noff = *off; }
623
+
624
+ if(len <= noff) {
625
+ // FIXME
626
+ return MSGPACK_UNPACK_CONTINUE;
627
+ }
628
+ else {
629
+ int e;
630
+ template_context ctx;
631
+ template_init(&ctx);
632
+
633
+ ctx.user.z = &result_zone;
634
+ ctx.user.referenced = false;
635
+
636
+ e = template_execute(&ctx, data, len, &noff);
637
+ if(e < 0) {
638
+ return (msgpack_unpack_return)e;
639
+ }
640
+
641
+ if(off != NULL) { *off = noff; }
642
+
643
+ if(e == 0) {
644
+ return MSGPACK_UNPACK_CONTINUE;
645
+ }
646
+
647
+ *result = template_data(&ctx);
648
+
649
+ if(noff < len) {
650
+ return MSGPACK_UNPACK_EXTRA_BYTES;
651
+ }
652
+
653
+ return MSGPACK_UNPACK_SUCCESS;
654
+ }
655
+ }
656
+
657
+ msgpack_unpack_return
658
+ msgpack_unpack_next(msgpack_unpacked* result,
659
+ const char* data, size_t len, size_t* off)
660
+ {
661
+ size_t noff = 0;
662
+ msgpack_unpacked_destroy(result);
663
+
664
+ if(off != NULL) { noff = *off; }
665
+
666
+ if(len <= noff) {
667
+ return MSGPACK_UNPACK_CONTINUE;
668
+ }
669
+
670
+ {
671
+ int e;
672
+ template_context ctx;
673
+ template_init(&ctx);
674
+
675
+ ctx.user.z = &result->zone;
676
+ ctx.user.referenced = false;
677
+
678
+ e = template_execute(&ctx, data, len, &noff);
679
+
680
+ if(off != NULL) { *off = noff; }
681
+
682
+ if(e < 0) {
683
+ msgpack_zone_free(result->zone);
684
+ result->zone = NULL;
685
+ return (msgpack_unpack_return)e;
686
+ }
687
+
688
+ if(e == 0) {
689
+ return MSGPACK_UNPACK_CONTINUE;
690
+ }
691
+
692
+ result->data = template_data(&ctx);
693
+
694
+ return MSGPACK_UNPACK_SUCCESS;
695
+ }
696
+ }
697
+
698
+ #if defined(MSGPACK_OLD_COMPILER_BUS_ERROR_WORKAROUND)
699
+ // FIXME: Dirty hack to avoid a bus error caused by OS X's old gcc.
700
+ static void dummy_function_to_avoid_bus_error()
701
+ {
702
+ }
703
+ #endif