-/* Generated by re2c 0.13.5 on Fri Aug 29 18:45:19 2008 */
+/* Generated by re2c 0.13.5 on Tue Mar 17 16:18:00 2009 */
#line 1 "ext/standard/var_unserializer.re"
/*
+----------------------------------------------------------------------+
- | PHP Version 6 |
+ | PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2006 The PHP Group |
+----------------------------------------------------------------------+
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy103;
yy3:
-#line 794 "ext/standard/var_unserializer.re"
+#line 817 "ext/standard/var_unserializer.re"
{ return 0; }
#line 528 "ext/standard/var_unserializer.c"
yy4:
goto yy3;
yy15:
++YYCURSOR;
-#line 788 "ext/standard/var_unserializer.re"
+#line 811 "ext/standard/var_unserializer.re"
{
/* this is the case where we have less data than planned */
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unexpected end of serialized data");
yych = *++YYCURSOR;
if (yych != '"') goto yy19;
++YYCURSOR;
-#line 670 "ext/standard/var_unserializer.re"
+#line 693 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
long elements;
yych = *++YYCURSOR;
if (yych != '"') goto yy19;
++YYCURSOR;
-#line 662 "ext/standard/var_unserializer.re"
+#line 685 "ext/standard/var_unserializer.re"
{
INIT_PZVAL(*rval);
yych = *++YYCURSOR;
if (yych != '{') goto yy19;
++YYCURSOR;
-#line 642 "ext/standard/var_unserializer.re"
+#line 665 "ext/standard/var_unserializer.re"
{
long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
yych = *++YYCURSOR;
if (yych != '"') goto yy19;
++YYCURSOR;
-#line 613 "ext/standard/var_unserializer.re"
+#line 636 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
UChar *ustr;
yych = *++YYCURSOR;
if (yych != '"') goto yy19;
++YYCURSOR;
-#line 584 "ext/standard/var_unserializer.re"
+#line 607 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
yych = *++YYCURSOR;
if (yych != '"') goto yy19;
++YYCURSOR;
-#line 556 "ext/standard/var_unserializer.re"
+#line 579 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
}
yy71:
++YYCURSOR;
-#line 549 "ext/standard/var_unserializer.re"
+#line 569 "ext/standard/var_unserializer.re"
{
+#if SIZEOF_LONG == 4
+use_double:
+#endif
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL));
return 1;
}
-#line 1047 "ext/standard/var_unserializer.c"
+#line 1050 "ext/standard/var_unserializer.c"
yy73:
yych = *++YYCURSOR;
if (yych <= ',') {
yych = *++YYCURSOR;
if (yych != ';') goto yy19;
++YYCURSOR;
-#line 534 "ext/standard/var_unserializer.re"
+#line 554 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
INIT_PZVAL(*rval);
return 1;
}
-#line 1121 "ext/standard/var_unserializer.c"
+#line 1124 "ext/standard/var_unserializer.c"
yy84:
yych = *++YYCURSOR;
if (yych == 'N') goto yy81;
++YYCURSOR;
#line 527 "ext/standard/var_unserializer.re"
{
+#if SIZEOF_LONG == 4
+ int digits = YYCURSOR - start - 3;
+
+ if (start[2] == '-' || start[2] == '+') {
+ digits--;
+ }
+
+ /* Use double for large long values that were serialized on a 64-bit system */
+ if (digits >= MAX_LENGTH_OF_LONG - 1) {
+ if (digits == MAX_LENGTH_OF_LONG - 1) {
+ int cmp = strncmp(YYCURSOR - MAX_LENGTH_OF_LONG, long_min_digits, MAX_LENGTH_OF_LONG - 1);
+
+ if (!(cmp < 0 || (cmp == 0 && start[2] == '-'))) {
+ goto use_double;
+ }
+ } else {
+ goto use_double;
+ }
+ }
+#endif
*p = YYCURSOR;
INIT_PZVAL(*rval);
ZVAL_LONG(*rval, parse_iv(start + 2));
return 1;
}
-#line 1155 "ext/standard/var_unserializer.c"
+#line 1178 "ext/standard/var_unserializer.c"
yy91:
yych = *++YYCURSOR;
if (yych <= '/') goto yy19;
ZVAL_BOOL(*rval, parse_iv(start + 2));
return 1;
}
-#line 1170 "ext/standard/var_unserializer.c"
+#line 1193 "ext/standard/var_unserializer.c"
yy95:
++YYCURSOR;
#line 513 "ext/standard/var_unserializer.re"
ZVAL_NULL(*rval);
return 1;
}
-#line 1180 "ext/standard/var_unserializer.c"
+#line 1203 "ext/standard/var_unserializer.c"
yy97:
yych = *++YYCURSOR;
if (yych <= ',') {
return 1;
}
-#line 1226 "ext/standard/var_unserializer.c"
+#line 1249 "ext/standard/var_unserializer.c"
yy103:
yych = *++YYCURSOR;
if (yych <= ',') {
return 1;
}
-#line 1270 "ext/standard/var_unserializer.c"
+#line 1293 "ext/standard/var_unserializer.c"
}
-#line 796 "ext/standard/var_unserializer.re"
+#line 819 "ext/standard/var_unserializer.re"
return 0;