php_serializer 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +13 -0
- data/ext/php_serializer/php_serializer.c +789 -241
- data/ext/php_serializer/php_serializer.h +7 -6
- data/lib/php_serializer/version.rb +1 -1
- data/php_serializer.gemspec +1 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48cf4db001c4e31b27a47256b972187072581566
|
4
|
+
data.tar.gz: efc1eb6121ffd9d04b65d370445a185aeb9c612a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fefeb332de4ed8c095b4f3e255ad14e81b1054f459bf803030795c954cbff909e2d8613cb81fbda4bacc09bbb48382cef614d6517b10842051ea0512f41425e
|
7
|
+
data.tar.gz: f653bb2c4cdc1f03b85e016f7fe9b9a9235c20f836b70bb6c2cdca19aa901962d36c8b1f9a4a359b0246d3966a86aa4ab5292d9525ce417f948dde864fbafb44
|
data/README.md
CHANGED
@@ -18,6 +18,19 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
$ gem install php_serializer
|
20
20
|
|
21
|
+
## Ruby versions supported
|
22
|
+
|
23
|
+
Being a native gem, this library requires MRI (Matz's Ruby
|
24
|
+
Interpreter). It requires MRI 1.9.3 or greater. It is known to build
|
25
|
+
with these Ruby versions:
|
26
|
+
|
27
|
+
* ruby-1.9.3
|
28
|
+
* ruby-2.0
|
29
|
+
* ruby-2.1
|
30
|
+
* ruby-2.2
|
31
|
+
* ruby-2.3
|
32
|
+
* ruby-2.4
|
33
|
+
|
21
34
|
## Usage
|
22
35
|
|
23
36
|
``` ruby
|
@@ -1,249 +1,797 @@
|
|
1
|
+
/* Generated by re2c 0.16 on Sat Jul 15 05:38:49 2017 */
|
2
|
+
#line 1 "php_serializer.re"
|
1
3
|
#include<ruby.h>
|
2
4
|
#include<php_serializer.h>
|
3
5
|
|
4
|
-
|
6
|
+
#define YYFILL(n) do { } while (0)
|
7
|
+
#define YYCTYPE unsigned char
|
8
|
+
#define YYCURSOR cursor
|
9
|
+
#define YYLIMIT limit
|
10
|
+
#define YYMARKER marker
|
11
|
+
|
12
|
+
void
|
13
|
+
Init_php_serializer ()
|
14
|
+
{
|
15
|
+
VALUE php_serializer_module = rb_define_module ("PhpSerializer");
|
16
|
+
rb_define_singleton_method (php_serializer_module, "serialize", serialize,
|
17
|
+
1);
|
18
|
+
rb_define_singleton_method (php_serializer_module, "unserialize",
|
19
|
+
unserialize, 1);
|
20
|
+
}
|
21
|
+
|
22
|
+
static inline void
|
23
|
+
serialize_long (php_str * buf, long val)
|
24
|
+
{
|
25
|
+
php_str_appendl (buf, "i:", 2);
|
26
|
+
php_str_append_long (buf, val);
|
27
|
+
php_str_appendc (buf, ';');
|
28
|
+
}
|
29
|
+
|
30
|
+
static inline void
|
31
|
+
serialize_float (php_str * buf, VALUE flt)
|
32
|
+
{
|
33
|
+
VALUE str = Qnil;
|
34
|
+
str = rb_funcall (flt, rb_intern ("to_s"), 0);
|
35
|
+
php_str_appendl (buf, "d:", 2);
|
36
|
+
php_str_appendl (buf, RSTRING_PTR (str), RSTRING_LEN (str));
|
37
|
+
php_str_appendc (buf, ';');
|
38
|
+
}
|
39
|
+
|
40
|
+
static inline void
|
41
|
+
serialize_string (php_str * buf, char *str, int len)
|
42
|
+
{
|
43
|
+
php_str_appendl (buf, "s:", 2);
|
44
|
+
php_str_append_long (buf, len);
|
45
|
+
php_str_appendl (buf, ":\"", 2);
|
46
|
+
php_str_appendl (buf, str, len);
|
47
|
+
php_str_appendl (buf, "\";", 2);
|
48
|
+
}
|
49
|
+
|
50
|
+
static inline void
|
51
|
+
serialize_array (php_str * buf, VALUE arr)
|
52
|
+
{
|
53
|
+
long arr_len = RARRAY_LEN (arr);
|
54
|
+
php_str_appendl (buf, "a:", 2);
|
55
|
+
php_str_append_long (buf, arr_len);
|
56
|
+
php_str_appendl (buf, ":{", 2);
|
57
|
+
for (long i = 0; i < arr_len; i++)
|
58
|
+
{
|
59
|
+
php_str_appendl (buf, "i:", 2);
|
60
|
+
php_str_append_long (buf, i);
|
61
|
+
php_str_appendl (buf, ";", 1);
|
62
|
+
serialize_intern (buf, RARRAY_AREF (arr, i));
|
63
|
+
}
|
64
|
+
php_str_appendl (buf, "}", 1);
|
65
|
+
}
|
66
|
+
|
67
|
+
static inline int
|
68
|
+
rb_hash_each (VALUE key, VALUE val, VALUE rbuf)
|
69
|
+
{
|
70
|
+
php_str buf = { 0 };
|
71
|
+
serialize_intern (&buf, key);
|
72
|
+
serialize_intern (&buf, val);
|
73
|
+
rb_str_cat (rbuf, buf.c, buf.len);
|
74
|
+
php_str_free (&buf);
|
75
|
+
return ST_CONTINUE;
|
76
|
+
}
|
77
|
+
|
78
|
+
static inline void
|
79
|
+
serialize_hash (php_str * buf, VALUE hash)
|
80
|
+
{
|
81
|
+
long hash_size;
|
82
|
+
VALUE rbuf = rb_str_new_cstr ("");
|
83
|
+
hash_size = RHASH_SIZE (hash);
|
84
|
+
php_str_appendl (buf, "a:", 2);
|
85
|
+
php_str_append_long (buf, hash_size);
|
86
|
+
php_str_appendl (buf, ":{", 2);
|
87
|
+
rb_hash_foreach (hash, rb_hash_each, rbuf);
|
88
|
+
php_str_appendl (buf, StringValueCStr (rbuf), RSTRING_LEN (rbuf));
|
89
|
+
php_str_appendl (buf, "}", 1);
|
90
|
+
}
|
91
|
+
|
92
|
+
static inline void
|
93
|
+
serialize_symbol (php_str * buf, VALUE sym)
|
94
|
+
{
|
95
|
+
VALUE str = rb_sym_to_s (sym);
|
96
|
+
serialize_string (buf, RSTRING_PTR (str), RSTRING_LEN (str));
|
97
|
+
}
|
98
|
+
|
99
|
+
static void
|
100
|
+
serialize_intern (php_str * buf, VALUE in_data)
|
101
|
+
{
|
102
|
+
switch (TYPE (in_data))
|
103
|
+
{
|
104
|
+
case T_NIL:
|
105
|
+
php_str_appendl (buf, "N;", 2);
|
106
|
+
break;
|
107
|
+
case T_TRUE:
|
108
|
+
php_str_appendl (buf, "b:1;", 4);
|
109
|
+
break;
|
110
|
+
case T_FALSE:
|
111
|
+
php_str_appendl (buf, "b:0;", 4);
|
112
|
+
break;
|
113
|
+
case T_FIXNUM:
|
114
|
+
serialize_long (buf, FIX2LONG (in_data));
|
115
|
+
break;
|
116
|
+
case T_BIGNUM:
|
117
|
+
serialize_long (buf, NUM2LONG (in_data));
|
118
|
+
break;
|
119
|
+
case T_STRING:
|
120
|
+
serialize_string (buf, RSTRING_PTR (in_data), RSTRING_LEN (in_data));
|
121
|
+
break;
|
122
|
+
case T_SYMBOL:
|
123
|
+
serialize_symbol (buf, in_data);
|
124
|
+
break;
|
125
|
+
case T_ARRAY:
|
126
|
+
serialize_array (buf, in_data);
|
127
|
+
break;
|
128
|
+
case T_HASH:
|
129
|
+
serialize_hash (buf, in_data);
|
130
|
+
break;
|
131
|
+
case T_FLOAT:
|
132
|
+
serialize_float (buf, in_data);
|
133
|
+
break;
|
134
|
+
default:
|
135
|
+
/* raise exception */
|
136
|
+
rb_raise (rb_eTypeError, "%s is not valid value",
|
137
|
+
RSTRING_PTR (rb_any_to_s (rb_obj_class (in_data))));
|
138
|
+
break;
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
static inline long parse_iv(unsigned char *p)
|
143
|
+
{
|
144
|
+
char cursor;
|
145
|
+
long result = 0;
|
146
|
+
int neg = 0;
|
147
|
+
|
148
|
+
switch (*p) {
|
149
|
+
case '-':
|
150
|
+
neg++;
|
151
|
+
/* fall-through */
|
152
|
+
case '+':
|
153
|
+
p++;
|
154
|
+
}
|
155
|
+
|
156
|
+
while (1) {
|
157
|
+
cursor = (char)*p;
|
158
|
+
if (cursor >= '0' && cursor <= '9') {
|
159
|
+
result = result * 10 + (unsigned int)(cursor - (unsigned char)'0');
|
160
|
+
} else {
|
161
|
+
break;
|
162
|
+
}
|
163
|
+
p++;
|
164
|
+
}
|
165
|
+
if (neg) return -result;
|
166
|
+
return result;
|
167
|
+
}
|
168
|
+
|
169
|
+
static inline unsigned int parse_uiv(unsigned char *p)
|
170
|
+
{
|
171
|
+
unsigned char cursor;
|
172
|
+
unsigned int result = 0;
|
173
|
+
|
174
|
+
if (*p == '+') {
|
175
|
+
p++;
|
176
|
+
}
|
177
|
+
|
178
|
+
while (1) {
|
179
|
+
cursor = *p;
|
180
|
+
if (cursor >= '0' && cursor <= '9') {
|
181
|
+
result = result * 10 + (unsigned int)(cursor - (unsigned char)'0');
|
182
|
+
} else {
|
183
|
+
break;
|
184
|
+
}
|
185
|
+
p++;
|
186
|
+
}
|
187
|
+
return result;
|
188
|
+
}
|
189
|
+
|
190
|
+
static inline void raise_incomplete_serialization()
|
191
|
+
{
|
192
|
+
rb_raise (rb_eTypeError, "Incomplete Serialization.");
|
193
|
+
}
|
194
|
+
|
195
|
+
|
196
|
+
#line 201 "php_serializer.re"
|
197
|
+
|
198
|
+
static VALUE
|
199
|
+
unserialize_intern (unsigned char **p, unsigned char *max)
|
200
|
+
{
|
201
|
+
VALUE rval = Qnil;
|
202
|
+
unsigned char *cursor, *limit, *marker, *start;
|
203
|
+
|
204
|
+
limit = max;
|
205
|
+
cursor = *p;
|
206
|
+
|
207
|
+
if (YYCURSOR >= YYLIMIT) {
|
208
|
+
return 0;
|
209
|
+
}
|
210
|
+
|
211
|
+
start = cursor;
|
212
|
+
|
213
|
+
|
214
|
+
#line 215 "php_serializer.c"
|
215
|
+
{
|
216
|
+
YYCTYPE yych;
|
217
|
+
if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
|
218
|
+
yych = *YYCURSOR;
|
219
|
+
switch (yych) {
|
220
|
+
case 'N': goto yy4;
|
221
|
+
case 'a': goto yy5;
|
222
|
+
case 'b': goto yy6;
|
223
|
+
case 'd': goto yy7;
|
224
|
+
case 'i': goto yy8;
|
225
|
+
case 's': goto yy9;
|
226
|
+
default: goto yy2;
|
227
|
+
}
|
228
|
+
yy2:
|
229
|
+
++YYCURSOR;
|
230
|
+
yy3:
|
231
|
+
#line 319 "php_serializer.re"
|
232
|
+
{ rb_raise (rb_eTypeError, "Invalid Serialization."); }
|
233
|
+
#line 234 "php_serializer.c"
|
234
|
+
yy4:
|
235
|
+
yych = *++YYCURSOR;
|
236
|
+
switch (yych) {
|
237
|
+
case ';': goto yy10;
|
238
|
+
default: goto yy3;
|
239
|
+
}
|
240
|
+
yy5:
|
241
|
+
yych = *(YYMARKER = ++YYCURSOR);
|
242
|
+
switch (yych) {
|
243
|
+
case ':': goto yy12;
|
244
|
+
default: goto yy3;
|
245
|
+
}
|
246
|
+
yy6:
|
247
|
+
yych = *(YYMARKER = ++YYCURSOR);
|
248
|
+
switch (yych) {
|
249
|
+
case ':': goto yy14;
|
250
|
+
default: goto yy3;
|
251
|
+
}
|
252
|
+
yy7:
|
253
|
+
yych = *(YYMARKER = ++YYCURSOR);
|
254
|
+
switch (yych) {
|
255
|
+
case ':': goto yy15;
|
256
|
+
default: goto yy3;
|
257
|
+
}
|
258
|
+
yy8:
|
259
|
+
yych = *(YYMARKER = ++YYCURSOR);
|
260
|
+
switch (yych) {
|
261
|
+
case ':': goto yy16;
|
262
|
+
default: goto yy3;
|
263
|
+
}
|
264
|
+
yy9:
|
265
|
+
yych = *(YYMARKER = ++YYCURSOR);
|
266
|
+
switch (yych) {
|
267
|
+
case ':': goto yy17;
|
268
|
+
default: goto yy3;
|
269
|
+
}
|
270
|
+
yy10:
|
271
|
+
++YYCURSOR;
|
272
|
+
#line 219 "php_serializer.re"
|
273
|
+
{
|
274
|
+
*p = YYCURSOR;
|
275
|
+
return rval;
|
276
|
+
}
|
277
|
+
#line 278 "php_serializer.c"
|
278
|
+
yy12:
|
279
|
+
yych = *++YYCURSOR;
|
280
|
+
switch (yych) {
|
281
|
+
case '+': goto yy18;
|
282
|
+
case '0':
|
283
|
+
case '1':
|
284
|
+
case '2':
|
285
|
+
case '3':
|
286
|
+
case '4':
|
287
|
+
case '5':
|
288
|
+
case '6':
|
289
|
+
case '7':
|
290
|
+
case '8':
|
291
|
+
case '9': goto yy19;
|
292
|
+
default: goto yy13;
|
293
|
+
}
|
294
|
+
yy13:
|
295
|
+
YYCURSOR = YYMARKER;
|
296
|
+
goto yy3;
|
297
|
+
yy14:
|
298
|
+
yych = *++YYCURSOR;
|
299
|
+
switch (yych) {
|
300
|
+
case '0':
|
301
|
+
case '1': goto yy21;
|
302
|
+
default: goto yy13;
|
303
|
+
}
|
304
|
+
yy15:
|
305
|
+
yych = *++YYCURSOR;
|
306
|
+
switch (yych) {
|
307
|
+
case '+': goto yy22;
|
308
|
+
case '-': goto yy23;
|
309
|
+
case '.': goto yy24;
|
310
|
+
case '0':
|
311
|
+
case '1':
|
312
|
+
case '2':
|
313
|
+
case '3':
|
314
|
+
case '4':
|
315
|
+
case '5':
|
316
|
+
case '6':
|
317
|
+
case '7':
|
318
|
+
case '8':
|
319
|
+
case '9': goto yy25;
|
320
|
+
case 'I': goto yy27;
|
321
|
+
case 'N': goto yy28;
|
322
|
+
default: goto yy13;
|
323
|
+
}
|
324
|
+
yy16:
|
325
|
+
yych = *++YYCURSOR;
|
326
|
+
switch (yych) {
|
327
|
+
case '+':
|
328
|
+
case '-': goto yy29;
|
329
|
+
case '0':
|
330
|
+
case '1':
|
331
|
+
case '2':
|
332
|
+
case '3':
|
333
|
+
case '4':
|
334
|
+
case '5':
|
335
|
+
case '6':
|
336
|
+
case '7':
|
337
|
+
case '8':
|
338
|
+
case '9': goto yy30;
|
339
|
+
default: goto yy13;
|
340
|
+
}
|
341
|
+
yy17:
|
342
|
+
yych = *++YYCURSOR;
|
343
|
+
switch (yych) {
|
344
|
+
case '+': goto yy32;
|
345
|
+
case '0':
|
346
|
+
case '1':
|
347
|
+
case '2':
|
348
|
+
case '3':
|
349
|
+
case '4':
|
350
|
+
case '5':
|
351
|
+
case '6':
|
352
|
+
case '7':
|
353
|
+
case '8':
|
354
|
+
case '9': goto yy33;
|
355
|
+
default: goto yy13;
|
356
|
+
}
|
357
|
+
yy18:
|
358
|
+
yych = *++YYCURSOR;
|
359
|
+
switch (yych) {
|
360
|
+
case '0':
|
361
|
+
case '1':
|
362
|
+
case '2':
|
363
|
+
case '3':
|
364
|
+
case '4':
|
365
|
+
case '5':
|
366
|
+
case '6':
|
367
|
+
case '7':
|
368
|
+
case '8':
|
369
|
+
case '9': goto yy19;
|
370
|
+
default: goto yy13;
|
371
|
+
}
|
372
|
+
yy19:
|
373
|
+
++YYCURSOR;
|
374
|
+
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
|
375
|
+
yych = *YYCURSOR;
|
376
|
+
switch (yych) {
|
377
|
+
case '0':
|
378
|
+
case '1':
|
379
|
+
case '2':
|
380
|
+
case '3':
|
381
|
+
case '4':
|
382
|
+
case '5':
|
383
|
+
case '6':
|
384
|
+
case '7':
|
385
|
+
case '8':
|
386
|
+
case '9': goto yy19;
|
387
|
+
case ':': goto yy35;
|
388
|
+
default: goto yy13;
|
389
|
+
}
|
390
|
+
yy21:
|
391
|
+
yych = *++YYCURSOR;
|
392
|
+
switch (yych) {
|
393
|
+
case ';': goto yy36;
|
394
|
+
default: goto yy13;
|
395
|
+
}
|
396
|
+
yy22:
|
397
|
+
yych = *++YYCURSOR;
|
398
|
+
switch (yych) {
|
399
|
+
case '.': goto yy24;
|
400
|
+
case '0':
|
401
|
+
case '1':
|
402
|
+
case '2':
|
403
|
+
case '3':
|
404
|
+
case '4':
|
405
|
+
case '5':
|
406
|
+
case '6':
|
407
|
+
case '7':
|
408
|
+
case '8':
|
409
|
+
case '9': goto yy25;
|
410
|
+
default: goto yy13;
|
411
|
+
}
|
412
|
+
yy23:
|
413
|
+
yych = *++YYCURSOR;
|
414
|
+
switch (yych) {
|
415
|
+
case '.': goto yy24;
|
416
|
+
case '0':
|
417
|
+
case '1':
|
418
|
+
case '2':
|
419
|
+
case '3':
|
420
|
+
case '4':
|
421
|
+
case '5':
|
422
|
+
case '6':
|
423
|
+
case '7':
|
424
|
+
case '8':
|
425
|
+
case '9': goto yy25;
|
426
|
+
case 'I': goto yy27;
|
427
|
+
default: goto yy13;
|
428
|
+
}
|
429
|
+
yy24:
|
430
|
+
yych = *++YYCURSOR;
|
431
|
+
switch (yych) {
|
432
|
+
case '0':
|
433
|
+
case '1':
|
434
|
+
case '2':
|
435
|
+
case '3':
|
436
|
+
case '4':
|
437
|
+
case '5':
|
438
|
+
case '6':
|
439
|
+
case '7':
|
440
|
+
case '8':
|
441
|
+
case '9': goto yy38;
|
442
|
+
default: goto yy13;
|
443
|
+
}
|
444
|
+
yy25:
|
445
|
+
++YYCURSOR;
|
446
|
+
if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
|
447
|
+
yych = *YYCURSOR;
|
448
|
+
switch (yych) {
|
449
|
+
case '.': goto yy38;
|
450
|
+
case '0':
|
451
|
+
case '1':
|
452
|
+
case '2':
|
453
|
+
case '3':
|
454
|
+
case '4':
|
455
|
+
case '5':
|
456
|
+
case '6':
|
457
|
+
case '7':
|
458
|
+
case '8':
|
459
|
+
case '9': goto yy25;
|
460
|
+
case ';': goto yy40;
|
461
|
+
case 'E':
|
462
|
+
case 'e': goto yy42;
|
463
|
+
default: goto yy13;
|
464
|
+
}
|
465
|
+
yy27:
|
466
|
+
yych = *++YYCURSOR;
|
467
|
+
switch (yych) {
|
468
|
+
case 'N': goto yy43;
|
469
|
+
default: goto yy13;
|
470
|
+
}
|
471
|
+
yy28:
|
472
|
+
yych = *++YYCURSOR;
|
473
|
+
switch (yych) {
|
474
|
+
case 'A': goto yy44;
|
475
|
+
default: goto yy13;
|
476
|
+
}
|
477
|
+
yy29:
|
478
|
+
yych = *++YYCURSOR;
|
479
|
+
switch (yych) {
|
480
|
+
case '0':
|
481
|
+
case '1':
|
482
|
+
case '2':
|
483
|
+
case '3':
|
484
|
+
case '4':
|
485
|
+
case '5':
|
486
|
+
case '6':
|
487
|
+
case '7':
|
488
|
+
case '8':
|
489
|
+
case '9': goto yy30;
|
490
|
+
default: goto yy13;
|
491
|
+
}
|
492
|
+
yy30:
|
493
|
+
++YYCURSOR;
|
494
|
+
if (YYLIMIT <= YYCURSOR) YYFILL(1);
|
495
|
+
yych = *YYCURSOR;
|
496
|
+
switch (yych) {
|
497
|
+
case '0':
|
498
|
+
case '1':
|
499
|
+
case '2':
|
500
|
+
case '3':
|
501
|
+
case '4':
|
502
|
+
case '5':
|
503
|
+
case '6':
|
504
|
+
case '7':
|
505
|
+
case '8':
|
506
|
+
case '9': goto yy30;
|
507
|
+
case ';': goto yy45;
|
508
|
+
default: goto yy13;
|
509
|
+
}
|
510
|
+
yy32:
|
511
|
+
yych = *++YYCURSOR;
|
512
|
+
switch (yych) {
|
513
|
+
case '0':
|
514
|
+
case '1':
|
515
|
+
case '2':
|
516
|
+
case '3':
|
517
|
+
case '4':
|
518
|
+
case '5':
|
519
|
+
case '6':
|
520
|
+
case '7':
|
521
|
+
case '8':
|
522
|
+
case '9': goto yy33;
|
523
|
+
default: goto yy13;
|
524
|
+
}
|
525
|
+
yy33:
|
526
|
+
++YYCURSOR;
|
527
|
+
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
|
528
|
+
yych = *YYCURSOR;
|
529
|
+
switch (yych) {
|
530
|
+
case '0':
|
531
|
+
case '1':
|
532
|
+
case '2':
|
533
|
+
case '3':
|
534
|
+
case '4':
|
535
|
+
case '5':
|
536
|
+
case '6':
|
537
|
+
case '7':
|
538
|
+
case '8':
|
539
|
+
case '9': goto yy33;
|
540
|
+
case ':': goto yy47;
|
541
|
+
default: goto yy13;
|
542
|
+
}
|
543
|
+
yy35:
|
544
|
+
yych = *++YYCURSOR;
|
545
|
+
switch (yych) {
|
546
|
+
case '{': goto yy48;
|
547
|
+
default: goto yy13;
|
548
|
+
}
|
549
|
+
yy36:
|
550
|
+
++YYCURSOR;
|
551
|
+
#line 224 "php_serializer.re"
|
552
|
+
{
|
553
|
+
*p = YYCURSOR;
|
554
|
+
rval = parse_iv(start + 2) ? Qtrue : Qfalse;
|
555
|
+
return rval;
|
556
|
+
}
|
557
|
+
#line 558 "php_serializer.c"
|
558
|
+
yy38:
|
559
|
+
++YYCURSOR;
|
560
|
+
if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
|
561
|
+
yych = *YYCURSOR;
|
562
|
+
switch (yych) {
|
563
|
+
case '0':
|
564
|
+
case '1':
|
565
|
+
case '2':
|
566
|
+
case '3':
|
567
|
+
case '4':
|
568
|
+
case '5':
|
569
|
+
case '6':
|
570
|
+
case '7':
|
571
|
+
case '8':
|
572
|
+
case '9': goto yy38;
|
573
|
+
case ';': goto yy40;
|
574
|
+
case 'E':
|
575
|
+
case 'e': goto yy42;
|
576
|
+
default: goto yy13;
|
577
|
+
}
|
578
|
+
yy40:
|
579
|
+
++YYCURSOR;
|
580
|
+
#line 251 "php_serializer.re"
|
581
|
+
{
|
582
|
+
long str_len;
|
583
|
+
VALUE rb_str;
|
584
|
+
const char *str_p;
|
585
|
+
|
586
|
+
*p = YYCURSOR;
|
587
|
+
str_p = (const char *) start + 2;
|
588
|
+
str_len = YYCURSOR - start - 3;
|
589
|
+
rb_str = rb_str_new (str_p, str_len);
|
590
|
+
rval = DBL2NUM (rb_str_to_dbl (rb_str, 0));
|
591
|
+
return rval;
|
592
|
+
}
|
593
|
+
#line 594 "php_serializer.c"
|
594
|
+
yy42:
|
595
|
+
yych = *++YYCURSOR;
|
596
|
+
switch (yych) {
|
597
|
+
case '+':
|
598
|
+
case '-': goto yy50;
|
599
|
+
case '0':
|
600
|
+
case '1':
|
601
|
+
case '2':
|
602
|
+
case '3':
|
603
|
+
case '4':
|
604
|
+
case '5':
|
605
|
+
case '6':
|
606
|
+
case '7':
|
607
|
+
case '8':
|
608
|
+
case '9': goto yy51;
|
609
|
+
default: goto yy13;
|
610
|
+
}
|
611
|
+
yy43:
|
612
|
+
yych = *++YYCURSOR;
|
613
|
+
switch (yych) {
|
614
|
+
case 'F': goto yy53;
|
615
|
+
default: goto yy13;
|
616
|
+
}
|
617
|
+
yy44:
|
618
|
+
yych = *++YYCURSOR;
|
619
|
+
switch (yych) {
|
620
|
+
case 'N': goto yy53;
|
621
|
+
default: goto yy13;
|
622
|
+
}
|
623
|
+
yy45:
|
624
|
+
++YYCURSOR;
|
625
|
+
#line 230 "php_serializer.re"
|
626
|
+
{
|
627
|
+
*p = YYCURSOR;
|
628
|
+
rval = LONG2FIX (parse_iv(start + 2));
|
629
|
+
return rval;
|
630
|
+
}
|
631
|
+
#line 632 "php_serializer.c"
|
632
|
+
yy47:
|
633
|
+
yych = *++YYCURSOR;
|
634
|
+
switch (yych) {
|
635
|
+
case '"': goto yy54;
|
636
|
+
default: goto yy13;
|
637
|
+
}
|
638
|
+
yy48:
|
639
|
+
++YYCURSOR;
|
640
|
+
#line 291 "php_serializer.re"
|
641
|
+
{
|
642
|
+
VALUE hash = Qnil;
|
643
|
+
VALUE array = Qnil;
|
644
|
+
VALUE h_key = Qnil;
|
645
|
+
VALUE h_val = Qnil;
|
646
|
+
int is_array = 1;
|
647
|
+
long elements;
|
648
|
+
|
649
|
+
*p = YYCURSOR;
|
650
|
+
|
651
|
+
elements = parse_iv(start + 2);
|
652
|
+
hash = rb_hash_new ();
|
653
|
+
array = rb_ary_new ();
|
654
|
+
for (long i = 0; i < elements; i++)
|
655
|
+
{
|
656
|
+
h_key = unserialize_intern (p, max);
|
657
|
+
h_val = unserialize_intern (p, max);
|
658
|
+
rb_hash_aset (hash, h_key, h_val);
|
659
|
+
if (TYPE (h_key) != T_FIXNUM || FIX2LONG (h_key) != i)
|
660
|
+
is_array = 0;
|
661
|
+
if (is_array)
|
662
|
+
rb_ary_push (array, h_val);
|
663
|
+
}
|
664
|
+
*p += 1;
|
665
|
+
rval = is_array ? array : hash;
|
666
|
+
return rval;
|
667
|
+
}
|
668
|
+
#line 669 "php_serializer.c"
|
669
|
+
yy50:
|
670
|
+
yych = *++YYCURSOR;
|
671
|
+
switch (yych) {
|
672
|
+
case '+':
|
673
|
+
case '-': goto yy56;
|
674
|
+
case '0':
|
675
|
+
case '1':
|
676
|
+
case '2':
|
677
|
+
case '3':
|
678
|
+
case '4':
|
679
|
+
case '5':
|
680
|
+
case '6':
|
681
|
+
case '7':
|
682
|
+
case '8':
|
683
|
+
case '9': goto yy51;
|
684
|
+
default: goto yy13;
|
685
|
+
}
|
686
|
+
yy51:
|
687
|
+
++YYCURSOR;
|
688
|
+
if (YYLIMIT <= YYCURSOR) YYFILL(1);
|
689
|
+
yych = *YYCURSOR;
|
690
|
+
switch (yych) {
|
691
|
+
case '0':
|
692
|
+
case '1':
|
693
|
+
case '2':
|
694
|
+
case '3':
|
695
|
+
case '4':
|
696
|
+
case '5':
|
697
|
+
case '6':
|
698
|
+
case '7':
|
699
|
+
case '8':
|
700
|
+
case '9': goto yy51;
|
701
|
+
case ';': goto yy40;
|
702
|
+
default: goto yy13;
|
703
|
+
}
|
704
|
+
yy53:
|
705
|
+
yych = *++YYCURSOR;
|
706
|
+
switch (yych) {
|
707
|
+
case ';': goto yy57;
|
708
|
+
default: goto yy13;
|
709
|
+
}
|
710
|
+
yy54:
|
711
|
+
++YYCURSOR;
|
712
|
+
#line 264 "php_serializer.re"
|
713
|
+
{
|
714
|
+
unsigned int len, maxlen;
|
715
|
+
char *str;
|
716
|
+
|
717
|
+
len = parse_uiv(start + 2);
|
718
|
+
maxlen = max - YYCURSOR;
|
719
|
+
if (maxlen < len) {
|
720
|
+
raise_incomplete_serialization();
|
721
|
+
}
|
722
|
+
|
723
|
+
str = (char*)YYCURSOR;
|
724
|
+
YYCURSOR += len;
|
725
|
+
|
726
|
+
if (*(YYCURSOR) != '"') {
|
727
|
+
raise_incomplete_serialization();
|
728
|
+
}
|
729
|
+
|
730
|
+
if (*(YYCURSOR + 1) != ';') {
|
731
|
+
raise_incomplete_serialization();
|
732
|
+
}
|
733
|
+
|
734
|
+
YYCURSOR += 2;
|
735
|
+
*p = YYCURSOR;
|
736
|
+
rval = rb_str_new (str, len);
|
737
|
+
return rval;
|
738
|
+
}
|
739
|
+
#line 740 "php_serializer.c"
|
740
|
+
yy56:
|
741
|
+
yych = *++YYCURSOR;
|
742
|
+
switch (yych) {
|
743
|
+
case '0':
|
744
|
+
case '1':
|
745
|
+
case '2':
|
746
|
+
case '3':
|
747
|
+
case '4':
|
748
|
+
case '5':
|
749
|
+
case '6':
|
750
|
+
case '7':
|
751
|
+
case '8':
|
752
|
+
case '9': goto yy51;
|
753
|
+
default: goto yy13;
|
754
|
+
}
|
755
|
+
yy57:
|
756
|
+
++YYCURSOR;
|
757
|
+
#line 236 "php_serializer.re"
|
758
|
+
{
|
759
|
+
const char *str;
|
760
|
+
|
761
|
+
*p = YYCURSOR;
|
762
|
+
str = (const char *) start + 2;
|
763
|
+
if (!strncmp(str, "NAN", 3)) {
|
764
|
+
rval = rb_const_get(rb_cFloat, rb_intern("NAN"));
|
765
|
+
} else if (!strncmp(str, "INF", 3)) {
|
766
|
+
rval = rb_const_get(rb_cFloat, rb_intern("INFINITY"));
|
767
|
+
} else if (!strncmp(str, "-INF", 4)) {
|
768
|
+
rval = DBL2NUM(-RFLOAT_VALUE(rb_const_get(rb_cFloat, rb_intern("INFINITY"))));
|
769
|
+
}
|
770
|
+
return rval;
|
771
|
+
}
|
772
|
+
#line 773 "php_serializer.c"
|
773
|
+
}
|
774
|
+
#line 320 "php_serializer.re"
|
775
|
+
|
776
|
+
|
777
|
+
return Qnil;
|
778
|
+
}
|
779
|
+
|
780
|
+
static VALUE
|
781
|
+
serialize (VALUE module, VALUE input)
|
5
782
|
{
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
{
|
13
|
-
php_str_appendl(buf, "i:", 2);
|
14
|
-
php_str_append_long(buf, val);
|
15
|
-
php_str_appendc(buf, ';');
|
783
|
+
php_str buf = { 0 };
|
784
|
+
VALUE serialized_data = Qnil;
|
785
|
+
serialize_intern (&buf, input);
|
786
|
+
serialized_data = rb_str_new (buf.c, buf.len);
|
787
|
+
php_str_free (&buf);
|
788
|
+
return serialized_data;
|
16
789
|
}
|
17
790
|
|
18
|
-
static
|
791
|
+
static VALUE
|
792
|
+
unserialize (VALUE module, VALUE input)
|
19
793
|
{
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
php_str_appendl(buf, RSTRING_PTR(str), RSTRING_LEN(str));
|
24
|
-
php_str_appendc(buf, ';');
|
25
|
-
}
|
26
|
-
|
27
|
-
static inline void serialize_string(php_str *buf, char *str, int len)
|
28
|
-
{
|
29
|
-
php_str_appendl(buf, "s:", 2);
|
30
|
-
php_str_append_long(buf, len);
|
31
|
-
php_str_appendl(buf, ":\"", 2);
|
32
|
-
php_str_appendl(buf, str, len);
|
33
|
-
php_str_appendl(buf, "\";", 2);
|
34
|
-
}
|
35
|
-
|
36
|
-
static inline void serialize_array(php_str *buf, VALUE arr)
|
37
|
-
{
|
38
|
-
long arr_len = RARRAY_LEN(arr);
|
39
|
-
php_str_appendl(buf, "a:", 2);
|
40
|
-
php_str_append_long(buf, arr_len);
|
41
|
-
php_str_appendl(buf, ":{", 2);
|
42
|
-
for(long i=0; i<arr_len; i++) {
|
43
|
-
php_str_appendl(buf, "i:", 2);
|
44
|
-
php_str_append_long(buf, i);
|
45
|
-
php_str_appendl(buf, ";", 1);
|
46
|
-
serialize_intern(buf, RARRAY_AREF(arr, i));
|
47
|
-
}
|
48
|
-
php_str_appendl(buf, "}", 1);
|
49
|
-
}
|
50
|
-
|
51
|
-
static inline int rb_hash_each(VALUE key, VALUE val, VALUE rbuf)
|
52
|
-
{
|
53
|
-
php_str buf = {0};
|
54
|
-
serialize_intern(&buf, key);
|
55
|
-
serialize_intern(&buf, val);
|
56
|
-
rb_str_cat(rbuf, buf.c, buf.len);
|
57
|
-
php_str_free(&buf);
|
58
|
-
return ST_CONTINUE;
|
59
|
-
}
|
60
|
-
|
61
|
-
static inline void serialize_hash(php_str *buf, VALUE hash)
|
62
|
-
{
|
63
|
-
long hash_size;
|
64
|
-
VALUE rbuf = rb_str_new_cstr("");
|
65
|
-
hash_size = RHASH_SIZE(hash);
|
66
|
-
php_str_appendl(buf, "a:", 2);
|
67
|
-
php_str_append_long(buf, hash_size);
|
68
|
-
php_str_appendl(buf, ":{", 2);
|
69
|
-
rb_hash_foreach(hash, rb_hash_each, rbuf);
|
70
|
-
php_str_appendl(buf, StringValueCStr(rbuf), RSTRING_LEN(rbuf));
|
71
|
-
php_str_appendl(buf, "}", 1);
|
72
|
-
}
|
73
|
-
|
74
|
-
static inline void serialize_symbol(php_str *buf, VALUE sym)
|
75
|
-
{
|
76
|
-
VALUE str = rb_sym_to_s(sym);
|
77
|
-
serialize_string(buf, RSTRING_PTR(str), RSTRING_LEN(str));
|
78
|
-
}
|
79
|
-
|
80
|
-
static void serialize_intern(php_str *buf, VALUE in_data) {
|
81
|
-
switch (TYPE(in_data)) {
|
82
|
-
case T_NIL:
|
83
|
-
php_str_appendl(buf, "N;", 2);
|
84
|
-
break;
|
85
|
-
case T_TRUE:
|
86
|
-
php_str_appendl(buf, "b:1;", 4);
|
87
|
-
break;
|
88
|
-
case T_FALSE:
|
89
|
-
php_str_appendl(buf, "b:0;", 4);
|
90
|
-
break;
|
91
|
-
case T_FIXNUM:
|
92
|
-
serialize_long(buf, FIX2LONG(in_data));
|
93
|
-
break;
|
94
|
-
case T_BIGNUM:
|
95
|
-
serialize_long(buf, NUM2LONG(in_data));
|
96
|
-
break;
|
97
|
-
case T_STRING:
|
98
|
-
serialize_string(buf, RSTRING_PTR(in_data), RSTRING_LEN(in_data));
|
99
|
-
break;
|
100
|
-
case T_SYMBOL:
|
101
|
-
serialize_symbol(buf, in_data);
|
102
|
-
break;
|
103
|
-
case T_ARRAY:
|
104
|
-
serialize_array(buf, in_data);
|
105
|
-
break;
|
106
|
-
case T_HASH:
|
107
|
-
serialize_hash(buf, in_data);
|
108
|
-
break;
|
109
|
-
case T_FLOAT:
|
110
|
-
serialize_float(buf, in_data);
|
111
|
-
break;
|
112
|
-
default:
|
113
|
-
/* raise exception */
|
114
|
-
rb_raise(rb_eTypeError, "%s is not valid value", RSTRING_PTR(rb_any_to_s(rb_obj_class(in_data))));
|
115
|
-
break;
|
116
|
-
}
|
117
|
-
}
|
118
|
-
|
119
|
-
static inline long get_lval(char **src, char delimiter, long *count, long limit) {
|
120
|
-
long val = 0;
|
121
|
-
int is_negative = 0;
|
122
|
-
while(1) {
|
123
|
-
if(*count >= limit) {
|
124
|
-
rb_raise(rb_eTypeError, "Incomplete Serialization.");
|
125
|
-
} else if (**src >= '0' && **src <= '9') {
|
126
|
-
val = (val * 10) + (**src - 48);
|
127
|
-
} else if (**src == delimiter) {
|
128
|
-
if (is_negative)
|
129
|
-
val *= -1;
|
130
|
-
return val;
|
131
|
-
} else if (**src == '-') {
|
132
|
-
is_negative = 1;
|
133
|
-
} else if (**src == '+') {
|
134
|
-
//do nothing;
|
135
|
-
} else {
|
136
|
-
rb_raise(rb_eTypeError, "Integer is expected.");
|
137
|
-
}
|
138
|
-
(*src)++;
|
139
|
-
(*count)++;
|
140
|
-
}
|
141
|
-
}
|
142
|
-
|
143
|
-
static inline VALUE get_dval(char **src, char delimiter, long *count, long limit) {
|
144
|
-
VALUE val = Qnil;
|
145
|
-
php_str buf = {0};
|
146
|
-
char *c;
|
147
|
-
while(1) {
|
148
|
-
c = *src;
|
149
|
-
if(*count >= limit) {
|
150
|
-
rb_raise(rb_eTypeError, "Incomplete Serialization.");
|
151
|
-
} else if (*c >= '0' && *c <= '9') {
|
152
|
-
php_str_appendl(&buf, c, 1);
|
153
|
-
} else if (*c == delimiter) {
|
154
|
-
val = rb_str_new(buf.c, buf.len);
|
155
|
-
php_str_free(&buf);
|
156
|
-
return DBL2NUM(rb_str_to_dbl(val, 0));
|
157
|
-
} else if (*c == '-' || *c == '+' || *c == '.' || *c == 'e' || *c == 'E') {
|
158
|
-
php_str_appendl(&buf, c, 1);
|
159
|
-
} else {
|
160
|
-
rb_raise(rb_eTypeError, "Malformed decimal value.");
|
161
|
-
}
|
162
|
-
(*src)++;
|
163
|
-
(*count)++;
|
164
|
-
}
|
165
|
-
}
|
166
|
-
|
167
|
-
static VALUE unserialize_intern(char **str_ptr_ptr, long *count, long limit) {
|
168
|
-
char type;
|
169
|
-
long _lval;
|
170
|
-
int is_array = 1;
|
171
|
-
VALUE val = Qnil;
|
172
|
-
VALUE hash = Qnil;
|
173
|
-
VALUE array = Qnil;
|
174
|
-
VALUE h_key = Qnil;
|
175
|
-
VALUE h_val = Qnil;
|
176
|
-
|
177
|
-
if (*count >= limit)
|
178
|
-
return val;
|
179
|
-
|
180
|
-
type = **str_ptr_ptr;
|
181
|
-
(*str_ptr_ptr) += 2;
|
182
|
-
(*count) += 2;
|
183
|
-
|
184
|
-
switch(type) {
|
185
|
-
case 'i':
|
186
|
-
_lval = get_lval(str_ptr_ptr, ';', count, limit);
|
187
|
-
val = LONG2FIX(_lval);
|
188
|
-
(*count)++;
|
189
|
-
break;
|
190
|
-
case 'b':
|
191
|
-
_lval = get_lval(str_ptr_ptr, ';', count, limit);
|
192
|
-
val = _lval ? Qtrue : Qfalse;
|
193
|
-
(*count)++;
|
194
|
-
break;
|
195
|
-
case 's':
|
196
|
-
_lval = get_lval(str_ptr_ptr, ':', count, limit);
|
197
|
-
(*str_ptr_ptr) += 2;
|
198
|
-
val = rb_str_new(*str_ptr_ptr, _lval);
|
199
|
-
(*str_ptr_ptr) += (_lval + 1);
|
200
|
-
(*count) += (_lval + 4);
|
201
|
-
break;
|
202
|
-
case 'd':
|
203
|
-
val = get_dval(str_ptr_ptr, ';', count, limit);
|
204
|
-
(*count)++;
|
205
|
-
break;
|
206
|
-
case 'N':
|
207
|
-
//Do nothing for NULL;
|
208
|
-
break;
|
209
|
-
case 'a':
|
210
|
-
_lval = get_lval(str_ptr_ptr, ':', count, limit);
|
211
|
-
(*str_ptr_ptr) += 2;
|
212
|
-
(*count) += 2;
|
213
|
-
hash = rb_hash_new();
|
214
|
-
array = rb_ary_new();
|
215
|
-
for(long i = 0; i < _lval; i++) {
|
216
|
-
h_key = unserialize_intern(str_ptr_ptr, count, limit);
|
217
|
-
h_val = unserialize_intern(str_ptr_ptr, count, limit);
|
218
|
-
rb_hash_aset(hash, h_key, h_val);
|
219
|
-
if (TYPE(h_key) != T_FIXNUM || FIX2LONG(h_key) != i)
|
220
|
-
is_array = 0;
|
221
|
-
if (is_array)
|
222
|
-
rb_ary_push(array, h_val);
|
223
|
-
}
|
224
|
-
val = is_array ? array : hash;
|
225
|
-
(*count)++;
|
226
|
-
break;
|
227
|
-
default:
|
228
|
-
rb_raise(rb_eTypeError, "Invalid Serialization.");
|
229
|
-
break;
|
230
|
-
}
|
231
|
-
if(*count < limit && val != Qnil)
|
232
|
-
(*str_ptr_ptr)++;
|
233
|
-
return val;
|
234
|
-
}
|
235
|
-
|
236
|
-
static VALUE serialize(VALUE module, VALUE input) {
|
237
|
-
php_str buf = {0};
|
238
|
-
VALUE serialized_data = Qnil;
|
239
|
-
serialize_intern(&buf, input);
|
240
|
-
serialized_data = rb_str_new(buf.c, buf.len);
|
241
|
-
php_str_free(&buf);
|
242
|
-
return serialized_data;
|
243
|
-
}
|
244
|
-
|
245
|
-
static VALUE unserialize(VALUE module, VALUE input) {
|
246
|
-
char *str_p = RSTRING_PTR(input);
|
247
|
-
long count = 0, limit = RSTRING_LEN(input);
|
248
|
-
return unserialize_intern(&str_p, &count, limit);
|
794
|
+
unsigned char *str_p = (unsigned char *) RSTRING_PTR (input);
|
795
|
+
long str_len = RSTRING_LEN (input);
|
796
|
+
return unserialize_intern (&str_p, str_p + str_len);
|
249
797
|
}
|
@@ -2,16 +2,17 @@
|
|
2
2
|
#define PHP_SERIALIZER_H
|
3
3
|
#include <sys/types.h>
|
4
4
|
|
5
|
-
typedef struct
|
5
|
+
typedef struct
|
6
|
+
{
|
6
7
|
char *c;
|
7
8
|
size_t len;
|
8
|
-
size_t a;
|
9
|
+
size_t a; //allocated_size
|
9
10
|
} php_str;
|
10
11
|
|
11
|
-
static VALUE serialize(VALUE module, VALUE in_data);
|
12
|
-
static VALUE unserialize(VALUE module, VALUE in_data);
|
13
|
-
static void serialize_intern(php_str *buf, VALUE in_data);
|
14
|
-
static VALUE unserialize_intern(char **
|
12
|
+
static VALUE serialize (VALUE module, VALUE in_data);
|
13
|
+
static VALUE unserialize (VALUE module, VALUE in_data);
|
14
|
+
static void serialize_intern (php_str * buf, VALUE in_data);
|
15
|
+
static VALUE unserialize_intern (unsigned char **p, unsigned char *max);
|
15
16
|
|
16
17
|
#define PHP_STR_PREALLOC 128
|
17
18
|
#define PHP_STR_START_SIZE 78
|
data/php_serializer.gemspec
CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = %q{Native PHP serializer and unserializer(Note: currently only supports PHP primitive data-types) for Ruby and it is heavily inspired by PHP source code.}
|
14
14
|
spec.homepage = "https://github.com/vijayrsv/php_serializer"
|
15
15
|
spec.license = "MIT"
|
16
|
+
spec.required_ruby_version = ">= 1.9.3"
|
16
17
|
|
17
18
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
19
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: php_serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- vijayrsv
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -69,7 +69,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
69
69
|
requirements:
|
70
70
|
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
|
-
version:
|
72
|
+
version: 1.9.3
|
73
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
75
|
- - ">="
|