msgpack 0.3.9 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/pack.c +117 -10
- data/ext/pack.h +1 -1
- data/ext/rbinit.c +21 -1
- data/ext/unpack.c +390 -29
- data/ext/unpack.h +1 -1
- data/msgpack/pack_template.h +108 -28
- metadata +6 -11
- data/AUTHORS +0 -1
- data/ChangeLog +0 -0
- data/README +0 -29
data/ext/pack.c
CHANGED
@@ -51,6 +51,15 @@ static ID s_append;
|
|
51
51
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); \
|
52
52
|
}
|
53
53
|
|
54
|
+
|
55
|
+
/*
|
56
|
+
* Document-method: NilClass#to_msgpack
|
57
|
+
*
|
58
|
+
* call-seq:
|
59
|
+
* nil.to_msgpack(out = '') -> String
|
60
|
+
*
|
61
|
+
* Serializes the nil into raw bytes.
|
62
|
+
*/
|
54
63
|
static VALUE MessagePack_NilClass_to_msgpack(int argc, VALUE *argv, VALUE self)
|
55
64
|
{
|
56
65
|
ARG_BUFFER(out, argc, argv);
|
@@ -58,6 +67,15 @@ static VALUE MessagePack_NilClass_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
58
67
|
return out;
|
59
68
|
}
|
60
69
|
|
70
|
+
|
71
|
+
/*
|
72
|
+
* Document-method: TrueClass#to_msgpack
|
73
|
+
*
|
74
|
+
* call-seq:
|
75
|
+
* true.to_msgpack(out = '') -> String
|
76
|
+
*
|
77
|
+
* Serializes the true into raw bytes.
|
78
|
+
*/
|
61
79
|
static VALUE MessagePack_TrueClass_to_msgpack(int argc, VALUE *argv, VALUE self)
|
62
80
|
{
|
63
81
|
ARG_BUFFER(out, argc, argv);
|
@@ -65,6 +83,15 @@ static VALUE MessagePack_TrueClass_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
65
83
|
return out;
|
66
84
|
}
|
67
85
|
|
86
|
+
|
87
|
+
/*
|
88
|
+
* Document-method: FalseClass#to_msgpack
|
89
|
+
*
|
90
|
+
* call-seq:
|
91
|
+
* false.to_msgpack(out = '') -> String
|
92
|
+
*
|
93
|
+
* Serializes false into raw bytes.
|
94
|
+
*/
|
68
95
|
static VALUE MessagePack_FalseClass_to_msgpack(int argc, VALUE *argv, VALUE self)
|
69
96
|
{
|
70
97
|
ARG_BUFFER(out, argc, argv);
|
@@ -73,6 +100,14 @@ static VALUE MessagePack_FalseClass_to_msgpack(int argc, VALUE *argv, VALUE self
|
|
73
100
|
}
|
74
101
|
|
75
102
|
|
103
|
+
/*
|
104
|
+
* Document-method: Fixnum#to_msgpack
|
105
|
+
*
|
106
|
+
* call-seq:
|
107
|
+
* fixnum.to_msgpack(out = '') -> String
|
108
|
+
*
|
109
|
+
* Serializes the Fixnum into raw bytes.
|
110
|
+
*/
|
76
111
|
static VALUE MessagePack_Fixnum_to_msgpack(int argc, VALUE *argv, VALUE self)
|
77
112
|
{
|
78
113
|
ARG_BUFFER(out, argc, argv);
|
@@ -85,6 +120,14 @@ static VALUE MessagePack_Fixnum_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
85
120
|
#define RBIGNUM_SIGN(b) (RBIGNUM(b)->sign)
|
86
121
|
#endif
|
87
122
|
|
123
|
+
/*
|
124
|
+
* Document-method: Bignum#to_msgpack
|
125
|
+
*
|
126
|
+
* call-seq:
|
127
|
+
* bignum.to_msgpack(out = '') -> String
|
128
|
+
*
|
129
|
+
* Serializes the Bignum into raw bytes.
|
130
|
+
*/
|
88
131
|
static VALUE MessagePack_Bignum_to_msgpack(int argc, VALUE *argv, VALUE self)
|
89
132
|
{
|
90
133
|
ARG_BUFFER(out, argc, argv);
|
@@ -97,6 +140,15 @@ static VALUE MessagePack_Bignum_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
97
140
|
return out;
|
98
141
|
}
|
99
142
|
|
143
|
+
|
144
|
+
/*
|
145
|
+
* Document-method: Float#to_msgpack
|
146
|
+
*
|
147
|
+
* call-seq:
|
148
|
+
* float.to_msgpack(out = '') -> String
|
149
|
+
*
|
150
|
+
* Serializes the Float into raw bytes.
|
151
|
+
*/
|
100
152
|
static VALUE MessagePack_Float_to_msgpack(int argc, VALUE *argv, VALUE self)
|
101
153
|
{
|
102
154
|
ARG_BUFFER(out, argc, argv);
|
@@ -104,6 +156,15 @@ static VALUE MessagePack_Float_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
104
156
|
return out;
|
105
157
|
}
|
106
158
|
|
159
|
+
|
160
|
+
/*
|
161
|
+
* Document-method: String#to_msgpack
|
162
|
+
*
|
163
|
+
* call-seq:
|
164
|
+
* string.to_msgpack(out = '') -> String
|
165
|
+
*
|
166
|
+
* Serializes the String into raw bytes.
|
167
|
+
*/
|
107
168
|
static VALUE MessagePack_String_to_msgpack(int argc, VALUE *argv, VALUE self)
|
108
169
|
{
|
109
170
|
ARG_BUFFER(out, argc, argv);
|
@@ -112,6 +173,15 @@ static VALUE MessagePack_String_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
112
173
|
return out;
|
113
174
|
}
|
114
175
|
|
176
|
+
|
177
|
+
/*
|
178
|
+
* Document-method: Symbol#to_msgpack
|
179
|
+
*
|
180
|
+
* call-seq:
|
181
|
+
* symbol.to_msgpack(out = '') -> String
|
182
|
+
*
|
183
|
+
* Serializes the Symbol into raw bytes.
|
184
|
+
*/
|
115
185
|
static VALUE MessagePack_Symbol_to_msgpack(int argc, VALUE *argv, VALUE self)
|
116
186
|
{
|
117
187
|
ARG_BUFFER(out, argc, argv);
|
@@ -122,6 +192,16 @@ static VALUE MessagePack_Symbol_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
122
192
|
return out;
|
123
193
|
}
|
124
194
|
|
195
|
+
|
196
|
+
/*
|
197
|
+
* Document-method: Array#to_msgpack
|
198
|
+
*
|
199
|
+
* call-seq:
|
200
|
+
* array.to_msgpack(out = '') -> String
|
201
|
+
*
|
202
|
+
* Serializes the Array into raw bytes.
|
203
|
+
* This calls to_msgpack method reflectively for internal elements.
|
204
|
+
*/
|
125
205
|
static VALUE MessagePack_Array_to_msgpack(int argc, VALUE *argv, VALUE self)
|
126
206
|
{
|
127
207
|
ARG_BUFFER(out, argc, argv);
|
@@ -134,6 +214,7 @@ static VALUE MessagePack_Array_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
134
214
|
return out;
|
135
215
|
}
|
136
216
|
|
217
|
+
|
137
218
|
#ifndef RHASH_SIZE // Ruby 1.8
|
138
219
|
#define RHASH_SIZE(h) (RHASH(h)->tbl ? RHASH(h)->tbl->num_entries : 0)
|
139
220
|
#endif
|
@@ -146,6 +227,15 @@ static int MessagePack_Hash_to_msgpack_foreach(VALUE key, VALUE value, VALUE out
|
|
146
227
|
return ST_CONTINUE;
|
147
228
|
}
|
148
229
|
|
230
|
+
/*
|
231
|
+
* Document-method: Hash#to_msgpack
|
232
|
+
*
|
233
|
+
* call-seq:
|
234
|
+
* hash.to_msgpack(out = '') -> String
|
235
|
+
*
|
236
|
+
* Serializes the Hash into raw bytes.
|
237
|
+
* This calls to_msgpack method reflectively for internal keys and values.
|
238
|
+
*/
|
149
239
|
static VALUE MessagePack_Hash_to_msgpack(int argc, VALUE *argv, VALUE self)
|
150
240
|
{
|
151
241
|
ARG_BUFFER(out, argc, argv);
|
@@ -155,6 +245,17 @@ static VALUE MessagePack_Hash_to_msgpack(int argc, VALUE *argv, VALUE self)
|
|
155
245
|
}
|
156
246
|
|
157
247
|
|
248
|
+
/**
|
249
|
+
* Document-method: MessagePack.pack
|
250
|
+
*
|
251
|
+
* call-seq:
|
252
|
+
* MessagePack.pack(object, out = '') -> String
|
253
|
+
*
|
254
|
+
* Serializes the object into raw bytes. The encoding of the string is ASCII-8BIT on Ruby 1.9.
|
255
|
+
* This method is same as object.to_msgpack(out = '').
|
256
|
+
*
|
257
|
+
* _out_ is an object that implements *<<* method like String or IO.
|
258
|
+
*/
|
158
259
|
static VALUE MessagePack_pack(int argc, VALUE* argv, VALUE self)
|
159
260
|
{
|
160
261
|
VALUE out;
|
@@ -173,16 +274,22 @@ void Init_msgpack_pack(VALUE mMessagePack)
|
|
173
274
|
{
|
174
275
|
s_to_msgpack = rb_intern("to_msgpack");
|
175
276
|
s_append = rb_intern("<<");
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
277
|
+
|
278
|
+
rb_define_method(rb_cNilClass, "to_msgpack", MessagePack_NilClass_to_msgpack, -1);
|
279
|
+
rb_define_method(rb_cTrueClass, "to_msgpack", MessagePack_TrueClass_to_msgpack, -1);
|
280
|
+
rb_define_method(rb_cFalseClass, "to_msgpack", MessagePack_FalseClass_to_msgpack, -1);
|
281
|
+
rb_define_method(rb_cFixnum, "to_msgpack", MessagePack_Fixnum_to_msgpack, -1);
|
282
|
+
rb_define_method(rb_cBignum, "to_msgpack", MessagePack_Bignum_to_msgpack, -1);
|
283
|
+
rb_define_method(rb_cFloat, "to_msgpack", MessagePack_Float_to_msgpack, -1);
|
284
|
+
rb_define_method(rb_cString, "to_msgpack", MessagePack_String_to_msgpack, -1);
|
285
|
+
rb_define_method(rb_cArray, "to_msgpack", MessagePack_Array_to_msgpack, -1);
|
286
|
+
rb_define_method(rb_cHash, "to_msgpack", MessagePack_Hash_to_msgpack, -1);
|
287
|
+
rb_define_method(rb_cSymbol, "to_msgpack", MessagePack_Symbol_to_msgpack, -1);
|
288
|
+
|
289
|
+
/**
|
290
|
+
* MessagePack module is defined in rbinit.c file.
|
291
|
+
* mMessagePack = rb_define_module("MessagePack");
|
292
|
+
*/
|
186
293
|
rb_define_module_function(mMessagePack, "pack", MessagePack_pack, -1);
|
187
294
|
}
|
188
295
|
|
data/ext/pack.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* MessagePack for Ruby packing routine
|
3
3
|
*
|
4
|
-
* Copyright (C) 2008-
|
4
|
+
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
5
5
|
*
|
6
6
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
* you may not use this file except in compliance with the License.
|
data/ext/rbinit.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* MessagePack for Ruby
|
3
3
|
*
|
4
|
-
* Copyright (C) 2008-
|
4
|
+
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
5
5
|
*
|
6
6
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
* you may not use this file except in compliance with the License.
|
@@ -20,6 +20,26 @@
|
|
20
20
|
|
21
21
|
static VALUE mMessagePack;
|
22
22
|
|
23
|
+
/**
|
24
|
+
* Document-module: MessagePack
|
25
|
+
*
|
26
|
+
* MessagePack is a binary-based efficient object serialization library.
|
27
|
+
* It enables to exchange structured objects between many languages like JSON.
|
28
|
+
* But unlike JSON, it is very fast and small.
|
29
|
+
*
|
30
|
+
* You can install MessagePack with rubygems.
|
31
|
+
*
|
32
|
+
* gem install msgpack
|
33
|
+
*
|
34
|
+
* Simple usage is as follows:
|
35
|
+
*
|
36
|
+
* require 'msgpack'
|
37
|
+
* msg = [1,2,3].to_msgpack #=> "\x93\x01\x02\x03"
|
38
|
+
* MessagePack.unpack(msg) #=> [1,2,3]
|
39
|
+
*
|
40
|
+
* Use Unpacker class for streaming deserialization.
|
41
|
+
*
|
42
|
+
*/
|
23
43
|
void Init_msgpack(void)
|
24
44
|
{
|
25
45
|
mMessagePack = rb_define_module("MessagePack");
|
data/ext/unpack.c
CHANGED
@@ -27,11 +27,17 @@ static ID s_readpartial;
|
|
27
27
|
int s_ascii_8bit;
|
28
28
|
#endif
|
29
29
|
|
30
|
+
struct unpack_buffer {
|
31
|
+
size_t size;
|
32
|
+
size_t free;
|
33
|
+
char* ptr;
|
34
|
+
};
|
35
|
+
|
30
36
|
typedef struct {
|
31
37
|
int finished;
|
32
38
|
VALUE source;
|
33
39
|
size_t offset;
|
34
|
-
|
40
|
+
struct unpack_buffer buffer;
|
35
41
|
VALUE stream;
|
36
42
|
VALUE streambuf;
|
37
43
|
ID stream_append_method;
|
@@ -124,7 +130,14 @@ static inline int template_callback_map_item(unpack_user* u, VALUE* c, VALUE k,
|
|
124
130
|
#endif
|
125
131
|
|
126
132
|
static inline int template_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, VALUE* o)
|
127
|
-
{
|
133
|
+
{
|
134
|
+
if(u->source == Qnil || l <= COW_MIN_SIZE) {
|
135
|
+
*o = rb_str_new(p, l);
|
136
|
+
} else {
|
137
|
+
*o = rb_str_substr(u->source, p - b, l);
|
138
|
+
}
|
139
|
+
return 0;
|
140
|
+
}
|
128
141
|
|
129
142
|
|
130
143
|
#include "msgpack/unpack_template.h"
|
@@ -203,20 +216,58 @@ static int template_execute_wrap(msgpack_unpack_t* mp,
|
|
203
216
|
return ret;
|
204
217
|
}
|
205
218
|
|
219
|
+
static int template_execute_wrap_each(msgpack_unpack_t* mp,
|
220
|
+
const char* ptr, size_t dlen, size_t* from)
|
221
|
+
{
|
222
|
+
VALUE args[4] = {
|
223
|
+
(VALUE)mp,
|
224
|
+
(VALUE)ptr,
|
225
|
+
(VALUE)dlen,
|
226
|
+
(VALUE)from,
|
227
|
+
};
|
228
|
+
|
229
|
+
// FIXME execute実行中はmp->topが更新されないのでGC markが機能しない
|
230
|
+
rb_gc_disable();
|
231
|
+
|
232
|
+
int ret = (int)rb_rescue(template_execute_do, (VALUE)args,
|
233
|
+
template_execute_rescue, Qnil);
|
234
|
+
|
235
|
+
rb_gc_enable();
|
236
|
+
|
237
|
+
return ret;
|
238
|
+
}
|
239
|
+
|
206
240
|
|
207
241
|
static VALUE cUnpacker;
|
242
|
+
|
243
|
+
|
244
|
+
/**
|
245
|
+
* Document-module: MessagePack::UnpackerError
|
246
|
+
*
|
247
|
+
*/
|
208
248
|
static VALUE eUnpackError;
|
209
249
|
|
210
250
|
|
251
|
+
#ifndef MSGPACK_UNPACKER_BUFFER_INIT_SIZE
|
252
|
+
#define MSGPACK_UNPACKER_BUFFER_INIT_SIZE (32*1024)
|
253
|
+
#endif
|
254
|
+
|
255
|
+
#ifndef MSGPACK_UNPACKER_BUFFER_RESERVE_SIZE
|
256
|
+
#define MSGPACK_UNPACKER_BUFFER_RESERVE_SIZE (8*1024)
|
257
|
+
#endif
|
258
|
+
|
211
259
|
static void MessagePack_Unpacker_free(void* data)
|
212
260
|
{
|
213
|
-
if(data) {
|
261
|
+
if(data) {
|
262
|
+
msgpack_unpack_t* mp = (msgpack_unpack_t*)data;
|
263
|
+
free(mp->user.buffer.ptr);
|
264
|
+
free(mp);
|
265
|
+
}
|
214
266
|
}
|
215
267
|
|
216
268
|
static void MessagePack_Unpacker_mark(msgpack_unpack_t *mp)
|
217
269
|
{
|
218
270
|
unsigned int i;
|
219
|
-
rb_gc_mark(mp->user.buffer);
|
220
271
|
rb_gc_mark(mp->user.stream);
|
221
272
|
rb_gc_mark(mp->user.streambuf);
|
222
273
|
for(i=0; i < mp->top; ++i) {
|
@@ -243,6 +294,22 @@ static ID append_method_of(VALUE stream)
|
|
243
294
|
}
|
244
295
|
}
|
245
296
|
|
297
|
+
/**
|
298
|
+
* Document-method: MessagePack::Unpacker#initialize
|
299
|
+
*
|
300
|
+
* call-seq:
|
301
|
+
* MessagePack::Unpacker.new(stream = nil)
|
302
|
+
*
|
303
|
+
* Creates instance of MessagePack::Unpacker.
|
304
|
+
*
|
305
|
+
* You can specify a _stream_ for input stream.
|
306
|
+
* It is required to implement *sysread* or *readpartial* method.
|
307
|
+
*
|
308
|
+
* With the input stream, buffers will be feeded into the deserializer automatically.
|
309
|
+
*
|
310
|
+
* Without the input stream, use *feed* method manually. Or you can manage the buffer manually
|
311
|
+
* with *execute*, *finished?*, *data* and *reset* methods.
|
312
|
+
*/
|
246
313
|
static VALUE MessagePack_Unpacker_initialize(int argc, VALUE *argv, VALUE self)
|
247
314
|
{
|
248
315
|
VALUE stream;
|
@@ -261,19 +328,38 @@ static VALUE MessagePack_Unpacker_initialize(int argc, VALUE *argv, VALUE self)
|
|
261
328
|
template_init(mp);
|
262
329
|
mp->user.finished = 0;
|
263
330
|
mp->user.offset = 0;
|
264
|
-
mp->user.buffer =
|
331
|
+
mp->user.buffer.size = 0;
|
332
|
+
mp->user.buffer.free = 0;
|
333
|
+
mp->user.buffer.ptr = NULL;
|
265
334
|
mp->user.stream = stream;
|
266
|
-
mp->user.streambuf =
|
335
|
+
mp->user.streambuf = rb_str_buf_new(MSGPACK_UNPACKER_BUFFER_RESERVE_SIZE);
|
267
336
|
mp->user.stream_append_method = append_method_of(stream);
|
268
337
|
return self;
|
269
338
|
}
|
270
339
|
|
340
|
+
|
341
|
+
/**
|
342
|
+
* Document-method: MessagePack::Unpacker#stream
|
343
|
+
*
|
344
|
+
* call-seq:
|
345
|
+
* unpacker.stream
|
346
|
+
*
|
347
|
+
* Gets the input stream.
|
348
|
+
*/
|
271
349
|
static VALUE MessagePack_Unpacker_stream_get(VALUE self)
|
272
350
|
{
|
273
351
|
UNPACKER(self, mp);
|
274
352
|
return mp->user.stream;
|
275
353
|
}
|
276
354
|
|
355
|
+
/**
|
356
|
+
* Document-method: MessagePack::Unpacker#stream=
|
357
|
+
*
|
358
|
+
* call-seq:
|
359
|
+
* unpacker.stream = stream
|
360
|
+
*
|
361
|
+
* Resets the input stream. You can set nil not to use input stream.
|
362
|
+
*/
|
277
363
|
static VALUE MessagePack_Unpacker_stream_set(VALUE self, VALUE val)
|
278
364
|
{
|
279
365
|
UNPACKER(self, mp);
|
@@ -282,14 +368,126 @@ static VALUE MessagePack_Unpacker_stream_set(VALUE self, VALUE val)
|
|
282
368
|
return val;
|
283
369
|
}
|
284
370
|
|
371
|
+
|
372
|
+
#ifdef RUBY_VM
|
373
|
+
# ifndef STR_SHARED
|
374
|
+
# define STR_SHARED FL_USER2
|
375
|
+
# endif
|
376
|
+
# ifndef STR_NOEMBED
|
377
|
+
# define STR_NOEMBED FL_USER1
|
378
|
+
# endif
|
379
|
+
# ifndef STR_ASSOC
|
380
|
+
# define STR_ASSOC FL_USER3
|
381
|
+
# endif
|
382
|
+
# ifndef STR_NOCAPA_P
|
383
|
+
# define STR_NOCAPA_P(s) (FL_TEST(s,STR_NOEMBED) && FL_ANY(s,STR_SHARED|STR_ASSOC))
|
384
|
+
# endif
|
385
|
+
# define NEED_MORE_CAPA(s,size) (!STR_NOCAPA_P(s) && RSTRING(s)->as.heap.aux.capa < size)
|
386
|
+
#else
|
387
|
+
# ifndef STR_NOCAPA
|
388
|
+
# ifndef STR_ASSOC
|
389
|
+
# define STR_ASSOC FL_USER3
|
390
|
+
# endif
|
391
|
+
# ifndef ELTS_SHARED
|
392
|
+
# define ELTS_SHARED FL_USER2
|
393
|
+
# endif
|
394
|
+
# define STR_NOCAPA (ELTS_SHARED|STR_ASSOC)
|
395
|
+
# endif
|
396
|
+
# define NEED_MORE_CAPA(s,size) (!FL_TEST(s,STR_NOCAPA) && RSTRING(s)->aux.capa < size)
|
397
|
+
#endif
|
398
|
+
|
399
|
+
static void feed_buffer(msgpack_unpack_t* mp, const char* ptr, size_t len)
|
400
|
+
{
|
401
|
+
struct unpack_buffer* buffer = &mp->user.buffer;
|
402
|
+
|
403
|
+
if(buffer->size == 0) {
|
404
|
+
char* tmp = (char*)malloc(MSGPACK_UNPACKER_BUFFER_INIT_SIZE);
|
405
|
+
// FIXME check tmp == NULL
|
406
|
+
buffer->ptr = tmp;
|
407
|
+
buffer->free = MSGPACK_UNPACKER_BUFFER_INIT_SIZE;
|
408
|
+
buffer->size = 0;
|
409
|
+
|
410
|
+
} else if(buffer->size <= mp->user.offset) {
|
411
|
+
/* clear buffer and rewind offset */
|
412
|
+
buffer->free += buffer->size;
|
413
|
+
buffer->size = 0;
|
414
|
+
mp->user.offset = 0;
|
415
|
+
}
|
416
|
+
|
417
|
+
if(len <= buffer->free) {
|
418
|
+
/* enough free space: just copy */
|
419
|
+
memcpy(buffer->ptr+buffer->size, ptr, len);
|
420
|
+
buffer->size += len;
|
421
|
+
buffer->free -= len;
|
422
|
+
return;
|
423
|
+
}
|
424
|
+
|
425
|
+
size_t csize = buffer->size + buffer->free;
|
426
|
+
|
427
|
+
if(mp->user.offset <= buffer->size / 2) {
|
428
|
+
/* parsed less than half: realloc and copy */
|
429
|
+
csize *= 2;
|
430
|
+
while(csize < buffer->size + len) {
|
431
|
+
csize *= 2;
|
432
|
+
}
|
433
|
+
char* tmp = (char*)realloc(buffer->ptr, csize);
|
434
|
+
// FIXME check tmp == NULL
|
435
|
+
memcpy(tmp + buffer->size, ptr, len);
|
436
|
+
buffer->ptr = tmp;
|
437
|
+
buffer->free = csize - buffer->size;
|
438
|
+
return;
|
439
|
+
}
|
440
|
+
|
441
|
+
size_t not_parsed = buffer->size - mp->user.offset;
|
442
|
+
|
443
|
+
if(csize < not_parsed + len) {
|
444
|
+
/* more buffer size */
|
445
|
+
csize *= 2;
|
446
|
+
while(csize < not_parsed + len) {
|
447
|
+
csize *= 2;
|
448
|
+
}
|
449
|
+
char* tmp = (char*)realloc(buffer->ptr, csize);
|
450
|
+
// FIXME check tmp == NULL
|
451
|
+
buffer->ptr = tmp;
|
452
|
+
}
|
453
|
+
|
454
|
+
memcpy(buffer->ptr+not_parsed, ptr, not_parsed);
|
455
|
+
buffer->size = not_parsed;
|
456
|
+
buffer->free = csize - buffer->size;
|
457
|
+
buffer->ptr = buffer->ptr;
|
458
|
+
mp->user.offset = 0;
|
459
|
+
}
|
460
|
+
|
461
|
+
/**
|
462
|
+
* Document-method: MessagePack::Unpacker#feed
|
463
|
+
*
|
464
|
+
* call-seq:
|
465
|
+
* unpacker.feed(data)
|
466
|
+
*
|
467
|
+
* Fills the internal buffer with the specified buffer.
|
468
|
+
*/
|
285
469
|
static VALUE MessagePack_Unpacker_feed(VALUE self, VALUE data)
|
286
470
|
{
|
287
471
|
UNPACKER(self, mp);
|
288
472
|
StringValue(data);
|
289
|
-
|
473
|
+
feed_buffer(mp, RSTRING_PTR(data), RSTRING_LEN(data));
|
290
474
|
return Qnil;
|
291
475
|
}
|
292
476
|
|
477
|
+
/**
|
478
|
+
* Document-method: MessagePack::Unpacker#fill
|
479
|
+
*
|
480
|
+
* call-seq:
|
481
|
+
* unpacker.fill -> length of read data
|
482
|
+
*
|
483
|
+
* Fills the internal buffer using the input stream.
|
484
|
+
*
|
485
|
+
* If the input stream is not specified, it returns nil.
|
486
|
+
* You can set it on *initialize* or *stream=* methods.
|
487
|
+
*
|
488
|
+
* This methods raises exceptions that _stream.sysread_ or
|
489
|
+
* _stream.readpartial_ method raises.
|
490
|
+
*/
|
293
491
|
static VALUE MessagePack_Unpacker_fill(VALUE self)
|
294
492
|
{
|
295
493
|
UNPACKER(self, mp);
|
@@ -298,21 +496,28 @@ static VALUE MessagePack_Unpacker_fill(VALUE self)
|
|
298
496
|
return Qnil;
|
299
497
|
}
|
300
498
|
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
rb_funcall(mp->user.stream, mp->user.stream_append_method, 2,
|
308
|
-
LONG2FIX(64*1024), mp->user.streambuf);
|
309
|
-
len = RSTRING_LEN(mp->user.streambuf);
|
310
|
-
rb_str_cat(mp->user.buffer, RSTRING_PTR(mp->user.streambuf), RSTRING_LEN(mp->user.streambuf));
|
311
|
-
}
|
499
|
+
rb_funcall(mp->user.stream, mp->user.stream_append_method, 2,
|
500
|
+
LONG2FIX(MSGPACK_UNPACKER_BUFFER_RESERVE_SIZE),
|
501
|
+
mp->user.streambuf);
|
502
|
+
|
503
|
+
size_t len = RSTRING_LEN(mp->user.streambuf);
|
504
|
+
feed_buffer(mp, RSTRING_PTR(mp->user.streambuf), len);
|
312
505
|
|
313
506
|
return LONG2FIX(len);
|
314
507
|
}
|
315
508
|
|
509
|
+
|
510
|
+
/**
|
511
|
+
* Document-method: MessagePack::Unpacker#each
|
512
|
+
*
|
513
|
+
* call-seq:
|
514
|
+
* unpacker.each {|object| }
|
515
|
+
*
|
516
|
+
* Deserializes objects repeatedly. This calls *fill* method automatically.
|
517
|
+
*
|
518
|
+
* UnpackError is throw when parse error is occured.
|
519
|
+
* This method raises exceptions that *fill* method raises.
|
520
|
+
*/
|
316
521
|
static VALUE MessagePack_Unpacker_each(VALUE self)
|
317
522
|
{
|
318
523
|
UNPACKER(self, mp);
|
@@ -323,7 +528,7 @@ static VALUE MessagePack_Unpacker_each(VALUE self)
|
|
323
528
|
#endif
|
324
529
|
|
325
530
|
while(1) {
|
326
|
-
if(
|
531
|
+
if(mp->user.buffer.size <= mp->user.offset) {
|
327
532
|
do_fill:
|
328
533
|
{
|
329
534
|
VALUE len = MessagePack_Unpacker_fill(self);
|
@@ -333,8 +538,9 @@ static VALUE MessagePack_Unpacker_each(VALUE self)
|
|
333
538
|
}
|
334
539
|
}
|
335
540
|
|
336
|
-
ret =
|
337
|
-
|
541
|
+
ret = template_execute_wrap_each(mp,
|
542
|
+
mp->user.buffer.ptr, mp->user.buffer.size,
|
543
|
+
&mp->user.offset);
|
338
544
|
|
339
545
|
if(ret < 0) {
|
340
546
|
rb_raise(eUnpackError, "parse error.");
|
@@ -352,6 +558,7 @@ static VALUE MessagePack_Unpacker_each(VALUE self)
|
|
352
558
|
return Qnil;
|
353
559
|
}
|
354
560
|
|
561
|
+
|
355
562
|
static inline VALUE MessagePack_unpack_impl(VALUE self, VALUE data, unsigned long dlen)
|
356
563
|
{
|
357
564
|
msgpack_unpack_t mp;
|
@@ -376,12 +583,34 @@ static inline VALUE MessagePack_unpack_impl(VALUE self, VALUE data, unsigned lon
|
|
376
583
|
}
|
377
584
|
}
|
378
585
|
|
586
|
+
/**
|
587
|
+
* Document-method: MessagePack::Unpacker.unpack_limit
|
588
|
+
*
|
589
|
+
* call-seq:
|
590
|
+
* MessagePack::Unpacker.unpack_limit(data, limit) -> object
|
591
|
+
*
|
592
|
+
* Deserializes one object over the specified buffer upto _limit_ bytes.
|
593
|
+
*
|
594
|
+
* UnpackError is throw when parse error is occured, the buffer is insufficient
|
595
|
+
* to deserialize one object or there are extra bytes.
|
596
|
+
*/
|
379
597
|
static VALUE MessagePack_unpack_limit(VALUE self, VALUE data, VALUE limit)
|
380
598
|
{
|
381
599
|
CHECK_STRING_TYPE(data);
|
382
600
|
return MessagePack_unpack_impl(self, data, NUM2ULONG(limit));
|
383
601
|
}
|
384
602
|
|
603
|
+
/**
|
604
|
+
* Document-method: MessagePack::Unpacker.unpack
|
605
|
+
*
|
606
|
+
* call-seq:
|
607
|
+
* MessagePack::Unpacker.unpack(data) -> object
|
608
|
+
*
|
609
|
+
* Deserializes one object over the specified buffer.
|
610
|
+
*
|
611
|
+
* UnpackError is throw when parse error is occured, the buffer is insufficient
|
612
|
+
* to deserialize one object or there are extra bytes.
|
613
|
+
*/
|
385
614
|
static VALUE MessagePack_unpack(VALUE self, VALUE data)
|
386
615
|
{
|
387
616
|
CHECK_STRING_TYPE(data);
|
@@ -411,7 +640,20 @@ static VALUE MessagePack_Unpacker_execute_impl(VALUE self, VALUE data,
|
|
411
640
|
}
|
412
641
|
}
|
413
642
|
|
414
|
-
|
643
|
+
/**
|
644
|
+
* Document-method: MessagePack::Unpacker#execute_limit
|
645
|
+
*
|
646
|
+
* call-seq:
|
647
|
+
* unpacker.unpack_limit(data, offset, limit) -> next offset
|
648
|
+
*
|
649
|
+
* Deserializes one object over the specified buffer from _offset_ bytes upto _limit_ bytes.
|
650
|
+
*
|
651
|
+
* This method doesn't use the internal buffer.
|
652
|
+
*
|
653
|
+
* Call *reset()* method before calling this method again.
|
654
|
+
*
|
655
|
+
* UnpackError is throw when parse error is occured.
|
656
|
+
*/
|
415
657
|
static VALUE MessagePack_Unpacker_execute_limit(VALUE self, VALUE data,
|
416
658
|
VALUE off, VALUE limit)
|
417
659
|
{
|
@@ -420,7 +662,24 @@ static VALUE MessagePack_Unpacker_execute_limit(VALUE self, VALUE data,
|
|
420
662
|
(size_t)NUM2ULONG(off), (size_t)NUM2ULONG(limit));
|
421
663
|
}
|
422
664
|
|
423
|
-
|
665
|
+
/**
|
666
|
+
* Document-method: MessagePack::Unpacker#execute
|
667
|
+
*
|
668
|
+
* call-seq:
|
669
|
+
* unpacker.unpack(data, offset) -> next offset
|
670
|
+
*
|
671
|
+
* Deserializes one object over the specified buffer from _offset_ bytes.
|
672
|
+
*
|
673
|
+
* This method doesn't use the internal buffer.
|
674
|
+
*
|
675
|
+
* Call *reset()* method before calling this method again.
|
676
|
+
*
|
677
|
+
* This returns offset that was parsed to.
|
678
|
+
* Use *finished?* method to check an object is deserialized and call *data*
|
679
|
+
* method if it returns true.
|
680
|
+
*
|
681
|
+
* UnpackError is throw when parse error is occured.
|
682
|
+
*/
|
424
683
|
static VALUE MessagePack_Unpacker_execute(VALUE self, VALUE data, VALUE off)
|
425
684
|
{
|
426
685
|
CHECK_STRING_TYPE(data);
|
@@ -428,7 +687,16 @@ static VALUE MessagePack_Unpacker_execute(VALUE self, VALUE data, VALUE off)
|
|
428
687
|
(size_t)NUM2ULONG(off), (size_t)RSTRING_LEN(data));
|
429
688
|
}
|
430
689
|
|
431
|
-
|
690
|
+
/**
|
691
|
+
* Document-method: MessagePack::Unpacker#finished?
|
692
|
+
*
|
693
|
+
* call-seq:
|
694
|
+
* unpacker.finished?
|
695
|
+
*
|
696
|
+
* Returns true if an object is ready to get with data method.
|
697
|
+
*
|
698
|
+
* Use this method with execute method.
|
699
|
+
*/
|
432
700
|
static VALUE MessagePack_Unpacker_finished_p(VALUE self)
|
433
701
|
{
|
434
702
|
UNPACKER(self, mp);
|
@@ -438,14 +706,30 @@ static VALUE MessagePack_Unpacker_finished_p(VALUE self)
|
|
438
706
|
return Qfalse;
|
439
707
|
}
|
440
708
|
|
441
|
-
|
709
|
+
/**
|
710
|
+
* Document-method: MessagePack::Unpacker#data
|
711
|
+
*
|
712
|
+
* call-seq:
|
713
|
+
* unpacker.data
|
714
|
+
*
|
715
|
+
* Gets the object deserialized by execute method.
|
716
|
+
*
|
717
|
+
* Use this method with execute method.
|
718
|
+
*/
|
442
719
|
static VALUE MessagePack_Unpacker_data(VALUE self)
|
443
720
|
{
|
444
721
|
UNPACKER(self, mp);
|
445
722
|
return template_data(mp);
|
446
723
|
}
|
447
724
|
|
448
|
-
|
725
|
+
/**
|
726
|
+
* Document-method: MessagePack::Unpacker#reset
|
727
|
+
*
|
728
|
+
* call-seq:
|
729
|
+
* unpacker.reset
|
730
|
+
*
|
731
|
+
* Resets the internal state of the unpacker.
|
732
|
+
*/
|
449
733
|
static VALUE MessagePack_Unpacker_reset(VALUE self)
|
450
734
|
{
|
451
735
|
UNPACKER(self, mp);
|
@@ -467,20 +751,97 @@ void Init_msgpack_unpack(VALUE mMessagePack)
|
|
467
751
|
eUnpackError = rb_define_class_under(mMessagePack, "UnpackError", rb_eStandardError);
|
468
752
|
cUnpacker = rb_define_class_under(mMessagePack, "Unpacker", rb_cObject);
|
469
753
|
rb_define_alloc_func(cUnpacker, MessagePack_Unpacker_alloc);
|
754
|
+
|
470
755
|
rb_define_method(cUnpacker, "initialize", MessagePack_Unpacker_initialize, -1);
|
756
|
+
|
757
|
+
/* Buffered API */
|
471
758
|
rb_define_method(cUnpacker, "feed", MessagePack_Unpacker_feed, 1);
|
472
759
|
rb_define_method(cUnpacker, "fill", MessagePack_Unpacker_fill, 0);
|
473
760
|
rb_define_method(cUnpacker, "each", MessagePack_Unpacker_each, 0);
|
474
761
|
rb_define_method(cUnpacker, "stream", MessagePack_Unpacker_stream_get, 0);
|
475
762
|
rb_define_method(cUnpacker, "stream=", MessagePack_Unpacker_stream_set, 1);
|
476
|
-
rb_define_module_function(mMessagePack, "unpack", MessagePack_unpack, 1);
|
477
|
-
rb_define_module_function(mMessagePack, "unpack_limit", MessagePack_unpack_limit, 2);
|
478
763
|
|
479
|
-
/*
|
764
|
+
/* Unbuffered API */
|
480
765
|
rb_define_method(cUnpacker, "execute", MessagePack_Unpacker_execute, 2);
|
481
766
|
rb_define_method(cUnpacker, "execute_limit", MessagePack_Unpacker_execute_limit, 3);
|
482
767
|
rb_define_method(cUnpacker, "finished?", MessagePack_Unpacker_finished_p, 0);
|
483
768
|
rb_define_method(cUnpacker, "data", MessagePack_Unpacker_data, 0);
|
484
769
|
rb_define_method(cUnpacker, "reset", MessagePack_Unpacker_reset, 0);
|
770
|
+
|
771
|
+
/**
|
772
|
+
* MessagePack module is defined in rbinit.c file.
|
773
|
+
* mMessagePack = rb_define_module("MessagePack");
|
774
|
+
*/
|
775
|
+
rb_define_module_function(mMessagePack, "unpack", MessagePack_unpack, 1);
|
776
|
+
rb_define_module_function(mMessagePack, "unpack_limit", MessagePack_unpack_limit, 2);
|
485
777
|
}
|
486
778
|
|
779
|
+
/**
|
780
|
+
* Document-module: MessagePack::Unpacker
|
781
|
+
*
|
782
|
+
* Deserializer class that includes Buffered API and Unbuffered API.
|
783
|
+
*
|
784
|
+
*
|
785
|
+
* Buffered API uses the internal buffer of the Unpacker.
|
786
|
+
* Following code uses Buffered API with an input stream:
|
787
|
+
*
|
788
|
+
* # create an unpacker with input stream.
|
789
|
+
* pac = MessagePack::Unpacker.new(STDIN)
|
790
|
+
*
|
791
|
+
* # deserialize object one after another.
|
792
|
+
* pac.each {|obj|
|
793
|
+
* # ...
|
794
|
+
* }
|
795
|
+
*
|
796
|
+
*
|
797
|
+
* Following code doesn't use the input stream and feeds buffer
|
798
|
+
* manually. This is useful to use special stream or with
|
799
|
+
* event-driven I/O library.
|
800
|
+
*
|
801
|
+
* # create an unpacker without input stream.
|
802
|
+
* pac = MessagePack::Unpacker.new()
|
803
|
+
*
|
804
|
+
* # feed buffer to the internal buffer.
|
805
|
+
* pac.feed(input_bytes)
|
806
|
+
*
|
807
|
+
* # deserialize object one after another.
|
808
|
+
* pac.each {|obj|
|
809
|
+
* # ...
|
810
|
+
* }
|
811
|
+
*
|
812
|
+
*
|
813
|
+
* You can manage the buffer manually with the combination of
|
814
|
+
* *execute*, *finished?*, *data* and *reset* method.
|
815
|
+
*
|
816
|
+
* # create an unpacker.
|
817
|
+
* pac = MessagePack::Unpacker.new()
|
818
|
+
*
|
819
|
+
* # manage buffer and offset manually.
|
820
|
+
* offset = 0
|
821
|
+
* buffer = ''
|
822
|
+
*
|
823
|
+
* # read some data into the buffer.
|
824
|
+
* buffer << [1,2,3].to_msgpack
|
825
|
+
* buffer << [4,5,6].to_msgpack
|
826
|
+
*
|
827
|
+
* while true
|
828
|
+
* offset = pac.execute(buffer, offset)
|
829
|
+
*
|
830
|
+
* if pac.finished?
|
831
|
+
* obj = pac.data
|
832
|
+
*
|
833
|
+
* buffer.slice!(0, offset)
|
834
|
+
* offset = 0
|
835
|
+
* pac.reset
|
836
|
+
*
|
837
|
+
* # do something with the object
|
838
|
+
* # ...
|
839
|
+
*
|
840
|
+
* # repeat execution if there are more data.
|
841
|
+
* next unless buffer.empty?
|
842
|
+
* end
|
843
|
+
*
|
844
|
+
* break
|
845
|
+
* end
|
846
|
+
*/
|
847
|
+
|
data/ext/unpack.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* MessagePack for Ruby unpacking routine
|
3
3
|
*
|
4
|
-
* Copyright (C) 2008-
|
4
|
+
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
5
5
|
*
|
6
6
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
* you may not use this file except in compliance with the License.
|
data/msgpack/pack_template.h
CHANGED
@@ -16,12 +16,12 @@
|
|
16
16
|
* limitations under the License.
|
17
17
|
*/
|
18
18
|
|
19
|
-
#
|
19
|
+
#if defined(__LITTLE_ENDIAN__)
|
20
20
|
#define TAKE8_8(d) ((uint8_t*)&d)[0]
|
21
21
|
#define TAKE8_16(d) ((uint8_t*)&d)[0]
|
22
22
|
#define TAKE8_32(d) ((uint8_t*)&d)[0]
|
23
23
|
#define TAKE8_64(d) ((uint8_t*)&d)[0]
|
24
|
-
#elif __BIG_ENDIAN__
|
24
|
+
#elif defined(__BIG_ENDIAN__)
|
25
25
|
#define TAKE8_8(d) ((uint8_t*)&d)[0]
|
26
26
|
#define TAKE8_16(d) ((uint8_t*)&d)[1]
|
27
27
|
#define TAKE8_32(d) ((uint8_t*)&d)[3]
|
@@ -377,14 +377,24 @@ msgpack_pack_inline_func(_int64)(msgpack_pack_user x, int64_t d)
|
|
377
377
|
|
378
378
|
msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d)
|
379
379
|
{
|
380
|
-
#if defined(SIZEOF_SHORT)
|
381
|
-
#if SIZEOF_SHORT == 2
|
380
|
+
#if defined(SIZEOF_SHORT)
|
381
|
+
#if SIZEOF_SHORT == 2
|
382
382
|
msgpack_pack_real_int16(x, d);
|
383
|
-
#elif SIZEOF_SHORT == 4
|
383
|
+
#elif SIZEOF_SHORT == 4
|
384
384
|
msgpack_pack_real_int32(x, d);
|
385
385
|
#else
|
386
386
|
msgpack_pack_real_int64(x, d);
|
387
387
|
#endif
|
388
|
+
|
389
|
+
#elif defined(SHRT_MAX)
|
390
|
+
#if SHRT_MAX == 0x7fff
|
391
|
+
msgpack_pack_real_int16(x, d);
|
392
|
+
#elif SHRT_MAX == 0x7fffffff
|
393
|
+
msgpack_pack_real_int32(x, d);
|
394
|
+
#else
|
395
|
+
msgpack_pack_real_int64(x, d);
|
396
|
+
#endif
|
397
|
+
|
388
398
|
#else
|
389
399
|
if(sizeof(short) == 2) {
|
390
400
|
msgpack_pack_real_int16(x, d);
|
@@ -398,14 +408,24 @@ if(sizeof(short) == 2) {
|
|
398
408
|
|
399
409
|
msgpack_pack_inline_func_cint(_int)(msgpack_pack_user x, int d)
|
400
410
|
{
|
401
|
-
#if defined(SIZEOF_INT)
|
402
|
-
#if SIZEOF_INT == 2
|
411
|
+
#if defined(SIZEOF_INT)
|
412
|
+
#if SIZEOF_INT == 2
|
403
413
|
msgpack_pack_real_int16(x, d);
|
404
|
-
#elif SIZEOF_INT == 4
|
414
|
+
#elif SIZEOF_INT == 4
|
405
415
|
msgpack_pack_real_int32(x, d);
|
406
416
|
#else
|
407
417
|
msgpack_pack_real_int64(x, d);
|
408
418
|
#endif
|
419
|
+
|
420
|
+
#elif defined(INT_MAX)
|
421
|
+
#if INT_MAX == 0x7fff
|
422
|
+
msgpack_pack_real_int16(x, d);
|
423
|
+
#elif INT_MAX == 0x7fffffff
|
424
|
+
msgpack_pack_real_int32(x, d);
|
425
|
+
#else
|
426
|
+
msgpack_pack_real_int64(x, d);
|
427
|
+
#endif
|
428
|
+
|
409
429
|
#else
|
410
430
|
if(sizeof(int) == 2) {
|
411
431
|
msgpack_pack_real_int16(x, d);
|
@@ -419,14 +439,24 @@ if(sizeof(int) == 2) {
|
|
419
439
|
|
420
440
|
msgpack_pack_inline_func_cint(_long)(msgpack_pack_user x, long d)
|
421
441
|
{
|
422
|
-
#if defined(SIZEOF_LONG)
|
423
|
-
#if SIZEOF_LONG == 2
|
442
|
+
#if defined(SIZEOF_LONG)
|
443
|
+
#if SIZEOF_LONG == 2
|
424
444
|
msgpack_pack_real_int16(x, d);
|
425
|
-
#elif SIZEOF_LONG == 4
|
445
|
+
#elif SIZEOF_LONG == 4
|
426
446
|
msgpack_pack_real_int32(x, d);
|
427
447
|
#else
|
428
448
|
msgpack_pack_real_int64(x, d);
|
429
449
|
#endif
|
450
|
+
|
451
|
+
#elif defined(LONG_MAX)
|
452
|
+
#if LONG_MAX == 0x7fffL
|
453
|
+
msgpack_pack_real_int16(x, d);
|
454
|
+
#elif LONG_MAX == 0x7fffffffL
|
455
|
+
msgpack_pack_real_int32(x, d);
|
456
|
+
#else
|
457
|
+
msgpack_pack_real_int64(x, d);
|
458
|
+
#endif
|
459
|
+
|
430
460
|
#else
|
431
461
|
if(sizeof(long) == 2) {
|
432
462
|
msgpack_pack_real_int16(x, d);
|
@@ -440,14 +470,24 @@ if(sizeof(long) == 2) {
|
|
440
470
|
|
441
471
|
msgpack_pack_inline_func_cint(_long_long)(msgpack_pack_user x, long long d)
|
442
472
|
{
|
443
|
-
#if defined(SIZEOF_LONG_LONG)
|
444
|
-
#if SIZEOF_LONG_LONG == 2
|
473
|
+
#if defined(SIZEOF_LONG_LONG)
|
474
|
+
#if SIZEOF_LONG_LONG == 2
|
475
|
+
msgpack_pack_real_int16(x, d);
|
476
|
+
#elif SIZEOF_LONG_LONG == 4
|
477
|
+
msgpack_pack_real_int32(x, d);
|
478
|
+
#else
|
479
|
+
msgpack_pack_real_int64(x, d);
|
480
|
+
#endif
|
481
|
+
|
482
|
+
#elif defined(LLONG_MAX)
|
483
|
+
#if LLONG_MAX == 0x7fffL
|
445
484
|
msgpack_pack_real_int16(x, d);
|
446
|
-
#elif
|
485
|
+
#elif LLONG_MAX == 0x7fffffffL
|
447
486
|
msgpack_pack_real_int32(x, d);
|
448
487
|
#else
|
449
488
|
msgpack_pack_real_int64(x, d);
|
450
489
|
#endif
|
490
|
+
|
451
491
|
#else
|
452
492
|
if(sizeof(long long) == 2) {
|
453
493
|
msgpack_pack_real_int16(x, d);
|
@@ -461,14 +501,24 @@ if(sizeof(long long) == 2) {
|
|
461
501
|
|
462
502
|
msgpack_pack_inline_func_cint(_unsigned_short)(msgpack_pack_user x, unsigned short d)
|
463
503
|
{
|
464
|
-
#if defined(SIZEOF_SHORT)
|
465
|
-
#if SIZEOF_SHORT == 2
|
504
|
+
#if defined(SIZEOF_SHORT)
|
505
|
+
#if SIZEOF_SHORT == 2
|
506
|
+
msgpack_pack_real_uint16(x, d);
|
507
|
+
#elif SIZEOF_SHORT == 4
|
508
|
+
msgpack_pack_real_uint32(x, d);
|
509
|
+
#else
|
510
|
+
msgpack_pack_real_uint64(x, d);
|
511
|
+
#endif
|
512
|
+
|
513
|
+
#elif defined(USHRT_MAX)
|
514
|
+
#if USHRT_MAX == 0xffffU
|
466
515
|
msgpack_pack_real_uint16(x, d);
|
467
|
-
#elif
|
516
|
+
#elif USHRT_MAX == 0xffffffffU
|
468
517
|
msgpack_pack_real_uint32(x, d);
|
469
518
|
#else
|
470
519
|
msgpack_pack_real_uint64(x, d);
|
471
520
|
#endif
|
521
|
+
|
472
522
|
#else
|
473
523
|
if(sizeof(unsigned short) == 2) {
|
474
524
|
msgpack_pack_real_uint16(x, d);
|
@@ -482,14 +532,24 @@ if(sizeof(unsigned short) == 2) {
|
|
482
532
|
|
483
533
|
msgpack_pack_inline_func_cint(_unsigned_int)(msgpack_pack_user x, unsigned int d)
|
484
534
|
{
|
485
|
-
#if defined(SIZEOF_INT)
|
486
|
-
#if SIZEOF_INT == 2
|
535
|
+
#if defined(SIZEOF_INT)
|
536
|
+
#if SIZEOF_INT == 2
|
487
537
|
msgpack_pack_real_uint16(x, d);
|
488
|
-
#elif SIZEOF_INT == 4
|
538
|
+
#elif SIZEOF_INT == 4
|
489
539
|
msgpack_pack_real_uint32(x, d);
|
490
540
|
#else
|
491
541
|
msgpack_pack_real_uint64(x, d);
|
492
542
|
#endif
|
543
|
+
|
544
|
+
#elif defined(UINT_MAX)
|
545
|
+
#if UINT_MAX == 0xffffU
|
546
|
+
msgpack_pack_real_uint16(x, d);
|
547
|
+
#elif UINT_MAX == 0xffffffffU
|
548
|
+
msgpack_pack_real_uint32(x, d);
|
549
|
+
#else
|
550
|
+
msgpack_pack_real_uint64(x, d);
|
551
|
+
#endif
|
552
|
+
|
493
553
|
#else
|
494
554
|
if(sizeof(unsigned int) == 2) {
|
495
555
|
msgpack_pack_real_uint16(x, d);
|
@@ -503,18 +563,28 @@ if(sizeof(unsigned int) == 2) {
|
|
503
563
|
|
504
564
|
msgpack_pack_inline_func_cint(_unsigned_long)(msgpack_pack_user x, unsigned long d)
|
505
565
|
{
|
506
|
-
#if defined(SIZEOF_LONG)
|
507
|
-
#if SIZEOF_LONG == 2
|
566
|
+
#if defined(SIZEOF_LONG)
|
567
|
+
#if SIZEOF_LONG == 2
|
508
568
|
msgpack_pack_real_uint16(x, d);
|
509
|
-
#elif SIZEOF_LONG == 4
|
569
|
+
#elif SIZEOF_LONG == 4
|
510
570
|
msgpack_pack_real_uint32(x, d);
|
511
571
|
#else
|
512
572
|
msgpack_pack_real_uint64(x, d);
|
513
573
|
#endif
|
574
|
+
|
575
|
+
#elif defined(ULONG_MAX)
|
576
|
+
#if ULONG_MAX == 0xffffUL
|
577
|
+
msgpack_pack_real_uint16(x, d);
|
578
|
+
#elif ULONG_MAX == 0xffffffffUL
|
579
|
+
msgpack_pack_real_uint32(x, d);
|
514
580
|
#else
|
515
|
-
|
581
|
+
msgpack_pack_real_uint64(x, d);
|
582
|
+
#endif
|
583
|
+
|
584
|
+
#else
|
585
|
+
if(sizeof(unsigned long) == 2) {
|
516
586
|
msgpack_pack_real_uint16(x, d);
|
517
|
-
} else if(sizeof(unsigned
|
587
|
+
} else if(sizeof(unsigned long) == 4) {
|
518
588
|
msgpack_pack_real_uint32(x, d);
|
519
589
|
} else {
|
520
590
|
msgpack_pack_real_uint64(x, d);
|
@@ -524,14 +594,24 @@ if(sizeof(unsigned int) == 2) {
|
|
524
594
|
|
525
595
|
msgpack_pack_inline_func_cint(_unsigned_long_long)(msgpack_pack_user x, unsigned long long d)
|
526
596
|
{
|
527
|
-
#if defined(SIZEOF_LONG_LONG)
|
528
|
-
#if SIZEOF_LONG_LONG == 2
|
597
|
+
#if defined(SIZEOF_LONG_LONG)
|
598
|
+
#if SIZEOF_LONG_LONG == 2
|
529
599
|
msgpack_pack_real_uint16(x, d);
|
530
|
-
#elif SIZEOF_LONG_LONG == 4
|
600
|
+
#elif SIZEOF_LONG_LONG == 4
|
531
601
|
msgpack_pack_real_uint32(x, d);
|
532
602
|
#else
|
533
603
|
msgpack_pack_real_uint64(x, d);
|
534
604
|
#endif
|
605
|
+
|
606
|
+
#elif defined(ULLONG_MAX)
|
607
|
+
#if ULLONG_MAX == 0xffffUL
|
608
|
+
msgpack_pack_real_uint16(x, d);
|
609
|
+
#elif ULLONG_MAX == 0xffffffffUL
|
610
|
+
msgpack_pack_real_uint32(x, d);
|
611
|
+
#else
|
612
|
+
msgpack_pack_real_uint64(x, d);
|
613
|
+
#endif
|
614
|
+
|
535
615
|
#else
|
536
616
|
if(sizeof(unsigned long long) == 2) {
|
537
617
|
msgpack_pack_real_uint16(x, d);
|
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.
|
4
|
+
version: 0.4.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: 2010-
|
12
|
+
date: 2010-05-26 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -19,10 +19,8 @@ executables: []
|
|
19
19
|
|
20
20
|
extensions:
|
21
21
|
- ext/extconf.rb
|
22
|
-
extra_rdoc_files:
|
23
|
-
|
24
|
-
- ChangeLog
|
25
|
-
- AUTHORS
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
26
24
|
files:
|
27
25
|
- ext/extconf.rb
|
28
26
|
- ext/pack.c
|
@@ -37,16 +35,13 @@ files:
|
|
37
35
|
- msgpack/unpack_template.h
|
38
36
|
- test/msgpack_test.rb
|
39
37
|
- test/test_helper.rb
|
40
|
-
- README
|
41
|
-
- ChangeLog
|
42
|
-
- AUTHORS
|
43
38
|
has_rdoc: true
|
44
39
|
homepage: http://msgpack.sourceforge.net/
|
45
40
|
licenses: []
|
46
41
|
|
47
42
|
post_install_message:
|
48
|
-
rdoc_options:
|
49
|
-
|
43
|
+
rdoc_options:
|
44
|
+
- ext
|
50
45
|
require_paths:
|
51
46
|
- lib
|
52
47
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/AUTHORS
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
FURUHASHI Sadayuki <frsyuki _at_ users.sourceforge.jp>
|
data/ChangeLog
DELETED
File without changes
|
data/README
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
|
2
|
-
= MessagePack
|
3
|
-
|
4
|
-
|
5
|
-
== Description
|
6
|
-
|
7
|
-
|
8
|
-
== Installation
|
9
|
-
|
10
|
-
=== Archive Installation
|
11
|
-
|
12
|
-
rake install
|
13
|
-
|
14
|
-
=== Gem Installation
|
15
|
-
|
16
|
-
gem install msgpack
|
17
|
-
|
18
|
-
|
19
|
-
== Features/Problems
|
20
|
-
|
21
|
-
|
22
|
-
== Synopsis
|
23
|
-
|
24
|
-
|
25
|
-
== Copyright
|
26
|
-
|
27
|
-
Author:: frsyuki <frsyuki@users.sourceforge.jp>
|
28
|
-
Copyright:: Copyright (c) 2008-2009 frsyuki
|
29
|
-
License:: Apache License, Version 2.0
|