]> granicus.if.org Git - php/commitdiff
Fix zend.multibyte oddities. Hope this will address all the known problems.
authorMoriyoshi Koizumi <moriyoshi@php.net>
Sun, 6 Mar 2011 07:00:30 +0000 (07:00 +0000)
committerMoriyoshi Koizumi <moriyoshi@php.net>
Sun, 6 Mar 2011 07:00:30 +0000 (07:00 +0000)
Zend/zend_compile.c
Zend/zend_language_scanner.c
Zend/zend_language_scanner.l
Zend/zend_language_scanner_defs.h
Zend/zend_multibyte.c
Zend/zend_multibyte.h
ext/mbstring/mbstring.c
ext/mbstring/mbstring.h
main/rfc1867.c
main/rfc1867.h

index 5f49c152df85a5d8353c1886886c85ac6e017e0d..a16380f7b862feb555d72b6302aaf9ccaeaedf0f 100644 (file)
@@ -5988,8 +5988,7 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */
 
                                /* need to re-scan if input filter changed */
                                if (old_input_filter != LANG_SCNG(input_filter) ||
-                                       ((old_input_filter == zend_multibyte_script_encoding_filter) &&
-                                        (new_encoding != old_encoding))) {
+                                        (old_input_filter && new_encoding != old_encoding)) {
                                        zend_multibyte_yyinput_again(old_input_filter, old_encoding TSRMLS_CC);
                                }
                        }
index 50a327f48434138e80df60f9be2950d86294074f..fd5987b86cb482e33a983d2adc6445c12e888af7 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Mon Jan  3 06:07:39 2011 */
+/* Generated by re2c 0.13.5 on Sun Mar  6 15:09:12 2011 */
 #line 1 "Zend/zend_language_scanner.l"
 /*
    +----------------------------------------------------------------------+
@@ -122,6 +122,33 @@ do {                                                                                                                                                       \
 
 BEGIN_EXTERN_C()
 
+static size_t encoding_filter_script_to_internal(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding(TSRMLS_C);
+       assert(internal_encoding && zend_multibyte_check_lexer_compatibility(internal_encoding));
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length, internal_encoding, LANG_SCNG(script_encoding) TSRMLS_CC);
+}
+
+static size_t encoding_filter_script_to_intermediate(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length, zend_multibyte_encoding_utf8, LANG_SCNG(script_encoding) TSRMLS_CC);
+}
+
+static size_t encoding_filter_intermediate_to_script(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length,
+LANG_SCNG(script_encoding), zend_multibyte_encoding_utf8 TSRMLS_CC);
+}
+
+static size_t encoding_filter_intermediate_to_internal(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding(TSRMLS_C);
+       assert(internal_encoding && zend_multibyte_check_lexer_compatibility(internal_encoding));
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length,
+internal_encoding, zend_multibyte_encoding_utf8 TSRMLS_CC);
+}
+
+
 static void _yy_push_state(int new_state TSRMLS_DC)
 {
        zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
@@ -323,7 +350,6 @@ static const zend_encoding* zend_multibyte_detect_unicode(TSRMLS_D)
                /* remove BOM */
                script = (unsigned char*)emalloc(LANG_SCNG(script_org_size)+1-bom_size);
                memcpy(script, LANG_SCNG(script_org)+bom_size, LANG_SCNG(script_org_size)+1-bom_size);
-               efree(LANG_SCNG(script_org));
                LANG_SCNG(script_org) = script;
                LANG_SCNG(script_org_size) -= bom_size;
 
