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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 896053e81f7ec13433591a69fd084decd20dccc2
4
- data.tar.gz: 1bf0f3f0d89c13a3892ee1900210ca627c47ddd3
3
+ metadata.gz: 48cf4db001c4e31b27a47256b972187072581566
4
+ data.tar.gz: efc1eb6121ffd9d04b65d370445a185aeb9c612a
5
5
  SHA512:
6
- metadata.gz: 37c9e2bcf7e4d0c10d67f43a3161a3f340447c4c2b5dce57f4e5b77522076d12d291520305eee588a35d166d279a028d122f5f2aeed5b68a111328794bde841c
7
- data.tar.gz: 96636d63dc77461f8e8132715f969cee8bc05d3115bea7e74edfd160d91ce9956b68d4a146c3d52a31644d399925463028bd8ff817ec04fdf8eba7e814416abd
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
- void Init_php_serializer()
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
- VALUE php_serializer_module = rb_define_module("PhpSerializer");
7
- rb_define_singleton_method(php_serializer_module, "serialize", serialize, 1);
8
- rb_define_singleton_method(php_serializer_module, "unserialize", unserialize, 1);
9
- }
10
-
11
- static inline void serialize_long(php_str *buf, long val)
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 inline void serialize_float(php_str *buf, VALUE flt)
791
+ static VALUE
792
+ unserialize (VALUE module, VALUE input)
19
793
  {
20
- VALUE str = Qnil;
21
- str = rb_funcall(flt, rb_intern("to_s"), 0);
22
- php_str_appendl(buf, "d:", 2);
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; //allocated_size
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 **str_p, long *count, long limit);
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
@@ -1,3 +1,3 @@
1
1
  module PhpSerializer
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -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.1.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-08 00:00:00.000000000 Z
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: '0'
72
+ version: 1.9.3
73
73
  required_rubygems_version: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - ">="