cvs: ZendEngine2 / zend_language_scanner.c zend_language_scanner.l

From: Date: Thu, 01 Jan 2009 20:19:39 +0000
Subject: cvs: ZendEngine2 / zend_language_scanner.c zend_language_scanner.l
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-7282@lists.php.net to get a copy of this message
iliaa Thu Jan 1 20:19:39 2009 UTC Modified files: /ZendEngine2 zend_language_scanner.l zend_language_scanner.c Log: MFB: Fixed bug #46844 (php scripts or included files with first line starting with # have the 1st line missed from the output).

http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.l?r1=1.198&r2=1.199&diff_format=u Index: ZendEngine2/zend_language_scanner.l diff -u ZendEngine2/zend_language_scanner.l:1.198 ZendEngine2/zend_language_scanner.l:1.199 --- ZendEngine2/zend_language_scanner.l:1.198 Wed Dec 31 11:09:46 2008 +++ ZendEngine2/zend_language_scanner.l Thu Jan 1 20:19:39 2009 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_scanner.l,v 1.198 2008/12/31 11:09:46 sebastian Exp $ */ +/* $Id: zend_language_scanner.l,v 1.199 2009/01/01 20:19:39 iliaa Exp $ */ #if 0 # define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) @@ -1336,8 +1336,8 @@ return 0; } - /* ignore first line when it's started with a # */ - if (YYCURSOR == SCNG(yy_start) && *YYCURSOR == '#') { + /* ignore first line when it's started with a #! */ + if (YYCURSOR == SCNG(yy_start) && *YYCURSOR == '#' && *(YYCURSOR + 1) == '!') { while (++YYCURSOR < YYLIMIT) { if (*YYCURSOR == '\n') { ++YYCURSOR; http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.c?r1=1.19&r2=1.20&diff_format=u Index: ZendEngine2/zend_language_scanner.c diff -u ZendEngine2/zend_language_scanner.c:1.19 ZendEngine2/zend_language_scanner.c:1.20 --- ZendEngine2/zend_language_scanner.c:1.19 Wed Dec 31 11:12:29 2008 +++ ZendEngine2/zend_language_scanner.c Thu Jan 1 20:19:39 2009 @@ -1,1364 +1,1364 @@ /* Generated by re2c 0.13.5 on Tue Dec 2 17:02:51 2008 */ #line 1 "Zend/zend_language_scanner.l" -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.zend.com/license/2_00.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Marcus Boerger <helly@php.net> | - | Nuno Lopes <nlopess@php.net> | - | Scott MacVicar <scottmac@php.net> | - | Flex version authors: | - | Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - -/* $Id: zend_language_scanner.c,v 1.19 2008/12/31 11:12:29 sebastian Exp $ */ - -#if 0 -# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) -#else -# define YYDEBUG(s, c) -#endif - -#include "zend_language_scanner_defs.h" - -#include <errno.h> -#include "zend.h" -#include "zend_alloc.h" -#include <zend_language_parser.h> -#include "zend_compile.h" -#include "zend_language_scanner.h" -#include "zend_highlight.h" -#include "zend_constants.h" -#include "zend_variables.h" -#include "zend_operators.h" -#include "zend_API.h" -#include "zend_strtod.h" -#include "zend_unicode.h" -#include "tsrm_virtual_cwd.h" -#include "tsrm_config_common.h" - -#define YYCTYPE unsigned char -#define YYFILL(n) { if (YYCURSOR >= YYLIMIT) return 0; } -#define YYCURSOR SCNG(yy_cursor) -#define YYLIMIT SCNG(yy_limit) -#define YYMARKER SCNG(yy_marker) - -#define YYGETCONDITION() SCNG(yy_state) -#define YYSETCONDITION(s) SCNG(yy_state) = s - -#define STATE(name) yyc##name - -/* emulate flex constructs */ -#define BEGIN(state) YYSETCONDITION(STATE(state)) -#define YYSTATE YYGETCONDITION() -#define yytext ((char*)SCNG(yy_text)) -#define yyleng SCNG(yy_leng) -#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + (x); \ - yyleng = (unsigned int)(x); } while(0) -#define yymore() goto yymore_restart - -/* perform sanity check. If this message is triggered you should - increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 of the Zend license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.zend.com/license/2_00.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Marcus Boerger <helly@php.net> | + | Nuno Lopes <nlopess@php.net> | + | Scott MacVicar <scottmac@php.net> | + | Flex version authors: | + | Andi Gutmans <andi@zend.com> | + | Zeev Suraski <zeev@zend.com> | + +----------------------------------------------------------------------+ +*/ + +/* $Id: zend_language_scanner.c,v 1.20 2009/01/01 20:19:39 iliaa Exp $ */ + +#if 0 +# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) +#else +# define YYDEBUG(s, c) +#endif + +#include "zend_language_scanner_defs.h" + +#include <errno.h> +#include "zend.h" +#include "zend_alloc.h" +#include <zend_language_parser.h> +#include "zend_compile.h" +#include "zend_language_scanner.h" +#include "zend_highlight.h" +#include "zend_constants.h" +#include "zend_variables.h" +#include "zend_operators.h" +#include "zend_API.h" +#include "zend_strtod.h" +#include "zend_unicode.h" +#include "tsrm_virtual_cwd.h" +#include "tsrm_config_common.h" + +#define YYCTYPE unsigned char +#define YYFILL(n) { if (YYCURSOR >= YYLIMIT) return 0; } +#define YYCURSOR SCNG(yy_cursor) +#define YYLIMIT SCNG(yy_limit) +#define YYMARKER SCNG(yy_marker) + +#define YYGETCONDITION() SCNG(yy_state) +#define YYSETCONDITION(s) SCNG(yy_state) = s + +#define STATE(name) yyc##name + +/* emulate flex constructs */ +#define BEGIN(state) YYSETCONDITION(STATE(state)) +#define YYSTATE YYGETCONDITION() +#define yytext ((char*)SCNG(yy_text)) +#define yyleng SCNG(yy_leng) +#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + (x); \ + yyleng = (unsigned int)(x); } while(0) +#define yymore() goto yymore_restart + +/* perform sanity check. If this message is triggered you should + increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ #define YYMAXFILL 16 -#if ZEND_MMAP_AHEAD < YYMAXFILL -# error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL -#endif - -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#endif - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif - -/* Globals Macros */ -#define SCNG LANG_SCNG -#ifdef ZTS -ZEND_API ts_rsrc_id language_scanner_globals_id; -#else -ZEND_API zend_php_scanner_globals language_scanner_globals; -#endif - -/* -#define YY_INPUT(buf, result, max_size) \ - if ( ((result = zend_unicode_yyinput(yyin, buf, max_size TSRMLS_CC)) == 0)) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -*/ - -#define HANDLE_NEWLINES(s, l) \ -do { \ - char *p = (s), *boundary = p+(l); \ - \ - while (p<boundary) { \ - if (*p == '\n' || (*p == '\r' && (*(p+1) != '\n'))) { \ - CG(zend_lineno)++; \ - } \ - p++; \ - } \ -} while (0) - -#define HANDLE_NEWLINE(c) \ -{ \ - if (c == '\n' || c == '\r') { \ - CG(zend_lineno)++; \ - } \ -} - -#define ZEND_IS_OCT(c) ((c)>='0' && (c)<='7') -#define ZEND_IS_HEX(c) (((c)>='0' && (c)<='9') || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F')) - -BEGIN_EXTERN_C() - -static void _yy_push_state(int new_state TSRMLS_DC) - { - zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int)); - YYSETCONDITION(new_state); -} - -#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm) - -static void yy_pop_state(TSRMLS_D) -{ - int *stack_state; - zend_stack_top(&SCNG(state_stack), (void **) &stack_state); - YYSETCONDITION(*stack_state); - zend_stack_del_top(&SCNG(state_stack)); -} - -static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC) -{ - YYCURSOR = (YYCTYPE*)str; - SCNG(yy_start) = YYCURSOR; - YYLIMIT = YYCURSOR + len; - } - -void startup_scanner(TSRMLS_D) -{ - CG(heredoc) = NULL; - CG(heredoc_len) = 0; - CG(doc_comment) = NULL_ZSTR; - CG(doc_comment_len) = 0; - - SCNG(input_conv) = NULL; - SCNG(output_conv) = NULL; - SCNG(encoding_checked) = 0; - SCNG(rest_str) = NULL; - SCNG(rest_len) = 0; - - zend_llist_init(&SCNG(used_state_stacks), sizeof(zend_stack), (llist_dtor_func_t) zend_stack_destroy, 0); - zend_stack_init(&SCNG(state_stack)); - zend_llist_add_element(&SCNG(used_state_stacks), &SCNG(state_stack)); -} - - -void shutdown_scanner(TSRMLS_D) -{ - if (CG(heredoc)) { - efree(CG(heredoc)); - CG(heredoc_len)=0; - } - zend_llist_destroy(&SCNG(used_state_stacks)); - RESET_DOC_COMMENT(); - - if (SCNG(input_conv)) { - ucnv_close(SCNG(input_conv)); - SCNG(input_conv) = NULL; - } - if (SCNG(output_conv)) { - ucnv_close(SCNG(output_conv)); - SCNG(output_conv) = NULL; - } - SCNG(encoding_checked) = 0; - if (SCNG(rest_str)) { - efree(SCNG(rest_str)); - SCNG(rest_str) = NULL; - } - SCNG(rest_len) = 0; -} - -static int compare_stacks(zend_stack *stack1, zend_stack *stack2) -{ - return (stack1 == stack2); -} - -ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state TSRMLS_DC) -{ - lex_state->yy_leng = SCNG(yy_leng); - lex_state->yy_start = SCNG(yy_start); - lex_state->yy_text = SCNG(yy_text); - lex_state->yy_cursor = SCNG(yy_cursor); - lex_state->yy_marker = SCNG(yy_marker); - lex_state->yy_limit = SCNG(yy_limit); - - lex_state->state_stack = SCNG(state_stack); - zend_stack_init(&SCNG(state_stack)); - zend_llist_add_element(&SCNG(used_state_stacks), &SCNG(state_stack)); - - lex_state->in = SCNG(yy_in); - lex_state->yy_state = YYSTATE; - lex_state->filename = zend_get_compiled_filename(TSRMLS_C); - lex_state->lineno = CG(zend_lineno); - - lex_state->input_conv = SCNG(input_conv); - lex_state->output_conv = SCNG(output_conv); - lex_state->encoding_checked = SCNG(encoding_checked); - lex_state->rest_str = SCNG(rest_str); - lex_state->rest_len = SCNG(rest_len); - SCNG(input_conv) = NULL; - SCNG(output_conv) = NULL; - SCNG(encoding_checked) = 0; - SCNG(rest_str) = NULL; - SCNG(rest_len) = 0; -} - -ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC) -{ - SCNG(yy_leng) = lex_state->yy_leng; - SCNG(yy_start) = lex_state->yy_start; - SCNG(yy_text) = lex_state->yy_text; - SCNG(yy_cursor) = lex_state->yy_cursor; - SCNG(yy_marker) = lex_state->yy_marker; - SCNG(yy_limit) = lex_state->yy_limit; - - zend_llist_del_element(&SCNG(used_state_stacks), &SCNG(state_stack), (int (*)(void *, void *)) compare_stacks); - SCNG(state_stack) = lex_state->state_stack; - - SCNG(yy_in) = lex_state->in; - YYSETCONDITION(lex_state->yy_state); - CG(zend_lineno) = lex_state->lineno; - zend_restore_compiled_filename(lex_state->filename TSRMLS_CC); - zend_restore_compiled_script_encoding(lex_state->script_encoding TSRMLS_CC); - - if (SCNG(input_conv)) { - ucnv_close(SCNG(input_conv)); - } - SCNG(input_conv) = lex_state->input_conv; - if (SCNG(output_conv)) { - ucnv_close(SCNG(output_conv)); - } - SCNG(output_conv) = lex_state->output_conv; - SCNG(encoding_checked) = lex_state->encoding_checked; - if (SCNG(rest_str)) { - efree(SCNG(rest_str)); - } - SCNG(rest_str) = lex_state->rest_str; - SCNG(rest_len) = lex_state->rest_len; -} - -ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC) -{ - zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles); - /* zend_file_handle_dtor() operates on the copy, so we have to NULLify the original here */ - file_handle->opened_path = NULL; - if (file_handle->free_filename) { - file_handle->filename = NULL; - } -} - -/* Convert one octal digit to a numeric value 0..7, or -1 on failure */ -static inline int8_t zend_get_octal_digit(UChar c) { - if (c >= 0x0030 && c <= 0x0037) { - return (int8_t)(c - 0x0030); - } - return -1; -} - -/* - * Convert one hex digit to a numeric value 0..F, or -1 on failure. - * Borrowed from ICU. - */ -static inline int8_t zend_get_hex_digit(UChar c) { - if (c >= 0x0030 && c <= 0x0039) { - return (int8_t)(c - 0x0030); - } - if (c >= 0x0041 && c <= 0x0046) { - return (int8_t)(c - (0x0041 - 10)); - } - if (c >= 0x0061 && c <= 0x0066) { - return (int8_t)(c - (0x0061 - 10)); - } - return -1; -} - -static inline zend_bool zend_udigits_to_codepoint(UChar *s, UChar *end, UChar32 *c, int8_t digits) -{ - int8_t n = 0; - int8_t digit = 0; - UChar32 codepoint = 0; - - while (s < end && n < digits) { - digit = zend_get_hex_digit(*s); - if (digit < 0) { - break; - } - codepoint = (codepoint << 4) | digit; - ++s; - ++n; - } - - if (n < digits) { - return 0; - } - - *c = codepoint; - return 1; -} - -static inline int zend_uchar_from_uname(UChar *name, int name_len, UChar32 *c TSRMLS_DC) -{ - UChar32 codepoint = 0; - UErrorCode status = U_ZERO_ERROR; - char *buf; - - buf = zend_unicode_to_ascii(name, name_len TSRMLS_CC); - if (!buf) return 0; - codepoint = u_charFromName(U_UNICODE_CHAR_NAME, buf, &status); - efree(buf); - if (U_SUCCESS(status)) { - *c = codepoint; - return 1; - } else { - return 0; - } -} - -static inline int zend_parse_charname_sequence(UChar **s, UChar *end, UChar32 *c TSRMLS_DC) -{ - UChar *start; - - if (**s == '{') { - start = ++(*s); - while ((*s)++ != end) { - if (**s == '}') { - if (zend_uchar_from_uname(start, *s - start, c TSRMLS_CC)) { - return 1; - } else { - /* safe, since *s points to '}' */ - **s = 0; - zend_error(E_COMPILE_WARNING, "Invalid Unicode character name: '%r'", start); - break; - } - } - } - } - - return 0; -} - -ZEND_API int zend_copy_scanner_string(zval *zendlval, char *str, zend_uint str_len, zend_uchar type, UConverter *conv TSRMLS_DC) -{ - UErrorCode status = U_ZERO_ERROR; - int consumed = 0; - - if (type == IS_UNICODE) { - consumed = zend_convert_scanner_output(conv, &Z_USTRVAL_P(zendlval), &Z_USTRLEN_P(zendlval), str, str_len, &status TSRMLS_CC); - - if (U_FAILURE(status)) { - zend_error(E_COMPILE_WARNING,"Illegal or truncated character in input: offset %d, state=%d", consumed, YYSTATE); - efree(Z_USTRVAL_P(zendlval)); - return 0; - } - Z_TYPE_P(zendlval) = IS_UNICODE; - } else { - Z_STRVAL_P(zendlval) = (char *)estrndup(str, str_len); - Z_STRLEN_P(zendlval) = str_len; - Z_TYPE_P(zendlval) = IS_STRING; - } - - return 1; -} - -static inline int zend_check_and_normalize_identifier(zval *zendlval) -{ - UChar *norm; - int norm_len; - - if (!zend_is_valid_identifier(Z_USTRVAL_P(zendlval), Z_USTRLEN_P(zendlval))) { - zend_error(E_COMPILE_WARNING, "Invalid identifier syntax: %r", Z_USTRVAL_P(zendlval)); - efree(Z_USTRVAL_P(zendlval)); - return 0; - } - if (zend_normalize_identifier(&norm, &norm_len, Z_USTRVAL_P(zendlval), Z_USTRLEN_P(zendlval), 0) == FAILURE) { - zend_error(E_COMPILE_WARNING, "Could not normalize identifier: %r", Z_USTRVAL_P(zendlval)); - efree(Z_USTRVAL_P(zendlval)); - return 0; - } - if (norm != Z_USTRVAL_P(zendlval)) { - efree(Z_USTRVAL_P(zendlval)); - ZVAL_UNICODEL(zendlval, norm, norm_len, 0); - } - return 1; -} - -static void zend_scanner_output_callback( - const void *context, - UConverterToUnicodeArgs *toUArgs, - const char *codeUnits, - int32_t length, - UConverterCallbackReason reason, - UErrorCode *err - ) -{ - if (*err == U_TRUNCATED_CHAR_FOUND || - *err == U_ILLEGAL_CHAR_FOUND || - *err == U_INVALID_CHAR_FOUND) { - *(const char **)context = toUArgs->source - length; - } - - return; -} - -static int is_encoding_flex_compatible(const char *enc TSRMLS_DC) -{ - int key_len = strlen(enc)+1; - unsigned char ret; - unsigned char *ret_ptr; - - if (zend_hash_find(&UG(flex_compatible), (char*)enc, key_len, (void**)&ret_ptr) == SUCCESS) { - return *ret_ptr; - } else { - UErrorCode status = U_ZERO_ERROR; - UConverter *conv = ucnv_open(enc, &status); - - if (U_FAILURE(status)) { - return 0; - } - - switch (ucnv_getType(conv)) { - case UCNV_DBCS: - case UCNV_UTF16_BigEndian: - case UCNV_UTF16_LittleEndian: - case UCNV_UTF32_BigEndian: - case UCNV_UTF32_LittleEndian: - case UCNV_EBCDIC_STATEFUL: - case UCNV_ISO_2022: - case UCNV_LMBCS_1: - case UCNV_LMBCS_2: - case UCNV_LMBCS_3: - case UCNV_LMBCS_4: - case UCNV_LMBCS_5: - case UCNV_LMBCS_6: - case UCNV_LMBCS_8: - case UCNV_LMBCS_11: - case UCNV_LMBCS_16: - case UCNV_LMBCS_17: - case UCNV_LMBCS_18: - case UCNV_LMBCS_19: - case UCNV_HZ: - case UCNV_SCSU: - case UCNV_UTF7: - case UCNV_BOCU1: - case UCNV_UTF16: - case UCNV_UTF32: - case UCNV_IMAP_MAILBOX: - ret = 0; - break; - case UCNV_LATIN_1: - case UCNV_UTF8: - case UCNV_ISCII: - case UCNV_US_ASCII: - case UCNV_CESU8: - ret = 1; - break; - default: { - static const UChar ascii[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E - }; - static const char expected[] = - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" - "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" - "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F" - "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F" - "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F" - "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F" - "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F" - "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E"; - char output[sizeof(expected)]; - - if (ucnv_fromUChars(conv, - output, sizeof(output), - ascii, sizeof(expected), - &status) != sizeof(expected) || - U_FAILURE(status)) { - ret = 0; - } else { - ret = (memcmp(expected, output, sizeof(expected)) == 0); - } - } - } - ucnv_close(conv); - - zend_hash_add(&UG(flex_compatible), (char*)enc, key_len, (void**)&ret, sizeof(ret), NULL); - - return ret; - } -} - -ZEND_API int zend_prepare_scanner_converters(const char *onetime_encoding, int run_time TSRMLS_DC) -{ - const char *encoding = NULL; - - if (SCNG(input_conv)) { - /* Script is already converted to UTF-8 */ - return zend_set_converter_encoding(&SCNG(output_conv), "UTF-8"); - } else { - encoding = onetime_encoding; - } - - /* We need to convert the input stream only if script_encoding is not ASCII compatible */ - if (!is_encoding_flex_compatible(encoding TSRMLS_CC)) { - if (zend_set_converter_encoding(&SCNG(input_conv), encoding) == FAILURE) { - return FAILURE; - } -#ifdef scottmac_0 - if (run_time) { - /* Convert rest of the buffer to unicode.runtime_encoding. */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; - int offset, length, size; - const char *src, *old_src; - char rt_buf[8192]; - char *target = rt_buf; - UErrorCode status = U_ZERO_ERROR; - - old_src = src = yy_c_buf_p; - offset = yy_c_buf_p - b->yy_ch_buf; - length = b->yy_n_chars - offset; - size = b->yy_buf_size - offset; - - ucnv_convertEx(UG(utf8_conv), - SCNG(input_conv), - &target, rt_buf+size-2, - &src, src+length, - NULL, NULL, NULL, NULL, - TRUE, TRUE, - &status); - - if (src - old_src < length) { - /* Cannot fit into buffer. Schedule for next read. */ - SCNG(rest_len) = length - (src - old_src); - SCNG(rest_str) = emalloc(SCNG(rest_len)); - memcpy(SCNG(rest_str), src, SCNG(rest_len)); - } - length = target - rt_buf; - memcpy(yy_c_buf_p, rt_buf, length); - SCNG(yy_n_chars) = b->yy_n_chars = length + offset; - b->yy_ch_buf[b->yy_n_chars] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[b->yy_n_chars+1] = YY_END_OF_BUFFER_CHAR; - } -#endif - encoding = "UTF-8"; - } - return zend_set_converter_encoding(&SCNG(output_conv), encoding); -} - -ZEND_API int zend_convert_scanner_output(UConverter *conv, UChar **target, int *target_len, const char *source, int source_len, UErrorCode *status TSRMLS_DC) -{ - const char *source_consumed = NULL; - - /* set our custom callback with context */ - ucnv_setToUCallBack(conv, zend_scanner_output_callback, &source_consumed, NULL, NULL, status); - - /* reset the error and perform conversion */ - *status = U_ZERO_ERROR; - zend_string_to_unicode_ex(conv, target, target_len, source, source_len, status); - - /* figure out how many source bytes were consumed */ - if (U_SUCCESS(*status)) { - return source_len; - } else if (source_consumed) { - return source_consumed - source; - } else { - return 0; - } -} - -int zend_unicode_yyinput(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC) -{ - size_t n = len; - const char *src = buf; - -#ifdef scottmac_0 - /* Look of we have rest from previous call */ - if (SCNG(rest_str)) { - if (len >= SCNG(rest_len)) { - memcpy(buf, SCNG(rest_str), SCNG(rest_len)); - efree(SCNG(rest_str)); - SCNG(rest_str) = NULL; - n = SCNG(rest_len); - SCNG(rest_len) = 0; - } else { - memcpy(buf, SCNG(rest_str), len); - memcpy(SCNG(rest_str), SCNG(rest_str)+len, SCNG(rest_len)-len); - n = len; - SCNG(rest_len) -= len; - } - } else { - n = zend_stream_read(file_handle, buf, len TSRMLS_CC); - } -#endif - - /* Don't make any conversions if unicode=off */ - if (!UG(unicode)) { - return n; - } - - /* Autodetect encoding */ - if (!SCNG(encoding_checked)) { - int32_t signatureLength; - UErrorCode status = U_ZERO_ERROR; - const char *encoding; - - encoding = ucnv_detectUnicodeSignature(buf, n, &signatureLength, &status); - if (encoding && U_SUCCESS(status)) { - src += signatureLength; - n -= signatureLength; - if (is_encoding_flex_compatible(encoding TSRMLS_CC)) { - if (SCNG(input_conv)) { - ucnv_close(SCNG(input_conv)); - SCNG(input_conv) = NULL; - } - zend_set_converter_encoding(&SCNG(output_conv), encoding); - if (signatureLength > 0) { - memcpy(buf, src, n); - } - } else { - zend_set_converter_encoding(&SCNG(input_conv), encoding); - zend_set_converter_encoding(&SCNG(output_conv), "UTF-8"); - } - } - status = U_ZERO_ERROR; - SCNG(encoding_checked) = 1; - } - - if (SCNG(input_conv) && n >= 0) { - UErrorCode status = U_ZERO_ERROR; - char rt_buf[8192]; - char *target = rt_buf; - const char *old_src = src; - - ucnv_convertEx(UG(utf8_conv), - SCNG(input_conv), - &target, rt_buf+len, - &src, src+n, - NULL, NULL, NULL, NULL, - TRUE, TRUE, - &status); - if (src - old_src < n) { - /* Cannot fit into buffer. Schedule for next read. */ - SCNG(rest_len) = n - (src - old_src); - SCNG(rest_str) = emalloc(SCNG(rest_len)); - memcpy(SCNG(rest_str), src, SCNG(rest_len)); - } - n = target - rt_buf; - memcpy(buf, rt_buf, n); - } - return n; -} - -ZEND_API int open_file_for_scanning(zend_file_handle *file_handle TSRMLS_DC) -{ - char *file_path=NULL, *buf; - UErrorCode status = U_ZERO_ERROR; - size_t size; - - if (zend_stream_fixup(file_handle, &buf, &size TSRMLS_CC) == FAILURE) { - return FAILURE; - } - - zend_llist_add_element(&CG(open_files), file_handle); - - if (file_handle->handle.stream.handle >= (void*)file_handle && file_handle->handle.stream.handle <= (void*)(file_handle+1)) { - zend_file_handle *fh = (zend_file_handle*)zend_llist_get_last(&CG(open_files)); - size_t diff = (char*)file_handle->handle.stream.handle - (char*)file_handle; - fh->handle.stream.handle = (void*)(((char*)fh) + diff); - file_handle->handle.stream.handle = fh->handle.stream.handle; - } - - /* Reset the scanner for scanning the new file */ - SCNG(yy_in) = file_handle; - - zend_prepare_scanner_converters(ucnv_getName(ZEND_U_CONVERTER(UG(script_encoding_conv)), &status), 0 TSRMLS_CC); - - if (size != -1) { - /* Re-encode for Unicode if needed */ - yy_scan_buffer(buf, size TSRMLS_CC); - } else { - zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed"); - } - - BEGIN(INITIAL); - - if (file_handle->opened_path) { - file_path = file_handle->opened_path; - } else { - file_path = file_handle->filename; - } - - zend_set_compiled_filename(file_path TSRMLS_CC); - zend_set_compiled_script_encoding((char*)ucnv_getName(SCNG(output_conv), &status) TSRMLS_CC); - - if (CG(start_lineno)) { - CG(zend_lineno) = CG(start_lineno); - CG(start_lineno) = 0; - } else { - CG(zend_lineno) = 1; - } - - CG(increment_lineno) = 0; - return SUCCESS; -} -END_EXTERN_C() - - -ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) -{ - zend_lex_state original_lex_state; - zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array)); - zend_op_array *original_active_op_array = CG(active_op_array); - zend_op_array *retval=NULL; - int compiler_result; - zend_bool compilation_successful=0; - znode retval_znode; - zend_bool original_in_compilation = CG(in_compilation); - - retval_znode.op_type = IS_CONST; - Z_TYPE(retval_znode.u.constant) = IS_LONG; - Z_LVAL(retval_znode.u.constant) = 1; - Z_UNSET_ISREF(retval_znode.u.constant); - Z_SET_REFCOUNT(retval_znode.u.constant, 1); - - zend_save_lexical_state(&original_lex_state TSRMLS_CC); - - retval = op_array; /* success oriented */ - - if (open_file_for_scanning(file_handle TSRMLS_CC)==FAILURE) { - if (type==ZEND_REQUIRE) { - zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC); - zend_bailout(); - } else { - zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC); - } - compilation_successful=0; - } else { - init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE TSRMLS_CC); - CG(in_compilation) = 1; - CG(active_op_array) = op_array; - compiler_result = zendparse(TSRMLS_C); - zend_do_return(&retval_znode, 0 TSRMLS_CC); - CG(in_compilation) = original_in_compilation; - if (compiler_result==1) { /* parser error */ - zend_bailout(); - } - compilation_successful=1; - } - - if (retval) { - CG(active_op_array) = original_active_op_array; - if (compilation_successful) { - pass_two(op_array TSRMLS_CC); - zend_release_labels(TSRMLS_C); - } else { - efree(op_array); - retval = NULL; - } - } - if (compilation_successful) { - zend_restore_lexical_state(&original_lex_state TSRMLS_CC); - } - return retval; -} - - -zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC) -{ - zend_file_handle file_handle; - zval tmp; - zend_op_array *retval; - char *opened_path = NULL; - - if (Z_TYPE_P(filename) != IS_STRING) { - tmp = *filename; - zval_copy_ctor(&tmp); - convert_to_string(&tmp); - filename = &tmp; - } - file_handle.filename = Z_STRVAL_P(filename); - file_handle.free_filename = 0; - file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.opened_path = NULL; - file_handle.handle.fp = NULL; - - retval = zend_compile_file(&file_handle, type TSRMLS_CC); - if (retval && file_handle.handle.stream.handle) { - int dummy = 1; - - if (!file_handle.opened_path) { - file_handle.opened_path = opened_path = estrndup(Z_STRVAL_P(filename), Z_STRLEN_P(filename)); - } - - zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL); - - if (opened_path) { - efree(opened_path); - } - } - zend_destroy_file_handle(&file_handle TSRMLS_CC); - - if (filename==&tmp) { - zval_dtor(&tmp); - } - return retval; -} - -ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_DC) -{ - const char *encoding; - UErrorCode status = U_ZERO_ERROR; - - if (Z_TYPE_P(str) == IS_UNICODE) { - convert_to_string_with_converter(str, UG(utf8_conv)); - encoding = "UTF-8"; - } else { - UErrorCode status = U_ZERO_ERROR; - encoding = ucnv_getName(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &status); - } - - str->value.str.val = safe_erealloc(str->value.str.val, 1, str->value.str.len, ZEND_MMAP_AHEAD); - memset(str->value.str.val + str->value.str.len, 0, ZEND_MMAP_AHEAD); - - SCNG(yy_in)=NULL; - - zend_prepare_scanner_converters(encoding, 0 TSRMLS_CC); - /* Re-encode for Unicode if needed */ - yy_scan_buffer(Z_STRVAL_P(str), Z_STRLEN_P(str) TSRMLS_CC); - - zend_set_compiled_filename(filename TSRMLS_CC); - zend_set_compiled_script_encoding((char*)ucnv_getName(SCNG(output_conv), &status) TSRMLS_CC); - CG(zend_lineno) = 1; - CG(increment_lineno) = 0; - return SUCCESS; -} - - -ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D) -{ - return SCNG(yy_cursor) - SCNG(yy_start); -} - - -zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC) -{ - zend_lex_state original_lex_state; - zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array)); - zend_op_array *original_active_op_array = CG(active_op_array); - zend_op_array *retval; - zval tmp; - int compiler_result; - zend_bool original_in_compilation = CG(in_compilation); - - tmp = *source_string; - zval_copy_ctor(&tmp); - if (Z_TYPE(tmp) != IS_STRING && Z_TYPE(tmp) != IS_UNICODE) { - convert_to_text(&tmp); - } - source_string = &tmp; - - if (Z_UNILEN_P(source_string)==0) { - efree(op_array); - zval_dtor(&tmp); - return NULL; - } - - CG(in_compilation) = 1; - - zend_save_lexical_state(&original_lex_state TSRMLS_CC); - if (zend_prepare_string_for_scanning(source_string, filename TSRMLS_CC)==FAILURE) { - efree(op_array); - retval = NULL; - } else { - zend_bool orig_interactive = CG(interactive); - - CG(interactive) = 0; - init_op_array(op_array, ZEND_EVAL_CODE, INITIAL_OP_ARRAY_SIZE TSRMLS_CC); - CG(interactive) = orig_interactive; - CG(active_op_array) = op_array; - BEGIN(ST_IN_SCRIPTING); - compiler_result = zendparse(TSRMLS_C); - - if (compiler_result==1) { - CG(active_op_array) = original_active_op_array; - CG(unclean_shutdown)=1; - retval = NULL; - } else { - zend_do_return(NULL, 0 TSRMLS_CC); - CG(active_op_array) = original_active_op_array; - pass_two(op_array TSRMLS_CC); - zend_release_labels(TSRMLS_C); - retval = op_array; - } - zend_restore_lexical_state(&original_lex_state TSRMLS_CC); - } - zval_dtor(&tmp); - CG(in_compilation) = original_in_compilation; - return retval; -} - - -BEGIN_EXTERN_C() -int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini TSRMLS_DC) -{ - zend_lex_state original_lex_state; - zend_file_handle file_handle; - - file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.filename = filename; - file_handle.free_filename = 0; - file_handle.opened_path = NULL; - zend_save_lexical_state(&original_lex_state TSRMLS_CC); - if (open_file_for_scanning(&file_handle TSRMLS_CC)==FAILURE) { - zend_message_dispatcher(ZMSG_FAILED_HIGHLIGHT_FOPEN, filename TSRMLS_CC); - return FAILURE; - } - zend_highlight(syntax_highlighter_ini TSRMLS_CC); - zend_destroy_file_handle(&file_handle TSRMLS_CC); - zend_restore_lexical_state(&original_lex_state TSRMLS_CC); - return SUCCESS; -} - -int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name TSRMLS_DC) -{ - zend_lex_state original_lex_state; - zval tmp = *str; - - str = &tmp; - zval_copy_ctor(str); - zend_save_lexical_state(&original_lex_state TSRMLS_CC); - if (zend_prepare_string_for_scanning(str, str_name TSRMLS_CC)==FAILURE) { - return FAILURE; - } - BEGIN(INITIAL); - zend_highlight(syntax_highlighter_ini TSRMLS_CC); - zend_restore_lexical_state(&original_lex_state TSRMLS_CC); - zval_dtor(str); - return SUCCESS; -} -END_EXTERN_C() - -#define zend_copy_value(zendlval, yytext, yyleng) \ - Z_STRVAL_P(zendlval) = (char *)estrndup(yytext, yyleng); \ - Z_STRLEN_P(zendlval) = yyleng; - -static int zend_scan_unicode_escape_string(zval *zendlval, char *str, int len, UChar quote_type, int type TSRMLS_DC) -{ - register UChar *s, *t, c; - UChar *end; - UChar32 codepoint = 0; - int8_t digit; - int8_t min_digits = 0, max_digits = 0; - int8_t bits; - int8_t n; - - if (!zend_copy_scanner_string(zendlval, str, len, IS_UNICODE, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - - /* convert escape sequences */ - s = t = Z_USTRVAL_P(zendlval); - end = s+Z_USTRLEN_P(zendlval); - while (s<end) { - if (*s==0x5C /*'\\'*/) { - s++; - c = *s; - if (s >= end) { - *t++ = 0x5C; /*'\\'*/ - break; - } - - min_digits = 0; - codepoint = 0; - bits = 4; - n = 0; - - switch(c) { - case 0x6E: /*'n'*/ - *t++ = (UChar) 0x0A; /*'\n'*/ - Z_USTRLEN_P(zendlval)--; - break; - case 0x72: /*'r'*/ - *t++ = (UChar) 0x0D; /*'\r'*/ - Z_USTRLEN_P(zendlval)--; - break; - case 0x74: /*'t'*/ - *t++ = (UChar) 0x09; /*'\t'*/ - Z_USTRLEN_P(zendlval)--; - break; - case 0x66: /*'f'*/ - *t++ = (UChar) 0x0C; /*'\f'*/ - Z_USTRLEN_P(zendlval)--; - break; - case 0x76: /*'v'*/ - *t++ = (UChar) 0x0B; /*'\v'*/ - Z_USTRLEN_P(zendlval)--; - break; - case 0x22: /*'"'*/ - case 0x60: /*'`'*/ - if (c != quote_type) { - *t++ = 0x5C; /*'\\'*/ - *t++ = *s; - break; - } - case 0x5C: /*'\\'*/ - case 0x24: /*'$'*/ - *t++ = *s; - Z_USTRLEN_P(zendlval)--; - break; - case 0x43: /*'C'*/ - { - UChar *p = s+1; - if (p < end && zend_parse_charname_sequence(&p, end, &codepoint TSRMLS_CC)) { - Z_USTRLEN_P(zendlval) -= p - s + 1; - s = p; - if (U_IS_BMP(codepoint)) { - *t++ = (UChar) codepoint; - } else { - *t++ = (UChar) U16_LEAD(codepoint); - *t++ = (UChar) U16_TRAIL(codepoint); - Z_USTRLEN_P(zendlval)++; - } - } else { - zend_error(E_COMPILE_WARNING, "Invalid \\C{..} sequence"); - efree(Z_USTRVAL_P(zendlval)); - return 0; - } - break; - } - case 0x75: /*'u'*/ - min_digits = 4; - max_digits = 4; - Z_USTRLEN_P(zendlval)--; - break; - case 0x55: /*'U'*/ - min_digits = 6; - max_digits = 6; - Z_USTRLEN_P(zendlval)--; - break; - case 0x78: /*'x'*/ - case 0x58: /*'X'*/ - if ((digit = zend_get_hex_digit(*(s+1))) >= 0) { - min_digits = 1; - max_digits = 2; - Z_USTRLEN_P(zendlval)--; - s++; - n = 1; /* already have one digit */ - codepoint = digit; - } else { - *t++ = 0x5C; /*'\\'*/ - *t++ = *s; - } - break; - default: - digit = zend_get_octal_digit(*s); - if (digit >= 0) { - min_digits = 1; - max_digits = 3; - bits = 3; - n = 1; /* already have one digit */ - codepoint = digit; - } else { - *t++ = 0x5C; /*'\\'*/ - *t++ = *s; - } - break; - } - - /* need to parse a number for one of the escape sequences */ - if (min_digits != 0) { - while (s++ < end && n < max_digits) { - digit = (bits == 4) ? zend_get_hex_digit(*s) : zend_get_octal_digit(*s); - if (digit < 0) { - break; - } - codepoint = (codepoint << bits) | digit; - n++; - } - - if (n < min_digits) { - /* can only happen for \u and \U sequences */ - zend_error(E_COMPILE_WARNING,"\\%c escape sequence requires exactly %d hexadecimal digits", (char) c, min_digits); - efree(Z_USTRVAL_P(zendlval)); - return 0; - } - - if (U_IS_BMP(codepoint)) { - *t++ = (UChar) codepoint; - Z_USTRLEN_P(zendlval) -= n; - } else if (codepoint <= 0x10FFFF) { - *t++ = (UChar) U16_LEAD(codepoint); - *t++ = (UChar) U16_TRAIL(codepoint); - Z_USTRLEN_P(zendlval) -= n-1; - } else { - zend_error(E_COMPILE_WARNING,"\\U%06x is above the highest valid codepoint 0x10FFFF", codepoint); - efree(Z_USTRVAL_P(zendlval)); - return 0; - } - - /* s is already incremented and not past a newline */ - continue; - } - } else { - *t++ = *s; - } - - if (*s == 0x0A /*'\n'*/ || (*s == 0x0D /*'\r'*/ && (*(s+1) != 0x0A /*'\n'*/))) { - CG(zend_lineno)++; - } - s++; - } - *t = 0; - - return type; -} - -static int zend_scan_unicode_single_string(zval *zendlval TSRMLS_DC) -{ - register UChar *s, *t; - UChar *end; - - if (!zend_copy_scanner_string(zendlval, yytext+1, yyleng-2, IS_UNICODE, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - - /* convert escape sequences */ - s = t = Z_USTRVAL_P(zendlval); - end = s+Z_USTRLEN_P(zendlval); - while (s<end) { - if (*s==0x5C /*'\\'*/) { - s++; - - switch(*s) { - case 0x5C: /*'\\'*/ - case 0x27: /*'\''*/ - *t++ = *s; - Z_USTRLEN_P(zendlval)--; - break; - default: - *t++ = 0x5C; /*'\\'*/ - *t++ = *s; - break; - } - } else { - *t++ = *s; - } - - if (*s == 0x0A /*'\n'*/ || (*s == 0x0D /*'\r'*/ && (*(s+1) != 0x0A /*'\n'*/))) { - CG(zend_lineno)++; - } - s++; - } - *t = 0; - - return T_CONSTANT_ENCAPSED_STRING; -} - -static void zend_scan_binary_escape_string(zval *zendlval, char *str, int len, char quote_type TSRMLS_DC) -{ - register char *s, *t; - char *end; - - ZVAL_STRINGL(zendlval, str, len, 1); - - /* convert escape sequences */ - s = t = Z_STRVAL_P(zendlval); - end = s+Z_STRLEN_P(zendlval); - while (s<end) { - if (*s=='\\') { - s++; - if (s >= end) { - *t++ = '\\'; - break; - } - - switch(*s) { - case 'n': - *t++ = '\n'; - Z_STRLEN_P(zendlval)--; - break; - case 'r': - *t++ = '\r'; - Z_STRLEN_P(zendlval)--; - break; - case 't': - *t++ = '\t'; - Z_STRLEN_P(zendlval)--; - break; - case 'f': - *t++ = '\f'; - zendlval->value.str.len--; - break; - case 'v': - *t++ = '\v'; - zendlval->value.str.len--; - break; - case '"': - case '`': - if (*s != quote_type) { - *t++ = '\\'; - *t++ = *s; - break; - } - case '\\': - case '$': - *t++ = *s; - Z_STRLEN_P(zendlval)--; - break; - case 'x': - case 'X': - if (ZEND_IS_HEX(*(s+1))) { - char hex_buf[3] = { 0, 0, 0 }; - - Z_STRLEN_P(zendlval)--; /* for the 'x' */ - - hex_buf[0] = *(++s); - Z_STRLEN_P(zendlval)--; - if (ZEND_IS_HEX(*(s+1))) { - hex_buf[1] = *(++s); - Z_STRLEN_P(zendlval)--; - } - *t++ = (char) strtol(hex_buf, NULL, 16); - } else { - *t++ = '\\'; - *t++ = *s; - } - break; - default: - /* check for an octal */ - if (ZEND_IS_OCT(*s)) { - char octal_buf[4] = { 0, 0, 0, 0 }; - - octal_buf[0] = *s; - Z_STRLEN_P(zendlval)--; - if (ZEND_IS_OCT(*(s+1))) { - octal_buf[1] = *(++s); - Z_STRLEN_P(zendlval)--; - if (ZEND_IS_OCT(*(s+1))) { - octal_buf[2] = *(++s); - Z_STRLEN_P(zendlval)--; - } - } - *t++ = (char) strtol(octal_buf, NULL, 8); - } else { - *t++ = '\\'; - *t++ = *s; - } - break; - } - } else { - *t++ = *s; - } - - if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { - CG(zend_lineno)++; - } - s++; - } - *t = 0; -} - -static void zend_scan_binary_single_string(zval *zendlval, char *str, int len TSRMLS_DC) -{ - register char *s, *t; - char *end; - - ZVAL_STRINGL(zendlval, str, len, 1); - - /* convert escape sequences */ - s = t = Z_STRVAL_P(zendlval); - end = s+Z_STRLEN_P(zendlval); - while (s<end) { - if (*s=='\\') { - s++; - - switch(*s) { - case '\\': - case '\'': - *t++ = *s; - Z_STRLEN_P(zendlval)--; - break; - default: - *t++ = '\\'; - *t++ = *s; - break; - } - } else { - *t++ = *s; - } - - if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { - CG(zend_lineno)++; - } - s++; - } - *t = 0; -} - - -int lex_scan(zval *zendlval TSRMLS_DC) -{ -restart: - SCNG(yy_text) = YYCURSOR; - -yymore_restart: - - /* detect EOF */ - if (YYCURSOR >= YYLIMIT) { - /* special case */ - if (YYSTATE == STATE(ST_COMMENT) || YYSTATE == STATE(ST_DOC_COMMENT)) { - zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno)); - } - return 0; - } - - /* ignore first line when it's started with a # */ - if (YYCURSOR == SCNG(yy_start) && *YYCURSOR == '#') { - while (++YYCURSOR < YYLIMIT) { - if (*YYCURSOR == '\n') { - ++YYCURSOR; - CG(zend_lineno)++; - goto restart; - } - - if (*YYCURSOR == '\r') { - if (++YYCURSOR < YYLIMIT && *YYCURSOR == '\n') { /* match \r\n as single newline */ - ++YYCURSOR; - } - CG(zend_lineno)++; - goto restart; - } - } - - return 0; /* EOF */ - } - +#if ZEND_MMAP_AHEAD < YYMAXFILL +# error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL +#endif + +#ifdef HAVE_STDARG_H +# include <stdarg.h> +#endif + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +/* Globals Macros */ +#define SCNG LANG_SCNG +#ifdef ZTS +ZEND_API ts_rsrc_id language_scanner_globals_id; +#else +ZEND_API zend_php_scanner_globals language_scanner_globals; +#endif + +/* +#define YY_INPUT(buf, result, max_size) \ + if ( ((result = zend_unicode_yyinput(yyin, buf, max_size TSRMLS_CC)) == 0)) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +*/ + +#define HANDLE_NEWLINES(s, l) \ +do { \ + char *p = (s), *boundary = p+(l); \ + \ + while (p<boundary) { \ + if (*p == '\n' || (*p == '\r' && (*(p+1) != '\n'))) { \ + CG(zend_lineno)++; \ + } \ + p++; \ + } \ +} while (0) + +#define HANDLE_NEWLINE(c) \ +{ \ + if (c == '\n' || c == '\r') { \ + CG(zend_lineno)++; \ + } \ +} + +#define ZEND_IS_OCT(c) ((c)>='0' && (c)<='7') +#define ZEND_IS_HEX(c) (((c)>='0' && (c)<='9') || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F')) + +BEGIN_EXTERN_C() + +static void _yy_push_state(int new_state TSRMLS_DC) + { + zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int)); + YYSETCONDITION(new_state); +} + +#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm) + +static void yy_pop_state(TSRMLS_D) +{ + int *stack_state; + zend_stack_top(&SCNG(state_stack), (void **) &stack_state); + YYSETCONDITION(*stack_state); + zend_stack_del_top(&SCNG(state_stack)); +} + +static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC) +{ + YYCURSOR = (YYCTYPE*)str; + SCNG(yy_start) = YYCURSOR; + YYLIMIT = YYCURSOR + len; + } + +void startup_scanner(TSRMLS_D) +{ + CG(heredoc) = NULL; + CG(heredoc_len) = 0; + CG(doc_comment) = NULL_ZSTR; + CG(doc_comment_len) = 0; + + SCNG(input_conv) = NULL; + SCNG(output_conv) = NULL; + SCNG(encoding_checked) = 0; + SCNG(rest_str) = NULL; + SCNG(rest_len) = 0; + + zend_llist_init(&SCNG(used_state_stacks), sizeof(zend_stack), (llist_dtor_func_t) zend_stack_destroy, 0); + zend_stack_init(&SCNG(state_stack)); + zend_llist_add_element(&SCNG(used_state_stacks), &SCNG(state_stack)); +} + + +void shutdown_scanner(TSRMLS_D) +{ + if (CG(heredoc)) { + efree(CG(heredoc)); + CG(heredoc_len)=0; + } + zend_llist_destroy(&SCNG(used_state_stacks)); + RESET_DOC_COMMENT(); + + if (SCNG(input_conv)) { + ucnv_close(SCNG(input_conv)); + SCNG(input_conv) = NULL; + } + if (SCNG(output_conv)) { + ucnv_close(SCNG(output_conv)); + SCNG(output_conv) = NULL; + } + SCNG(encoding_checked) = 0; + if (SCNG(rest_str)) { + efree(SCNG(rest_str)); + SCNG(rest_str) = NULL; + } + SCNG(rest_len) = 0; +} + +static int compare_stacks(zend_stack *stack1, zend_stack *stack2) +{ + return (stack1 == stack2); +} + +ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state TSRMLS_DC) +{ + lex_state->yy_leng = SCNG(yy_leng); + lex_state->yy_start = SCNG(yy_start); + lex_state->yy_text = SCNG(yy_text); + lex_state->yy_cursor = SCNG(yy_cursor); + lex_state->yy_marker = SCNG(yy_marker); + lex_state->yy_limit = SCNG(yy_limit); + + lex_state->state_stack = SCNG(state_stack); + zend_stack_init(&SCNG(state_stack)); + zend_llist_add_element(&SCNG(used_state_stacks), &SCNG(state_stack)); + + lex_state->in = SCNG(yy_in); + lex_state->yy_state = YYSTATE; + lex_state->filename = zend_get_compiled_filename(TSRMLS_C); + lex_state->lineno = CG(zend_lineno); + + lex_state->input_conv = SCNG(input_conv); + lex_state->output_conv = SCNG(output_conv); + lex_state->encoding_checked = SCNG(encoding_checked); + lex_state->rest_str = SCNG(rest_str); + lex_state->rest_len = SCNG(rest_len); + SCNG(input_conv) = NULL; + SCNG(output_conv) = NULL; + SCNG(encoding_checked) = 0; + SCNG(rest_str) = NULL; + SCNG(rest_len) = 0; +} + +ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC) +{ + SCNG(yy_leng) = lex_state->yy_leng; + SCNG(yy_start) = lex_state->yy_start; + SCNG(yy_text) = lex_state->yy_text; + SCNG(yy_cursor) = lex_state->yy_cursor; + SCNG(yy_marker) = lex_state->yy_marker; + SCNG(yy_limit) = lex_state->yy_limit; + + zend_llist_del_element(&SCNG(used_state_stacks), &SCNG(state_stack), (int (*)(void *, void *)) compare_stacks); + SCNG(state_stack) = lex_state->state_stack; + + SCNG(yy_in) = lex_state->in; + YYSETCONDITION(lex_state->yy_state); + CG(zend_lineno) = lex_state->lineno; + zend_restore_compiled_filename(lex_state->filename TSRMLS_CC); + zend_restore_compiled_script_encoding(lex_state->script_encoding TSRMLS_CC); + + if (SCNG(input_conv)) { + ucnv_close(SCNG(input_conv)); + } + SCNG(input_conv) = lex_state->input_conv; + if (SCNG(output_conv)) { + ucnv_close(SCNG(output_conv)); + } + SCNG(output_conv) = lex_state->output_conv; + SCNG(encoding_checked) = lex_state->encoding_checked; + if (SCNG(rest_str)) { + efree(SCNG(rest_str)); + } + SCNG(rest_str) = lex_state->rest_str; + SCNG(rest_len) = lex_state->rest_len; +} + +ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC) +{ + zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles); + /* zend_file_handle_dtor() operates on the copy, so we have to NULLify the original here */ + file_handle->opened_path = NULL; + if (file_handle->free_filename) { + file_handle->filename = NULL; + } +} + +/* Convert one octal digit to a numeric value 0..7, or -1 on failure */ +static inline int8_t zend_get_octal_digit(UChar c) { + if (c >= 0x0030 && c <= 0x0037) { + return (int8_t)(c - 0x0030); + } + return -1; +} + +/* + * Convert one hex digit to a numeric value 0..F, or -1 on failure. + * Borrowed from ICU. + */ +static inline int8_t zend_get_hex_digit(UChar c) { + if (c >= 0x0030 && c <= 0x0039) { + return (int8_t)(c - 0x0030); + } + if (c >= 0x0041 && c <= 0x0046) { + return (int8_t)(c - (0x0041 - 10)); + } + if (c >= 0x0061 && c <= 0x0066) { + return (int8_t)(c - (0x0061 - 10)); + } + return -1; +} + +static inline zend_bool zend_udigits_to_codepoint(UChar *s, UChar *end, UChar32 *c, int8_t digits) +{ + int8_t n = 0; + int8_t digit = 0; + UChar32 codepoint = 0; + + while (s < end && n < digits) { + digit = zend_get_hex_digit(*s); + if (digit < 0) { + break; + } + codepoint = (codepoint << 4) | digit; + ++s; + ++n; + } + + if (n < digits) { + return 0; + } + + *c = codepoint; + return 1; +} + +static inline int zend_uchar_from_uname(UChar *name, int name_len, UChar32 *c TSRMLS_DC) +{ + UChar32 codepoint = 0; + UErrorCode status = U_ZERO_ERROR; + char *buf; + + buf = zend_unicode_to_ascii(name, name_len TSRMLS_CC); + if (!buf) return 0; + codepoint = u_charFromName(U_UNICODE_CHAR_NAME, buf, &status); + efree(buf); + if (U_SUCCESS(status)) { + *c = codepoint; + return 1; + } else { + return 0; + } +} + +static inline int zend_parse_charname_sequence(UChar **s, UChar *end, UChar32 *c TSRMLS_DC) +{ + UChar *start; + + if (**s == '{') { + start = ++(*s); + while ((*s)++ != end) { + if (**s == '}') { + if (zend_uchar_from_uname(start, *s - start, c TSRMLS_CC)) { + return 1; + } else { + /* safe, since *s points to '}' */ + **s = 0; + zend_error(E_COMPILE_WARNING, "Invalid Unicode character name: '%r'", start); + break; + } + } + } + } + + return 0; +} + +ZEND_API int zend_copy_scanner_string(zval *zendlval, char *str, zend_uint str_len, zend_uchar type, UConverter *conv TSRMLS_DC) +{ + UErrorCode status = U_ZERO_ERROR; + int consumed = 0; + + if (type == IS_UNICODE) { + consumed = zend_convert_scanner_output(conv, &Z_USTRVAL_P(zendlval), &Z_USTRLEN_P(zendlval), str, str_len, &status TSRMLS_CC); + + if (U_FAILURE(status)) { + zend_error(E_COMPILE_WARNING,"Illegal or truncated character in input: offset %d, state=%d", consumed, YYSTATE); + efree(Z_USTRVAL_P(zendlval)); + return 0; + } + Z_TYPE_P(zendlval) = IS_UNICODE; + } else { + Z_STRVAL_P(zendlval) = (char *)estrndup(str, str_len); + Z_STRLEN_P(zendlval) = str_len; + Z_TYPE_P(zendlval) = IS_STRING; + } + + return 1; +} + +static inline int zend_check_and_normalize_identifier(zval *zendlval) +{ + UChar *norm; + int norm_len; + + if (!zend_is_valid_identifier(Z_USTRVAL_P(zendlval), Z_USTRLEN_P(zendlval))) { + zend_error(E_COMPILE_WARNING, "Invalid identifier syntax: %r", Z_USTRVAL_P(zendlval)); + efree(Z_USTRVAL_P(zendlval)); + return 0; + } + if (zend_normalize_identifier(&norm, &norm_len, Z_USTRVAL_P(zendlval), Z_USTRLEN_P(zendlval), 0) == FAILURE) { + zend_error(E_COMPILE_WARNING, "Could not normalize identifier: %r", Z_USTRVAL_P(zendlval)); + efree(Z_USTRVAL_P(zendlval)); + return 0; + } + if (norm != Z_USTRVAL_P(zendlval)) { + efree(Z_USTRVAL_P(zendlval)); + ZVAL_UNICODEL(zendlval, norm, norm_len, 0); + } + return 1; +} + +static void zend_scanner_output_callback( + const void *context, + UConverterToUnicodeArgs *toUArgs, + const char *codeUnits, + int32_t length, + UConverterCallbackReason reason, + UErrorCode *err + ) +{ + if (*err == U_TRUNCATED_CHAR_FOUND || + *err == U_ILLEGAL_CHAR_FOUND || + *err == U_INVALID_CHAR_FOUND) { + *(const char **)context = toUArgs->source - length; + } + + return; +} + +static int is_encoding_flex_compatible(const char *enc TSRMLS_DC) +{ + int key_len = strlen(enc)+1; + unsigned char ret; + unsigned char *ret_ptr; + + if (zend_hash_find(&UG(flex_compatible), (char*)enc, key_len, (void**)&ret_ptr) == SUCCESS) { + return *ret_ptr; + } else { + UErrorCode status = U_ZERO_ERROR; + UConverter *conv = ucnv_open(enc, &status); + + if (U_FAILURE(status)) { + return 0; + } + + switch (ucnv_getType(conv)) { + case UCNV_DBCS: + case UCNV_UTF16_BigEndian: + case UCNV_UTF16_LittleEndian: + case UCNV_UTF32_BigEndian: + case UCNV_UTF32_LittleEndian: + case UCNV_EBCDIC_STATEFUL: + case UCNV_ISO_2022: + case UCNV_LMBCS_1: + case UCNV_LMBCS_2: + case UCNV_LMBCS_3: + case UCNV_LMBCS_4: + case UCNV_LMBCS_5: + case UCNV_LMBCS_6: + case UCNV_LMBCS_8: + case UCNV_LMBCS_11: + case UCNV_LMBCS_16: + case UCNV_LMBCS_17: + case UCNV_LMBCS_18: + case UCNV_LMBCS_19: + case UCNV_HZ: + case UCNV_SCSU: + case UCNV_UTF7: + case UCNV_BOCU1: + case UCNV_UTF16: + case UCNV_UTF32: + case UCNV_IMAP_MAILBOX: + ret = 0; + break; + case UCNV_LATIN_1: + case UCNV_UTF8: + case UCNV_ISCII: + case UCNV_US_ASCII: + case UCNV_CESU8: + ret = 1; + break; + default: { + static const UChar ascii[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E + }; + static const char expected[] = + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" + "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F" + "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F" + "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F" + "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F" + "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F" + "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E"; + char output[sizeof(expected)]; + + if (ucnv_fromUChars(conv, + output, sizeof(output), + ascii, sizeof(expected), + &status) != sizeof(expected) || + U_FAILURE(status)) { + ret = 0; + } else { + ret = (memcmp(expected, output, sizeof(expected)) == 0); + } + } + } + ucnv_close(conv); + + zend_hash_add(&UG(flex_compatible), (char*)enc, key_len, (void**)&ret, sizeof(ret), NULL); + + return ret; + } +} + +ZEND_API int zend_prepare_scanner_converters(const char *onetime_encoding, int run_time TSRMLS_DC) +{ + const char *encoding = NULL; + + if (SCNG(input_conv)) { + /* Script is already converted to UTF-8 */ + return zend_set_converter_encoding(&SCNG(output_conv), "UTF-8"); + } else { + encoding = onetime_encoding; + } + + /* We need to convert the input stream only if script_encoding is not ASCII compatible */ + if (!is_encoding_flex_compatible(encoding TSRMLS_CC)) { + if (zend_set_converter_encoding(&SCNG(input_conv), encoding) == FAILURE) { + return FAILURE; + } +#ifdef scottmac_0 + if (run_time) { + /* Convert rest of the buffer to unicode.runtime_encoding. */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + int offset, length, size; + const char *src, *old_src; + char rt_buf[8192]; + char *target = rt_buf; + UErrorCode status = U_ZERO_ERROR; + + old_src = src = yy_c_buf_p; + offset = yy_c_buf_p - b->yy_ch_buf; + length = b->yy_n_chars - offset; + size = b->yy_buf_size - offset; + + ucnv_convertEx(UG(utf8_conv), + SCNG(input_conv), + &target, rt_buf+size-2, + &src, src+length, + NULL, NULL, NULL, NULL, + TRUE, TRUE, + &status); + + if (src - old_src < length) { + /* Cannot fit into buffer. Schedule for next read. */ + SCNG(rest_len) = length - (src - old_src); + SCNG(rest_str) = emalloc(SCNG(rest_len)); + memcpy(SCNG(rest_str), src, SCNG(rest_len)); + } + length = target - rt_buf; + memcpy(yy_c_buf_p, rt_buf, length); + SCNG(yy_n_chars) = b->yy_n_chars = length + offset; + b->yy_ch_buf[b->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[b->yy_n_chars+1] = YY_END_OF_BUFFER_CHAR; + } +#endif + encoding = "UTF-8"; + } + return zend_set_converter_encoding(&SCNG(output_conv), encoding); +} + +ZEND_API int zend_convert_scanner_output(UConverter *conv, UChar **target, int *target_len, const char *source, int source_len, UErrorCode *status TSRMLS_DC) +{ + const char *source_consumed = NULL; + + /* set our custom callback with context */ + ucnv_setToUCallBack(conv, zend_scanner_output_callback, &source_consumed, NULL, NULL, status); + + /* reset the error and perform conversion */ + *status = U_ZERO_ERROR; + zend_string_to_unicode_ex(conv, target, target_len, source, source_len, status); + + /* figure out how many source bytes were consumed */ + if (U_SUCCESS(*status)) { + return source_len; + } else if (source_consumed) { + return source_consumed - source; + } else { + return 0; + } +} + +int zend_unicode_yyinput(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC) +{ + size_t n = len; + const char *src = buf; + +#ifdef scottmac_0 + /* Look of we have rest from previous call */ + if (SCNG(rest_str)) { + if (len >= SCNG(rest_len)) { + memcpy(buf, SCNG(rest_str), SCNG(rest_len)); + efree(SCNG(rest_str)); + SCNG(rest_str) = NULL; + n = SCNG(rest_len); + SCNG(rest_len) = 0; + } else { + memcpy(buf, SCNG(rest_str), len); + memcpy(SCNG(rest_str), SCNG(rest_str)+len, SCNG(rest_len)-len); + n = len; + SCNG(rest_len) -= len; + } + } else { + n = zend_stream_read(file_handle, buf, len TSRMLS_CC); + } +#endif + + /* Don't make any conversions if unicode=off */ + if (!UG(unicode)) { + return n; + } + + /* Autodetect encoding */ + if (!SCNG(encoding_checked)) { + int32_t signatureLength; + UErrorCode status = U_ZERO_ERROR; + const char *encoding; + + encoding = ucnv_detectUnicodeSignature(buf, n, &signatureLength, &status); + if (encoding && U_SUCCESS(status)) { + src += signatureLength; + n -= signatureLength; + if (is_encoding_flex_compatible(encoding TSRMLS_CC)) { + if (SCNG(input_conv)) { + ucnv_close(SCNG(input_conv)); + SCNG(input_conv) = NULL; + } + zend_set_converter_encoding(&SCNG(output_conv), encoding); + if (signatureLength > 0) { + memcpy(buf, src, n); + } + } else { + zend_set_converter_encoding(&SCNG(input_conv), encoding); + zend_set_converter_encoding(&SCNG(output_conv), "UTF-8"); + } + } + status = U_ZERO_ERROR; + SCNG(encoding_checked) = 1; + } + + if (SCNG(input_conv) && n >= 0) { + UErrorCode status = U_ZERO_ERROR; + char rt_buf[8192]; + char *target = rt_buf; + const char *old_src = src; + + ucnv_convertEx(UG(utf8_conv), + SCNG(input_conv), + &target, rt_buf+len, + &src, src+n, + NULL, NULL, NULL, NULL, + TRUE, TRUE, + &status); + if (src - old_src < n) { + /* Cannot fit into buffer. Schedule for next read. */ + SCNG(rest_len) = n - (src - old_src); + SCNG(rest_str) = emalloc(SCNG(rest_len)); + memcpy(SCNG(rest_str), src, SCNG(rest_len)); + } + n = target - rt_buf; + memcpy(buf, rt_buf, n); + } + return n; +} + +ZEND_API int open_file_for_scanning(zend_file_handle *file_handle TSRMLS_DC) +{ + char *file_path=NULL, *buf; + UErrorCode status = U_ZERO_ERROR; + size_t size; + + if (zend_stream_fixup(file_handle, &buf, &size TSRMLS_CC) == FAILURE) { + return FAILURE; + } + + zend_llist_add_element(&CG(open_files), file_handle); + + if (file_handle->handle.stream.handle >= (void*)file_handle && file_handle->handle.stream.handle <= (void*)(file_handle+1)) { + zend_file_handle *fh = (zend_file_handle*)zend_llist_get_last(&CG(open_files)); + size_t diff = (char*)file_handle->handle.stream.handle - (char*)file_handle; + fh->handle.stream.handle = (void*)(((char*)fh) + diff); + file_handle->handle.stream.handle = fh->handle.stream.handle; + } + + /* Reset the scanner for scanning the new file */ + SCNG(yy_in) = file_handle; + + zend_prepare_scanner_converters(ucnv_getName(ZEND_U_CONVERTER(UG(script_encoding_conv)), &status), 0 TSRMLS_CC); + + if (size != -1) { + /* Re-encode for Unicode if needed */ + yy_scan_buffer(buf, size TSRMLS_CC); + } else { + zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed"); + } + + BEGIN(INITIAL); + + if (file_handle->opened_path) { + file_path = file_handle->opened_path; + } else { + file_path = file_handle->filename; + } + + zend_set_compiled_filename(file_path TSRMLS_CC); + zend_set_compiled_script_encoding((char*)ucnv_getName(SCNG(output_conv), &status) TSRMLS_CC); + + if (CG(start_lineno)) { + CG(zend_lineno) = CG(start_lineno); + CG(start_lineno) = 0; + } else { + CG(zend_lineno) = 1; + } + + CG(increment_lineno) = 0; + return SUCCESS; +} +END_EXTERN_C() + + +ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) +{ + zend_lex_state original_lex_state; + zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array)); + zend_op_array *original_active_op_array = CG(active_op_array); + zend_op_array *retval=NULL; + int compiler_result; + zend_bool compilation_successful=0; + znode retval_znode; + zend_bool original_in_compilation = CG(in_compilation); + + retval_znode.op_type = IS_CONST; + Z_TYPE(retval_znode.u.constant) = IS_LONG; + Z_LVAL(retval_znode.u.constant) = 1; + Z_UNSET_ISREF(retval_znode.u.constant); + Z_SET_REFCOUNT(retval_znode.u.constant, 1); + + zend_save_lexical_state(&original_lex_state TSRMLS_CC); + + retval = op_array; /* success oriented */ + + if (open_file_for_scanning(file_handle TSRMLS_CC)==FAILURE) { + if (type==ZEND_REQUIRE) { + zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC); + zend_bailout(); + } else { + zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC); + } + compilation_successful=0; + } else { + init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE TSRMLS_CC); + CG(in_compilation) = 1; + CG(active_op_array) = op_array; + compiler_result = zendparse(TSRMLS_C); + zend_do_return(&retval_znode, 0 TSRMLS_CC); + CG(in_compilation) = original_in_compilation; + if (compiler_result==1) { /* parser error */ + zend_bailout(); + } + compilation_successful=1; + } + + if (retval) { + CG(active_op_array) = original_active_op_array; + if (compilation_successful) { + pass_two(op_array TSRMLS_CC); + zend_release_labels(TSRMLS_C); + } else { + efree(op_array); + retval = NULL; + } + } + if (compilation_successful) { + zend_restore_lexical_state(&original_lex_state TSRMLS_CC); + } + return retval; +} + + +zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC) +{ + zend_file_handle file_handle; + zval tmp; + zend_op_array *retval; + char *opened_path = NULL; + + if (Z_TYPE_P(filename) != IS_STRING) { + tmp = *filename; + zval_copy_ctor(&tmp); + convert_to_string(&tmp); + filename = &tmp; + } + file_handle.filename = Z_STRVAL_P(filename); + file_handle.free_filename = 0; + file_handle.type = ZEND_HANDLE_FILENAME; + file_handle.opened_path = NULL; + file_handle.handle.fp = NULL; + + retval = zend_compile_file(&file_handle, type TSRMLS_CC); + if (retval && file_handle.handle.stream.handle) { + int dummy = 1; + + if (!file_handle.opened_path) { + file_handle.opened_path = opened_path = estrndup(Z_STRVAL_P(filename), Z_STRLEN_P(filename)); + } + + zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL); + + if (opened_path) { + efree(opened_path); + } + } + zend_destroy_file_handle(&file_handle TSRMLS_CC); + + if (filename==&tmp) { + zval_dtor(&tmp); + } + return retval; +} + +ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_DC) +{ + const char *encoding; + UErrorCode status = U_ZERO_ERROR; + + if (Z_TYPE_P(str) == IS_UNICODE) { + convert_to_string_with_converter(str, UG(utf8_conv)); + encoding = "UTF-8"; + } else { + UErrorCode status = U_ZERO_ERROR; + encoding = ucnv_getName(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &status); + } + + str->value.str.val = safe_erealloc(str->value.str.val, 1, str->value.str.len, ZEND_MMAP_AHEAD); + memset(str->value.str.val + str->value.str.len, 0, ZEND_MMAP_AHEAD); + + SCNG(yy_in)=NULL; + + zend_prepare_scanner_converters(encoding, 0 TSRMLS_CC); + /* Re-encode for Unicode if needed */ + yy_scan_buffer(Z_STRVAL_P(str), Z_STRLEN_P(str) TSRMLS_CC); + + zend_set_compiled_filename(filename TSRMLS_CC); + zend_set_compiled_script_encoding((char*)ucnv_getName(SCNG(output_conv), &status) TSRMLS_CC); + CG(zend_lineno) = 1; + CG(increment_lineno) = 0; + return SUCCESS; +} + + +ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D) +{ + return SCNG(yy_cursor) - SCNG(yy_start); +} + + +zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC) +{ + zend_lex_state original_lex_state; + zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array)); + zend_op_array *original_active_op_array = CG(active_op_array); + zend_op_array *retval; + zval tmp; + int compiler_result; + zend_bool original_in_compilation = CG(in_compilation); + + tmp = *source_string; + zval_copy_ctor(&tmp); + if (Z_TYPE(tmp) != IS_STRING && Z_TYPE(tmp) != IS_UNICODE) { + convert_to_text(&tmp); + } + source_string = &tmp; + + if (Z_UNILEN_P(source_string)==0) { + efree(op_array); + zval_dtor(&tmp); + return NULL; + } + + CG(in_compilation) = 1; + + zend_save_lexical_state(&original_lex_state TSRMLS_CC); + if (zend_prepare_string_for_scanning(source_string, filename TSRMLS_CC)==FAILURE) { + efree(op_array); + retval = NULL; + } else { + zend_bool orig_interactive = CG(interactive); + + CG(interactive) = 0; + init_op_array(op_array, ZEND_EVAL_CODE, INITIAL_OP_ARRAY_SIZE TSRMLS_CC); + CG(interactive) = orig_interactive; + CG(active_op_array) = op_array; + BEGIN(ST_IN_SCRIPTING); + compiler_result = zendparse(TSRMLS_C); + + if (compiler_result==1) { + CG(active_op_array) = original_active_op_array; + CG(unclean_shutdown)=1; + retval = NULL; + } else { + zend_do_return(NULL, 0 TSRMLS_CC); + CG(active_op_array) = original_active_op_array; + pass_two(op_array TSRMLS_CC); + zend_release_labels(TSRMLS_C); + retval = op_array; + } + zend_restore_lexical_state(&original_lex_state TSRMLS_CC); + } + zval_dtor(&tmp); + CG(in_compilation) = original_in_compilation; + return retval; +} + + +BEGIN_EXTERN_C() +int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini TSRMLS_DC) +{ + zend_lex_state original_lex_state; + zend_file_handle file_handle; + + file_handle.type = ZEND_HANDLE_FILENAME; + file_handle.filename = filename; + file_handle.free_filename = 0; + file_handle.opened_path = NULL; + zend_save_lexical_state(&original_lex_state TSRMLS_CC); + if (open_file_for_scanning(&file_handle TSRMLS_CC)==FAILURE) { + zend_message_dispatcher(ZMSG_FAILED_HIGHLIGHT_FOPEN, filename TSRMLS_CC); + return FAILURE; + } + zend_highlight(syntax_highlighter_ini TSRMLS_CC); + zend_destroy_file_handle(&file_handle TSRMLS_CC); + zend_restore_lexical_state(&original_lex_state TSRMLS_CC); + return SUCCESS; +} + +int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name TSRMLS_DC) +{ + zend_lex_state original_lex_state; + zval tmp = *str; + + str = &tmp; + zval_copy_ctor(str); + zend_save_lexical_state(&original_lex_state TSRMLS_CC); + if (zend_prepare_string_for_scanning(str, str_name TSRMLS_CC)==FAILURE) { + return FAILURE; + } + BEGIN(INITIAL); + zend_highlight(syntax_highlighter_ini TSRMLS_CC); + zend_restore_lexical_state(&original_lex_state TSRMLS_CC); + zval_dtor(str); + return SUCCESS; +} +END_EXTERN_C() + +#define zend_copy_value(zendlval, yytext, yyleng) \ + Z_STRVAL_P(zendlval) = (char *)estrndup(yytext, yyleng); \ + Z_STRLEN_P(zendlval) = yyleng; + +static int zend_scan_unicode_escape_string(zval *zendlval, char *str, int len, UChar quote_type, int type TSRMLS_DC) +{ + register UChar *s, *t, c; + UChar *end; + UChar32 codepoint = 0; + int8_t digit; + int8_t min_digits = 0, max_digits = 0; + int8_t bits; + int8_t n; + + if (!zend_copy_scanner_string(zendlval, str, len, IS_UNICODE, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + + /* convert escape sequences */ + s = t = Z_USTRVAL_P(zendlval); + end = s+Z_USTRLEN_P(zendlval); + while (s<end) { + if (*s==0x5C /*'\\'*/) { + s++; + c = *s; + if (s >= end) { + *t++ = 0x5C; /*'\\'*/ + break; + } + + min_digits = 0; + codepoint = 0; + bits = 4; + n = 0; + + switch(c) { + case 0x6E: /*'n'*/ + *t++ = (UChar) 0x0A; /*'\n'*/ + Z_USTRLEN_P(zendlval)--; + break; + case 0x72: /*'r'*/ + *t++ = (UChar) 0x0D; /*'\r'*/ + Z_USTRLEN_P(zendlval)--; + break; + case 0x74: /*'t'*/ + *t++ = (UChar) 0x09; /*'\t'*/ + Z_USTRLEN_P(zendlval)--; + break; + case 0x66: /*'f'*/ + *t++ = (UChar) 0x0C; /*'\f'*/ + Z_USTRLEN_P(zendlval)--; + break; + case 0x76: /*'v'*/ + *t++ = (UChar) 0x0B; /*'\v'*/ + Z_USTRLEN_P(zendlval)--; + break; + case 0x22: /*'"'*/ + case 0x60: /*'`'*/ + if (c != quote_type) { + *t++ = 0x5C; /*'\\'*/ + *t++ = *s; + break; + } + case 0x5C: /*'\\'*/ + case 0x24: /*'$'*/ + *t++ = *s; + Z_USTRLEN_P(zendlval)--; + break; + case 0x43: /*'C'*/ + { + UChar *p = s+1; + if (p < end && zend_parse_charname_sequence(&p, end, &codepoint TSRMLS_CC)) { + Z_USTRLEN_P(zendlval) -= p - s + 1; + s = p; + if (U_IS_BMP(codepoint)) { + *t++ = (UChar) codepoint; + } else { + *t++ = (UChar) U16_LEAD(codepoint); + *t++ = (UChar) U16_TRAIL(codepoint); + Z_USTRLEN_P(zendlval)++; + } + } else { + zend_error(E_COMPILE_WARNING, "Invalid \\C{..} sequence"); + efree(Z_USTRVAL_P(zendlval)); + return 0; + } + break; + } + case 0x75: /*'u'*/ + min_digits = 4; + max_digits = 4; + Z_USTRLEN_P(zendlval)--; + break; + case 0x55: /*'U'*/ + min_digits = 6; + max_digits = 6; + Z_USTRLEN_P(zendlval)--; + break; + case 0x78: /*'x'*/ + case 0x58: /*'X'*/ + if ((digit = zend_get_hex_digit(*(s+1))) >= 0) { + min_digits = 1; + max_digits = 2; + Z_USTRLEN_P(zendlval)--; + s++; + n = 1; /* already have one digit */ + codepoint = digit; + } else { + *t++ = 0x5C; /*'\\'*/ + *t++ = *s; + } + break; + default: + digit = zend_get_octal_digit(*s); + if (digit >= 0) { + min_digits = 1; + max_digits = 3; + bits = 3; + n = 1; /* already have one digit */ + codepoint = digit; + } else { + *t++ = 0x5C; /*'\\'*/ + *t++ = *s; + } + break; + } + + /* need to parse a number for one of the escape sequences */ + if (min_digits != 0) { + while (s++ < end && n < max_digits) { + digit = (bits == 4) ? zend_get_hex_digit(*s) : zend_get_octal_digit(*s); + if (digit < 0) { + break; + } + codepoint = (codepoint << bits) | digit; + n++; + } + + if (n < min_digits) { + /* can only happen for \u and \U sequences */ + zend_error(E_COMPILE_WARNING,"\\%c escape sequence requires exactly %d hexadecimal digits", (char) c, min_digits); + efree(Z_USTRVAL_P(zendlval)); + return 0; + } + + if (U_IS_BMP(codepoint)) { + *t++ = (UChar) codepoint; + Z_USTRLEN_P(zendlval) -= n; + } else if (codepoint <= 0x10FFFF) { + *t++ = (UChar) U16_LEAD(codepoint); + *t++ = (UChar) U16_TRAIL(codepoint); + Z_USTRLEN_P(zendlval) -= n-1; + } else { + zend_error(E_COMPILE_WARNING,"\\U%06x is above the highest valid codepoint 0x10FFFF", codepoint); + efree(Z_USTRVAL_P(zendlval)); + return 0; + } + + /* s is already incremented and not past a newline */ + continue; + } + } else { + *t++ = *s; + } + + if (*s == 0x0A /*'\n'*/ || (*s == 0x0D /*'\r'*/ && (*(s+1) != 0x0A /*'\n'*/))) { + CG(zend_lineno)++; + } + s++; + } + *t = 0; + + return type; +} + +static int zend_scan_unicode_single_string(zval *zendlval TSRMLS_DC) +{ + register UChar *s, *t; + UChar *end; + + if (!zend_copy_scanner_string(zendlval, yytext+1, yyleng-2, IS_UNICODE, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + + /* convert escape sequences */ + s = t = Z_USTRVAL_P(zendlval); + end = s+Z_USTRLEN_P(zendlval); + while (s<end) { + if (*s==0x5C /*'\\'*/) { + s++; + + switch(*s) { + case 0x5C: /*'\\'*/ + case 0x27: /*'\''*/ + *t++ = *s; + Z_USTRLEN_P(zendlval)--; + break; + default: + *t++ = 0x5C; /*'\\'*/ + *t++ = *s; + break; + } + } else { + *t++ = *s; + } + + if (*s == 0x0A /*'\n'*/ || (*s == 0x0D /*'\r'*/ && (*(s+1) != 0x0A /*'\n'*/))) { + CG(zend_lineno)++; + } + s++; + } + *t = 0; + + return T_CONSTANT_ENCAPSED_STRING; +} + +static void zend_scan_binary_escape_string(zval *zendlval, char *str, int len, char quote_type TSRMLS_DC) +{ + register char *s, *t; + char *end; + + ZVAL_STRINGL(zendlval, str, len, 1); + + /* convert escape sequences */ + s = t = Z_STRVAL_P(zendlval); + end = s+Z_STRLEN_P(zendlval); + while (s<end) { + if (*s=='\\') { + s++; + if (s >= end) { + *t++ = '\\'; + break; + } + + switch(*s) { + case 'n': + *t++ = '\n'; + Z_STRLEN_P(zendlval)--; + break; + case 'r': + *t++ = '\r'; + Z_STRLEN_P(zendlval)--; + break; + case 't': + *t++ = '\t'; + Z_STRLEN_P(zendlval)--; + break; + case 'f': + *t++ = '\f'; + zendlval->value.str.len--; + break; + case 'v': + *t++ = '\v'; + zendlval->value.str.len--; + break; + case '"': + case '`': + if (*s != quote_type) { + *t++ = '\\'; + *t++ = *s; + break; + } + case '\\': + case '$': + *t++ = *s; + Z_STRLEN_P(zendlval)--; + break; + case 'x': + case 'X': + if (ZEND_IS_HEX(*(s+1))) { + char hex_buf[3] = { 0, 0, 0 }; + + Z_STRLEN_P(zendlval)--; /* for the 'x' */ + + hex_buf[0] = *(++s); + Z_STRLEN_P(zendlval)--; + if (ZEND_IS_HEX(*(s+1))) { + hex_buf[1] = *(++s); + Z_STRLEN_P(zendlval)--; + } + *t++ = (char) strtol(hex_buf, NULL, 16); + } else { + *t++ = '\\'; + *t++ = *s; + } + break; + default: + /* check for an octal */ + if (ZEND_IS_OCT(*s)) { + char octal_buf[4] = { 0, 0, 0, 0 }; + + octal_buf[0] = *s; + Z_STRLEN_P(zendlval)--; + if (ZEND_IS_OCT(*(s+1))) { + octal_buf[1] = *(++s); + Z_STRLEN_P(zendlval)--; + if (ZEND_IS_OCT(*(s+1))) { + octal_buf[2] = *(++s); + Z_STRLEN_P(zendlval)--; + } + } + *t++ = (char) strtol(octal_buf, NULL, 8); + } else { + *t++ = '\\'; + *t++ = *s; + } + break; + } + } else { + *t++ = *s; + } + + if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { + CG(zend_lineno)++; + } + s++; + } + *t = 0; +} + +static void zend_scan_binary_single_string(zval *zendlval, char *str, int len TSRMLS_DC) +{ + register char *s, *t; + char *end; + + ZVAL_STRINGL(zendlval, str, len, 1); + + /* convert escape sequences */ + s = t = Z_STRVAL_P(zendlval); + end = s+Z_STRLEN_P(zendlval); + while (s<end) { + if (*s=='\\') { + s++; + + switch(*s) { + case '\\': + case '\'': + *t++ = *s; + Z_STRLEN_P(zendlval)--; + break; + default: + *t++ = '\\'; + *t++ = *s; + break; + } + } else { + *t++ = *s; + } + + if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { + CG(zend_lineno)++; + } + s++; + } + *t = 0; +} + + +int lex_scan(zval *zendlval TSRMLS_DC) +{ +restart: + SCNG(yy_text) = YYCURSOR; + +yymore_restart: + + /* detect EOF */ + if (YYCURSOR >= YYLIMIT) { + /* special case */ + if (YYSTATE == STATE(ST_COMMENT) || YYSTATE == STATE(ST_DOC_COMMENT)) { + zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno)); + } + return 0; + } + + /* ignore first line when it's started with a #! */ + if (YYCURSOR == SCNG(yy_start) && *YYCURSOR == '#' && *(YYCURSOR + 1) == '!') { + while (++YYCURSOR < YYLIMIT) { + if (*YYCURSOR == '\n') { + ++YYCURSOR; + CG(zend_lineno)++; + goto restart; + } + + if (*YYCURSOR == '\r') { + if (++YYCURSOR < YYLIMIT && *YYCURSOR == '\n') { /* match \r\n as single newline */ + ++YYCURSOR; + } + CG(zend_lineno)++; + goto restart; + } + } + + return 0; /* EOF */ + } + #line 1364 "Zend/zend_language_scanner.c" { @@ -1472,35 +1472,35 @@ YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2169 "Zend/zend_language_scanner.l" - { - -inline_char_handler: - - while (1) { - YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR); - - if (ptr == NULL) { - YYCURSOR = YYLIMIT; - yyleng = YYCURSOR - SCNG(yy_text); - break; - - } else { - YYCURSOR = ptr + 1; - - /* stop if it may be an opening tag (<?, <%, <script>). this condition is not optimal though */ - if (YYCURSOR < YYLIMIT && (*YYCURSOR == '?' || *YYCURSOR == '%' || *YYCURSOR == 's')) { - --YYCURSOR; - yyleng = YYCURSOR - SCNG(yy_text); - break; - } - } - } - - Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng); - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - HANDLE_NEWLINES(yytext, yyleng); - return T_INLINE_HTML; + { + +inline_char_handler: + + while (1) { + YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR); + + if (ptr == NULL) { + YYCURSOR = YYLIMIT; + yyleng = YYCURSOR - SCNG(yy_text); + break; + + } else { + YYCURSOR = ptr + 1; + + /* stop if it may be an opening tag (<?, <%, <script>). this condition is not optimal though */ + if (YYCURSOR < YYLIMIT && (*YYCURSOR == '?' || *YYCURSOR == '%' || *YYCURSOR == 's')) { + --YYCURSOR; + yyleng = YYCURSOR - SCNG(yy_text); + break; + } + } + } + + Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng); + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + HANDLE_NEWLINES(yytext, yyleng); + return T_INLINE_HTML; } #line 1506 "Zend/zend_language_scanner.c" yy4: @@ -1521,16 +1521,16 @@ YYDEBUG(6, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2157 "Zend/zend_language_scanner.l" - { - if (CG(short_tags)) { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG; - } else { - goto inline_char_handler; - } + { + if (CG(short_tags)) { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(ST_IN_SCRIPTING); + return T_OPEN_TAG; + } else { + goto inline_char_handler; + } } #line 1536 "Zend/zend_language_scanner.c" yy7: @@ -1540,16 +1540,16 @@ YYDEBUG(8, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2134 "Zend/zend_language_scanner.l" - { - if (CG(asp_tags)) { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG; - } else { - goto inline_char_handler; - } + { + if (CG(asp_tags)) { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(ST_IN_SCRIPTING); + return T_OPEN_TAG; + } else { + goto inline_char_handler; + } } #line 1555 "Zend/zend_language_scanner.c" yy9: @@ -1738,13 +1738,13 @@ YYDEBUG(38, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2099 "Zend/zend_language_scanner.l" - { - HANDLE_NEWLINES(yytext, yyleng); - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG; + { + HANDLE_NEWLINES(yytext, yyleng); + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(ST_IN_SCRIPTING); + return T_OPEN_TAG; } #line 1750 "Zend/zend_language_scanner.c" yy39: @@ -1774,16 +1774,16 @@ YYDEBUG(44, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2108 "Zend/zend_language_scanner.l" - { - if (CG(asp_tags)) { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG_WITH_ECHO; - } else { - goto inline_char_handler; - } + { + if (CG(asp_tags)) { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(ST_IN_SCRIPTING); + return T_OPEN_TAG_WITH_ECHO; + } else { + goto inline_char_handler; + } } #line 1789 "Zend/zend_language_scanner.c" yy45: @@ -1792,16 +1792,16 @@ YYDEBUG(46, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2121 "Zend/zend_language_scanner.l" - { - if (CG(short_tags)) { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG_WITH_ECHO; - } else { - goto inline_char_handler; - } + { + if (CG(short_tags)) { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(ST_IN_SCRIPTING); + return T_OPEN_TAG_WITH_ECHO; + } else { + goto inline_char_handler; + } } #line 1807 "Zend/zend_language_scanner.c" yy47: @@ -1831,13 +1831,13 @@ YYDEBUG(51, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2147 "Zend/zend_language_scanner.l" - { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - HANDLE_NEWLINE(yytext[yyleng-1]); - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG; + { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + HANDLE_NEWLINE(yytext[yyleng-1]); + BEGIN(ST_IN_SCRIPTING); + return T_OPEN_TAG; } #line 1843 "Zend/zend_language_scanner.c" yy52: @@ -1931,10 +1931,10 @@ YYDEBUG(57, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2545 "Zend/zend_language_scanner.l" - { - Z_LVAL_P(zendlval) = (long) '{'; - yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); - return T_CURLY_OPEN; + { + Z_LVAL_P(zendlval) = (long) '{'; + yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); + return T_CURLY_OPEN; } #line 1940 "Zend/zend_language_scanner.c" yy58: @@ -1955,13 +1955,13 @@ YYDEBUG(60, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2579 "Zend/zend_language_scanner.l" - { - if (CG(literal_type) == IS_UNICODE) { - return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x60 /*'`'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC); - return T_ENCAPSED_AND_WHITESPACE; - } + { + if (CG(literal_type) == IS_UNICODE) { + return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x60 /*'`'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC); + return T_ENCAPSED_AND_WHITESPACE; + } } #line 1967 "Zend/zend_language_scanner.c" yy61: @@ -1976,9 +1976,9 @@ YYDEBUG(63, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2676 "Zend/zend_language_scanner.l" - { - BEGIN(ST_IN_SCRIPTING); - return '`'; + { + BEGIN(ST_IN_SCRIPTING); + return '`'; } #line 1984 "Zend/zend_language_scanner.c" yy64: @@ -2069,15 +2069,15 @@ YYDEBUG(70, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2588 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - - if (CG(literal_type) == IS_UNICODE) { - return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x60 /*'`'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC); - return T_ENCAPSED_AND_WHITESPACE; - } + { + yyless(yyleng - 1); + + if (CG(literal_type) == IS_UNICODE) { + return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x60 /*'`'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC); + return T_ENCAPSED_AND_WHITESPACE; + } } #line 2083 "Zend/zend_language_scanner.c" yy71: @@ -2114,14 +2114,14 @@ YYDEBUG(76, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2231 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 2127 "Zend/zend_language_scanner.c" yy77: @@ -2130,9 +2130,9 @@ YYDEBUG(78, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1864 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); - return T_DOLLAR_OPEN_CURLY_BRACES; + { + yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); + return T_DOLLAR_OPEN_CURLY_BRACES; } #line 2138 "Zend/zend_language_scanner.c" yy79: @@ -2146,17 +2146,17 @@ YYDEBUG(81, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2218 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET TSRMLS_CC); - - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET TSRMLS_CC); + + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 2162 "Zend/zend_language_scanner.c" yy82: @@ -2177,17 +2177,17 @@ YYDEBUG(84, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2203 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); - - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); + + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 2193 "Zend/zend_language_scanner.c" } @@ -2247,8 +2247,8 @@ YYDEBUG(89, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2338 "Zend/zend_language_scanner.l" - { - yymore(); + { + yymore(); } #line 2254 "Zend/zend_language_scanner.c" yy90: @@ -2258,8 +2258,8 @@ YYDEBUG(91, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2361 "Zend/zend_language_scanner.l" - { - yymore(); + { + yymore(); } #line 2265 "Zend/zend_language_scanner.c" yy92: @@ -2268,10 +2268,10 @@ YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2355 "Zend/zend_language_scanner.l" - { - HANDLE_NEWLINES(yytext, yyleng); - BEGIN(ST_IN_SCRIPTING); - return T_COMMENT; + { + HANDLE_NEWLINES(yytext, yyleng); + BEGIN(ST_IN_SCRIPTING); + return T_COMMENT; } #line 2277 "Zend/zend_language_scanner.c" } @@ -2331,8 +2331,8 @@ YYDEBUG(98, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2338 "Zend/zend_language_scanner.l" - { - yymore(); + { + yymore(); } #line 2338 "Zend/zend_language_scanner.c" yy99: @@ -2342,8 +2342,8 @@ YYDEBUG(100, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2361 "Zend/zend_language_scanner.l" - { - yymore(); + { + yymore(); } #line 2349 "Zend/zend_language_scanner.c" yy101: @@ -2352,17 +2352,17 @@ YYDEBUG(102, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2342 "Zend/zend_language_scanner.l" - { - zval temp; - - HANDLE_NEWLINES(yytext, yyleng); - if (!zend_copy_scanner_string(&temp, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - CG(doc_comment) = temp.value.uni.val; - CG(doc_comment_len) = temp.value.uni.len; - BEGIN(ST_IN_SCRIPTING); - return T_DOC_COMMENT; + { + zval temp; + + HANDLE_NEWLINES(yytext, yyleng); + if (!zend_copy_scanner_string(&temp, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + CG(doc_comment) = temp.value.uni.val; + CG(doc_comment_len) = temp.value.uni.len; + BEGIN(ST_IN_SCRIPTING); + return T_DOC_COMMENT; } #line 2368 "Zend/zend_language_scanner.c" } @@ -2452,10 +2452,10 @@ YYDEBUG(107, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2545 "Zend/zend_language_scanner.l" - { - Z_LVAL_P(zendlval) = (long) '{'; - yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); - return T_CURLY_OPEN; + { + Z_LVAL_P(zendlval) = (long) '{'; + yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); + return T_CURLY_OPEN; } #line 2461 "Zend/zend_language_scanner.c" yy108: @@ -2477,13 +2477,13 @@ YYDEBUG(110, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2552 "Zend/zend_language_scanner.l" - { - if (CG(literal_type) == IS_UNICODE) { - return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x22 /*'"'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC); - return T_ENCAPSED_AND_WHITESPACE; - } + { + if (CG(literal_type) == IS_UNICODE) { + return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x22 /*'"'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC); + return T_ENCAPSED_AND_WHITESPACE; + } } #line 2489 "Zend/zend_language_scanner.c" yy111: @@ -2498,9 +2498,9 @@ YYDEBUG(113, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2670 "Zend/zend_language_scanner.l" - { - BEGIN(ST_IN_SCRIPTING); - return '"'; + { + BEGIN(ST_IN_SCRIPTING); + return '"'; } #line 2506 "Zend/zend_language_scanner.c" yy114: @@ -2594,15 +2594,15 @@ YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2567 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - - if (CG(literal_type) == IS_UNICODE) { - return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x22 /*'"'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC); - return T_ENCAPSED_AND_WHITESPACE; - } + { + yyless(yyleng - 1); + + if (CG(literal_type) == IS_UNICODE) { + return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x22 /*'"'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC); + return T_ENCAPSED_AND_WHITESPACE; + } } #line 2608 "Zend/zend_language_scanner.c" yy121: @@ -2639,14 +2639,14 @@ YYDEBUG(126, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2231 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 2652 "Zend/zend_language_scanner.c" yy127: @@ -2655,9 +2655,9 @@ YYDEBUG(128, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1864 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); - return T_DOLLAR_OPEN_CURLY_BRACES; + { + yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); + return T_DOLLAR_OPEN_CURLY_BRACES; } #line 2663 "Zend/zend_language_scanner.c" yy129: @@ -2671,17 +2671,17 @@ YYDEBUG(131, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2218 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET TSRMLS_CC); - - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET TSRMLS_CC); + + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 2687 "Zend/zend_language_scanner.c" yy132: @@ -2702,17 +2702,17 @@ YYDEBUG(134, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2203 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); - - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); + + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 2718 "Zend/zend_language_scanner.c" } @@ -2726,16 +2726,16 @@ YYDEBUG(138, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2531 "Zend/zend_language_scanner.l" - { - YYCURSOR += CG(heredoc_len) - 1; - yyleng = CG(heredoc_len); - - Z_STRVAL_P(zendlval) = CG(heredoc); - Z_STRLEN_P(zendlval) = CG(heredoc_len); - CG(heredoc) = NULL; - CG(heredoc_len) = 0; - BEGIN(ST_IN_SCRIPTING); - return T_END_HEREDOC; + { + YYCURSOR += CG(heredoc_len) - 1; + yyleng = CG(heredoc_len); + + Z_STRVAL_P(zendlval) = CG(heredoc); + Z_STRLEN_P(zendlval) = CG(heredoc_len); + CG(heredoc) = NULL; + CG(heredoc_len) = 0; + BEGIN(ST_IN_SCRIPTING); + return T_END_HEREDOC; } #line 2741 "Zend/zend_language_scanner.c" /* *********************************** */ @@ -2795,13 +2795,13 @@ YYDEBUG(141, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2607 "Zend/zend_language_scanner.l" - { - if (CG(literal_type) == IS_UNICODE) { - return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext, yyleng, 0 TSRMLS_CC); - return T_ENCAPSED_AND_WHITESPACE; - } + { + if (CG(literal_type) == IS_UNICODE) { + return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext, yyleng, 0 TSRMLS_CC); + return T_ENCAPSED_AND_WHITESPACE; + } } #line 2807 "Zend/zend_language_scanner.c" yy142: @@ -2850,10 +2850,10 @@ YYDEBUG(144, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2545 "Zend/zend_language_scanner.l" - { - Z_LVAL_P(zendlval) = (long) '{'; - yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); - return T_CURLY_OPEN; + { + Z_LVAL_P(zendlval) = (long) '{'; + yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); + return T_CURLY_OPEN; } #line 2859 "Zend/zend_language_scanner.c" yy145: @@ -3107,15 +3107,15 @@ YYDEBUG(163, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2616 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - - if (CG(literal_type) == IS_UNICODE) { - return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext, yyleng, 0 TSRMLS_CC); - return T_ENCAPSED_AND_WHITESPACE; - } + { + yyless(yyleng - 1); + + if (CG(literal_type) == IS_UNICODE) { + return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext, yyleng, 0 TSRMLS_CC); + return T_ENCAPSED_AND_WHITESPACE; + } } #line 3121 "Zend/zend_language_scanner.c" yy164: @@ -3217,46 +3217,46 @@ YYDEBUG(171, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2489 "Zend/zend_language_scanner.l" - { - char *end = yytext + yyleng - 1; - - if (end[-1] == ';') { - end--; - yyleng--; - } - - if (yyleng > CG(heredoc_len) && !memcmp(end - CG(heredoc_len), CG(heredoc), CG(heredoc_len))) { - int len = yyleng - CG(heredoc_len) - 2; /* 2 for newline before and after label */ - - /* May have matched fooLABEL; make sure there's a newline before it */ - if (yytext[len] != '\n') { - if (yytext[len] != '\r') { - yyless(yyleng - 1); - yymore(); - } - } else if (len > 0 && yytext[len - 1] == '\r') { - len--; /* Windows newline */ - } - - /* Go back before label, to match in ST_END_HEREDOC state. yytext will include - * newline before label, for zend_highlight/strip, tokenizer, etc. */ - yyless(yyleng - CG(heredoc_len) - 1); /* 1 for newline after label */ - - CG(increment_lineno) = 1; /* For newline before label */ - BEGIN(ST_END_HEREDOC); - - if (CG(literal_type) == IS_UNICODE) { - return zend_scan_unicode_escape_string(zendlval, yytext, len, 0, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext, len, 0 TSRMLS_CC); - return T_ENCAPSED_AND_WHITESPACE; - } - } else { - /* Go back to end of label, so the next match works correctly in case of - * a variable or another label at the beginning of the next line */ - yyless(yyleng - 1); - yymore(); - } + { + char *end = yytext + yyleng - 1; + + if (end[-1] == ';') { + end--; + yyleng--; + } + + if (yyleng > CG(heredoc_len) && !memcmp(end - CG(heredoc_len), CG(heredoc), CG(heredoc_len))) { + int len = yyleng - CG(heredoc_len) - 2; /* 2 for newline before and after label */ + + /* May have matched fooLABEL; make sure there's a newline before it */ + if (yytext[len] != '\n') { + if (yytext[len] != '\r') { + yyless(yyleng - 1); + yymore(); + } + } else if (len > 0 && yytext[len - 1] == '\r') { + len--; /* Windows newline */ + } + + /* Go back before label, to match in ST_END_HEREDOC state. yytext will include + * newline before label, for zend_highlight/strip, tokenizer, etc. */ + yyless(yyleng - CG(heredoc_len) - 1); /* 1 for newline after label */ + + CG(increment_lineno) = 1; /* For newline before label */ + BEGIN(ST_END_HEREDOC); + + if (CG(literal_type) == IS_UNICODE) { + return zend_scan_unicode_escape_string(zendlval, yytext, len, 0, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext, len, 0 TSRMLS_CC); + return T_ENCAPSED_AND_WHITESPACE; + } + } else { + /* Go back to end of label, so the next match works correctly in case of + * a variable or another label at the beginning of the next line */ + yyless(yyleng - 1); + yymore(); + } } #line 3262 "Zend/zend_language_scanner.c" yy172: @@ -3519,14 +3519,14 @@ YYDEBUG(193, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2231 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 3532 "Zend/zend_language_scanner.c" yy194: @@ -3535,9 +3535,9 @@ YYDEBUG(195, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1864 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); - return T_DOLLAR_OPEN_CURLY_BRACES; + { + yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); + return T_DOLLAR_OPEN_CURLY_BRACES; } #line 3543 "Zend/zend_language_scanner.c" yy196: @@ -3551,17 +3551,17 @@ YYDEBUG(198, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2218 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET TSRMLS_CC); - - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET TSRMLS_CC); + + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 3567 "Zend/zend_language_scanner.c" yy199: @@ -3582,17 +3582,17 @@ YYDEBUG(201, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2203 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); - - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); + + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 3598 "Zend/zend_language_scanner.c" } @@ -3810,14 +3810,14 @@ YYDEBUG(205, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2259 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_STRING; + { + if (!zend_copy_scanner_string(zendlval, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_STRING; } #line 3823 "Zend/zend_language_scanner.c" yy206: @@ -4067,8 +4067,8 @@ YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1853 "Zend/zend_language_scanner.l" - { - return yytext[0]; + { + return yytext[0]; } #line 4074 "Zend/zend_language_scanner.c" yy220: @@ -4080,12 +4080,12 @@ YYDEBUG(221, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1580 "Zend/zend_language_scanner.l" - { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - HANDLE_NEWLINES(yytext, yyleng); - return T_WHITESPACE; + { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + HANDLE_NEWLINES(yytext, yyleng); + return T_WHITESPACE; } #line 4091 "Zend/zend_language_scanner.c" yy222: @@ -4099,8 +4099,8 @@ YYDEBUG(224, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1613 "Zend/zend_language_scanner.l" - { - return T_NS_SEPARATOR; + { + return T_NS_SEPARATOR; } #line 4106 "Zend/zend_language_scanner.c" yy225: @@ -4331,9 +4331,9 @@ YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1858 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); - return '{'; + { + yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); + return '{'; } #line 4339 "Zend/zend_language_scanner.c" yy250: @@ -4342,12 +4342,12 @@ YYDEBUG(251, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1870 "Zend/zend_language_scanner.l" - { - RESET_DOC_COMMENT(); - if (!zend_stack_is_empty(&SCNG(state_stack))) { - yy_pop_state(TSRMLS_C); - } - return '}'; + { + RESET_DOC_COMMENT(); + if (!zend_stack_is_empty(&SCNG(state_stack))) { + yy_pop_state(TSRMLS_C); + } + return '}'; } #line 4353 "Zend/zend_language_scanner.c" yy252: @@ -4373,25 +4373,25 @@ YYDEBUG(253, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1900 "Zend/zend_language_scanner.l" - { - if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ - Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); - } else { - errno = 0; - Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); - if (errno == ERANGE) { /* Overflow */ - if (yytext[0] == '0') { /* octal overflow */ - Z_DVAL_P(zendlval) = zend_oct_strtod(yytext, NULL); - } else { - Z_DVAL_P(zendlval) = zend_strtod(yytext, NULL); - } - Z_TYPE_P(zendlval) = IS_DOUBLE; - return T_DNUMBER; - } - } - - Z_TYPE_P(zendlval) = IS_LONG; - return T_LNUMBER; + { + if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ + Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); + } else { + errno = 0; + Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); + if (errno == ERANGE) { /* Overflow */ + if (yytext[0] == '0') { /* octal overflow */ + Z_DVAL_P(zendlval) = zend_oct_strtod(yytext, NULL); + } else { + Z_DVAL_P(zendlval) = zend_strtod(yytext, NULL); + } + Z_TYPE_P(zendlval) = IS_DOUBLE; + return T_DNUMBER; + } + } + + Z_TYPE_P(zendlval) = IS_LONG; + return T_LNUMBER; } #line 4397 "Zend/zend_language_scanner.c" yy254: @@ -4422,9 +4422,9 @@ YYDEBUG(257, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2277 "Zend/zend_language_scanner.l" - { - BEGIN(ST_ONE_LINE_COMMENT); - yymore(); + { + BEGIN(ST_ONE_LINE_COMMENT); + yymore(); } #line 4430 "Zend/zend_language_scanner.c" yy258: @@ -4436,9 +4436,9 @@ YYDEBUG(259, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2422 "Zend/zend_language_scanner.l" - { - BEGIN(ST_DOUBLE_QUOTES); - return '"'; + { + BEGIN(ST_DOUBLE_QUOTES); + return '"'; } #line 4444 "Zend/zend_language_scanner.c" yy260: @@ -4450,9 +4450,9 @@ YYDEBUG(261, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2682 "Zend/zend_language_scanner.l" - { - zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); - goto restart; + { + zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); + goto restart; } #line 4458 "Zend/zend_language_scanner.c" yy262: @@ -4461,9 +4461,9 @@ YYDEBUG(263, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2477 "Zend/zend_language_scanner.l" - { - BEGIN(ST_BACKQUOTE); - return '`'; + { + BEGIN(ST_BACKQUOTE); + return '`'; } #line 4469 "Zend/zend_language_scanner.c" yy264: @@ -4492,13 +4492,13 @@ YYDEBUG(269, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2406 "Zend/zend_language_scanner.l" - { - if (UG(unicode)) { - return zend_scan_unicode_single_string(zendlval TSRMLS_CC); - } else { - zend_scan_binary_single_string(zendlval, yytext+1, yyleng-2 TSRMLS_CC); - return T_CONSTANT_ENCAPSED_STRING; - } + { + if (UG(unicode)) { + return zend_scan_unicode_single_string(zendlval TSRMLS_CC); + } else { + zend_scan_binary_single_string(zendlval, yytext+1, yyleng-2 TSRMLS_CC); + return T_CONSTANT_ENCAPSED_STRING; + } } #line 4504 "Zend/zend_language_scanner.c" yy270: @@ -4602,13 +4602,13 @@ YYDEBUG(279, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2390 "Zend/zend_language_scanner.l" - { - if (UG(unicode)) { - return zend_scan_unicode_escape_string(zendlval, yytext+1, yyleng-2, 0x22 /*'"'*/, T_CONSTANT_ENCAPSED_STRING TSRMLS_CC); - } else { - zend_scan_binary_escape_string(zendlval, yytext+1, yyleng-2, '"' TSRMLS_CC); - return T_CONSTANT_ENCAPSED_STRING; - } + { + if (UG(unicode)) { + return zend_scan_unicode_escape_string(zendlval, yytext+1, yyleng-2, 0x22 /*'"'*/, T_CONSTANT_ENCAPSED_STRING TSRMLS_CC); + } else { + zend_scan_binary_escape_string(zendlval, yytext+1, yyleng-2, '"' TSRMLS_CC); + return T_CONSTANT_ENCAPSED_STRING; + } } #line 4614 "Zend/zend_language_scanner.c" yy280: @@ -4644,10 +4644,10 @@ YYDEBUG(285, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1961 "Zend/zend_language_scanner.l" - { - Z_DVAL_P(zendlval) = zend_strtod(yytext, NULL); - Z_TYPE_P(zendlval) = IS_DOUBLE; - return T_DNUMBER; + { + Z_DVAL_P(zendlval) = zend_strtod(yytext, NULL); + Z_TYPE_P(zendlval) = IS_DOUBLE; + return T_DNUMBER; } #line 4653 "Zend/zend_language_scanner.c" yy286: @@ -4712,25 +4712,25 @@ YYDEBUG(295, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1921 "Zend/zend_language_scanner.l" - { - char *hex = yytext + 2; /* Skip "0x" */ - int len = yyleng - 2; - - /* Skip any leading 0s */ - while (*hex == '0') { - hex++; - len--; - } - - if (len < SIZEOF_LONG * 2 || (len == SIZEOF_LONG * 2 && *hex <= '7')) { - Z_LVAL_P(zendlval) = strtol(hex, NULL, 16); - Z_TYPE_P(zendlval) = IS_LONG; - return T_LNUMBER; - } else { - Z_DVAL_P(zendlval) = zend_hex_strtod(hex, NULL); - Z_TYPE_P(zendlval) = IS_DOUBLE; - return T_DNUMBER; - } + { + char *hex = yytext + 2; /* Skip "0x" */ + int len = yyleng - 2; + + /* Skip any leading 0s */ + while (*hex == '0') { + hex++; + len--; + } + + if (len < SIZEOF_LONG * 2 || (len == SIZEOF_LONG * 2 && *hex <= '7')) { + Z_LVAL_P(zendlval) = strtol(hex, NULL, 16); + Z_TYPE_P(zendlval) = IS_LONG; + return T_LNUMBER; + } else { + Z_DVAL_P(zendlval) = zend_hex_strtod(hex, NULL); + Z_TYPE_P(zendlval) = IS_DOUBLE; + return T_DNUMBER; + } } #line 4736 "Zend/zend_language_scanner.c" yy296: @@ -4742,12 +4742,12 @@ YYDEBUG(297, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2365 "Zend/zend_language_scanner.l" - { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(INITIAL); - return T_CLOSE_TAG; /* implicit ';' at php-end tag */ + { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(INITIAL); + return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } #line 4753 "Zend/zend_language_scanner.c" yy298: @@ -4784,14 +4784,14 @@ YYDEBUG(302, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2231 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 4797 "Zend/zend_language_scanner.c" yy303: @@ -4808,8 +4808,8 @@ YYDEBUG(305, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1841 "Zend/zend_language_scanner.l" - { - return T_LOGICAL_XOR; + { + return T_LOGICAL_XOR; } #line 4815 "Zend/zend_language_scanner.c" yy306: @@ -4821,8 +4821,8 @@ YYDEBUG(307, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1833 "Zend/zend_language_scanner.l" - { - return T_LOGICAL_OR; + { + return T_LOGICAL_OR; } #line 4828 "Zend/zend_language_scanner.c" yy308: @@ -4831,8 +4831,8 @@ YYDEBUG(309, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1821 "Zend/zend_language_scanner.l" - { - return T_XOR_EQUAL; + { + return T_XOR_EQUAL; } #line 4838 "Zend/zend_language_scanner.c" yy310: @@ -4841,8 +4841,8 @@ YYDEBUG(311, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1825 "Zend/zend_language_scanner.l" - { - return T_BOOLEAN_OR; + { + return T_BOOLEAN_OR; } #line 4848 "Zend/zend_language_scanner.c" yy312: @@ -4851,8 +4851,8 @@ YYDEBUG(313, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1817 "Zend/zend_language_scanner.l" - { - return T_OR_EQUAL; + { + return T_OR_EQUAL; } #line 4858 "Zend/zend_language_scanner.c" yy314: @@ -4861,8 +4861,8 @@ YYDEBUG(315, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1829 "Zend/zend_language_scanner.l" - { - return T_BOOLEAN_AND; + { + return T_BOOLEAN_AND; } #line 4868 "Zend/zend_language_scanner.c" yy316: @@ -4871,8 +4871,8 @@ YYDEBUG(317, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1813 "Zend/zend_language_scanner.l" - { - return T_AND_EQUAL; + { + return T_AND_EQUAL; } #line 4878 "Zend/zend_language_scanner.c" yy318: @@ -4884,17 +4884,17 @@ YYDEBUG(319, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2374 "Zend/zend_language_scanner.l" - { - if (CG(asp_tags)) { - BEGIN(INITIAL); - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - return T_CLOSE_TAG; /* implicit ';' at php-end tag */ - } else { - yyless(1); - return yytext[0]; - } + { + if (CG(asp_tags)) { + BEGIN(INITIAL); + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + return T_CLOSE_TAG; /* implicit ';' at php-end tag */ + } else { + yyless(1); + return yytext[0]; + } } #line 4900 "Zend/zend_language_scanner.c" yy320: @@ -4903,8 +4903,8 @@ YYDEBUG(321, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1801 "Zend/zend_language_scanner.l" - { - return T_MOD_EQUAL; + { + return T_MOD_EQUAL; } #line 4910 "Zend/zend_language_scanner.c" yy322: @@ -4938,8 +4938,8 @@ YYDEBUG(327, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1797 "Zend/zend_language_scanner.l" - { - return T_CONCAT_EQUAL; + { + return T_CONCAT_EQUAL; } #line 4945 "Zend/zend_language_scanner.c" yy328: @@ -4951,9 +4951,9 @@ YYDEBUG(329, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2332 "Zend/zend_language_scanner.l" - { - BEGIN(ST_COMMENT); - yymore(); + { + BEGIN(ST_COMMENT); + yymore(); } #line 4959 "Zend/zend_language_scanner.c" yy330: @@ -4966,8 +4966,8 @@ YYDEBUG(332, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1793 "Zend/zend_language_scanner.l" - { - return T_DIV_EQUAL; + { + return T_DIV_EQUAL; } #line 4973 "Zend/zend_language_scanner.c" yy333: @@ -4989,10 +4989,10 @@ YYDEBUG(336, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2326 "Zend/zend_language_scanner.l" - { - RESET_DOC_COMMENT(); - BEGIN(ST_DOC_COMMENT); - yymore(); + { + RESET_DOC_COMMENT(); + BEGIN(ST_DOC_COMMENT); + yymore(); } #line 4998 "Zend/zend_language_scanner.c" yy337: @@ -5001,8 +5001,8 @@ YYDEBUG(338, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1789 "Zend/zend_language_scanner.l" - { - return T_MUL_EQUAL; + { + return T_MUL_EQUAL; } #line 5008 "Zend/zend_language_scanner.c" yy339: @@ -5012,8 +5012,8 @@ YYDEBUG(340, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1849 "Zend/zend_language_scanner.l" - { - return T_SR; + { + return T_SR; } #line 5019 "Zend/zend_language_scanner.c" yy341: @@ -5022,8 +5022,8 @@ YYDEBUG(342, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1777 "Zend/zend_language_scanner.l" - { - return T_IS_GREATER_OR_EQUAL; + { + return T_IS_GREATER_OR_EQUAL; } #line 5029 "Zend/zend_language_scanner.c" yy343: @@ -5032,8 +5032,8 @@ YYDEBUG(344, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1809 "Zend/zend_language_scanner.l" - { - return T_SR_EQUAL; + { + return T_SR_EQUAL; } #line 5039 "Zend/zend_language_scanner.c" yy345: @@ -5047,8 +5047,8 @@ YYDEBUG(346, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1845 "Zend/zend_language_scanner.l" - { - return T_SL; + { + return T_SL; } #line 5054 "Zend/zend_language_scanner.c" yy347: @@ -5063,8 +5063,8 @@ YYDEBUG(349, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1773 "Zend/zend_language_scanner.l" - { - return T_IS_SMALLER_OR_EQUAL; + { + return T_IS_SMALLER_OR_EQUAL; } #line 5070 "Zend/zend_language_scanner.c" yy350: @@ -5074,8 +5074,8 @@ YYDEBUG(351, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1769 "Zend/zend_language_scanner.l" - { - return T_IS_NOT_EQUAL; + { + return T_IS_NOT_EQUAL; } #line 5081 "Zend/zend_language_scanner.c" yy352: @@ -5129,8 +5129,8 @@ YYDEBUG(360, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1805 "Zend/zend_language_scanner.l" - { - return T_SL_EQUAL; + { + return T_SL_EQUAL; } #line 5136 "Zend/zend_language_scanner.c" yy361: @@ -5238,48 +5238,48 @@ YYDEBUG(371, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2432 "Zend/zend_language_scanner.l" - { - char *s; - int bprefix = (yytext[0] != '<') ? 1 : 0; - - CG(zend_lineno)++; - CG(heredoc_len) = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0); - s = yytext+bprefix+3; - while ((*s == ' ') || (*s == '\t')) { - s++; - CG(heredoc_len)--; - } - - if (*s == '\'') { - s++; - CG(heredoc_len) -= 2; - - BEGIN(ST_NOWDOC); - } else { - if (*s == '"') { - s++; - CG(heredoc_len) -= 2; - } - - BEGIN(ST_HEREDOC); - } - - CG(heredoc) = estrndup(s, CG(heredoc_len)); - - /* Check for ending label on the next line */ - if (CG(heredoc_len) < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, s, CG(heredoc_len))) { - unsigned char *end = YYCURSOR + CG(heredoc_len); - - if (*end == ';') { - end++; - } - - if (*end == '\n' || *end == '\r') { - BEGIN(ST_END_HEREDOC); - } - } - - return bprefix ? T_BINARY_HEREDOC : T_START_HEREDOC; + { + char *s; + int bprefix = (yytext[0] != '<') ? 1 : 0; + + CG(zend_lineno)++; + CG(heredoc_len) = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0); + s = yytext+bprefix+3; + while ((*s == ' ') || (*s == '\t')) { + s++; + CG(heredoc_len)--; + } + + if (*s == '\'') { + s++; + CG(heredoc_len) -= 2; + + BEGIN(ST_NOWDOC); + } else { + if (*s == '"') { + s++; + CG(heredoc_len) -= 2; + } + + BEGIN(ST_HEREDOC); + } + + CG(heredoc) = estrndup(s, CG(heredoc_len)); + + /* Check for ending label on the next line */ + if (CG(heredoc_len) < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, s, CG(heredoc_len))) { + unsigned char *end = YYCURSOR + CG(heredoc_len); + + if (*end == ';') { + end++; + } + + if (*end == '\n' || *end == '\r') { + BEGIN(ST_END_HEREDOC); + } + } + + return bprefix ? T_BINARY_HEREDOC : T_START_HEREDOC; } #line 5285 "Zend/zend_language_scanner.c" yy372: @@ -5322,8 +5322,8 @@ YYDEBUG(377, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1761 "Zend/zend_language_scanner.l" - { - return T_IS_NOT_IDENTICAL; + { + return T_IS_NOT_IDENTICAL; } #line 5329 "Zend/zend_language_scanner.c" yy378: @@ -5332,8 +5332,8 @@ YYDEBUG(379, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1781 "Zend/zend_language_scanner.l" - { - return T_PLUS_EQUAL; + { + return T_PLUS_EQUAL; } #line 5339 "Zend/zend_language_scanner.c" yy380: @@ -5342,8 +5342,8 @@ YYDEBUG(381, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1749 "Zend/zend_language_scanner.l" - { - return T_INC; + { + return T_INC; } #line 5349 "Zend/zend_language_scanner.c" yy382: @@ -5365,8 +5365,8 @@ YYDEBUG(385, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1741 "Zend/zend_language_scanner.l" - { - return T_LIST; + { + return T_LIST; } #line 5372 "Zend/zend_language_scanner.c" yy386: @@ -5376,8 +5376,8 @@ YYDEBUG(387, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1765 "Zend/zend_language_scanner.l" - { - return T_IS_EQUAL; + { + return T_IS_EQUAL; } #line 5383 "Zend/zend_language_scanner.c" yy388: @@ -5386,8 +5386,8 @@ YYDEBUG(389, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1737 "Zend/zend_language_scanner.l" - { - return T_DOUBLE_ARROW; + { + return T_DOUBLE_ARROW; } #line 5393 "Zend/zend_language_scanner.c" yy390: @@ -5396,8 +5396,8 @@ YYDEBUG(391, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1757 "Zend/zend_language_scanner.l" - { - return T_IS_IDENTICAL; + { + return T_IS_IDENTICAL; } #line 5403 "Zend/zend_language_scanner.c" yy392: @@ -5522,14 +5522,14 @@ YYDEBUG(410, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2089 "Zend/zend_language_scanner.l" - { - if (CG(current_namespace)) { - *zendlval = *CG(current_namespace); - zval_copy_ctor(zendlval); - } else { - ZVAL_EMPTY_TEXT(zendlval); - } - return T_NS_C; + { + if (CG(current_namespace)) { + *zendlval = *CG(current_namespace); + zval_copy_ctor(zendlval); + } else { + ZVAL_EMPTY_TEXT(zendlval); + } + return T_NS_C; } #line 5535 "Zend/zend_language_scanner.c" yy411: @@ -5552,31 +5552,31 @@ YYDEBUG(415, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2062 "Zend/zend_language_scanner.l" - { - char *filename = zend_get_compiled_filename(TSRMLS_C); - const size_t filename_len = strlen(filename); - char *dirname; - - if (!filename) { - filename = ""; - } - - dirname = estrndup(filename, filename_len); - zend_dirname(dirname, filename_len); - - if (strcmp(dirname, ".") == 0) { - dirname = erealloc(dirname, MAXPATHLEN); -#if HAVE_GETCWD - VCWD_GETCWD(dirname, MAXPATHLEN); -#elif HAVE_GETWD - VCWD_GETWD(dirname); -#endif - } - - zendlval->value.str.len = strlen(dirname); - zendlval->value.str.val = dirname; - zendlval->type = IS_STRING; - return T_DIR; + { + char *filename = zend_get_compiled_filename(TSRMLS_C); + const size_t filename_len = strlen(filename); + char *dirname; + + if (!filename) { + filename = ""; + } + + dirname = estrndup(filename, filename_len); + zend_dirname(dirname, filename_len); + + if (strcmp(dirname, ".") == 0) { + dirname = erealloc(dirname, MAXPATHLEN); +#if HAVE_GETCWD + VCWD_GETCWD(dirname, MAXPATHLEN); +#elif HAVE_GETWD + VCWD_GETWD(dirname); +#endif + } + + zendlval->value.str.len = strlen(dirname); + zendlval->value.str.val = dirname; + zendlval->type = IS_STRING; + return T_DIR; } #line 5582 "Zend/zend_language_scanner.c" yy416: @@ -5604,10 +5604,10 @@ YYDEBUG(421, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2046 "Zend/zend_language_scanner.l" - { - Z_LVAL_P(zendlval) = CG(zend_lineno); - Z_TYPE_P(zendlval) = IS_LONG; - return T_LINE; + { + Z_LVAL_P(zendlval) = CG(zend_lineno); + Z_TYPE_P(zendlval) = IS_LONG; + return T_LINE; } #line 5613 "Zend/zend_language_scanner.c" yy422: @@ -5645,53 +5645,53 @@ YYDEBUG(429, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1997 "Zend/zend_language_scanner.l" - { - zstr class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL_ZSTR; - zstr func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL_ZSTR; - size_t len = 0; - - if (UG(unicode)) { - size_t len1; - - if (class_name.u) { - len += len1 = u_strlen(class_name.u); - len += 2; - } - if (func_name.u) { - len += u_strlen(func_name.u); - } else { - func_name.u = EMPTY_STR; - } - Z_USTRLEN_P(zendlval) = len; - Z_USTRVAL_P(zendlval) = eumalloc(len+1); - if (class_name.u) { - u_strcpy(Z_USTRVAL_P(zendlval), class_name.u); - Z_USTRVAL_P(zendlval)[len1] = 0x3a; /* ':' */ - Z_USTRVAL_P(zendlval)[len1+1] = 0x3a; /* ':' */ - Z_USTRVAL_P(zendlval)[len1+2] = 0; - } else { - Z_USTRVAL_P(zendlval)[0] = 0; - } - u_strcat(Z_USTRVAL_P(zendlval), func_name.u); - Z_TYPE_P(zendlval) = IS_UNICODE; - } else { - if (class_name.s) { - len += strlen(class_name.s) + 2; - } - if (func_name.s) { - len += strlen(func_name.s); - } - - Z_STRVAL_P(zendlval) = emalloc(len+1); - Z_STRLEN_P(zendlval) = sprintf(Z_STRVAL_P(zendlval), "%s%s%s", - class_name.s ? class_name.s : "", - class_name.s && func_name.s ? "::" : "", - func_name.s ? func_name.s : "" - ); - Z_STRLEN_P(zendlval) = strlen(Z_STRVAL_P(zendlval)); - Z_TYPE_P(zendlval) = IS_STRING; - } - return T_METHOD_C; + { + zstr class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL_ZSTR; + zstr func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL_ZSTR; + size_t len = 0; + + if (UG(unicode)) { + size_t len1; + + if (class_name.u) { + len += len1 = u_strlen(class_name.u); + len += 2; + } + if (func_name.u) { + len += u_strlen(func_name.u); + } else { + func_name.u = EMPTY_STR; + } + Z_USTRLEN_P(zendlval) = len; + Z_USTRVAL_P(zendlval) = eumalloc(len+1); + if (class_name.u) { + u_strcpy(Z_USTRVAL_P(zendlval), class_name.u); + Z_USTRVAL_P(zendlval)[len1] = 0x3a; /* ':' */ + Z_USTRVAL_P(zendlval)[len1+1] = 0x3a; /* ':' */ + Z_USTRVAL_P(zendlval)[len1+2] = 0; + } else { + Z_USTRVAL_P(zendlval)[0] = 0; + } + u_strcat(Z_USTRVAL_P(zendlval), func_name.u); + Z_TYPE_P(zendlval) = IS_UNICODE; + } else { + if (class_name.s) { + len += strlen(class_name.s) + 2; + } + if (func_name.s) { + len += strlen(func_name.s); + } + + Z_STRVAL_P(zendlval) = emalloc(len+1); + Z_STRLEN_P(zendlval) = sprintf(Z_STRVAL_P(zendlval), "%s%s%s", + class_name.s ? class_name.s : "", + class_name.s && func_name.s ? "::" : "", + func_name.s ? func_name.s : "" + ); + Z_STRLEN_P(zendlval) = strlen(Z_STRVAL_P(zendlval)); + Z_TYPE_P(zendlval) = IS_STRING; + } + return T_METHOD_C; } #line 5697 "Zend/zend_language_scanner.c" yy430: @@ -5745,19 +5745,19 @@ YYDEBUG(440, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1982 "Zend/zend_language_scanner.l" - { - zstr func_name = NULL_ZSTR; - - if (CG(active_op_array)) { - func_name = CG(active_op_array)->function_name; - } - - if (!func_name.v) { - ZVAL_EMPTY_TEXT(zendlval); - } else { - ZVAL_TEXT(zendlval, func_name, 1); - } - return T_FUNC_C; + { + zstr func_name = NULL_ZSTR; + + if (CG(active_op_array)) { + func_name = CG(active_op_array)->function_name; + } + + if (!func_name.v) { + ZVAL_EMPTY_TEXT(zendlval); + } else { + ZVAL_TEXT(zendlval, func_name, 1); + } + return T_FUNC_C; } #line 5763 "Zend/zend_language_scanner.c" yy441: @@ -5780,14 +5780,14 @@ YYDEBUG(445, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2052 "Zend/zend_language_scanner.l" - { - char *filename = zend_get_compiled_filename(TSRMLS_C); - - if (!filename) { - filename = ""; - } - ZVAL_RT_STRING(zendlval, filename, 1); - return T_FILE; + { + char *filename = zend_get_compiled_filename(TSRMLS_C); + + if (!filename) { + filename = ""; + } + ZVAL_RT_STRING(zendlval, filename, 1); + return T_FILE; } #line 5793 "Zend/zend_language_scanner.c" yy446: @@ -5820,19 +5820,19 @@ YYDEBUG(452, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1967 "Zend/zend_language_scanner.l" - { - zstr class_name = NULL_ZSTR; - - if (CG(active_class_entry)) { - class_name = CG(active_class_entry)->name; - } - - if (!class_name.v) { - ZVAL_EMPTY_TEXT(zendlval); - } else { - ZVAL_TEXT(zendlval, class_name, 1); - } - return T_CLASS_C; + { + zstr class_name = NULL_ZSTR; + + if (CG(active_class_entry)) { + class_name = CG(active_class_entry)->name; + } + + if (!class_name.v) { + ZVAL_EMPTY_TEXT(zendlval); + } else { + ZVAL_TEXT(zendlval, class_name, 1); + } + return T_CLASS_C; } #line 5838 "Zend/zend_language_scanner.c" yy453: @@ -5897,8 +5897,8 @@ YYDEBUG(465, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1705 "Zend/zend_language_scanner.l" - { - return T_HALT_COMPILER; + { + return T_HALT_COMPILER; } #line 5904 "Zend/zend_language_scanner.c" yy466: @@ -5921,8 +5921,8 @@ YYDEBUG(469, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1689 "Zend/zend_language_scanner.l" - { - return T_USE; + { + return T_USE; } #line 5928 "Zend/zend_language_scanner.c" yy470: @@ -5944,8 +5944,8 @@ YYDEBUG(473, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1733 "Zend/zend_language_scanner.l" - { - return T_UNSET; + { + return T_UNSET; } #line 5951 "Zend/zend_language_scanner.c" yy474: @@ -6120,8 +6120,8 @@ YYDEBUG(491, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1629 "Zend/zend_language_scanner.l" - { - return T_INT_CAST; + { + return T_INT_CAST; } #line 6127 "Zend/zend_language_scanner.c" yy492: @@ -6168,8 +6168,8 @@ YYDEBUG(500, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1633 "Zend/zend_language_scanner.l" - { - return T_DOUBLE_CAST; + { + return T_DOUBLE_CAST; } #line 6175 "Zend/zend_language_scanner.c" yy501: @@ -6242,8 +6242,8 @@ YYDEBUG(514, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1637 "Zend/zend_language_scanner.l" - { - return T_STRING_CAST; + { + return T_STRING_CAST; } #line 6249 "Zend/zend_language_scanner.c" yy515: @@ -6279,8 +6279,8 @@ YYDEBUG(521, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1649 "Zend/zend_language_scanner.l" - { - return T_ARRAY_CAST; + { + return T_ARRAY_CAST; } #line 6286 "Zend/zend_language_scanner.c" yy522: @@ -6321,8 +6321,8 @@ YYDEBUG(529, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1653 "Zend/zend_language_scanner.l" - { - return T_OBJECT_CAST; + { + return T_OBJECT_CAST; } #line 6328 "Zend/zend_language_scanner.c" yy530: @@ -6366,8 +6366,8 @@ YYDEBUG(537, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1657 "Zend/zend_language_scanner.l" - { - return T_BOOL_CAST; + { + return T_BOOL_CAST; } #line 6373 "Zend/zend_language_scanner.c" yy538: @@ -6414,8 +6414,8 @@ YYDEBUG(546, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1645 "Zend/zend_language_scanner.l" - { - return T_BINARY_CAST; + { + return T_BINARY_CAST; } #line 6421 "Zend/zend_language_scanner.c" yy547: @@ -6475,8 +6475,8 @@ YYDEBUG(556, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1641 "Zend/zend_language_scanner.l" - { - return T_UNICODE_CAST; + { + return T_UNICODE_CAST; } #line 6482 "Zend/zend_language_scanner.c" yy557: @@ -6502,8 +6502,8 @@ YYDEBUG(561, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1661 "Zend/zend_language_scanner.l" - { - return T_UNSET_CAST; + { + return T_UNSET_CAST; } #line 6509 "Zend/zend_language_scanner.c" yy562: @@ -6520,8 +6520,8 @@ YYDEBUG(564, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1625 "Zend/zend_language_scanner.l" - { - return T_VAR; + { + return T_VAR; } #line 6527 "Zend/zend_language_scanner.c" yy565: @@ -6544,8 +6544,8 @@ YYDEBUG(568, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1617 "Zend/zend_language_scanner.l" - { - return T_NEW; + { + return T_NEW; } #line 6551 "Zend/zend_language_scanner.c" yy569: @@ -6587,8 +6587,8 @@ YYDEBUG(576, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1685 "Zend/zend_language_scanner.l" - { - return T_NAMESPACE; + { + return T_NAMESPACE; } #line 6594 "Zend/zend_language_scanner.c" yy577: @@ -6597,8 +6597,8 @@ YYDEBUG(578, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1609 "Zend/zend_language_scanner.l" - { - return T_PAAMAYIM_NEKUDOTAYIM; + { + return T_PAAMAYIM_NEKUDOTAYIM; } #line 6604 "Zend/zend_language_scanner.c" yy579: @@ -6623,8 +6623,8 @@ YYDEBUG(582, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1785 "Zend/zend_language_scanner.l" - { - return T_MINUS_EQUAL; + { + return T_MINUS_EQUAL; } #line 6630 "Zend/zend_language_scanner.c" yy583: @@ -6633,8 +6633,8 @@ YYDEBUG(584, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1753 "Zend/zend_language_scanner.l" - { - return T_DEC; + { + return T_DEC; } #line 6640 "Zend/zend_language_scanner.c" yy585: @@ -6643,9 +6643,9 @@ YYDEBUG(586, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1575 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); - return T_OBJECT_OPERATOR; + { + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); + return T_OBJECT_OPERATOR; } #line 6651 "Zend/zend_language_scanner.c" yy587: @@ -6693,8 +6693,8 @@ YYDEBUG(593, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1729 "Zend/zend_language_scanner.l" - { - return T_PUBLIC; + { + return T_PUBLIC; } #line 6700 "Zend/zend_language_scanner.c" yy594: @@ -6752,8 +6752,8 @@ YYDEBUG(602, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1725 "Zend/zend_language_scanner.l" - { - return T_PROTECTED; + { + return T_PROTECTED; } #line 6759 "Zend/zend_language_scanner.c" yy603: @@ -6786,8 +6786,8 @@ YYDEBUG(608, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1721 "Zend/zend_language_scanner.l" - { - return T_PRIVATE; + { + return T_PRIVATE; } #line 6793 "Zend/zend_language_scanner.c" yy609: @@ -6799,8 +6799,8 @@ YYDEBUG(610, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1555 "Zend/zend_language_scanner.l" - { - return T_PRINT; + { + return T_PRINT; } #line 6806 "Zend/zend_language_scanner.c" yy611: @@ -6828,8 +6828,8 @@ YYDEBUG(615, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1547 "Zend/zend_language_scanner.l" - { - return T_GOTO; + { + return T_GOTO; } #line 6835 "Zend/zend_language_scanner.c" yy616: @@ -6856,8 +6856,8 @@ YYDEBUG(620, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1693 "Zend/zend_language_scanner.l" - { - return T_GLOBAL; + { + return T_GLOBAL; } #line 6863 "Zend/zend_language_scanner.c" yy621: @@ -6874,9 +6874,9 @@ YYDEBUG(623, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2427 "Zend/zend_language_scanner.l" - { - BEGIN(ST_DOUBLE_QUOTES); - return T_BINARY_DOUBLE; + { + BEGIN(ST_DOUBLE_QUOTES); + return T_BINARY_DOUBLE; } #line 6882 "Zend/zend_language_scanner.c" yy624: @@ -6912,8 +6912,8 @@ YYDEBUG(630, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1539 "Zend/zend_language_scanner.l" - { - return T_BREAK; + { + return T_BREAK; } #line 6919 "Zend/zend_language_scanner.c" yy631: @@ -6928,9 +6928,9 @@ YYDEBUG(633, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2416 "Zend/zend_language_scanner.l" - { - zend_scan_binary_single_string(zendlval, yytext+2, yyleng-3 TSRMLS_CC); - return T_CONSTANT_ENCAPSED_STRING; + { + zend_scan_binary_single_string(zendlval, yytext+2, yyleng-3 TSRMLS_CC); + return T_CONSTANT_ENCAPSED_STRING; } #line 6936 "Zend/zend_language_scanner.c" yy634: @@ -7007,9 +7007,9 @@ YYDEBUG(642, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2400 "Zend/zend_language_scanner.l" - { - zend_scan_binary_escape_string(zendlval, yytext+2, yyleng-3, '"' TSRMLS_CC); - return T_CONSTANT_ENCAPSED_STRING; + { + zend_scan_binary_escape_string(zendlval, yytext+2, yyleng-3, '"' TSRMLS_CC); + return T_CONSTANT_ENCAPSED_STRING; } #line 7015 "Zend/zend_language_scanner.c" yy643: @@ -7058,8 +7058,8 @@ YYDEBUG(651, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1523 "Zend/zend_language_scanner.l" - { - return T_SWITCH; + { + return T_SWITCH; } #line 7065 "Zend/zend_language_scanner.c" yy652: @@ -7086,8 +7086,8 @@ YYDEBUG(656, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1709 "Zend/zend_language_scanner.l" - { - return T_STATIC; + { + return T_STATIC; } #line 7093 "Zend/zend_language_scanner.c" yy657: @@ -7117,8 +7117,8 @@ YYDEBUG(661, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1519 "Zend/zend_language_scanner.l" - { - return T_AS; + { + return T_AS; } #line 7124 "Zend/zend_language_scanner.c" yy662: @@ -7140,8 +7140,8 @@ YYDEBUG(665, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1745 "Zend/zend_language_scanner.l" - { - return T_ARRAY; + { + return T_ARRAY; } #line 7147 "Zend/zend_language_scanner.c" yy666: @@ -7153,8 +7153,8 @@ YYDEBUG(667, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1837 "Zend/zend_language_scanner.l" - { - return T_LOGICAL_AND; + { + return T_LOGICAL_AND; } #line 7160 "Zend/zend_language_scanner.c" yy668: @@ -7191,8 +7191,8 @@ YYDEBUG(674, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1713 "Zend/zend_language_scanner.l" - { - return T_ABSTRACT; + { + return T_ABSTRACT; } #line 7198 "Zend/zend_language_scanner.c" yy675: @@ -7219,8 +7219,8 @@ YYDEBUG(679, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1479 "Zend/zend_language_scanner.l" - { - return T_WHILE; + { + return T_WHILE; } #line 7226 "Zend/zend_language_scanner.c" yy680: @@ -7232,8 +7232,8 @@ YYDEBUG(681, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1463 "Zend/zend_language_scanner.l" - { - return T_IF; + { + return T_IF; } #line 7239 "Zend/zend_language_scanner.c" yy682: @@ -7288,8 +7288,8 @@ YYDEBUG(688, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1697 "Zend/zend_language_scanner.l" - { - return T_ISSET; + { + return T_ISSET; } #line 7295 "Zend/zend_language_scanner.c" yy689: @@ -7346,8 +7346,8 @@ YYDEBUG(696, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1669 "Zend/zend_language_scanner.l" - { - return T_INCLUDE; + { + return T_INCLUDE; } #line 7353 "Zend/zend_language_scanner.c" yy697: @@ -7379,8 +7379,8 @@ YYDEBUG(702, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1673 "Zend/zend_language_scanner.l" - { - return T_INCLUDE_ONCE; + { + return T_INCLUDE_ONCE; } #line 7386 "Zend/zend_language_scanner.c" yy703: @@ -7417,8 +7417,8 @@ YYDEBUG(709, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1563 "Zend/zend_language_scanner.l" - { - return T_INTERFACE; + { + return T_INTERFACE; } #line 7424 "Zend/zend_language_scanner.c" yy710: @@ -7460,8 +7460,8 @@ YYDEBUG(717, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1515 "Zend/zend_language_scanner.l" - { - return T_INSTANCEOF; + { + return T_INSTANCEOF; } #line 7467 "Zend/zend_language_scanner.c" yy718: @@ -7508,8 +7508,8 @@ YYDEBUG(726, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1571 "Zend/zend_language_scanner.l" - { - return T_IMPLEMENTS; + { + return T_IMPLEMENTS; } #line 7515 "Zend/zend_language_scanner.c" yy727: @@ -7532,8 +7532,8 @@ YYDEBUG(730, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1451 "Zend/zend_language_scanner.l" - { - return T_TRY; + { + return T_TRY; } #line 7539 "Zend/zend_language_scanner.c" yy731: @@ -7555,8 +7555,8 @@ YYDEBUG(734, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1459 "Zend/zend_language_scanner.l" - { - return T_THROW; + { + return T_THROW; } #line 7562 "Zend/zend_language_scanner.c" yy735: @@ -7620,8 +7620,8 @@ YYDEBUG(742, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1677 "Zend/zend_language_scanner.l" - { - return T_REQUIRE; + { + return T_REQUIRE; } #line 7627 "Zend/zend_language_scanner.c" yy743: @@ -7653,8 +7653,8 @@ YYDEBUG(748, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1681 "Zend/zend_language_scanner.l" - { - return T_REQUIRE_ONCE; + { + return T_REQUIRE_ONCE; } #line 7660 "Zend/zend_language_scanner.c" yy749: @@ -7676,8 +7676,8 @@ YYDEBUG(752, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1447 "Zend/zend_language_scanner.l" - { - return T_RETURN; + { + return T_RETURN; } #line 7683 "Zend/zend_language_scanner.c" yy753: @@ -7761,8 +7761,8 @@ YYDEBUG(763, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1543 "Zend/zend_language_scanner.l" - { - return T_CONTINUE; + { + return T_CONTINUE; } #line 7768 "Zend/zend_language_scanner.c" yy764: @@ -7774,8 +7774,8 @@ YYDEBUG(765, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1443 "Zend/zend_language_scanner.l" - { - return T_CONST; + { + return T_CONST; } #line 7781 "Zend/zend_language_scanner.c" yy766: @@ -7803,8 +7803,8 @@ YYDEBUG(770, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1621 "Zend/zend_language_scanner.l" - { - return T_CLONE; + { + return T_CLONE; } #line 7810 "Zend/zend_language_scanner.c" yy771: @@ -7821,8 +7821,8 @@ YYDEBUG(773, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1559 "Zend/zend_language_scanner.l" - { - return T_CLASS; + { + return T_CLASS; } #line 7828 "Zend/zend_language_scanner.c" yy774: @@ -7845,8 +7845,8 @@ YYDEBUG(777, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1531 "Zend/zend_language_scanner.l" - { - return T_CASE; + { + return T_CASE; } #line 7852 "Zend/zend_language_scanner.c" yy778: @@ -7863,8 +7863,8 @@ YYDEBUG(780, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1455 "Zend/zend_language_scanner.l" - { - return T_CATCH; + { + return T_CATCH; } #line 7870 "Zend/zend_language_scanner.c" yy781: @@ -7918,8 +7918,8 @@ YYDEBUG(790, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1439 "Zend/zend_language_scanner.l" - { - return T_FUNCTION; + { + return T_FUNCTION; } #line 7925 "Zend/zend_language_scanner.c" yy791: @@ -7946,8 +7946,8 @@ YYDEBUG(792, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1491 "Zend/zend_language_scanner.l" - { - return T_FOR; + { + return T_FOR; } #line 7953 "Zend/zend_language_scanner.c" yy793: @@ -7974,8 +7974,8 @@ YYDEBUG(797, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1499 "Zend/zend_language_scanner.l" - { - return T_FOREACH; + { + return T_FOREACH; } #line 7981 "Zend/zend_language_scanner.c" yy798: @@ -7997,8 +7997,8 @@ YYDEBUG(801, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1717 "Zend/zend_language_scanner.l" - { - return T_FINAL; + { + return T_FINAL; } #line 8004 "Zend/zend_language_scanner.c" yy802: @@ -8032,8 +8032,8 @@ YYDEBUG(805, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1487 "Zend/zend_language_scanner.l" - { - return T_DO; + { + return T_DO; } #line 8039 "Zend/zend_language_scanner.c" yy806: @@ -8045,8 +8045,8 @@ YYDEBUG(807, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1435 "Zend/zend_language_scanner.l" - { - return T_EXIT; + { + return T_EXIT; } #line 8052 "Zend/zend_language_scanner.c" yy808: @@ -8084,8 +8084,8 @@ YYDEBUG(814, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1535 "Zend/zend_language_scanner.l" - { - return T_DEFAULT; + { + return T_DEFAULT; } #line 8091 "Zend/zend_language_scanner.c" yy815: @@ -8112,8 +8112,8 @@ YYDEBUG(819, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1507 "Zend/zend_language_scanner.l" - { - return T_DECLARE; + { + return T_DECLARE; } #line 8119 "Zend/zend_language_scanner.c" yy820: @@ -8196,8 +8196,8 @@ YYDEBUG(832, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1567 "Zend/zend_language_scanner.l" - { - return T_EXTENDS; + { + return T_EXTENDS; } #line 8203 "Zend/zend_language_scanner.c" yy833: @@ -8209,8 +8209,8 @@ YYDEBUG(834, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1431 "Zend/zend_language_scanner.l" - { - return T_EXIT; + { + return T_EXIT; } #line 8216 "Zend/zend_language_scanner.c" yy835: @@ -8227,8 +8227,8 @@ YYDEBUG(837, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1665 "Zend/zend_language_scanner.l" - { - return T_EVAL; + { + return T_EVAL; } #line 8234 "Zend/zend_language_scanner.c" yy838: @@ -8301,8 +8301,8 @@ YYDEBUG(848, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1483 "Zend/zend_language_scanner.l" - { - return T_ENDWHILE; + { + return T_ENDWHILE; } #line 8308 "Zend/zend_language_scanner.c" yy849: @@ -8334,8 +8334,8 @@ YYDEBUG(854, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1527 "Zend/zend_language_scanner.l" - { - return T_ENDSWITCH; + { + return T_ENDSWITCH; } #line 8341 "Zend/zend_language_scanner.c" yy855: @@ -8347,8 +8347,8 @@ YYDEBUG(856, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1471 "Zend/zend_language_scanner.l" - { - return T_ENDIF; + { + return T_ENDIF; } #line 8354 "Zend/zend_language_scanner.c" yy857: @@ -8380,8 +8380,8 @@ YYDEBUG(859, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1495 "Zend/zend_language_scanner.l" - { - return T_ENDFOR; + { + return T_ENDFOR; } #line 8387 "Zend/zend_language_scanner.c" yy860: @@ -8408,8 +8408,8 @@ YYDEBUG(864, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1503 "Zend/zend_language_scanner.l" - { - return T_ENDFOREACH; + { + return T_ENDFOREACH; } #line 8415 "Zend/zend_language_scanner.c" yy865: @@ -8446,8 +8446,8 @@ YYDEBUG(871, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1511 "Zend/zend_language_scanner.l" - { - return T_ENDDECLARE; + { + return T_ENDDECLARE; } #line 8453 "Zend/zend_language_scanner.c" yy872: @@ -8469,8 +8469,8 @@ YYDEBUG(875, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1701 "Zend/zend_language_scanner.l" - { - return T_EMPTY; + { + return T_EMPTY; } #line 8476 "Zend/zend_language_scanner.c" yy876: @@ -8502,8 +8502,8 @@ YYDEBUG(878, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1475 "Zend/zend_language_scanner.l" - { - return T_ELSE; + { + return T_ELSE; } #line 8509 "Zend/zend_language_scanner.c" yy879: @@ -8520,8 +8520,8 @@ YYDEBUG(881, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1467 "Zend/zend_language_scanner.l" - { - return T_ELSEIF; + { + return T_ELSEIF; } #line 8527 "Zend/zend_language_scanner.c" yy882: @@ -8538,8 +8538,8 @@ YYDEBUG(884, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1551 "Zend/zend_language_scanner.l" - { - return T_ECHO; + { + return T_ECHO; } #line 8545 "Zend/zend_language_scanner.c" } @@ -8615,12 +8615,12 @@ YYDEBUG(888, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1580 "Zend/zend_language_scanner.l" - { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - HANDLE_NEWLINES(yytext, yyleng); - return T_WHITESPACE; + { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + HANDLE_NEWLINES(yytext, yyleng); + return T_WHITESPACE; } #line 8626 "Zend/zend_language_scanner.c" yy889: @@ -8631,10 +8631,10 @@ YYDEBUG(890, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1603 "Zend/zend_language_scanner.l" - { - yyless(0); - yy_pop_state(TSRMLS_C); - goto restart; + { + yyless(0); + yy_pop_state(TSRMLS_C); + goto restart; } #line 8640 "Zend/zend_language_scanner.c" yy891: @@ -8646,15 +8646,15 @@ YYDEBUG(892, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1592 "Zend/zend_language_scanner.l" - { - yy_pop_state(TSRMLS_C); - if (!zend_copy_scanner_string(zendlval, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_STRING; + { + yy_pop_state(TSRMLS_C); + if (!zend_copy_scanner_string(zendlval, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_STRING; } #line 8660 "Zend/zend_language_scanner.c" yy893: @@ -8678,8 +8678,8 @@ YYDEBUG(897, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1588 "Zend/zend_language_scanner.l" - { - return T_OBJECT_OPERATOR; + { + return T_OBJECT_OPERATOR; } #line 8685 "Zend/zend_language_scanner.c" yy898: @@ -8752,16 +8752,16 @@ YYDEBUG(903, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1879 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - yy_pop_state(TSRMLS_C); - yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); - return T_STRING_VARNAME; + { + if (!zend_copy_scanner_string(zendlval, yytext, yyleng, UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + yy_pop_state(TSRMLS_C); + yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); + return T_STRING_VARNAME; } #line 8767 "Zend/zend_language_scanner.c" yy904: @@ -8770,11 +8770,11 @@ YYDEBUG(905, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1892 "Zend/zend_language_scanner.l" - { - yyless(0); - yy_pop_state(TSRMLS_C); - yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); - goto restart; + { + yyless(0); + yy_pop_state(TSRMLS_C); + yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); + goto restart; } #line 8780 "Zend/zend_language_scanner.c" yy906: @@ -8926,45 +8926,45 @@ YYDEBUG(920, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2628 "Zend/zend_language_scanner.l" - { - char *end = yytext + yyleng - 1; - - if (end[-1] == ';') { - end--; - yyleng--; - } - - if (yyleng > CG(heredoc_len) && !memcmp(end - CG(heredoc_len), CG(heredoc), CG(heredoc_len))) { - int len = yyleng - CG(heredoc_len) - 2; /* 2 for newline before and after label */ - - /* May have matched fooLABEL; make sure there's a newline before it */ - if (yytext[len] != '\n') { - if (yytext[len] != '\r') { - yyless(yyleng - 1); - yymore(); - } - } else if (len > 0 && yytext[len - 1] == '\r') { - len--; /* Windows newline */ - } - - /* Go back before label, to match in ST_END_HEREDOC state. yytext will include - * newline before label, for zend_highlight/strip, tokenizer, etc. */ - yyless(yyleng - CG(heredoc_len) - 1); /* 1 for newline after label */ - - CG(increment_lineno) = 1; /* For newline before label */ - BEGIN(ST_END_HEREDOC); - - if (!zend_copy_scanner_string(zendlval, yytext, len, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - HANDLE_NEWLINES(yytext, len); - return T_ENCAPSED_AND_WHITESPACE; - } else { - /* Go back to end of label, so the next match works correctly in case of - * another label at the beginning of the next line */ - yyless(yyleng - 1); - yymore(); - } + { + char *end = yytext + yyleng - 1; + + if (end[-1] == ';') { + end--; + yyleng--; + } + + if (yyleng > CG(heredoc_len) && !memcmp(end - CG(heredoc_len), CG(heredoc), CG(heredoc_len))) { + int len = yyleng - CG(heredoc_len) - 2; /* 2 for newline before and after label */ + + /* May have matched fooLABEL; make sure there's a newline before it */ + if (yytext[len] != '\n') { + if (yytext[len] != '\r') { + yyless(yyleng - 1); + yymore(); + } + } else if (len > 0 && yytext[len - 1] == '\r') { + len--; /* Windows newline */ + } + + /* Go back before label, to match in ST_END_HEREDOC state. yytext will include + * newline before label, for zend_highlight/strip, tokenizer, etc. */ + yyless(yyleng - CG(heredoc_len) - 1); /* 1 for newline after label */ + + CG(increment_lineno) = 1; /* For newline before label */ + BEGIN(ST_END_HEREDOC); + + if (!zend_copy_scanner_string(zendlval, yytext, len, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + HANDLE_NEWLINES(yytext, len); + return T_ENCAPSED_AND_WHITESPACE; + } else { + /* Go back to end of label, so the next match works correctly in case of + * another label at the beginning of the next line */ + yyless(yyleng - 1); + yymore(); + } } #line 8970 "Zend/zend_language_scanner.c" yy921: @@ -9074,8 +9074,8 @@ YYDEBUG(928, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2282 "Zend/zend_language_scanner.l" - { - yymore(); + { + yymore(); } #line 9081 "Zend/zend_language_scanner.c" yy929: @@ -9101,22 +9101,22 @@ YYDEBUG(933, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2286 "Zend/zend_language_scanner.l" - { - switch (yytext[yyleng-1]) { - case '?': case '%': case '>': - yyless(yyleng-1); - yymore(); - break; - case '\n': - CG(zend_lineno)++; - /* intentional fall through */ - default: - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_COMMENT; - } + { + switch (yytext[yyleng-1]) { + case '?': case '%': case '>': + yyless(yyleng-1); + yymore(); + break; + case '\n': + CG(zend_lineno)++; + /* intentional fall through */ + default: + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(ST_IN_SCRIPTING); + return T_COMMENT; + } } #line 9122 "Zend/zend_language_scanner.c" yy934: @@ -9132,13 +9132,13 @@ YYDEBUG(937, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2304 "Zend/zend_language_scanner.l" - { - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng; - Z_TYPE_P(zendlval) = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - CG(zend_lineno)++; - return T_COMMENT; + { + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng; + Z_TYPE_P(zendlval) = IS_STRING; + BEGIN(ST_IN_SCRIPTING); + CG(zend_lineno)++; + return T_COMMENT; } #line 9144 "Zend/zend_language_scanner.c" yy938: @@ -9151,17 +9151,17 @@ YYDEBUG(940, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2313 "Zend/zend_language_scanner.l" - { - if (CG(asp_tags) || yytext[yyleng-2] != '%') { /* asp comment? */ - Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ - Z_STRLEN_P(zendlval) = yyleng-2; - Z_TYPE_P(zendlval) = IS_STRING; - yyless(yyleng - 2); - BEGIN(ST_IN_SCRIPTING); - return T_COMMENT; - } else { - yymore(); - } + { + if (CG(asp_tags) || yytext[yyleng-2] != '%') { /* asp comment? */ + Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */ + Z_STRLEN_P(zendlval) = yyleng-2; + Z_TYPE_P(zendlval) = IS_STRING; + yyless(yyleng - 2); + BEGIN(ST_IN_SCRIPTING); + return T_COMMENT; + } else { + yymore(); + } } #line 9167 "Zend/zend_language_scanner.c" } @@ -9265,16 +9265,16 @@ YYDEBUG(944, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1942 "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)) { - Z_LVAL_P(zendlval) = strtol(yytext, NULL, 10); - Z_TYPE_P(zendlval) = IS_LONG; - } else { - if (!zend_copy_scanner_string(zendlval, yytext, yyleng, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - } - return T_NUM_STRING; + { /* 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)) { + Z_LVAL_P(zendlval) = strtol(yytext, NULL, 10); + Z_TYPE_P(zendlval) = IS_LONG; + } else { + if (!zend_copy_scanner_string(zendlval, yytext, yyleng, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + } + return T_NUM_STRING; } #line 9280 "Zend/zend_language_scanner.c" yy945: @@ -9297,9 +9297,9 @@ YYDEBUG(947, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2246 "Zend/zend_language_scanner.l" - { - /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ - return yytext[0]; + { + /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ + return yytext[0]; } #line 9305 "Zend/zend_language_scanner.c" yy948: @@ -9308,9 +9308,9 @@ YYDEBUG(949, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2241 "Zend/zend_language_scanner.l" - { - yy_pop_state(TSRMLS_C); - return ']'; + { + yy_pop_state(TSRMLS_C); + return ']'; } #line 9316 "Zend/zend_language_scanner.c" yy950: @@ -9323,12 +9323,12 @@ YYDEBUG(952, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2251 "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); - ZVAL_EMPTY_TEXT(zendlval); /* Empty since it won't be used */ - return T_ENCAPSED_AND_WHITESPACE; + { + /* Invalid rule to return a more explicit parse error with proper line number */ + yyless(0); + yy_pop_state(TSRMLS_C); + ZVAL_EMPTY_TEXT(zendlval); /* Empty since it won't be used */ + return T_ENCAPSED_AND_WHITESPACE; } #line 9334 "Zend/zend_language_scanner.c" yy953: @@ -9340,11 +9340,11 @@ YYDEBUG(954, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2269 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, yytext, yyleng, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - return T_STRING; + { + if (!zend_copy_scanner_string(zendlval, yytext, yyleng, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + return T_STRING; } #line 9350 "Zend/zend_language_scanner.c" yy955: @@ -9353,9 +9353,9 @@ YYDEBUG(956, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2682 "Zend/zend_language_scanner.l" - { - zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); - goto restart; + { + zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); + goto restart; } #line 9361 "Zend/zend_language_scanner.c" yy957: @@ -9394,14 +9394,14 @@ YYDEBUG(961, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2231 "Zend/zend_language_scanner.l" - { - if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { - return 0; - } - return T_VARIABLE; + { + if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) { + return 0; + } + return T_VARIABLE; } #line 9407 "Zend/zend_language_scanner.c" yy962: @@ -9436,11 +9436,11 @@ YYDEBUG(968, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1954 "Zend/zend_language_scanner.l" - { /* Offset must be treated as a string */ - if (!zend_copy_scanner_string(zendlval, yytext, yyleng, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { - return 0; - } - return T_NUM_STRING; + { /* Offset must be treated as a string */ + if (!zend_copy_scanner_string(zendlval, yytext, yyleng, CG(literal_type), SCNG(output_conv) TSRMLS_CC)) { + return 0; + } + return T_NUM_STRING; } #line 9446 "Zend/zend_language_scanner.c" yy969: @@ -9456,5 +9456,5 @@ } } #line 2687 "Zend/zend_language_scanner.l" - -} + +}
« previous php.zend-engine.cvs (#7282) next »