@@ -420,8 +446,8 @@ ZEND_API int zend_multibyte_set_filter(const zend_encoding *onetime_encoding TSR
        if (!internal_encoding || LANG_SCNG(script_encoding) == internal_encoding) {
                if (!zend_multibyte_check_lexer_compatibility(LANG_SCNG(script_encoding))) {
                        /* and if not, work around w/ script_encoding -> utf-8 -> script_encoding conversion */
-                       LANG_SCNG(input_filter) = zend_multibyte_script_encoding_filter;
-                       LANG_SCNG(output_filter) = zend_multibyte_internal_encoding_filter;
+                       LANG_SCNG(input_filter) = encoding_filter_script_to_intermediate;
+                       LANG_SCNG(output_filter) = encoding_filter_intermediate_to_script;
                } else {
                        LANG_SCNG(input_filter) = NULL;
                        LANG_SCNG(output_filter) = NULL;
@@ -429,9 +455,17 @@ ZEND_API int zend_multibyte_set_filter(const zend_encoding *onetime_encoding TSR
                return SUCCESS;
        }
 
-       /* both script and internal encodings are incompatible w/ flex */
-       LANG_SCNG(input_filter) = zend_multibyte_script_encoding_filter;
-       LANG_SCNG(output_filter) = zend_multibyte_internal_encoding_filter;
+       if (zend_multibyte_check_lexer_compatibility(internal_encoding)) {
+               LANG_SCNG(input_filter) = encoding_filter_script_to_internal;
+               LANG_SCNG(output_filter) = NULL;
+       } else if (zend_multibyte_check_lexer_compatibility(LANG_SCNG(script_encoding))) {
+               LANG_SCNG(input_filter) = NULL;
+               LANG_SCNG(output_filter) = encoding_filter_script_to_internal;
+       } else {
+               /* both script and internal encodings are incompatible w/ flex */
+               LANG_SCNG(input_filter) = encoding_filter_script_to_intermediate;
+               LANG_SCNG(output_filter) = encoding_filter_intermediate_to_internal;
+       }
 
        return 0;
 }
@@ -791,21 +825,9 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
 
 ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, zend_encoding *old_encoding TSRMLS_DC)
 {
-       size_t original_offset, offset, length;
+       size_t length;
        unsigned char *new_yy_start;
 
-       /* calculate current position */
-       offset = original_offset = YYCURSOR - SCNG(yy_start);
-       if (old_input_filter && offset > 0) {
-               const zend_encoding *new_encoding = SCNG(script_encoding);
-               zend_encoding_filter new_filter = SCNG(input_filter);
-               SCNG(script_encoding) = old_encoding;
-               SCNG(input_filter) = old_input_filter;
-               offset = zend_get_scanned_file_offset(TSRMLS_C);
-               SCNG(script_encoding) = new_encoding;
-               SCNG(input_filter) = new_filter;
-       }
-
        /* convert and set */
        if (!SCNG(input_filter)) {
                if (SCNG(script_filtered)) {
@@ -813,10 +835,10 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter
                        SCNG(script_filtered) = NULL;
                }
                SCNG(script_filtered_size) = 0;
-               length = SCNG(script_org_size) - offset;
-               new_yy_start = SCNG(script_org) + offset;
+               length = SCNG(script_org_size);
+               new_yy_start = SCNG(script_org);
        } else {
-               if ((size_t)-1 == SCNG(input_filter)(&new_yy_start, &length, SCNG(script_org) + offset, SCNG(script_org_size) - offset TSRMLS_CC)) {
+               if ((size_t)-1 == SCNG(input_filter)(&new_yy_start, &length, SCNG(script_org), SCNG(script_org_size) TSRMLS_CC)) {
                        zend_error_noreturn(E_COMPILE_ERROR, "Could not convert the script from the detected "
                                        "encoding \"%s\" to a compatible encoding", zend_multibyte_get_encoding_name(LANG_SCNG(script_encoding)));
                }
@@ -963,7 +985,7 @@ restart:
 yymore_restart:
 
 
-#line 967 "Zend/zend_language_scanner.c"
+#line 989 "Zend/zend_language_scanner.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -1062,7 +1084,7 @@ yyc_INITIAL:
 yy3:
                YYDEBUG(3, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1755 "Zend/zend_language_scanner.l"
+#line 1777 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -1122,7 +1144,7 @@ inline_html:
        HANDLE_NEWLINES(yytext, yyleng);
        return T_INLINE_HTML;
 }
-#line 1126 "Zend/zend_language_scanner.c"
+#line 1148 "Zend/zend_language_scanner.c"
 yy4:
                YYDEBUG(4, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1140,7 +1162,7 @@ yy5:
 yy6:
                YYDEBUG(6, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1743 "Zend/zend_language_scanner.l"
+#line 1765 "Zend/zend_language_scanner.l"
                {
        if (CG(short_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1152,14 +1174,14 @@ yy6:
                goto inline_char_handler;
        }
 }
-#line 1156 "Zend/zend_language_scanner.c"
+#line 1178 "Zend/zend_language_scanner.c"
 yy7:
                YYDEBUG(7, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '=') goto yy43;
                YYDEBUG(8, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1720 "Zend/zend_language_scanner.l"
+#line 1742 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1171,7 +1193,7 @@ yy7:
                goto inline_char_handler;
        }
 }
-#line 1175 "Zend/zend_language_scanner.c"
+#line 1197 "Zend/zend_language_scanner.c"
 yy9:
                YYDEBUG(9, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1357,7 +1379,7 @@ yy35:
                ++YYCURSOR;
                YYDEBUG(38, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1676 "Zend/zend_language_scanner.l"
+#line 1698 "Zend/zend_language_scanner.l"
                {
        YYCTYPE *bracket = zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1));
 
@@ -1374,7 +1396,7 @@ yy35:
        BEGIN(ST_IN_SCRIPTING);
        return T_OPEN_TAG;
 }
-#line 1378 "Zend/zend_language_scanner.c"
+#line 1400 "Zend/zend_language_scanner.c"
 yy39:
                YYDEBUG(39, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1401,7 +1423,7 @@ yy43:
                ++YYCURSOR;
                YYDEBUG(44, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1694 "Zend/zend_language_scanner.l"
+#line 1716 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1413,13 +1435,13 @@ yy43:
                goto inline_char_handler;
        }
 }
-#line 1417 "Zend/zend_language_scanner.c"
+#line 1439 "Zend/zend_language_scanner.c"
 yy45:
                YYDEBUG(45, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(46, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1707 "Zend/zend_language_scanner.l"
+#line 1729 "Zend/zend_language_scanner.l"
                {
        if (CG(short_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1431,7 +1453,7 @@ yy45:
                goto inline_char_handler;
        }
 }
-#line 1435 "Zend/zend_language_scanner.c"
+#line 1457 "Zend/zend_language_scanner.c"
 yy47:
                YYDEBUG(47, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1458,7 +1480,7 @@ yy50:
 yy51:
                YYDEBUG(51, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1733 "Zend/zend_language_scanner.l"
+#line 1755 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -1467,7 +1489,7 @@ yy51:
        BEGIN(ST_IN_SCRIPTING);
        return T_OPEN_TAG;
 }
-#line 1471 "Zend/zend_language_scanner.c"
+#line 1493 "Zend/zend_language_scanner.c"
 yy52:
                YYDEBUG(52, *YYCURSOR);
                ++YYCURSOR;
@@ -1538,7 +1560,7 @@ yyc_ST_BACKQUOTE:
 yy56:
                YYDEBUG(56, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2206 "Zend/zend_language_scanner.l"
+#line 2228 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -1579,7 +1601,7 @@ yy56:
        zend_scan_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 1583 "Zend/zend_language_scanner.c"
+#line 1605 "Zend/zend_language_scanner.c"
 yy57:
                YYDEBUG(57, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1590,12 +1612,12 @@ yy58:
                ++YYCURSOR;
                YYDEBUG(59, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2150 "Zend/zend_language_scanner.l"
+#line 2172 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '`';
 }
-#line 1599 "Zend/zend_language_scanner.c"
+#line 1621 "Zend/zend_language_scanner.c"
 yy60:
                YYDEBUG(60, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1605,14 +1627,14 @@ yy61:
                ++YYCURSOR;
                YYDEBUG(62, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2137 "Zend/zend_language_scanner.l"
+#line 2159 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        yyless(1);
        return T_CURLY_OPEN;
 }
-#line 1616 "Zend/zend_language_scanner.c"
+#line 1638 "Zend/zend_language_scanner.c"
 yy63:
                YYDEBUG(63, *YYCURSOR);
                yyaccept = 0;
@@ -1628,24 +1650,24 @@ yy63:
 yy65:
                YYDEBUG(65, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1837 "Zend/zend_language_scanner.l"
+#line 1859 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1638 "Zend/zend_language_scanner.c"
+#line 1660 "Zend/zend_language_scanner.c"
 yy66:
                YYDEBUG(66, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(67, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1469 "Zend/zend_language_scanner.l"
+#line 1491 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
 }
-#line 1649 "Zend/zend_language_scanner.c"
+#line 1671 "Zend/zend_language_scanner.c"
 yy68:
                YYDEBUG(68, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1659,7 +1681,7 @@ yy70:
                ++YYCURSOR;
                YYDEBUG(71, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1829 "Zend/zend_language_scanner.l"
+#line 1851 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1667,7 +1689,7 @@ yy70:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1671 "Zend/zend_language_scanner.c"
+#line 1693 "Zend/zend_language_scanner.c"
 yy72:
                YYDEBUG(72, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1685,7 +1707,7 @@ yy73:
                ++YYCURSOR;
                YYDEBUG(74, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1819 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1693,7 +1715,7 @@ yy73:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1697 "Zend/zend_language_scanner.c"
+#line 1719 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_DOUBLE_QUOTES:
@@ -1761,7 +1783,7 @@ yy77:
 yy78:
                YYDEBUG(78, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2156 "Zend/zend_language_scanner.l"
+#line 2178 "Zend/zend_language_scanner.l"
                {
        if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
                YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
@@ -1810,7 +1832,7 @@ double_quotes_scan_done:
        zend_scan_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 1814 "Zend/zend_language_scanner.c"
+#line 1836 "Zend/zend_language_scanner.c"
 yy79:
                YYDEBUG(79, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1821,12 +1843,12 @@ yy80:
                ++YYCURSOR;
                YYDEBUG(81, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2145 "Zend/zend_language_scanner.l"
+#line 2167 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '"';
 }
-#line 1830 "Zend/zend_language_scanner.c"
+#line 1852 "Zend/zend_language_scanner.c"
 yy82:
                YYDEBUG(82, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1836,14 +1858,14 @@ yy83:
                ++YYCURSOR;
                YYDEBUG(84, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2137 "Zend/zend_language_scanner.l"
+#line 2159 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        yyless(1);
        return T_CURLY_OPEN;
 }
-#line 1847 "Zend/zend_language_scanner.c"
+#line 1869 "Zend/zend_language_scanner.c"
 yy85:
                YYDEBUG(85, *YYCURSOR);
                yyaccept = 0;
@@ -1859,24 +1881,24 @@ yy85:
 yy87:
                YYDEBUG(87, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1837 "Zend/zend_language_scanner.l"
+#line 1859 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1869 "Zend/zend_language_scanner.c"
+#line 1891 "Zend/zend_language_scanner.c"
 yy88:
                YYDEBUG(88, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(89, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1469 "Zend/zend_language_scanner.l"
+#line 1491 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
 }
-#line 1880 "Zend/zend_language_scanner.c"
+#line 1902 "Zend/zend_language_scanner.c"
 yy90:
                YYDEBUG(90, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1890,7 +1912,7 @@ yy92:
                ++YYCURSOR;
                YYDEBUG(93, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1829 "Zend/zend_language_scanner.l"
+#line 1851 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1898,7 +1920,7 @@ yy92:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1902 "Zend/zend_language_scanner.c"
+#line 1924 "Zend/zend_language_scanner.c"
 yy94:
                YYDEBUG(94, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1916,7 +1938,7 @@ yy95:
                ++YYCURSOR;
                YYDEBUG(96, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1819 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1924,7 +1946,7 @@ yy95:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1928 "Zend/zend_language_scanner.c"
+#line 1950 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_END_HEREDOC:
@@ -1935,7 +1957,7 @@ yyc_ST_END_HEREDOC:
        ++YYCURSOR;
        YYDEBUG(100, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2124 "Zend/zend_language_scanner.l"
+#line 2146 "Zend/zend_language_scanner.l"
        {
        YYCURSOR += CG(heredoc_len) - 1;
        yyleng = CG(heredoc_len);
@@ -1947,7 +1969,7 @@ yyc_ST_END_HEREDOC:
        BEGIN(ST_IN_SCRIPTING);
        return T_END_HEREDOC;
 }
-#line 1951 "Zend/zend_language_scanner.c"
+#line 1973 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_HEREDOC:
        {
@@ -2009,7 +2031,7 @@ yy103:
 yy104:
                YYDEBUG(104, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2248 "Zend/zend_language_scanner.l"
+#line 2270 "Zend/zend_language_scanner.l"
                {
        int newline = 0;
 
@@ -2080,7 +2102,7 @@ heredoc_scan_done:
        zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0 TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 2084 "Zend/zend_language_scanner.c"
+#line 2106 "Zend/zend_language_scanner.c"
 yy105:
                YYDEBUG(105, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2095,14 +2117,14 @@ yy107:
                ++YYCURSOR;
                YYDEBUG(108, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2137 "Zend/zend_language_scanner.l"
+#line 2159 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        yyless(1);
        return T_CURLY_OPEN;
 }
-#line 2106 "Zend/zend_language_scanner.c"
+#line 2128 "Zend/zend_language_scanner.c"
 yy109:
                YYDEBUG(109, *YYCURSOR);
                yyaccept = 0;
@@ -2118,24 +2140,24 @@ yy109:
 yy111:
                YYDEBUG(111, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1837 "Zend/zend_language_scanner.l"
+#line 1859 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 2128 "Zend/zend_language_scanner.c"
+#line 2150 "Zend/zend_language_scanner.c"
 yy112:
                YYDEBUG(112, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(113, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1469 "Zend/zend_language_scanner.l"
+#line 1491 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
 }
-#line 2139 "Zend/zend_language_scanner.c"
+#line 2161 "Zend/zend_language_scanner.c"
 yy114:
                YYDEBUG(114, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2149,7 +2171,7 @@ yy116:
                ++YYCURSOR;
                YYDEBUG(117, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1829 "Zend/zend_language_scanner.l"
+#line 1851 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -2157,7 +2179,7 @@ yy116:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 2161 "Zend/zend_language_scanner.c"
+#line 2183 "Zend/zend_language_scanner.c"
 yy118:
                YYDEBUG(118, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2175,7 +2197,7 @@ yy119:
                ++YYCURSOR;
                YYDEBUG(120, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1819 "Zend/zend_language_scanner.l"
+#line 1841 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -2183,7 +2205,7 @@ yy119:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 2187 "Zend/zend_language_scanner.c"
+#line 2209 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_IN_SCRIPTING:
@@ -2364,13 +2386,13 @@ yy123:
 yy124:
                YYDEBUG(124, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1860 "Zend/zend_language_scanner.l"
+#line 1882 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 2374 "Zend/zend_language_scanner.c"
+#line 2396 "Zend/zend_language_scanner.c"
 yy125:
                YYDEBUG(125, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2624,11 +2646,11 @@ yy137:
 yy138:
                YYDEBUG(138, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1458 "Zend/zend_language_scanner.l"
+#line 1480 "Zend/zend_language_scanner.l"
                {
        return yytext[0];
 }
-#line 2632 "Zend/zend_language_scanner.c"
+#line 2654 "Zend/zend_language_scanner.c"
 yy139:
                YYDEBUG(139, *YYCURSOR);
                ++YYCURSOR;
@@ -2637,7 +2659,7 @@ yy139:
 yy140:
                YYDEBUG(140, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1133 "Zend/zend_language_scanner.l"
+#line 1155 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -2645,7 +2667,7 @@ yy140:
        HANDLE_NEWLINES(yytext, yyleng);
        return T_WHITESPACE;
 }
-#line 2649 "Zend/zend_language_scanner.c"
+#line 2671 "Zend/zend_language_scanner.c"
 yy141:
                YYDEBUG(141, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2656,11 +2678,11 @@ yy142:
                ++YYCURSOR;
                YYDEBUG(143, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1162 "Zend/zend_language_scanner.l"
+#line 1184 "Zend/zend_language_scanner.l"
                {
        return T_NS_SEPARATOR;
 }
-#line 2664 "Zend/zend_language_scanner.c"
+#line 2686 "Zend/zend_language_scanner.c"
 yy144:
                YYDEBUG(144, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2914,18 +2936,18 @@ yy167:
                ++YYCURSOR;
                YYDEBUG(168, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1463 "Zend/zend_language_scanner.l"
+#line 1485 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return '{';
 }
-#line 2923 "Zend/zend_language_scanner.c"
+#line 2945 "Zend/zend_language_scanner.c"
 yy169:
                YYDEBUG(169, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(170, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1475 "Zend/zend_language_scanner.l"
+#line 1497 "Zend/zend_language_scanner.l"
                {
        RESET_DOC_COMMENT();
        if (!zend_stack_is_empty(&SCNG(state_stack))) {
@@ -2933,7 +2955,7 @@ yy169:
        }
        return '}';
 }
-#line 2937 "Zend/zend_language_scanner.c"
+#line 2959 "Zend/zend_language_scanner.c"
 yy171:
                YYDEBUG(171, *YYCURSOR);
                yyaccept = 2;
@@ -2956,7 +2978,7 @@ yy171:
 yy172:
                YYDEBUG(172, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1501 "Zend/zend_language_scanner.l"
+#line 1523 "Zend/zend_language_scanner.l"
                {
        if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
                zendlval->value.lval = strtol(yytext, NULL, 0);
@@ -2977,7 +2999,7 @@ yy172:
        zendlval->type = IS_LONG;
        return T_LNUMBER;
 }
-#line 2981 "Zend/zend_language_scanner.c"
+#line 3003 "Zend/zend_language_scanner.c"
 yy173:
                YYDEBUG(173, *YYCURSOR);
                yyaccept = 2;
@@ -3005,7 +3027,7 @@ yy175:
 yy176:
                YYDEBUG(176, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1867 "Zend/zend_language_scanner.l"
+#line 1889 "Zend/zend_language_scanner.l"
                {
        while (YYCURSOR < YYLIMIT) {
                switch (*YYCURSOR++) {
@@ -3039,14 +3061,14 @@ yy176:
 
        return T_COMMENT;
 }
-#line 3043 "Zend/zend_language_scanner.c"
+#line 3065 "Zend/zend_language_scanner.c"
 yy177:
                YYDEBUG(177, *YYCURSOR);
                ++YYCURSOR;
 yy178:
                YYDEBUG(178, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1958 "Zend/zend_language_scanner.l"
+#line 1980 "Zend/zend_language_scanner.l"
                {
        register char *s, *t;
        char *end;
@@ -3114,14 +3136,14 @@ yy178:
        }
        return T_CONSTANT_ENCAPSED_STRING;
 }
-#line 3118 "Zend/zend_language_scanner.c"
+#line 3140 "Zend/zend_language_scanner.c"
 yy179:
                YYDEBUG(179, *YYCURSOR);
                ++YYCURSOR;
 yy180:
                YYDEBUG(180, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2027 "Zend/zend_language_scanner.l"
+#line 2049 "Zend/zend_language_scanner.l"
                {
        int bprefix = (yytext[0] != '"') ? 1 : 0;
 
@@ -3162,24 +3184,24 @@ yy180:
        BEGIN(ST_DOUBLE_QUOTES);
        return '"';
 }
-#line 3166 "Zend/zend_language_scanner.c"
+#line 3188 "Zend/zend_language_scanner.c"
 yy181:
                YYDEBUG(181, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(182, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2118 "Zend/zend_language_scanner.l"
+#line 2140 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_BACKQUOTE);
        return '`';
 }
-#line 3177 "Zend/zend_language_scanner.c"
+#line 3199 "Zend/zend_language_scanner.c"
 yy183:
                YYDEBUG(183, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(184, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2376 "Zend/zend_language_scanner.l"
+#line 2398 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -3188,7 +3210,7 @@ yy183:
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 3192 "Zend/zend_language_scanner.c"
+#line 3214 "Zend/zend_language_scanner.c"
 yy185:
                YYDEBUG(185, *YYCURSOR);
                ++YYCURSOR;
@@ -3215,13 +3237,13 @@ yy187:
 yy189:
                YYDEBUG(189, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1562 "Zend/zend_language_scanner.l"
+#line 1584 "Zend/zend_language_scanner.l"
                {
        zendlval->value.dval = zend_strtod(yytext, NULL);
        zendlval->type = IS_DOUBLE;
        return T_DNUMBER;
 }
-#line 3225 "Zend/zend_language_scanner.c"
+#line 3247 "Zend/zend_language_scanner.c"
 yy190:
                YYDEBUG(190, *YYCURSOR);
                yyaccept = 2;
@@ -3306,7 +3328,7 @@ yy198:
                }
                YYDEBUG(200, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1522 "Zend/zend_language_scanner.l"
+#line 1544 "Zend/zend_language_scanner.l"
                {
        char *hex = yytext + 2; /* Skip "0x" */
        int len = yyleng - 2;
@@ -3327,7 +3349,7 @@ yy198:
                return T_DNUMBER;
        }
 }
-#line 3331 "Zend/zend_language_scanner.c"
+#line 3353 "Zend/zend_language_scanner.c"
 yy201:
                YYDEBUG(201, *YYCURSOR);
                ++YYCURSOR;
@@ -3336,7 +3358,7 @@ yy201:
 yy202:
                YYDEBUG(202, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1935 "Zend/zend_language_scanner.l"
+#line 1957 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -3344,7 +3366,7 @@ yy202:
        BEGIN(INITIAL);
        return T_CLOSE_TAG;  /* implicit ';' at php-end tag */
 }
-#line 3348 "Zend/zend_language_scanner.c"
+#line 3370 "Zend/zend_language_scanner.c"
 yy203:
                YYDEBUG(203, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3378,13 +3400,13 @@ yy205:
 yy207:
                YYDEBUG(207, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1837 "Zend/zend_language_scanner.l"
+#line 1859 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 3388 "Zend/zend_language_scanner.c"
+#line 3410 "Zend/zend_language_scanner.c"
 yy208:
                YYDEBUG(208, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3398,61 +3420,61 @@ yy209:
                }
                YYDEBUG(210, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1446 "Zend/zend_language_scanner.l"
+#line 1468 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_XOR;
 }
-#line 3406 "Zend/zend_language_scanner.c"
+#line 3428 "Zend/zend_language_scanner.c"
 yy211:
                YYDEBUG(211, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(212, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1426 "Zend/zend_language_scanner.l"
+#line 1448 "Zend/zend_language_scanner.l"
                {
        return T_XOR_EQUAL;
 }
-#line 3416 "Zend/zend_language_scanner.c"
+#line 3438 "Zend/zend_language_scanner.c"
 yy213:
                YYDEBUG(213, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(214, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1430 "Zend/zend_language_scanner.l"
+#line 1452 "Zend/zend_language_scanner.l"
                {
        return T_BOOLEAN_OR;
 }
-#line 3426 "Zend/zend_language_scanner.c"
+#line 3448 "Zend/zend_language_scanner.c"
 yy215:
                YYDEBUG(215, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(216, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1422 "Zend/zend_language_scanner.l"
+#line 1444 "Zend/zend_language_scanner.l"
                {
        return T_OR_EQUAL;
 }
-#line 3436 "Zend/zend_language_scanner.c"
+#line 3458 "Zend/zend_language_scanner.c"
 yy217:
                YYDEBUG(217, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(218, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1434 "Zend/zend_language_scanner.l"
+#line 1456 "Zend/zend_language_scanner.l"
                {
        return T_BOOLEAN_AND;
 }
-#line 3446 "Zend/zend_language_scanner.c"
+#line 3468 "Zend/zend_language_scanner.c"
 yy219:
                YYDEBUG(219, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(220, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1418 "Zend/zend_language_scanner.l"
+#line 1440 "Zend/zend_language_scanner.l"
                {
        return T_AND_EQUAL;
 }
-#line 3456 "Zend/zend_language_scanner.c"
+#line 3478 "Zend/zend_language_scanner.c"
 yy221:
                YYDEBUG(221, *YYCURSOR);
                ++YYCURSOR;
@@ -3461,7 +3483,7 @@ yy221:
 yy222:
                YYDEBUG(222, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1944 "Zend/zend_language_scanner.l"
+#line 1966 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                BEGIN(INITIAL);
@@ -3474,17 +3496,17 @@ yy222:
                return yytext[0];
        }
 }
-#line 3478 "Zend/zend_language_scanner.c"
+#line 3500 "Zend/zend_language_scanner.c"
 yy223:
                YYDEBUG(223, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(224, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1406 "Zend/zend_language_scanner.l"
+#line 1428 "Zend/zend_language_scanner.l"
                {
        return T_MOD_EQUAL;
 }
-#line 3488 "Zend/zend_language_scanner.c"
+#line 3510 "Zend/zend_language_scanner.c"
 yy225:
                YYDEBUG(225, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3515,11 +3537,11 @@ yy229:
                ++YYCURSOR;
                YYDEBUG(230, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1402 "Zend/zend_language_scanner.l"
+#line 1424 "Zend/zend_language_scanner.l"
                {
        return T_CONCAT_EQUAL;
 }
-#line 3523 "Zend/zend_language_scanner.c"
+#line 3545 "Zend/zend_language_scanner.c"
 yy231:
                YYDEBUG(231, *YYCURSOR);
                yyaccept = 4;
@@ -3528,7 +3550,7 @@ yy231:
 yy232:
                YYDEBUG(232, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1901 "Zend/zend_language_scanner.l"
+#line 1923 "Zend/zend_language_scanner.l"
                {
        int doc_com;
 
@@ -3562,7 +3584,7 @@ yy232:
 
        return T_COMMENT;
 }
-#line 3566 "Zend/zend_language_scanner.c"
+#line 3588 "Zend/zend_language_scanner.c"
 yy233:
                YYDEBUG(233, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3572,11 +3594,11 @@ yy234:
                ++YYCURSOR;
                YYDEBUG(235, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1398 "Zend/zend_language_scanner.l"
+#line 1420 "Zend/zend_language_scanner.l"
                {
        return T_DIV_EQUAL;
 }
-#line 3580 "Zend/zend_language_scanner.c"
+#line 3602 "Zend/zend_language_scanner.c"
 yy236:
                YYDEBUG(236, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3599,42 +3621,42 @@ yy239:
                ++YYCURSOR;
                YYDEBUG(240, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1394 "Zend/zend_language_scanner.l"
+#line 1416 "Zend/zend_language_scanner.l"
                {
        return T_MUL_EQUAL;
 }
-#line 3607 "Zend/zend_language_scanner.c"
+#line 3629 "Zend/zend_language_scanner.c"
 yy241:
                YYDEBUG(241, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '=') goto yy245;
                YYDEBUG(242, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1454 "Zend/zend_language_scanner.l"
+#line 1476 "Zend/zend_language_scanner.l"
                {
        return T_SR;
 }
-#line 3618 "Zend/zend_language_scanner.c"
+#line 3640 "Zend/zend_language_scanner.c"
 yy243:
                YYDEBUG(243, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(244, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1382 "Zend/zend_language_scanner.l"
+#line 1404 "Zend/zend_language_scanner.l"
                {
        return T_IS_GREATER_OR_EQUAL;
 }
-#line 3628 "Zend/zend_language_scanner.c"
+#line 3650 "Zend/zend_language_scanner.c"
 yy245:
                YYDEBUG(245, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(246, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1414 "Zend/zend_language_scanner.l"
+#line 1436 "Zend/zend_language_scanner.l"
                {
        return T_SR_EQUAL;
 }
-#line 3638 "Zend/zend_language_scanner.c"
+#line 3660 "Zend/zend_language_scanner.c"
 yy247:
                YYDEBUG(247, *YYCURSOR);
                yyaccept = 5;
@@ -3645,11 +3667,11 @@ yy247:
 yy248:
                YYDEBUG(248, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1450 "Zend/zend_language_scanner.l"
+#line 1472 "Zend/zend_language_scanner.l"
                {
        return T_SL;
 }
-#line 3653 "Zend/zend_language_scanner.c"
+#line 3675 "Zend/zend_language_scanner.c"
 yy249:
                YYDEBUG(249, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3661,22 +3683,22 @@ yy250:
                ++YYCURSOR;
                YYDEBUG(251, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1378 "Zend/zend_language_scanner.l"
+#line 1400 "Zend/zend_language_scanner.l"
                {
        return T_IS_SMALLER_OR_EQUAL;
 }
-#line 3669 "Zend/zend_language_scanner.c"
+#line 3691 "Zend/zend_language_scanner.c"
 yy252:
                YYDEBUG(252, *YYCURSOR);
                ++YYCURSOR;
 yy253:
                YYDEBUG(253, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1374 "Zend/zend_language_scanner.l"
+#line 1396 "Zend/zend_language_scanner.l"
                {
        return T_IS_NOT_EQUAL;
 }
-#line 3680 "Zend/zend_language_scanner.c"
+#line 3702 "Zend/zend_language_scanner.c"
 yy254:
                YYDEBUG(254, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3727,11 +3749,11 @@ yy261:
                ++YYCURSOR;
                YYDEBUG(262, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1410 "Zend/zend_language_scanner.l"
+#line 1432 "Zend/zend_language_scanner.l"
                {
        return T_SL_EQUAL;
 }
-#line 3735 "Zend/zend_language_scanner.c"
+#line 3757 "Zend/zend_language_scanner.c"
 yy263:
                YYDEBUG(263, *YYCURSOR);
                ++YYCURSOR;
@@ -3836,7 +3858,7 @@ yy272:
 yy273:
                YYDEBUG(273, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2069 "Zend/zend_language_scanner.l"
+#line 2091 "Zend/zend_language_scanner.l"
                {
        char *s;
        int bprefix = (yytext[0] != '<') ? 1 : 0;
@@ -3884,7 +3906,7 @@ yy273:
 
        return T_START_HEREDOC;
 }
-#line 3888 "Zend/zend_language_scanner.c"
+#line 3910 "Zend/zend_language_scanner.c"
 yy274:
                YYDEBUG(274, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3924,31 +3946,31 @@ yy277:
                ++YYCURSOR;
                YYDEBUG(279, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1366 "Zend/zend_language_scanner.l"
+#line 1388 "Zend/zend_language_scanner.l"
                {
        return T_IS_NOT_IDENTICAL;
 }
-#line 3932 "Zend/zend_language_scanner.c"
+#line 3954 "Zend/zend_language_scanner.c"
 yy280:
                YYDEBUG(280, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(281, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1386 "Zend/zend_language_scanner.l"
+#line 1408 "Zend/zend_language_scanner.l"
                {
        return T_PLUS_EQUAL;
 }
-#line 3942 "Zend/zend_language_scanner.c"
+#line 3964 "Zend/zend_language_scanner.c"
 yy282:
                YYDEBUG(282, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(283, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1354 "Zend/zend_language_scanner.l"
+#line 1376 "Zend/zend_language_scanner.l"
                {
        return T_INC;
 }
-#line 3952 "Zend/zend_language_scanner.c"
+#line 3974 "Zend/zend_language_scanner.c"
 yy284:
                YYDEBUG(284, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3963,11 +3985,11 @@ yy285:
                }
                YYDEBUG(286, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1438 "Zend/zend_language_scanner.l"
+#line 1460 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_OR;
 }
-#line 3971 "Zend/zend_language_scanner.c"
+#line 3993 "Zend/zend_language_scanner.c"
 yy287:
                YYDEBUG(287, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4046,12 +4068,12 @@ yy295:
                ++YYCURSOR;
                YYDEBUG(296, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1349 "Zend/zend_language_scanner.l"
+#line 1371 "Zend/zend_language_scanner.l"
                {
        yyless((sizeof("object") - 1));
        return T_OBJECT_HINT;
 }
-#line 4055 "Zend/zend_language_scanner.c"
+#line 4077 "Zend/zend_language_scanner.c"
 yy297:
                YYDEBUG(297, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4144,7 +4166,7 @@ yy305:
                ++YYCURSOR;
                YYDEBUG(306, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1322 "Zend/zend_language_scanner.l"
+#line 1344 "Zend/zend_language_scanner.l"
                {
        if (yytext[3] == 'e') {
                yyless((sizeof("integer") - 1));
@@ -4155,7 +4177,7 @@ yy305:
        }
        return T_INT_HINT;
 }
-#line 4159 "Zend/zend_language_scanner.c"
+#line 4181 "Zend/zend_language_scanner.c"
 yy307:
                YYDEBUG(307, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4169,42 +4191,42 @@ yy308:
                }
                YYDEBUG(309, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1290 "Zend/zend_language_scanner.l"
+#line 1312 "Zend/zend_language_scanner.l"
                {
        return T_LIST;
 }
-#line 4177 "Zend/zend_language_scanner.c"
+#line 4199 "Zend/zend_language_scanner.c"
 yy310:
                YYDEBUG(310, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '=') goto yy314;
                YYDEBUG(311, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1370 "Zend/zend_language_scanner.l"
+#line 1392 "Zend/zend_language_scanner.l"
                {
        return T_IS_EQUAL;
 }
-#line 4188 "Zend/zend_language_scanner.c"
+#line 4210 "Zend/zend_language_scanner.c"
 yy312:
                YYDEBUG(312, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(313, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1286 "Zend/zend_language_scanner.l"
+#line 1308 "Zend/zend_language_scanner.l"
                {
        return T_DOUBLE_ARROW;
 }
-#line 4198 "Zend/zend_language_scanner.c"
+#line 4220 "Zend/zend_language_scanner.c"
 yy314:
                YYDEBUG(314, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(315, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1362 "Zend/zend_language_scanner.l"
+#line 1384 "Zend/zend_language_scanner.l"
                {
        return T_IS_IDENTICAL;
 }
-#line 4208 "Zend/zend_language_scanner.c"
+#line 4230 "Zend/zend_language_scanner.c"
 yy316:
                YYDEBUG(316, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4326,7 +4348,7 @@ yy331:
                }
                YYDEBUG(334, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1666 "Zend/zend_language_scanner.l"
+#line 1688 "Zend/zend_language_scanner.l"
                {
        if (CG(current_namespace)) {
                *zendlval = *CG(current_namespace);
@@ -4336,7 +4358,7 @@ yy331:
        }
        return T_NS_C;
 }
-#line 4340 "Zend/zend_language_scanner.c"
+#line 4362 "Zend/zend_language_scanner.c"
 yy335:
                YYDEBUG(335, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4356,7 +4378,7 @@ yy336:
                }
                YYDEBUG(339, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1639 "Zend/zend_language_scanner.l"
+#line 1661 "Zend/zend_language_scanner.l"
                {
        char *filename = zend_get_compiled_filename(TSRMLS_C);
        const size_t filename_len = strlen(filename);
@@ -4383,7 +4405,7 @@ yy336:
        zendlval->type = IS_STRING;
        return T_DIR;
 }
-#line 4387 "Zend/zend_language_scanner.c"
+#line 4409 "Zend/zend_language_scanner.c"
 yy340:
                YYDEBUG(340, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4408,13 +4430,13 @@ yy342:
                }
                YYDEBUG(345, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1621 "Zend/zend_language_scanner.l"
+#line 1643 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = CG(zend_lineno);
        zendlval->type = IS_LONG;
        return T_LINE;
 }
-#line 4418 "Zend/zend_language_scanner.c"
+#line 4440 "Zend/zend_language_scanner.c"
 yy346:
                YYDEBUG(346, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4449,7 +4471,7 @@ yy350:
                }
                YYDEBUG(353, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1600 "Zend/zend_language_scanner.l"
+#line 1622 "Zend/zend_language_scanner.l"
                {
        char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL;
        char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL;
@@ -4470,7 +4492,7 @@ yy350:
        zendlval->type = IS_STRING;
        return T_METHOD_C;
 }
-#line 4474 "Zend/zend_language_scanner.c"
+#line 4496 "Zend/zend_language_scanner.c"
 yy354:
                YYDEBUG(354, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4521,7 +4543,7 @@ yy361:
                }
                YYDEBUG(364, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1584 "Zend/zend_language_scanner.l"
+#line 1606 "Zend/zend_language_scanner.l"
                {
        char *func_name = NULL;
 
@@ -4537,7 +4559,7 @@ yy361:
        zendlval->type = IS_STRING;
        return T_FUNC_C;
 }
-#line 4541 "Zend/zend_language_scanner.c"
+#line 4563 "Zend/zend_language_scanner.c"
 yy365:
                YYDEBUG(365, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4557,7 +4579,7 @@ yy366:
                }
                YYDEBUG(369, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1627 "Zend/zend_language_scanner.l"
+#line 1649 "Zend/zend_language_scanner.l"
                {
        char *filename = zend_get_compiled_filename(TSRMLS_C);
 
@@ -4569,7 +4591,7 @@ yy366:
        zendlval->type = IS_STRING;
        return T_FILE;
 }
-#line 4573 "Zend/zend_language_scanner.c"
+#line 4595 "Zend/zend_language_scanner.c"
 yy370:
                YYDEBUG(370, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4599,7 +4621,7 @@ yy373:
                }
                YYDEBUG(376, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1568 "Zend/zend_language_scanner.l"
+#line 1590 "Zend/zend_language_scanner.l"
                {
        char *class_name = NULL;
 
@@ -4615,7 +4637,7 @@ yy373:
        zendlval->type = IS_STRING;
        return T_CLASS_C;
 }
-#line 4619 "Zend/zend_language_scanner.c"
+#line 4641 "Zend/zend_language_scanner.c"
 yy377:
                YYDEBUG(377, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4677,11 +4699,11 @@ yy388:
                }
                YYDEBUG(389, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1254 "Zend/zend_language_scanner.l"
+#line 1276 "Zend/zend_language_scanner.l"
                {
        return T_HALT_COMPILER;
 }
-#line 4685 "Zend/zend_language_scanner.c"
+#line 4707 "Zend/zend_language_scanner.c"
 yy390:
                YYDEBUG(390, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4701,11 +4723,11 @@ yy392:
                }
                YYDEBUG(393, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1234 "Zend/zend_language_scanner.l"
+#line 1256 "Zend/zend_language_scanner.l"
                {
        return T_USE;
 }
-#line 4709 "Zend/zend_language_scanner.c"
+#line 4731 "Zend/zend_language_scanner.c"
 yy394:
                YYDEBUG(394, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4724,11 +4746,11 @@ yy396:
                }
                YYDEBUG(397, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1282 "Zend/zend_language_scanner.l"
+#line 1304 "Zend/zend_language_scanner.l"
                {
        return T_UNSET;
 }
-#line 4732 "Zend/zend_language_scanner.c"
+#line 4754 "Zend/zend_language_scanner.c"
 yy398:
                YYDEBUG(398, *YYCURSOR);
                ++YYCURSOR;
@@ -4910,11 +4932,11 @@ yy413:
                ++YYCURSOR;
                YYDEBUG(415, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1178 "Zend/zend_language_scanner.l"
+#line 1200 "Zend/zend_language_scanner.l"
                {
        return T_INT_CAST;
 }
-#line 4918 "Zend/zend_language_scanner.c"
+#line 4940 "Zend/zend_language_scanner.c"
 yy416:
                YYDEBUG(416, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4958,11 +4980,11 @@ yy421:
                ++YYCURSOR;
                YYDEBUG(424, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1182 "Zend/zend_language_scanner.l"
+#line 1204 "Zend/zend_language_scanner.l"
                {
        return T_DOUBLE_CAST;
 }
-#line 4966 "Zend/zend_language_scanner.c"
+#line 4988 "Zend/zend_language_scanner.c"
 yy425:
                YYDEBUG(425, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5038,11 +5060,11 @@ yy436:
                ++YYCURSOR;
                YYDEBUG(439, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1190 "Zend/zend_language_scanner.l"
+#line 1212 "Zend/zend_language_scanner.l"
                {
        return T_SCALAR_CAST;
 }
-#line 5046 "Zend/zend_language_scanner.c"
+#line 5068 "Zend/zend_language_scanner.c"
 yy440:
                YYDEBUG(440, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5075,11 +5097,11 @@ yy443:
                ++YYCURSOR;
                YYDEBUG(446, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1186 "Zend/zend_language_scanner.l"
+#line 1208 "Zend/zend_language_scanner.l"
                {
        return T_STRING_CAST;
 }
-#line 5083 "Zend/zend_language_scanner.c"
+#line 5105 "Zend/zend_language_scanner.c"
 yy447:
                YYDEBUG(447, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5112,11 +5134,11 @@ yy450:
                ++YYCURSOR;
                YYDEBUG(453, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1194 "Zend/zend_language_scanner.l"
+#line 1216 "Zend/zend_language_scanner.l"
                {
        return T_ARRAY_CAST;
 }
-#line 5120 "Zend/zend_language_scanner.c"
+#line 5142 "Zend/zend_language_scanner.c"
 yy454:
                YYDEBUG(454, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5154,11 +5176,11 @@ yy458:
                ++YYCURSOR;
                YYDEBUG(461, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1198 "Zend/zend_language_scanner.l"
+#line 1220 "Zend/zend_language_scanner.l"
                {
        return T_OBJECT_CAST;
 }
-#line 5162 "Zend/zend_language_scanner.c"
+#line 5184 "Zend/zend_language_scanner.c"
 yy462:
                YYDEBUG(462, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5199,11 +5221,11 @@ yy467:
                ++YYCURSOR;
                YYDEBUG(469, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1202 "Zend/zend_language_scanner.l"
+#line 1224 "Zend/zend_language_scanner.l"
                {
        return T_BOOL_CAST;
 }
-#line 5207 "Zend/zend_language_scanner.c"
+#line 5229 "Zend/zend_language_scanner.c"
 yy470:
                YYDEBUG(470, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5263,11 +5285,11 @@ yy478:
                ++YYCURSOR;
                YYDEBUG(481, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1206 "Zend/zend_language_scanner.l"
+#line 1228 "Zend/zend_language_scanner.l"
                {
        return T_UNSET_CAST;
 }
-#line 5271 "Zend/zend_language_scanner.c"
+#line 5293 "Zend/zend_language_scanner.c"
 yy482:
                YYDEBUG(482, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5281,11 +5303,11 @@ yy483:
                }
                YYDEBUG(484, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1174 "Zend/zend_language_scanner.l"
+#line 1196 "Zend/zend_language_scanner.l"
                {
        return T_VAR;
 }
-#line 5289 "Zend/zend_language_scanner.c"
+#line 5311 "Zend/zend_language_scanner.c"
 yy485:
                YYDEBUG(485, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5399,12 +5421,12 @@ yy497:
                ++YYCURSOR;
                YYDEBUG(498, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1317 "Zend/zend_language_scanner.l"
+#line 1339 "Zend/zend_language_scanner.l"
                {
        yyless(7);
        return T_NUMERIC_HINT;
 }
-#line 5408 "Zend/zend_language_scanner.c"
+#line 5430 "Zend/zend_language_scanner.c"
 yy499:
                YYDEBUG(499, *YYCURSOR);
                ++YYCURSOR;
@@ -5413,11 +5435,11 @@ yy499:
                }
                YYDEBUG(500, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1166 "Zend/zend_language_scanner.l"
+#line 1188 "Zend/zend_language_scanner.l"
                {
        return T_NEW;
 }
-#line 5421 "Zend/zend_language_scanner.c"
+#line 5443 "Zend/zend_language_scanner.c"
 yy501:
                YYDEBUG(501, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5456,21 +5478,21 @@ yy507:
                }
                YYDEBUG(508, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1230 "Zend/zend_language_scanner.l"
+#line 1252 "Zend/zend_language_scanner.l"
                {
        return T_NAMESPACE;
 }
-#line 5464 "Zend/zend_language_scanner.c"
+#line 5486 "Zend/zend_language_scanner.c"
 yy509:
                YYDEBUG(509, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(510, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1158 "Zend/zend_language_scanner.l"
+#line 1180 "Zend/zend_language_scanner.l"
                {
        return T_PAAMAYIM_NEKUDOTAYIM;
 }
-#line 5474 "Zend/zend_language_scanner.c"
+#line 5496 "Zend/zend_language_scanner.c"
 yy511:
                YYDEBUG(511, *YYCURSOR);
                ++YYCURSOR;
@@ -5492,32 +5514,32 @@ yy513:
                ++YYCURSOR;
                YYDEBUG(514, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1390 "Zend/zend_language_scanner.l"
+#line 1412 "Zend/zend_language_scanner.l"
                {
        return T_MINUS_EQUAL;
 }
-#line 5500 "Zend/zend_language_scanner.c"
+#line 5522 "Zend/zend_language_scanner.c"
 yy515:
                YYDEBUG(515, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(516, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1358 "Zend/zend_language_scanner.l"
+#line 1380 "Zend/zend_language_scanner.l"
                {
        return T_DEC;
 }
-#line 5510 "Zend/zend_language_scanner.c"
+#line 5532 "Zend/zend_language_scanner.c"
 yy517:
                YYDEBUG(517, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(518, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1128 "Zend/zend_language_scanner.l"
+#line 1150 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
        return T_OBJECT_OPERATOR;
 }
-#line 5521 "Zend/zend_language_scanner.c"
+#line 5543 "Zend/zend_language_scanner.c"
 yy519:
                YYDEBUG(519, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5562,11 +5584,11 @@ yy524:
                }
                YYDEBUG(525, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1278 "Zend/zend_language_scanner.l"
+#line 1300 "Zend/zend_language_scanner.l"
                {
        return T_PUBLIC;
 }
-#line 5570 "Zend/zend_language_scanner.c"
+#line 5592 "Zend/zend_language_scanner.c"
 yy526:
                YYDEBUG(526, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5621,11 +5643,11 @@ yy533:
                }
                YYDEBUG(534, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1274 "Zend/zend_language_scanner.l"
+#line 1296 "Zend/zend_language_scanner.l"
                {
        return T_PROTECTED;
 }
-#line 5629 "Zend/zend_language_scanner.c"
+#line 5651 "Zend/zend_language_scanner.c"
 yy535:
                YYDEBUG(535, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5655,11 +5677,11 @@ yy539:
                }
                YYDEBUG(540, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1270 "Zend/zend_language_scanner.l"
+#line 1292 "Zend/zend_language_scanner.l"
                {
        return T_PRIVATE;
 }
-#line 5663 "Zend/zend_language_scanner.c"
+#line 5685 "Zend/zend_language_scanner.c"
 yy541:
                YYDEBUG(541, *YYCURSOR);
                ++YYCURSOR;
@@ -5668,11 +5690,11 @@ yy541:
                }
                YYDEBUG(542, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1104 "Zend/zend_language_scanner.l"
+#line 1126 "Zend/zend_language_scanner.l"
                {
        return T_PRINT;
 }
-#line 5676 "Zend/zend_language_scanner.c"
+#line 5698 "Zend/zend_language_scanner.c"
 yy543:
                YYDEBUG(543, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5697,11 +5719,11 @@ yy546:
                }
                YYDEBUG(547, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1096 "Zend/zend_language_scanner.l"
+#line 1118 "Zend/zend_language_scanner.l"
                {
        return T_GOTO;
 }
-#line 5705 "Zend/zend_language_scanner.c"
+#line 5727 "Zend/zend_language_scanner.c"
 yy548:
                YYDEBUG(548, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5725,11 +5747,11 @@ yy551:
                }
                YYDEBUG(552, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1242 "Zend/zend_language_scanner.l"
+#line 1264 "Zend/zend_language_scanner.l"
                {
        return T_GLOBAL;
 }
-#line 5733 "Zend/zend_language_scanner.c"
+#line 5755 "Zend/zend_language_scanner.c"
 yy553:
                YYDEBUG(553, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5778,11 +5800,11 @@ yy561:
                }
                YYDEBUG(562, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1088 "Zend/zend_language_scanner.l"
+#line 1110 "Zend/zend_language_scanner.l"
                {
        return T_BREAK;
 }
-#line 5786 "Zend/zend_language_scanner.c"
+#line 5808 "Zend/zend_language_scanner.c"
 yy563:
                YYDEBUG(563, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5887,7 +5909,7 @@ yy569:
                ++YYCURSOR;
                YYDEBUG(570, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1298 "Zend/zend_language_scanner.l"
+#line 1320 "Zend/zend_language_scanner.l"
                {
        if (yytext[4] == 'e') {
                yyless((sizeof("boolean") - 1));
@@ -5896,7 +5918,7 @@ yy569:
        }
        return T_BOOL_HINT;
 }
-#line 5900 "Zend/zend_language_scanner.c"
+#line 5922 "Zend/zend_language_scanner.c"
 yy571:
                YYDEBUG(571, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6023,12 +6045,12 @@ yy582:
                ++YYCURSOR;
                YYDEBUG(583, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1307 "Zend/zend_language_scanner.l"
+#line 1329 "Zend/zend_language_scanner.l"
                {
        yyless(6);
        return T_STRING_HINT;
 }
-#line 6032 "Zend/zend_language_scanner.c"
+#line 6054 "Zend/zend_language_scanner.c"
 yy584:
                YYDEBUG(584, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6084,11 +6106,11 @@ yy591:
                }
                YYDEBUG(592, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1072 "Zend/zend_language_scanner.l"
+#line 1094 "Zend/zend_language_scanner.l"
                {
        return T_SWITCH;
 }
-#line 6092 "Zend/zend_language_scanner.c"
+#line 6114 "Zend/zend_language_scanner.c"
 yy593:
                YYDEBUG(593, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6129,11 +6151,11 @@ yy599:
                }
                YYDEBUG(600, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1258 "Zend/zend_language_scanner.l"
+#line 1280 "Zend/zend_language_scanner.l"
                {
        return T_STATIC;
 }
-#line 6137 "Zend/zend_language_scanner.c"
+#line 6159 "Zend/zend_language_scanner.c"
 yy601:
                YYDEBUG(601, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6225,12 +6247,12 @@ yy609:
                ++YYCURSOR;
                YYDEBUG(610, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1312 "Zend/zend_language_scanner.l"
+#line 1334 "Zend/zend_language_scanner.l"
                {
        yyless(6);
        return T_SCALAR_HINT;
 }
-#line 6234 "Zend/zend_language_scanner.c"
+#line 6256 "Zend/zend_language_scanner.c"
 yy611:
                YYDEBUG(611, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6257,11 +6279,11 @@ yy614:
                }
                YYDEBUG(615, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1068 "Zend/zend_language_scanner.l"
+#line 1090 "Zend/zend_language_scanner.l"
                {
        return T_AS;
 }
-#line 6265 "Zend/zend_language_scanner.c"
+#line 6287 "Zend/zend_language_scanner.c"
 yy616:
                YYDEBUG(616, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6280,11 +6302,11 @@ yy618:
                }
                YYDEBUG(619, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1294 "Zend/zend_language_scanner.l"
+#line 1316 "Zend/zend_language_scanner.l"
                {
        return T_ARRAY;
 }
-#line 6288 "Zend/zend_language_scanner.c"
+#line 6310 "Zend/zend_language_scanner.c"
 yy620:
                YYDEBUG(620, *YYCURSOR);
                ++YYCURSOR;
@@ -6293,11 +6315,11 @@ yy620:
                }
                YYDEBUG(621, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1442 "Zend/zend_language_scanner.l"
+#line 1464 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_AND;
 }
-#line 6301 "Zend/zend_language_scanner.c"
+#line 6323 "Zend/zend_language_scanner.c"
 yy622:
                YYDEBUG(622, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6331,11 +6353,11 @@ yy627:
                }
                YYDEBUG(628, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1262 "Zend/zend_language_scanner.l"
+#line 1284 "Zend/zend_language_scanner.l"
                {
        return T_ABSTRACT;
 }
-#line 6339 "Zend/zend_language_scanner.c"
+#line 6361 "Zend/zend_language_scanner.c"
 yy629:
                YYDEBUG(629, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6359,11 +6381,11 @@ yy632:
                }
                YYDEBUG(633, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1028 "Zend/zend_language_scanner.l"
+#line 1050 "Zend/zend_language_scanner.l"
                {
        return T_WHILE;
 }
-#line 6367 "Zend/zend_language_scanner.c"
+#line 6389 "Zend/zend_language_scanner.c"
 yy634:
                YYDEBUG(634, *YYCURSOR);
                ++YYCURSOR;
@@ -6372,11 +6394,11 @@ yy634:
                }
                YYDEBUG(635, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1012 "Zend/zend_language_scanner.l"
+#line 1034 "Zend/zend_language_scanner.l"
                {
        return T_IF;
 }
-#line 6380 "Zend/zend_language_scanner.c"
+#line 6402 "Zend/zend_language_scanner.c"
 yy636:
                YYDEBUG(636, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6428,11 +6450,11 @@ yy641:
                }
                YYDEBUG(642, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1246 "Zend/zend_language_scanner.l"
+#line 1268 "Zend/zend_language_scanner.l"
                {
        return T_ISSET;
 }
-#line 6436 "Zend/zend_language_scanner.c"
+#line 6458 "Zend/zend_language_scanner.c"
 yy643:
                YYDEBUG(643, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6528,11 +6550,11 @@ yy649:
 yy650:
                YYDEBUG(650, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1214 "Zend/zend_language_scanner.l"
+#line 1236 "Zend/zend_language_scanner.l"
                {
        return T_INCLUDE;
 }
-#line 6536 "Zend/zend_language_scanner.c"
+#line 6558 "Zend/zend_language_scanner.c"
 yy651:
                YYDEBUG(651, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6561,11 +6583,11 @@ yy655:
                }
                YYDEBUG(656, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1218 "Zend/zend_language_scanner.l"
+#line 1240 "Zend/zend_language_scanner.l"
                {
        return T_INCLUDE_ONCE;
 }
-#line 6569 "Zend/zend_language_scanner.c"
+#line 6591 "Zend/zend_language_scanner.c"
 yy657:
                YYDEBUG(657, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6619,11 +6641,11 @@ yy664:
                }
                YYDEBUG(665, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1112 "Zend/zend_language_scanner.l"
+#line 1134 "Zend/zend_language_scanner.l"
                {
        return T_INTERFACE;
 }
-#line 6627 "Zend/zend_language_scanner.c"
+#line 6649 "Zend/zend_language_scanner.c"
 yy666:
                YYDEBUG(666, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6673,11 +6695,11 @@ yy672:
                }
                YYDEBUG(673, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1238 "Zend/zend_language_scanner.l"
+#line 1260 "Zend/zend_language_scanner.l"
                {
         return T_INSTEADOF;
 }
-#line 6681 "Zend/zend_language_scanner.c"
+#line 6703 "Zend/zend_language_scanner.c"
 yy674:
                YYDEBUG(674, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6706,11 +6728,11 @@ yy678:
                }
                YYDEBUG(679, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1064 "Zend/zend_language_scanner.l"
+#line 1086 "Zend/zend_language_scanner.l"
                {
        return T_INSTANCEOF;
 }
-#line 6714 "Zend/zend_language_scanner.c"
+#line 6736 "Zend/zend_language_scanner.c"
 yy680:
                YYDEBUG(680, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6754,11 +6776,11 @@ yy687:
                }
                YYDEBUG(688, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1124 "Zend/zend_language_scanner.l"
+#line 1146 "Zend/zend_language_scanner.l"
                {
        return T_IMPLEMENTS;
 }
-#line 6762 "Zend/zend_language_scanner.c"
+#line 6784 "Zend/zend_language_scanner.c"
 yy689:
                YYDEBUG(689, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6786,11 +6808,11 @@ yy690:
                }
                YYDEBUG(692, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1000 "Zend/zend_language_scanner.l"
+#line 1022 "Zend/zend_language_scanner.l"
                {
        return T_TRY;
 }
-#line 6794 "Zend/zend_language_scanner.c"
+#line 6816 "Zend/zend_language_scanner.c"
 yy693:
                YYDEBUG(693, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6809,11 +6831,11 @@ yy695:
                }
                YYDEBUG(696, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1116 "Zend/zend_language_scanner.l"
+#line 1138 "Zend/zend_language_scanner.l"
                {
        return T_TRAIT;
 }
-#line 6817 "Zend/zend_language_scanner.c"
+#line 6839 "Zend/zend_language_scanner.c"
 yy697:
                YYDEBUG(697, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6832,11 +6854,11 @@ yy699:
                }
                YYDEBUG(700, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1008 "Zend/zend_language_scanner.l"
+#line 1030 "Zend/zend_language_scanner.l"
                {
        return T_THROW;
 }
-#line 6840 "Zend/zend_language_scanner.c"
+#line 6862 "Zend/zend_language_scanner.c"
 yy701:
                YYDEBUG(701, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6978,12 +7000,12 @@ yy715:
                ++YYCURSOR;
                YYDEBUG(716, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1344 "Zend/zend_language_scanner.l"
+#line 1366 "Zend/zend_language_scanner.l"
                {
        yyless((sizeof("resource") - 1));
        return T_RESOURCE_HINT;
 }
-#line 6987 "Zend/zend_language_scanner.c"
+#line 7009 "Zend/zend_language_scanner.c"
 yy717:
                YYDEBUG(717, *YYCURSOR);
                yyaccept = 0;
@@ -7060,7 +7082,7 @@ yy722:
                ++YYCURSOR;
                YYDEBUG(723, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1333 "Zend/zend_language_scanner.l"
+#line 1355 "Zend/zend_language_scanner.l"
                {
        if (yytext[4] == 'l') {
                yyless((sizeof("double") - 1));
@@ -7071,7 +7093,7 @@ yy722:
        }
        return T_DOUBLE_HINT;
 }
-#line 7075 "Zend/zend_language_scanner.c"
+#line 7097 "Zend/zend_language_scanner.c"
 yy724:
                YYDEBUG(724, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7108,11 +7130,11 @@ yy727:
 yy728:
                YYDEBUG(728, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1222 "Zend/zend_language_scanner.l"
+#line 1244 "Zend/zend_language_scanner.l"
                {
        return T_REQUIRE;
 }
-#line 7116 "Zend/zend_language_scanner.c"
+#line 7138 "Zend/zend_language_scanner.c"
 yy729:
                YYDEBUG(729, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7141,11 +7163,11 @@ yy733:
                }
                YYDEBUG(734, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1226 "Zend/zend_language_scanner.l"
+#line 1248 "Zend/zend_language_scanner.l"
                {
        return T_REQUIRE_ONCE;
 }
-#line 7149 "Zend/zend_language_scanner.c"
+#line 7171 "Zend/zend_language_scanner.c"
 yy735:
                YYDEBUG(735, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7164,11 +7186,11 @@ yy737:
                }
                YYDEBUG(738, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 996 "Zend/zend_language_scanner.l"
+#line 1018 "Zend/zend_language_scanner.l"
                {
        return T_RETURN;
 }
-#line 7172 "Zend/zend_language_scanner.c"
+#line 7194 "Zend/zend_language_scanner.c"
 yy739:
                YYDEBUG(739, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7249,11 +7271,11 @@ yy748:
                }
                YYDEBUG(749, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1092 "Zend/zend_language_scanner.l"
+#line 1114 "Zend/zend_language_scanner.l"
                {
        return T_CONTINUE;
 }
-#line 7257 "Zend/zend_language_scanner.c"
+#line 7279 "Zend/zend_language_scanner.c"
 yy750:
                YYDEBUG(750, *YYCURSOR);
                ++YYCURSOR;
@@ -7262,11 +7284,11 @@ yy750:
                }
                YYDEBUG(751, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 992 "Zend/zend_language_scanner.l"
+#line 1014 "Zend/zend_language_scanner.l"
                {
        return T_CONST;
 }
-#line 7270 "Zend/zend_language_scanner.c"
+#line 7292 "Zend/zend_language_scanner.c"
 yy752:
                YYDEBUG(752, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7291,11 +7313,11 @@ yy755:
                }
                YYDEBUG(756, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1170 "Zend/zend_language_scanner.l"
+#line 1192 "Zend/zend_language_scanner.l"
                {
        return T_CLONE;
 }
-#line 7299 "Zend/zend_language_scanner.c"
+#line 7321 "Zend/zend_language_scanner.c"
 yy757:
                YYDEBUG(757, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7309,11 +7331,11 @@ yy758:
                }
                YYDEBUG(759, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1108 "Zend/zend_language_scanner.l"
+#line 1130 "Zend/zend_language_scanner.l"
                {
        return T_CLASS;
 }
-#line 7317 "Zend/zend_language_scanner.c"
+#line 7339 "Zend/zend_language_scanner.c"
 yy760:
                YYDEBUG(760, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7333,11 +7355,11 @@ yy762:
                }
                YYDEBUG(763, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1080 "Zend/zend_language_scanner.l"
+#line 1102 "Zend/zend_language_scanner.l"
                {
        return T_CASE;
 }
-#line 7341 "Zend/zend_language_scanner.c"
+#line 7363 "Zend/zend_language_scanner.c"
 yy764:
                YYDEBUG(764, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7351,11 +7373,11 @@ yy765:
                }
                YYDEBUG(766, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1004 "Zend/zend_language_scanner.l"
+#line 1026 "Zend/zend_language_scanner.l"
                {
        return T_CATCH;
 }
-#line 7359 "Zend/zend_language_scanner.c"
+#line 7381 "Zend/zend_language_scanner.c"
 yy767:
                YYDEBUG(767, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7412,11 +7434,11 @@ yy776:
                }
                YYDEBUG(777, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 988 "Zend/zend_language_scanner.l"
+#line 1010 "Zend/zend_language_scanner.l"
                {
        return T_FUNCTION;
 }
-#line 7420 "Zend/zend_language_scanner.c"
+#line 7442 "Zend/zend_language_scanner.c"
 yy778:
                YYDEBUG(778, *YYCURSOR);
                ++YYCURSOR;
@@ -7440,11 +7462,11 @@ yy778:
 yy779:
                YYDEBUG(779, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1040 "Zend/zend_language_scanner.l"
+#line 1062 "Zend/zend_language_scanner.l"
                {
        return T_FOR;
 }
-#line 7448 "Zend/zend_language_scanner.c"
+#line 7470 "Zend/zend_language_scanner.c"
 yy780:
                YYDEBUG(780, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7468,11 +7490,11 @@ yy783:
                }
                YYDEBUG(784, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1048 "Zend/zend_language_scanner.l"
+#line 1070 "Zend/zend_language_scanner.l"
                {
        return T_FOREACH;
 }
-#line 7476 "Zend/zend_language_scanner.c"
+#line 7498 "Zend/zend_language_scanner.c"
 yy785:
                YYDEBUG(785, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7502,11 +7524,11 @@ yy789:
                }
                YYDEBUG(790, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1266 "Zend/zend_language_scanner.l"
+#line 1288 "Zend/zend_language_scanner.l"
                {
        return T_FINAL;
 }
-#line 7510 "Zend/zend_language_scanner.c"
+#line 7532 "Zend/zend_language_scanner.c"
 yy791:
                YYDEBUG(791, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7552,11 +7574,11 @@ yy793:
 yy794:
                YYDEBUG(794, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1036 "Zend/zend_language_scanner.l"
+#line 1058 "Zend/zend_language_scanner.l"
                {
        return T_DO;
 }
-#line 7560 "Zend/zend_language_scanner.c"
+#line 7582 "Zend/zend_language_scanner.c"
 yy795:
                YYDEBUG(795, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7581,11 +7603,11 @@ yy798:
                }
                YYDEBUG(799, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 984 "Zend/zend_language_scanner.l"
+#line 1006 "Zend/zend_language_scanner.l"
                {
        return T_EXIT;
 }
-#line 7589 "Zend/zend_language_scanner.c"
+#line 7611 "Zend/zend_language_scanner.c"
 yy800:
                YYDEBUG(800, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7620,11 +7642,11 @@ yy805:
                }
                YYDEBUG(806, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1084 "Zend/zend_language_scanner.l"
+#line 1106 "Zend/zend_language_scanner.l"
                {
        return T_DEFAULT;
 }
-#line 7628 "Zend/zend_language_scanner.c"
+#line 7650 "Zend/zend_language_scanner.c"
 yy807:
                YYDEBUG(807, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7648,11 +7670,11 @@ yy810:
                }
                YYDEBUG(811, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1056 "Zend/zend_language_scanner.l"
+#line 1078 "Zend/zend_language_scanner.l"
                {
        return T_DECLARE;
 }
-#line 7656 "Zend/zend_language_scanner.c"
+#line 7678 "Zend/zend_language_scanner.c"
 yy812:
                YYDEBUG(812, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7732,11 +7754,11 @@ yy823:
                }
                YYDEBUG(824, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1120 "Zend/zend_language_scanner.l"
+#line 1142 "Zend/zend_language_scanner.l"
                {
        return T_EXTENDS;
 }
-#line 7740 "Zend/zend_language_scanner.c"
+#line 7762 "Zend/zend_language_scanner.c"
 yy825:
                YYDEBUG(825, *YYCURSOR);
                ++YYCURSOR;
@@ -7745,11 +7767,11 @@ yy825:
                }
                YYDEBUG(826, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 980 "Zend/zend_language_scanner.l"
+#line 1002 "Zend/zend_language_scanner.l"
                {
        return T_EXIT;
 }
-#line 7753 "Zend/zend_language_scanner.c"
+#line 7775 "Zend/zend_language_scanner.c"
 yy827:
                YYDEBUG(827, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7763,11 +7785,11 @@ yy828:
                }
                YYDEBUG(829, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1210 "Zend/zend_language_scanner.l"
+#line 1232 "Zend/zend_language_scanner.l"
                {
        return T_EVAL;
 }
-#line 7771 "Zend/zend_language_scanner.c"
+#line 7793 "Zend/zend_language_scanner.c"
 yy830:
                YYDEBUG(830, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7837,11 +7859,11 @@ yy839:
                }
                YYDEBUG(840, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1032 "Zend/zend_language_scanner.l"
+#line 1054 "Zend/zend_language_scanner.l"
                {
        return T_ENDWHILE;
 }
-#line 7845 "Zend/zend_language_scanner.c"
+#line 7867 "Zend/zend_language_scanner.c"
 yy841:
                YYDEBUG(841, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7870,11 +7892,11 @@ yy845:
                }
                YYDEBUG(846, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1076 "Zend/zend_language_scanner.l"
+#line 1098 "Zend/zend_language_scanner.l"
                {
        return T_ENDSWITCH;
 }
-#line 7878 "Zend/zend_language_scanner.c"
+#line 7900 "Zend/zend_language_scanner.c"
 yy847:
                YYDEBUG(847, *YYCURSOR);
                ++YYCURSOR;
@@ -7883,11 +7905,11 @@ yy847:
                }
                YYDEBUG(848, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1020 "Zend/zend_language_scanner.l"
+#line 1042 "Zend/zend_language_scanner.l"
                {
        return T_ENDIF;
 }
-#line 7891 "Zend/zend_language_scanner.c"
+#line 7913 "Zend/zend_language_scanner.c"
 yy849:
                YYDEBUG(849, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7916,11 +7938,11 @@ yy850:
 yy851:
                YYDEBUG(851, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1044 "Zend/zend_language_scanner.l"
+#line 1066 "Zend/zend_language_scanner.l"
                {
        return T_ENDFOR;
 }
-#line 7924 "Zend/zend_language_scanner.c"
+#line 7946 "Zend/zend_language_scanner.c"
 yy852:
                YYDEBUG(852, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7944,11 +7966,11 @@ yy855:
                }
                YYDEBUG(856, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1052 "Zend/zend_language_scanner.l"
+#line 1074 "Zend/zend_language_scanner.l"
                {
        return T_ENDFOREACH;
 }
-#line 7952 "Zend/zend_language_scanner.c"
+#line 7974 "Zend/zend_language_scanner.c"
 yy857:
                YYDEBUG(857, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7982,11 +8004,11 @@ yy862:
                }
                YYDEBUG(863, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1060 "Zend/zend_language_scanner.l"
+#line 1082 "Zend/zend_language_scanner.l"
                {
        return T_ENDDECLARE;
 }
-#line 7990 "Zend/zend_language_scanner.c"
+#line 8012 "Zend/zend_language_scanner.c"
 yy864:
                YYDEBUG(864, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8005,11 +8027,11 @@ yy866:
                }
                YYDEBUG(867, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1250 "Zend/zend_language_scanner.l"
+#line 1272 "Zend/zend_language_scanner.l"
                {
        return T_EMPTY;
 }
-#line 8013 "Zend/zend_language_scanner.c"
+#line 8035 "Zend/zend_language_scanner.c"
 yy868:
                YYDEBUG(868, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8038,11 +8060,11 @@ yy869:
 yy870:
                YYDEBUG(870, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1024 "Zend/zend_language_scanner.l"
+#line 1046 "Zend/zend_language_scanner.l"
                {
        return T_ELSE;
 }
-#line 8046 "Zend/zend_language_scanner.c"
+#line 8068 "Zend/zend_language_scanner.c"
 yy871:
                YYDEBUG(871, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8056,11 +8078,11 @@ yy872:
                }
                YYDEBUG(873, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1016 "Zend/zend_language_scanner.l"
+#line 1038 "Zend/zend_language_scanner.l"
                {
        return T_ELSEIF;
 }
-#line 8064 "Zend/zend_language_scanner.c"
+#line 8086 "Zend/zend_language_scanner.c"
 yy874:
                YYDEBUG(874, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8074,11 +8096,11 @@ yy875:
                }
                YYDEBUG(876, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1100 "Zend/zend_language_scanner.l"
+#line 1122 "Zend/zend_language_scanner.l"
                {
        return T_ECHO;
 }
-#line 8082 "Zend/zend_language_scanner.c"
+#line 8104 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_LOOKING_FOR_PROPERTY:
@@ -8151,7 +8173,7 @@ yy879:
 yy880:
                YYDEBUG(880, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1133 "Zend/zend_language_scanner.l"
+#line 1155 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -8159,7 +8181,7 @@ yy880:
        HANDLE_NEWLINES(yytext, yyleng);
        return T_WHITESPACE;
 }
-#line 8163 "Zend/zend_language_scanner.c"
+#line 8185 "Zend/zend_language_scanner.c"
 yy881:
                YYDEBUG(881, *YYCURSOR);
                ++YYCURSOR;
@@ -8167,13 +8189,13 @@ yy881:
 yy882:
                YYDEBUG(882, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1152 "Zend/zend_language_scanner.l"
+#line 1174 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        yy_pop_state(TSRMLS_C);
        goto restart;
 }
-#line 8177 "Zend/zend_language_scanner.c"
+#line 8199 "Zend/zend_language_scanner.c"
 yy883:
                YYDEBUG(883, *YYCURSOR);
                ++YYCURSOR;
@@ -8182,14 +8204,14 @@ yy883:
 yy884:
                YYDEBUG(884, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1145 "Zend/zend_language_scanner.l"
+#line 1167 "Zend/zend_language_scanner.l"
                {
        yy_pop_state(TSRMLS_C);
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 8193 "Zend/zend_language_scanner.c"
+#line 8215 "Zend/zend_language_scanner.c"
 yy885:
                YYDEBUG(885, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8210,11 +8232,11 @@ yy888:
                ++YYCURSOR;
                YYDEBUG(889, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1141 "Zend/zend_language_scanner.l"
+#line 1163 "Zend/zend_language_scanner.l"
                {
        return T_OBJECT_OPERATOR;
 }
-#line 8218 "Zend/zend_language_scanner.c"
+#line 8240 "Zend/zend_language_scanner.c"
 yy890:
                YYDEBUG(890, *YYCURSOR);
                ++YYCURSOR;
@@ -8284,7 +8306,7 @@ yy894:
 yy895:
                YYDEBUG(895, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1484 "Zend/zend_language_scanner.l"
+#line 1506 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
@@ -8292,20 +8314,20 @@ yy895:
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return T_STRING_VARNAME;
 }
-#line 8296 "Zend/zend_language_scanner.c"
+#line 8318 "Zend/zend_language_scanner.c"
 yy896:
                YYDEBUG(896, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(897, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1493 "Zend/zend_language_scanner.l"
+#line 1515 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        yy_pop_state(TSRMLS_C);
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        goto restart;
 }
-#line 8309 "Zend/zend_language_scanner.c"
+#line 8331 "Zend/zend_language_scanner.c"
 yy898:
                YYDEBUG(898, *YYCURSOR);
                ++YYCURSOR;
@@ -8327,7 +8349,7 @@ yyc_ST_NOWDOC:
        ++YYCURSOR;
        YYDEBUG(903, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2320 "Zend/zend_language_scanner.l"
+#line 2342 "Zend/zend_language_scanner.l"
        {
        int newline = 0;
 
@@ -8382,7 +8404,7 @@ nowdoc_scan_done:
        HANDLE_NEWLINES(yytext, yyleng - newline);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 8386 "Zend/zend_language_scanner.c"
+#line 8408 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_VAR_OFFSET:
        {
@@ -8482,7 +8504,7 @@ yy906:
 yy907:
                YYDEBUG(907, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1543 "Zend/zend_language_scanner.l"
+#line 1565 "Zend/zend_language_scanner.l"
                { /* Offset could be treated as a long */
        if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) {
                zendlval->value.lval = strtol(yytext, NULL, 10);
@@ -8494,7 +8516,7 @@ yy907:
        }
        return T_NUM_STRING;
 }
-#line 8498 "Zend/zend_language_scanner.c"
+#line 8520 "Zend/zend_language_scanner.c"
 yy908:
                YYDEBUG(908, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8514,23 +8536,23 @@ yy909:
 yy910:
                YYDEBUG(910, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1848 "Zend/zend_language_scanner.l"
+#line 1870 "Zend/zend_language_scanner.l"
                {
        /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */
        return yytext[0];
 }
-#line 8523 "Zend/zend_language_scanner.c"
+#line 8545 "Zend/zend_language_scanner.c"
 yy911:
                YYDEBUG(911, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(912, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1843 "Zend/zend_language_scanner.l"
+#line 1865 "Zend/zend_language_scanner.l"
                {
        yy_pop_state(TSRMLS_C);
        return ']';
 }
-#line 8534 "Zend/zend_language_scanner.c"
+#line 8556 "Zend/zend_language_scanner.c"
 yy913:
                YYDEBUG(913, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8540,14 +8562,14 @@ yy914:
                ++YYCURSOR;
                YYDEBUG(915, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1853 "Zend/zend_language_scanner.l"
+#line 1875 "Zend/zend_language_scanner.l"
                {
        /* Invalid rule to return a more explicit parse error with proper line number */
        yyless(0);
        yy_pop_state(TSRMLS_C);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 8551 "Zend/zend_language_scanner.c"
+#line 8573 "Zend/zend_language_scanner.c"
 yy916:
                YYDEBUG(916, *YYCURSOR);
                ++YYCURSOR;
@@ -8556,19 +8578,19 @@ yy916:
 yy917:
                YYDEBUG(917, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1860 "Zend/zend_language_scanner.l"
+#line 1882 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 8566 "Zend/zend_language_scanner.c"
+#line 8588 "Zend/zend_language_scanner.c"
 yy918:
                YYDEBUG(918, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(919, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2376 "Zend/zend_language_scanner.l"
+#line 2398 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -8577,7 +8599,7 @@ yy918:
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 8581 "Zend/zend_language_scanner.c"
+#line 8603 "Zend/zend_language_scanner.c"
 yy920:
                YYDEBUG(920, *YYCURSOR);
                ++YYCURSOR;
@@ -8613,13 +8635,13 @@ yy922:
 yy924:
                YYDEBUG(924, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1837 "Zend/zend_language_scanner.l"
+#line 1859 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 8623 "Zend/zend_language_scanner.c"
+#line 8645 "Zend/zend_language_scanner.c"
 yy925:
                YYDEBUG(925, *YYCURSOR);
                ++YYCURSOR;
@@ -8651,14 +8673,14 @@ yy929:
 yy931:
                YYDEBUG(931, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1555 "Zend/zend_language_scanner.l"
+#line 1577 "Zend/zend_language_scanner.l"
                { /* Offset must be treated as a string */
        zendlval->value.str.val = (char *)estrndup(yytext, yyleng);
        zendlval->value.str.len = yyleng;
        zendlval->type = IS_STRING;
        return T_NUM_STRING;
 }
-#line 8662 "Zend/zend_language_scanner.c"
+#line 8684 "Zend/zend_language_scanner.c"
 yy932:
                YYDEBUG(932, *YYCURSOR);
                ++YYCURSOR;
@@ -8671,6 +8693,6 @@ yy932:
                goto yy931;
        }
 }
-#line 2385 "Zend/zend_language_scanner.l"
+#line 2407 "Zend/zend_language_scanner.l"
 
 }
index 5677b515443cc67c981f815b7d813f556a4e4c63..8b7df2bbf72f62916aa90009935308abbf80fff5 100644 (file)
@@ -120,6 +120,33 @@ do {                                                                                                                                                       \
 
 BEGIN_EXTERN_C()
 
+static size_t encoding_filter_script_to_internal(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding(TSRMLS_C);
+       assert(internal_encoding && zend_multibyte_check_lexer_compatibility(internal_encoding));
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length, internal_encoding, LANG_SCNG(script_encoding) TSRMLS_CC);
+}
+
+static size_t encoding_filter_script_to_intermediate(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length, zend_multibyte_encoding_utf8, LANG_SCNG(script_encoding) TSRMLS_CC);
+}
+
+static size_t encoding_filter_intermediate_to_script(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length,
+LANG_SCNG(script_encoding), zend_multibyte_encoding_utf8 TSRMLS_CC);
+}
+
+static size_t encoding_filter_intermediate_to_internal(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
+{
+       const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding(TSRMLS_C);
+       assert(internal_encoding && zend_multibyte_check_lexer_compatibility(internal_encoding));
+       return zend_multibyte_encoding_converter(to, to_length, from, from_length,
+internal_encoding, zend_multibyte_encoding_utf8 TSRMLS_CC);
+}
+
+
 static void _yy_push_state(int new_state TSRMLS_DC)
 {
        zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
@@ -321,7 +348,6 @@ static const zend_encoding* zend_multibyte_detect_unicode(TSRMLS_D)
                /* remove BOM */
                script = (unsigned char*)emalloc(LANG_SCNG(script_org_size)+1-bom_size);
                memcpy(script, LANG_SCNG(script_org)+bom_size, LANG_SCNG(script_org_size)+1-bom_size);
-               efree(LANG_SCNG(script_org));
                LANG_SCNG(script_org) = script;
                LANG_SCNG(script_org_size) -= bom_size;
 
@@ -418,8 +444,8 @@ ZEND_API int zend_multibyte_set_filter(const zend_encoding *onetime_encoding TSR
        if (!internal_encoding || LANG_SCNG(script_encoding) == internal_encoding) {
                if (!zend_multibyte_check_lexer_compatibility(LANG_SCNG(script_encoding))) {
                        /* and if not, work around w/ script_encoding -> utf-8 -> script_encoding conversion */
-                       LANG_SCNG(input_filter) = zend_multibyte_script_encoding_filter;
-                       LANG_SCNG(output_filter) = zend_multibyte_internal_encoding_filter;
+                       LANG_SCNG(input_filter) = encoding_filter_script_to_intermediate;
+                       LANG_SCNG(output_filter) = encoding_filter_intermediate_to_script;
                } else {
                        LANG_SCNG(input_filter) = NULL;
                        LANG_SCNG(output_filter) = NULL;
@@ -427,9 +453,17 @@ ZEND_API int zend_multibyte_set_filter(const zend_encoding *onetime_encoding TSR
                return SUCCESS;
        }
 
-       /* both script and internal encodings are incompatible w/ flex */
-       LANG_SCNG(input_filter) = zend_multibyte_script_encoding_filter;
-       LANG_SCNG(output_filter) = zend_multibyte_internal_encoding_filter;
+       if (zend_multibyte_check_lexer_compatibility(internal_encoding)) {
+               LANG_SCNG(input_filter) = encoding_filter_script_to_internal;
+               LANG_SCNG(output_filter) = NULL;
+       } else if (zend_multibyte_check_lexer_compatibility(LANG_SCNG(script_encoding))) {
+               LANG_SCNG(input_filter) = NULL;
+               LANG_SCNG(output_filter) = encoding_filter_script_to_internal;
+       } else {
+               /* both script and internal encodings are incompatible w/ flex */
+               LANG_SCNG(input_filter) = encoding_filter_script_to_intermediate;
+               LANG_SCNG(output_filter) = encoding_filter_intermediate_to_internal;
+       }
 
        return 0;
 }
@@ -789,21 +823,9 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
 
 ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, zend_encoding *old_encoding TSRMLS_DC)
 {
-       size_t original_offset, offset, length;
+       size_t length;
        unsigned char *new_yy_start;
 
-       /* calculate current position */
-       offset = original_offset = YYCURSOR - SCNG(yy_start);
-       if (old_input_filter && offset > 0) {
-               const zend_encoding *new_encoding = SCNG(script_encoding);
-               zend_encoding_filter new_filter = SCNG(input_filter);
-               SCNG(script_encoding) = old_encoding;
-               SCNG(input_filter) = old_input_filter;
-               offset = zend_get_scanned_file_offset(TSRMLS_C);
-               SCNG(script_encoding) = new_encoding;
-               SCNG(input_filter) = new_filter;
-       }
-
        /* convert and set */
        if (!SCNG(input_filter)) {
                if (SCNG(script_filtered)) {
@@ -811,10 +833,10 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter
                        SCNG(script_filtered) = NULL;
                }
                SCNG(script_filtered_size) = 0;
-               length = SCNG(script_org_size) - offset;
-               new_yy_start = SCNG(script_org) + offset;
+               length = SCNG(script_org_size);
+               new_yy_start = SCNG(script_org);
        } else {
-               if ((size_t)-1 == SCNG(input_filter)(&new_yy_start, &length, SCNG(script_org) + offset, SCNG(script_org_size) - offset TSRMLS_CC)) {
+               if ((size_t)-1 == SCNG(input_filter)(&new_yy_start, &length, SCNG(script_org), SCNG(script_org_size) TSRMLS_CC)) {
                        zend_error_noreturn(E_COMPILE_ERROR, "Could not convert the script from the detected "
                                        "encoding \"%s\" to a compatible encoding", zend_multibyte_get_encoding_name(LANG_SCNG(script_encoding)));
                }
index b82d87be4b35c16cd36b191896342eca1c8c80f9..157d2ae35367baa6175fe68e76c751db0a152850 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Mon Jan  3 06:07:39 2011 */
+/* Generated by re2c 0.13.5 on Sun Mar  6 15:09:12 2011 */
 #line 3 "Zend/zend_language_scanner_defs.h"
 
 enum YYCONDTYPE {
index e28d600ade3c00e9142f4c8f4ea6832bc12599ed..775ea78f5e02e353c386d81cd32832c6ce32e054 100644 (file)
@@ -206,26 +206,6 @@ ZEND_API int zend_multibyte_set_script_encoding_by_string(const char *new_value,
        return SUCCESS;
 }
 
-ZEND_API size_t zend_multibyte_script_encoding_filter(unsigned char **to, size_t
-*to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
-{
-       const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding(TSRMLS_C);
-       if (!internal_encoding || !zend_multibyte_check_lexer_compatibility(internal_encoding)) {
-               internal_encoding = zend_multibyte_encoding_utf8;
-       }
-       return zend_multibyte_encoding_converter(to, to_length, from, from_length, internal_encoding, LANG_SCNG(script_encoding) TSRMLS_CC);
-}
-
-ZEND_API size_t zend_multibyte_internal_encoding_filter(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC)
-{
-       const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding(TSRMLS_C);
-       if (!internal_encoding || !zend_multibyte_check_lexer_compatibility(internal_encoding)) {
-               internal_encoding = zend_multibyte_encoding_utf8;
-       }
-       return zend_multibyte_encoding_converter(to, to_length, from, from_length,
-LANG_SCNG(script_encoding), internal_encoding TSRMLS_CC);
-}
-
 /*
  * Local variables:
  * tab-width: 4
index ea127116e0b8196168040610977473c033fde849..5e0c51f57baf7f35337a55af354a2d6b6b6cfc9a 100644 (file)
@@ -75,9 +75,6 @@ ZEND_API int zend_multibyte_set_script_encoding(const zend_encoding **encoding_l
 ZEND_API int zend_multibyte_set_internal_encoding(const zend_encoding *encoding TSRMLS_DC);
 ZEND_API int zend_multibyte_set_script_encoding_by_string(const char *new_value, size_t new_value_length TSRMLS_DC);
 
-ZEND_API size_t zend_multibyte_script_encoding_filter(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC);
-ZEND_API size_t zend_multibyte_internal_encoding_filter(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length TSRMLS_DC);
-
 END_EXTERN_C()
 
 #endif /* ZEND_MULTIBYTE_H */
index a006843e0865d9b616773fe261c9a76e77afa877..da6c741e4bd777bcc06fc15af26540ac4d651045 100644 (file)
@@ -99,6 +99,12 @@ static PHP_GSHUTDOWN_FUNCTION(mbstring);
 
 static void php_mb_populate_current_detect_order_list(TSRMLS_D);
 
+static int php_mb_encoding_translation(TSRMLS_D);
+
+static void php_mb_gpc_get_detect_order(const zend_encoding ***list, size_t *list_size TSRMLS_DC);
+
+static void php_mb_gpc_set_input_encoding(const zend_encoding *encoding TSRMLS_DC);
+
 /* }}} */
 
 /* {{{ php_mb_default_identify_list */
@@ -1049,7 +1055,7 @@ static int php_mb_nls_get_default_detect_order_list(enum mbfl_no_language lang,
 }
 /* }}} */
 
-static char *php_mb_rfc1867_substring(char *start, int len, char quote TSRMLS_DC)
+static char *php_mb_rfc1867_substring_conf(const zend_encoding *encoding, char *start, int len, char quote TSRMLS_DC)
 {
        char *result = emalloc(len + 2);
        char *resp = result;
@@ -1059,7 +1065,7 @@ static char *php_mb_rfc1867_substring(char *start, int len, char quote TSRMLS_DC
                if (start[i] == '\\' && (start[i + 1] == '\\' || (quote && start[i + 1] == quote))) {
                        *resp++ = start[++i];
                } else {
-                       size_t j = php_mb_gpc_mbchar_bytes(start+i TSRMLS_CC);
+                       size_t j = php_mb_mbchar_bytes_ex(start+i, (const mbfl_encoding *)encoding);
 
                        while (j-- > 0 && i < len) {
                                *resp++ = start[i++];
@@ -1072,9 +1078,49 @@ static char *php_mb_rfc1867_substring(char *start, int len, char quote TSRMLS_DC
        return result;
 }
 
-static char *php_mb_rfc1867_getword(char *str TSRMLS_DC) /* {{{ */
+static char *php_mb_rfc1867_getword(const zend_encoding *encoding, char **line, char stop TSRMLS_DC) /* {{{ */
+{
+       char *pos = *line, quote;
+       char *res;
+
+       while (*pos && *pos != stop) {
+               if ((quote = *pos) == '"' || quote == '\'') {
+                       ++pos;
+                       while (*pos && *pos != quote) {
+                               if (*pos == '\\' && pos[1] && pos[1] == quote) {
+                                       pos += 2;
+                               } else {
+                                       ++pos;
+                               }
+                       }
+                       if (*pos) {
+                               ++pos;
+                       }
+               } else {
+                       pos += php_mb_mbchar_bytes_ex(pos, (const mbfl_encoding *)encoding);
+
+               }
+       }
+       if (*pos == '\0') {
+               res = estrdup(*line);
+               *line += strlen(*line);
+               return res;
+       }
+
+       res = estrndup(*line, pos - *line);
+
+       while (*pos == stop) {
+               pos += php_mb_mbchar_bytes_ex(pos, (const mbfl_encoding *)encoding);
+       }
+
+       *line = pos;
+       return res;
+}
+/* }}} */
+
+static char *php_mb_rfc1867_getword_conf(const zend_encoding *encoding, char *str TSRMLS_DC) /* {{{ */
 {
-       while (*str && isspace(*str)) {
+       while (*str && isspace(*(unsigned char *)str)) {
                ++str;
        }
 
@@ -1086,29 +1132,30 @@ static char *php_mb_rfc1867_getword(char *str TSRMLS_DC) /* {{{ */
                char quote = *str;
 
                str++;
-               return php_mb_rfc1867_substring(str, strlen(str), quote TSRMLS_CC);
+               return php_mb_rfc1867_substring_conf(encoding, str, strlen(str), quote);
        } else {
                char *strend = str;
 
-               while (*strend && !isspace(*strend)) {
+               while (*strend && !isspace(*(unsigned char *)strend)) {
                        ++strend;
                }
-               return php_mb_rfc1867_substring(str, strend - str, 0 TSRMLS_CC);
+               return php_mb_rfc1867_substring_conf(encoding, str, strend - str, 0);
        }
 }
 /* }}} */
 
-static char *php_mb_rfc1867_basename(char *filename TSRMLS_DC) /* {{{ */
+static char *php_mb_rfc1867_basename(const zend_encoding *encoding, char *filename TSRMLS_DC) /* {{{ */
 {
        char *s, *tmp;
-       
+       const size_t filename_len = strlen(filename);
+
        /* The \ check should technically be needed for win32 systems only where
         * it is a valid path separator. However, IE in all it's wisdom always sends
         * the full path of the file on the user's filesystem, which means that unless
         * the user does basename() they get a bogus file name. Until IE's user base drops
         * to nill or problem is fixed this code must remain enabled for all systems. */
-       s = php_mb_strrchr(filename, '\\' TSRMLS_CC);
-       if ((tmp = php_mb_strrchr(filename, '/' TSRMLS_CC)) > s) {
+       s = php_mb_safe_strrchr_ex(filename, '\\', filename_len, (const mbfl_encoding *)encoding TSRMLS_CC);
+       if ((tmp = php_mb_safe_strrchr_ex(filename, '/', filename_len, (const mbfl_encoding *)encoding TSRMLS_CC)) > s) {
                s = tmp;
        }
        if (s) {
@@ -1499,11 +1546,12 @@ PHP_MINIT_FUNCTION(mbstring)
 
        php_rfc1867_set_multibyte_callbacks(
                php_mb_encoding_translation,
-               php_mb_gpc_encoding_detector,
-               php_mb_gpc_encoding_converter,
+               php_mb_gpc_get_detect_order,
+               php_mb_gpc_set_input_encoding,
                php_mb_rfc1867_getword,
+               php_mb_rfc1867_getword_conf,
                php_mb_rfc1867_basename);
-       
+
        return SUCCESS;
 }
 /* }}} */
@@ -1512,7 +1560,7 @@ PHP_MINIT_FUNCTION(mbstring)
 PHP_MSHUTDOWN_FUNCTION(mbstring)
 {
        UNREGISTER_INI_ENTRIES();
-       
+
 #if HAVE_MBREGEX
        PHP_MSHUTDOWN(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
 #endif
@@ -2150,7 +2198,7 @@ PHP_FUNCTION(mb_strpos)
        mbfl_string haystack, needle;
        char *enc_name = NULL;
        int enc_name_len;
-       
+
        mbfl_string_init(&haystack);
        mbfl_string_init(&needle);
        haystack.no_language = MBSTRG(language);
@@ -3415,7 +3463,7 @@ PHP_FUNCTION(mb_convert_variables)
        const mbfl_encoding **elist;
        char *to_enc;
        void *ptmp;     
-       
+
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sZ+", &to_enc, &to_enc_len, &zfrom_enc, &args, &argc) == FAILURE) {
                return;
        }
@@ -3958,7 +4006,7 @@ PHP_FUNCTION(mb_send_mail)
        smart_str *s;
        extern void mbfl_memory_device_unput(mbfl_memory_device *device);
        char *pp, *ee;
-       
+
        /* initialize */
        mbfl_memory_device_init(&device, 0, 0);
        mbfl_string_init(&orig_str);
@@ -4422,7 +4470,7 @@ PHP_FUNCTION(mb_check_encoding)
                        RETURN_FALSE;
                }
        }
-       
+
        convd = mbfl_buffer_converter_new2(encoding, encoding, 0);
        if (convd == NULL) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create converter");
@@ -4430,7 +4478,7 @@ PHP_FUNCTION(mb_check_encoding)
        }       
        mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE);
        mbfl_buffer_converter_illegal_substchar(convd, 0);      
-       
+
        /* initialize string */
        mbfl_string_init_set(&string, mbfl_no_language_neutral, encoding->no_encoding);
        mbfl_string_init(&result);
@@ -4479,8 +4527,8 @@ static void php_mb_populate_current_detect_order_list(TSRMLS_D)
        MBSTRG(current_detect_order_list_size) = nentries;
 }
 
-/* {{{ MBSTRING_API int php_mb_encoding_translation() */
-MBSTRING_API int php_mb_encoding_translation(TSRMLS_D) 
+/* {{{ static int php_mb_encoding_translation() */
+static int php_mb_encoding_translation(TSRMLS_D) 
 {
        return MBSTRG(encoding_translation);
 }
@@ -4559,154 +4607,6 @@ MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nby
 }
 /* }}} */
 
-/* {{{ MBSTRING_API char *php_mb_strrchr() */
-MBSTRING_API char *php_mb_strrchr(const char *s, char c TSRMLS_DC)
-{
-       return php_mb_safe_strrchr(s, c, -1 TSRMLS_CC);
-}
-/* }}} */
-
-/* {{{ MBSTRING_API size_t php_mb_gpc_mbchar_bytes() */
-MBSTRING_API size_t php_mb_gpc_mbchar_bytes(const char *s TSRMLS_DC)
-{
-
-       if (MBSTRG(http_input_identify)) {
-               return php_mb_mbchar_bytes_ex(s, MBSTRG(http_input_identify));
-       } else {
-               return php_mb_mbchar_bytes_ex(s, MBSTRG(internal_encoding));
-       }
-}
-/* }}} */
-
-/*     {{{ MBSTRING_API int php_mb_gpc_encoding_converter() */
-MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, int num, const char *encoding_to, const char *encoding_from TSRMLS_DC)
-{
-       int i;
-       mbfl_string string, result, *ret = NULL;
-       const mbfl_encoding *from_encoding, *to_encoding;
-       mbfl_buffer_converter *convd;
-
-       if (encoding_to) {
-               /* new encoding */
-               to_encoding = mbfl_name2encoding(encoding_to);
-               if (!to_encoding) {
-                       return -1;
-               }
-       } else {
-               to_encoding = MBSTRG(current_internal_encoding);
-       }       
-       if (encoding_from) {
-               /* old encoding */
-               from_encoding = mbfl_name2encoding(encoding_from);
-               if (from_encoding) {
-                       return -1;
-               }
-       } else {
-               from_encoding = MBSTRG(http_input_identify);
-       }
-
-       if (from_encoding == mbfl_no_encoding_pass) {
-               return 0;
-       }
-
-       /* initialize string */
-       mbfl_string_init(&string);
-       mbfl_string_init(&result);
-       string.no_encoding = from_encoding->no_encoding;
-       string.no_language = MBSTRG(language);
-
-       for (i=0; i<num; i++){
-               string.val = (unsigned char *)str[i];
-               string.len = len[i];
-
-               /* initialize converter */
-               convd = mbfl_buffer_converter_new2(from_encoding, to_encoding, string.len);
-               if (convd == NULL) {
-                       return -1;
-               }
-               mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode));
-               mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar));
-               
-               /* do it */
-               ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
-               if (ret != NULL) {
-                       efree(str[i]);
-                       str[i] = (char *)ret->val;
-                       len[i] = (int)ret->len;
-               }
-               
-               MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);
-               mbfl_buffer_converter_delete(convd);
-       }
-
-       return ret ? 0 : -1;
-}
-/* }}} */
-
-/* {{{ MBSTRING_API int php_mb_gpc_encoding_detector()
- */
-MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length, int num, char *arg_list TSRMLS_DC)
-{
-       mbfl_string string;
-       const mbfl_encoding **elist;
-       const mbfl_encoding *encoding = NULL;
-       mbfl_encoding_detector *identd = NULL; 
-
-       size_t size;
-       const mbfl_encoding **list;
-
-       php_mb_populate_current_detect_order_list(TSRMLS_C);
-
-       if (MBSTRG(http_input_list_size) == 1 && MBSTRG(http_input_list)[0] == &mbfl_encoding_pass) {
-               MBSTRG(http_input_identify) = &mbfl_encoding_pass;
-               return SUCCESS;
-       }
-
-       if (arg_list && strlen(arg_list)>0) {
-               /* make encoding list */
-               list = NULL;
-               size = 0;
-               php_mb_parse_encoding_list(arg_list, strlen(arg_list), &list, &size, 0 TSRMLS_CC);
-               
-               if (size > 0 && list != NULL) {
-                       elist = list;
-               } else {
-                       elist = MBSTRG(current_detect_order_list);
-                       size = MBSTRG(current_detect_order_list_size);
-               }
-       } else {
-               elist = MBSTRG(current_detect_order_list);
-               size = MBSTRG(current_detect_order_list_size);
-       }
-
-       mbfl_string_init(&string);
-       string.no_language = MBSTRG(language);
-
-       identd = mbfl_encoding_detector_new2(elist, size, MBSTRG(strict_detection));
-
-       if (identd) {
-               int n = 0;
-               while(n < num){
-                       string.val = (unsigned char *)arg_string[n];
-                       string.len = arg_length[n];
-                       if (mbfl_encoding_detector_feed(identd, &string)) {
-                               break;
-                       }
-                       n++;
-               }
-               encoding = mbfl_encoding_detector_judge2(identd);
-               mbfl_encoding_detector_delete(identd);
-       }
-
-       if (encoding) {
-               MBSTRG(http_input_identify) = encoding;
-               return SUCCESS;
-       } else {
-               return FAILURE;
-       }
-}
-/* }}} */
-
 /* {{{ MBSTRING_API int php_mb_stripos()
  */
 MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int old_haystack_len, const char *old_needle, unsigned int old_needle_len, long offset, const char *from_encoding TSRMLS_DC)
@@ -4784,6 +4684,19 @@ MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int
 }
 /* }}} */
 
+static void php_mb_gpc_get_detect_order(const zend_encoding ***list, size_t *list_size TSRMLS_DC) /* {{{ */
+{
+       *list = (const zend_encoding **)MBSTRG(http_input_list);
+       *list_size = MBSTRG(http_input_list_size);
+}
+/* }}} */
+
+static void php_mb_gpc_set_input_encoding(const zend_encoding *encoding TSRMLS_DC) /* {{{ */
+{
+       MBSTRG(http_input_identify) = encoding;
+}
+/* }}} */
+
 #endif /* HAVE_MBSTRING */
 
 /*
index 9b61acdf600efc69151036d26076f43087f2d041..7dd0c894e9c602bb398b7d88f644706904f3f598 100644 (file)
@@ -128,13 +128,10 @@ PHP_FUNCTION(mb_send_mail);
 PHP_FUNCTION(mb_get_info);
 PHP_FUNCTION(mb_check_encoding);
 
-MBSTRING_API int php_mb_encoding_translation(TSRMLS_D);
-
 MBSTRING_API char *php_mb_safe_strrchr_ex(const char *s, unsigned int c,
                                     size_t nbytes, const mbfl_encoding *enc);
 MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c,
                                  size_t nbytes TSRMLS_DC);
-MBSTRING_API char *php_mb_strrchr(const char *s, char c TSRMLS_DC);
 
 MBSTRING_API char * php_mb_convert_encoding(const char *input, size_t length,
                                       const char *_to_encoding,
@@ -146,17 +143,11 @@ MBSTRING_API int php_mb_check_encoding_list(const char *encoding_list TSRMLS_DC)
 MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc);
 MBSTRING_API size_t php_mb_mbchar_bytes(const char *s TSRMLS_DC);
 
-MBSTRING_API size_t php_mb_gpc_mbchar_bytes(const char *s TSRMLS_DC);
-
 MBSTRING_API int php_mb_encoding_detector_ex(const char *arg_string, int arg_length, 
                                                                                         char *arg_list TSRMLS_DC);
 
 MBSTRING_API int php_mb_encoding_converter_ex(char **str, int *len, const char *encoding_to, 
                                                                                          const char *encoding_from TSRMLS_DC);
-MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, int num, const char *encoding_to, const char *encoding_from TSRMLS_DC);
-
-MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length, int num, char *arg_list TSRMLS_DC);
-
 MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int old_haystack_len, const char *old_needle, unsigned int old_needle_len, long offset, const char *from_encoding TSRMLS_DC);
 
 /* internal use only */
index e77f07c3275406f7fc584b915ff7301abcc13e6a..41ea045e0f6dd956e6a581b70db6e69ade0f78be 100644 (file)
@@ -41,85 +41,20 @@ static int dummy_encoding_translation(TSRMLS_D)
        return 0;
 }
 
+static char *php_ap_getword(const zend_encoding *encoding, char **line, char stop TSRMLS_DC);
+static char *php_ap_getword_conf(const zend_encoding *encoding, char *str TSRMLS_DC);
+
 static php_rfc1867_encoding_translation_t php_rfc1867_encoding_translation = dummy_encoding_translation;
-static php_rfc1867_encoding_detector_t php_rfc1867_encoding_detector = NULL;
-static php_rfc1867_encoding_converter_t php_rfc1867_encoding_converter = NULL;
-static php_rfc1867_getword_t php_rfc1867_getword = NULL;
+static php_rfc1867_get_detect_order_t php_rfc1867_get_detect_order = NULL;
+static php_rfc1867_set_input_encoding_t php_rfc1867_set_input_encoding = NULL;
+static php_rfc1867_getword_t php_rfc1867_getword = php_ap_getword;
+static php_rfc1867_getword_conf_t php_rfc1867_getword_conf = php_ap_getword_conf;
 static php_rfc1867_basename_t php_rfc1867_basename = NULL;
 
 PHPAPI int (*php_rfc1867_callback)(unsigned int event, void *event_data, void **extra TSRMLS_DC) = NULL;
 
 static void safe_php_register_variable(char *var, char *strval, int val_len, zval *track_vars_array, zend_bool override_protection TSRMLS_DC);
 
-static void php_flush_gpc_variables(int num_vars, char **val_list, int *len_list, zval *array_ptr  TSRMLS_DC) /* {{{ */
-{
-       int i;
-       unsigned int new_val_len;
-
-       if (num_vars > 0 &&
-               php_rfc1867_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC) == SUCCESS) {
-               php_rfc1867_encoding_converter(val_list, len_list, num_vars, NULL, NULL TSRMLS_CC);
-       }
-       for (i = 0; i<num_vars; i += 2) {
-               if (sapi_module.input_filter(PARSE_POST, val_list[i], &val_list[i+1], len_list[i+1], &new_val_len TSRMLS_CC)) {
-                       if (php_rfc1867_callback != NULL) {
-                               multipart_event_formdata event_formdata;
-                               void *event_extra_data = NULL;
-
-                               event_formdata.post_bytes_processed = SG(read_post_bytes);
-                               event_formdata.name = val_list[i];
-                               event_formdata.value = &val_list[i+1];
-                               event_formdata.length = new_val_len;
-                               event_formdata.newlength = &new_val_len;
-                               if (php_rfc1867_callback(MULTIPART_EVENT_FORMDATA, &event_formdata, &event_extra_data TSRMLS_CC) == FAILURE) {
-                                       efree(val_list[i]);
-                                       efree(val_list[i+1]);
-                                       continue;
-                               }
-                       }
-                       safe_php_register_variable(val_list[i], val_list[i+1], new_val_len, array_ptr, 0 TSRMLS_CC);
-               }
-               efree(val_list[i]);
-               efree(val_list[i+1]);
-       }
-       efree(val_list);
-       efree(len_list);
-}
-/* }}} */
-
-static void php_gpc_realloc_buffer(char ***pval_list, int **plen_list, int *num_vars_max, int inc  TSRMLS_DC) /* {{{ */
-{
-       /* allow only even increments */
-       if (inc & 1) {
-               inc++;
-       }
-       (*num_vars_max) += inc;
-       *pval_list = (char **)erealloc(*pval_list, (*num_vars_max+2)*sizeof(char *));
-       *plen_list = (int *)erealloc(*plen_list, (*num_vars_max+2)*sizeof(int));
-}
-/* }}} */
-
-static void php_gpc_stack_variable(char *param, char *value, char ***pval_list, int **plen_list, int *num_vars, int *num_vars_max TSRMLS_DC) /* {{{ */
-{
-       char **val_list = *pval_list;
-       int *len_list = *plen_list;
-
-       if (*num_vars >= *num_vars_max) {
-               php_gpc_realloc_buffer(pval_list, plen_list, num_vars_max, 16 TSRMLS_CC);
-               /* in case realloc relocated the buffer */
-               val_list = *pval_list;
-               len_list = *plen_list;
-       }
-
-       val_list[*num_vars] = (char *)estrdup(param);
-       len_list[*num_vars] = strlen(param);
-       (*num_vars)++;
-       val_list[*num_vars] = (char *)estrdup(value);
-       len_list[*num_vars] = strlen(value);
-       (*num_vars)++;
-}
-/* }}} */
-
 /* The longest property name we use in an uploaded file array */
 #define MAX_SIZE_OF_INDEX sizeof("[tmp_name]")
 
@@ -283,6 +218,9 @@ typedef struct {
        char *boundary_next;
        int  boundary_next_len;
 
+       const zend_encoding *input_encoding;
+       const zend_encoding **detect_order;
+       size_t detect_order_size;
 } multipart_buffer;
 
 typedef struct {
@@ -340,7 +278,7 @@ static int multipart_buffer_eof(multipart_buffer *self TSRMLS_DC)
 }
 
 /* create new multipart_buffer structure */
-static multipart_buffer *multipart_buffer_new(char *boundary, int boundary_len)
+static multipart_buffer *multipart_buffer_new(char *boundary, int boundary_len TSRMLS_DC)
 {
        multipart_buffer *self = (multipart_buffer *) ecalloc(1, sizeof(multipart_buffer));
 
@@ -357,6 +295,15 @@ static multipart_buffer *multipart_buffer_new(char *boundary, int boundary_len)
        self->buf_begin = self->buffer;
        self->bytes_in_buffer = 0;
 
+       if (php_rfc1867_encoding_translation(TSRMLS_C)) {
+               php_rfc1867_get_detect_order(&self->detect_order, &self->detect_order_size TSRMLS_CC);
+       } else {
+               self->detect_order = NULL;
+               self->detect_order_size = 0;
+       }
+
+       self->input_encoding = NULL;
+
        return self;
 }
 
@@ -467,6 +414,10 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header T
                char *key = line;
                char *value = NULL;
 
+               if (php_rfc1867_encoding_translation(TSRMLS_C)) {
+                       self->input_encoding = zend_multibyte_encoding_detector(line, strlen(line), self->detect_order, self->detect_order_size TSRMLS_CC);
+               }
+
                /* space in the beginning means same header */
                if (!isspace(line[0])) {
                        value = strchr(line, ':');
@@ -522,7 +473,7 @@ static char *php_mime_get_hdr_value(zend_llist header, char *key)
        return NULL;
 }
 
-static char *php_ap_getword(char **line, char stop)
+static char *php_ap_getword(const zend_encoding *encoding, char **line, char stop TSRMLS_DC)
 {
        char *pos = *line, quote;
        char *res;
@@ -558,7 +509,7 @@ static char *php_ap_getword(char **line, char stop)
        return res;
 }
 
-static char *substring_conf(char *start, int len, char quote TSRMLS_DC)
+static char *substring_conf(char *start, int len, char quote)
 {
        char *result = emalloc(len + 1);
        char *resp = result;
@@ -576,7 +527,7 @@ static char *substring_conf(char *start, int len, char quote TSRMLS_DC)
        return result;
 }
 
-static char *php_ap_getword_conf(char *str TSRMLS_DC)
+static char *php_ap_getword_conf(const zend_encoding *encoding, char *str TSRMLS_DC)
 {
        while (*str && isspace(*str)) {
                ++str;
@@ -590,17 +541,33 @@ static char *php_ap_getword_conf(char *str TSRMLS_DC)
                char quote = *str;
 
                str++;
-               return substring_conf(str, strlen(str), quote TSRMLS_CC);
+               return substring_conf(str, strlen(str), quote);
        } else {
                char *strend = str;
 
                while (*strend && !isspace(*strend)) {
                        ++strend;
                }
-               return substring_conf(str, strend - str, 0 TSRMLS_CC);
+               return substring_conf(str, strend - str, 0);
        }
 }
 
+static char *php_ap_basename(const zend_encoding *encoding, char *path TSRMLS_DC)
+{
+       char *s = strrchr(path, '\\');
+       if (s) {
+               char *tmp = strrchr(path, '/');
+               if (tmp && tmp > s) {
+                       s = tmp + 1;
+               } else {
+                       s++;
+               }
+       } else {
+               s = path;
+       }
+       return s;
+}
+
 /*
  * Search for a string in a fixed-length byte string.
  * If partial is true, partial matches are allowed at the end of the buffer.
@@ -709,8 +676,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
        int max_file_size = 0, skip_upload = 0, anonindex = 0, is_anonymous;
        zval *http_post_files = NULL;
        HashTable *uploaded_files = NULL;
-       int str_len = 0, num_vars = 0, num_vars_max = 2*10, *len_list = NULL;
-       char **val_list = NULL;
+       int str_len = 0;
        multipart_buffer *mbuff;
        zval *array_ptr = (zval *) arg;
        int fd = -1;
@@ -718,6 +684,20 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
        void *event_extra_data = NULL;
        unsigned int llen = 0;
        int upload_cnt = INI_INT("max_file_uploads");
+       const zend_encoding *internal_encoding = zend_multibyte_get_internal_encoding(TSRMLS_C);
+       php_rfc1867_getword_t getword;
+       php_rfc1867_getword_conf_t getword_conf;
+       php_rfc1867_basename_t _basename;
+
+       if (php_rfc1867_encoding_translation(TSRMLS_C) && internal_encoding) {
+               getword = php_rfc1867_getword;
+               getword_conf = php_rfc1867_getword_conf;
+               _basename = php_rfc1867_basename;
+       } else {
+               getword = php_ap_getword;
+               getword_conf = php_ap_getword_conf;
+               _basename = php_ap_basename;
+       }
 
        if (SG(post_max_size) > 0 && SG(request_info).content_length > SG(post_max_size)) {
                sapi_module.sapi_error(E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes", SG(request_info).content_length, SG(post_max_size));
@@ -780,11 +760,6 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
        INIT_PZVAL(http_post_files);
        PG(http_globals)[TRACK_VARS_FILES] = http_post_files;
 
-       if (php_rfc1867_encoding_translation(TSRMLS_C)) {
-               val_list = (char **)ecalloc(num_vars_max+2, sizeof(char *));
-               len_list = (int *)ecalloc(num_vars_max+2, sizeof(int));
-       }
-
        zend_llist_init(&header, sizeof(mime_header_entry), (llist_dtor_func_t) php_free_hdr_entry, 0);
 
        if (php_rfc1867_callback != NULL) {
@@ -817,7 +792,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
                                ++cd;
                        }
 
-                       while (*cd && (pair = php_ap_getword(&cd, ';')))
+                       while (*cd && (pair = getword(mbuff->input_encoding, &cd, ';' TSRMLS_CC)))
                        {
                                char *key = NULL, *word = pair;
 
@@ -826,41 +801,33 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
                                }
 
                                if (strchr(pair, '=')) {
-                                       key = php_ap_getword(&pair, '=');
+                                       key = getword(mbuff->input_encoding, &pair, '=' TSRMLS_CC);
 
                                        if (!strcasecmp(key, "name")) {
                                                if (param) {
                                                        efree(param);
                                                }
-                                               if (php_rfc1867_encoding_translation(TSRMLS_C)) {
-                                                       if (num_vars >= num_vars_max) {
-                                                               php_gpc_realloc_buffer(&val_list, &len_list, &num_vars_max, 1 TSRMLS_CC);
+                                               param = getword_conf(mbuff->input_encoding, pair TSRMLS_CC);
+                                               if (mbuff->input_encoding && internal_encoding) {
+                                                       unsigned char *new_param;
+                                                       size_t new_param_len;
+                                                       if ((size_t)-1 != zend_multibyte_encoding_converter(&new_param, &new_param_len, (unsigned char *)param, strlen(param), internal_encoding, mbuff->input_encoding TSRMLS_CC)) {
+                                                               efree(param);
+                                                               param = (char *)new_param;
                                                        }
-                                                       val_list[num_vars] = pair;
-                                                       len_list[num_vars] = strlen(pair);
-                                                       num_vars++;
-                                                       php_rfc1867_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC);
-                                                       num_vars--;
-                                                       param = php_rfc1867_getword(pair TSRMLS_CC);
-                                               } else {
-                                                       param = php_ap_getword_conf(pair TSRMLS_CC);
                                                }
                                        } else if (!strcasecmp(key, "filename")) {
                                                if (filename) {
                                                        efree(filename);
                                                }
-                                               if (php_rfc1867_encoding_translation(TSRMLS_C)) {
-                                                       if (num_vars >= num_vars_max) {
-                                                               php_gpc_realloc_buffer(&val_list, &len_list, &num_vars_max, 1 TSRMLS_CC);
+                                               filename = getword_conf(mbuff->input_encoding, pair TSRMLS_CC);
+                                               if (mbuff->input_encoding && internal_encoding) {
+                                                       unsigned char *new_filename;
+                                                       size_t new_filename_len;
+                                                       if ((size_t)-1 != zend_multibyte_encoding_converter(&new_filename, &new_filename_len, (unsigned char *)filename, strlen(filename), internal_encoding, mbuff->input_encoding TSRMLS_CC)) {
+                                                               efree(filename);
+                                                               filename = (char *)new_filename;
                                                        }
-                                                       val_list[num_vars] = pair;
-                                                       len_list[num_vars] = strlen(pair);
-                                                       num_vars++;
-                                                       php_rfc1867_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC);
-                                                       num_vars--;
-                                                       filename = php_rfc1867_getword(pair TSRMLS_CC);
-                                               } else {
-                                                       filename = php_ap_getword_conf(pair TSRMLS_CC);
                                                }
                                        }
                                }
@@ -878,12 +845,20 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
 
                                if (!value) {
                                        value = estrdup("");
+                                       value_len = 0;
                                }
 
-                               if (php_rfc1867_encoding_translation(TSRMLS_C)) {
-                                       /* postpone filtering, callback call and registration */
-                                       php_gpc_stack_variable(param, value, &val_list, &len_list, &num_vars, &num_vars_max TSRMLS_CC);
-                               } else if (sapi_module.input_filter(PARSE_POST, param, &value, value_len, &new_val_len TSRMLS_CC)) {
+                               if (mbuff->input_encoding && internal_encoding) {
+                                       unsigned char *new_value;
+                                       size_t new_value_len;
+                                       if ((size_t)-1 != zend_multibyte_encoding_converter(&new_value, &new_value_len, (unsigned char *)value, value_len, internal_encoding, mbuff->input_encoding TSRMLS_CC)) {
+                                               efree(value);
+                                               value = (char *)new_value;
+                                               value_len = new_value_len;
+                                       }
+                               }
+
+                               if (sapi_module.input_filter(PARSE_POST, param, &value, value_len, &new_val_len TSRMLS_CC)) {
                                        if (php_rfc1867_callback != NULL) {
                                                multipart_event_formdata event_formdata;
                                                size_t newlength = new_val_len;
@@ -1135,43 +1110,23 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
                                snprintf(lbuf, llen, "%s_name", param);
                        }
 
-                       if (php_rfc1867_encoding_translation(TSRMLS_C)) {
-                               if (num_vars >= num_vars_max) {
-                                       php_gpc_realloc_buffer(&val_list, &len_list, &num_vars_max, 1 TSRMLS_CC);
-                               }
-                               val_list[num_vars] = filename;
-                               len_list[num_vars] = strlen(filename);
-                               num_vars++;
-                               if (php_rfc1867_encoding_detector(val_list, len_list, num_vars, NULL TSRMLS_CC) == SUCCESS) {
-                                       str_len = strlen(filename);
-                                       php_rfc1867_encoding_converter(&filename, &str_len, 1, NULL, NULL TSRMLS_CC);
-                               }
-                               s = php_rfc1867_basename(filename TSRMLS_CC);
-                               num_vars--;
-                       } else {
-                               /* The \ check should technically be needed for win32 systems only where
-                                * it is a valid path separator. However, IE in all it's wisdom always sends
-                                * the full path of the file on the user's filesystem, which means that unless
-                                * the user does basename() they get a bogus file name. Until IE's user base drops
-                                * to nill or problem is fixed this code must remain enabled for all systems. */
-                               s = strrchr(filename, '\\');
-                               if ((tmp = strrchr(filename, '/')) > s) {
-                                       s = tmp;
-                               }
+                       /* The \ check should technically be needed for win32 systems only where
+                        * it is a valid path separator. However, IE in all it's wisdom always sends
+                        * the full path of the file on the user's filesystem, which means that unless
+                        * the user does basename() they get a bogus file name. Until IE's user base drops
+                        * to nill or problem is fixed this code must remain enabled for all systems. */
+                       s = _basename(internal_encoding, filename TSRMLS_CC);
 #ifdef PHP_WIN32
-                               if (PG(magic_quotes_gpc)) {
-                                       s = s ? s : filename;
-                                       tmp = strrchr(s, '\'');
-                                       s = tmp > s ? tmp : s;
-                                       tmp = strrchr(s, '"');
-                                       s = tmp > s ? tmp : s;
-                               }
+                       if (PG(magic_quotes_gpc)) {
+                               s = s ? s : filename;
+                               tmp = strrchr(s, '\'');
+                               s = tmp >= s ? tmp + 1: s;
+                               tmp = strrchr(s, '"');
+                               s = tmp >= s ? tmp + 1: s;
+                       }
 #endif
-                               if (s) {
-                                       s++;
-                               } else {
-                                       s = filename;
-                               }
+                       if (!s) {
+                               s = filename;
                        }
 
                        if (!is_anonymous) {
@@ -1300,10 +1255,6 @@ fileupload_done:
                php_rfc1867_callback(MULTIPART_EVENT_END, &event_end, &event_extra_data TSRMLS_CC);
        }
 
-       if (php_rfc1867_encoding_translation(TSRMLS_C)) {
-               php_flush_gpc_variables(num_vars, val_list, len_list, array_ptr TSRMLS_CC);
-       }
-
        if (lbuf) efree(lbuf);
        if (abuf) efree(abuf);
        if (array_index) efree(array_index);
@@ -1318,15 +1269,17 @@ fileupload_done:
 
 SAPI_API void php_rfc1867_set_multibyte_callbacks(
                                        php_rfc1867_encoding_translation_t encoding_translation,
-                                       php_rfc1867_encoding_detector_t encoding_detector,
-                                       php_rfc1867_encoding_converter_t encoding_converter,
+                                       php_rfc1867_get_detect_order_t get_detect_order,
+                                       php_rfc1867_set_input_encoding_t set_input_encoding,
                                        php_rfc1867_getword_t getword,
+                                       php_rfc1867_getword_conf_t getword_conf,
                                        php_rfc1867_basename_t basename) /* {{{ */
 {
        php_rfc1867_encoding_translation = encoding_translation;
-       php_rfc1867_encoding_detector = encoding_detector;
-       php_rfc1867_encoding_converter = encoding_converter;
+       php_rfc1867_get_detect_order = get_detect_order;
+       php_rfc1867_set_input_encoding = set_input_encoding;
        php_rfc1867_getword = getword;
+       php_rfc1867_getword_conf = getword_conf;
        php_rfc1867_basename = basename;
 }      
 /* }}} */
index 8fb8c35dcec1369d07b2109c97d6e31e1bbbd9a1..a05d36202cb454b1e430a77d952d8a77e2c2bc6f 100644 (file)
@@ -68,10 +68,11 @@ typedef struct _multipart_event_end {
 } multipart_event_end;
 
 typedef int (*php_rfc1867_encoding_translation_t)(TSRMLS_D);
-typedef int (*php_rfc1867_encoding_detector_t)(char **arg_string, int *arg_length, int num, char *arg_list TSRMLS_DC);
-typedef int (*php_rfc1867_encoding_converter_t)(char **str, int *len, int num, const char *encoding_to, const char *encoding_from TSRMLS_DC);
-typedef char* (*php_rfc1867_getword_t)(char *str TSRMLS_DC);
-typedef char* (*php_rfc1867_basename_t)(char *str TSRMLS_DC);
+typedef void (*php_rfc1867_get_detect_order_t)(const zend_encoding ***list, size_t *list_size TSRMLS_DC);
+typedef void (*php_rfc1867_set_input_encoding_t)(const zend_encoding *encoding TSRMLS_DC);
+typedef char* (*php_rfc1867_getword_t)(const zend_encoding *encoding, char **line, char stop TSRMLS_DC);
+typedef char* (*php_rfc1867_getword_conf_t)(const zend_encoding *encoding, char *str TSRMLS_DC);
+typedef char* (*php_rfc1867_basename_t)(const zend_encoding *encoding, char *str TSRMLS_DC);
 
 SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler);
 
@@ -81,9 +82,10 @@ extern PHPAPI int (*php_rfc1867_callback)(unsigned int event, void *event_data,
 
 SAPI_API void php_rfc1867_set_multibyte_callbacks(
                                        php_rfc1867_encoding_translation_t encoding_translation,
-                                       php_rfc1867_encoding_detector_t encoding_detector,
-                                       php_rfc1867_encoding_converter_t encoding_converter,
+                                       php_rfc1867_get_detect_order_t get_detect_order,
+                                       php_rfc1867_set_input_encoding_t set_input_encoding,
                                        php_rfc1867_getword_t getword,
+                                       php_rfc1867_getword_conf_t getword_conf,
                                        php_rfc1867_basename_t basename);       
 
 #endif /* RFC1867_H */