From: Ilia Alshanetsky Date: Tue, 13 Dec 2005 20:55:42 +0000 (+0000) Subject: Fixed bug #35655 (whitespace following end of heredoc is lost). X-Git-Tag: php-5.1.2RC1~118 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ce27140dc2a038795dab4e45cd9ea7b77582714;p=php Fixed bug #35655 (whitespace following end of heredoc is lost). --- diff --git a/NEWS b/NEWS index 61745e176e..8e5f792988 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,7 @@ PHP NEWS - Fixed many bugs in OCI8. (Tony) - Fixed crash and leak in mysqli when using 4.1.x client libraries and connecting to 5.x server. (Andrey) +- Fixed bug #35655 (whitespace following end of heredoc is lost). (Ilia) - Fixed bug #35630 (strtotime() crashes on certain relative identifiers). (Ilia) - Fixed bug #35629 (crash in http:// wrapper on multiple redirects). (Ilia) diff --git a/Zend/tests/bug35655.phpt b/Zend/tests/bug35655.phpt new file mode 100755 index 0000000000..30f00cb32e --- /dev/null +++ b/Zend/tests/bug35655.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug #35655 (whitespace following end of heredoc is lost) +--FILE-- +'; +highlight_string($code); +?> +--EXPECT-- + +
<? 
  $x 
= <<<EOT
some string    
EOT
  
$y 2;
?> +
+
diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index d32b79c7b5..a6151717d0 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -94,7 +94,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini int token_type; char *last_color = syntax_highlighter_ini->highlight_html; char *next_color; - int in_string=0, post_heredoc = 0; + int in_string=0; zend_printf(""); zend_printf("\n", last_color); @@ -151,14 +151,9 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini switch (token_type) { case T_END_HEREDOC: zend_html_puts(token.value.str.val, token.value.str.len TSRMLS_CC); - post_heredoc = 1; break; default: zend_html_puts(LANG_SCNG(yy_text), LANG_SCNG(yy_leng) TSRMLS_CC); - if (post_heredoc) { - zend_html_putc('\n'); - post_heredoc = 0; - } break; } @@ -215,19 +210,18 @@ ZEND_API void zend_strip(TSRMLS_D) case EOF: return; - case T_END_HEREDOC: { - char *ptr = LANG_SCNG(yy_text); - - zend_write(ptr, LANG_SCNG(yy_leng) - 1); - /* The ensure that we only write one ; and that it followed by the required newline */ - zend_write("\n", sizeof("\n") - 1); - if (ptr[LANG_SCNG(yy_leng) - 1] == ';') { - lex_scan(&token TSRMLS_CC); - } - efree(token.value.str.val); + case T_END_HEREDOC: + zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng)); + efree(token.value.str.val); + /* read the following character, either newline or ; */ + if (lex_scan(&token TSRMLS_CC) != T_WHITESPACE) { + zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng)); } - break; - + zend_write("\n", sizeof("\n") - 1); + prev_space = 1; + token.type = 0; + continue; + default: zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng)); break; diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index af4059fef7..830fae6c7f 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1733,7 +1733,6 @@ NEWLINE ("\r"|"\n"|"\r\n") ^{LABEL}(";")?{NEWLINE} { int label_len; - unsigned char unput_semicolon; CG(zend_lineno)++; if (yytext[yyleng-2]=='\r') { @@ -1744,17 +1743,12 @@ NEWLINE ("\r"|"\n"|"\r\n") if (yytext[label_len-1]==';') { label_len--; - unput_semicolon=1; - } else{ - unput_semicolon=0; } if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) { zendlval->value.str.val = estrndup(yytext, label_len); /* unput destroys yytext */ zendlval->value.str.len = label_len; - if (unput_semicolon) { - unput(';'); - } + yyless(yyleng - (yyleng - label_len)); efree(CG(heredoc)); CG(heredoc)=NULL; CG(heredoc_len)=0; diff --git a/ext/tokenizer/tests/bug26463.phpt b/ext/tokenizer/tests/bug26463.phpt index 7480aa2f59..679ffe3c37 100644 --- a/ext/tokenizer/tests/bug26463.phpt +++ b/ext/tokenizer/tests/bug26463.phpt @@ -14,11 +14,11 @@ DDDD; var_dump(token_get_all($str)); ?> --EXPECTF-- -array(17) { +array(19) { [0]=> array(2) { [0]=> - int(%d) + int(367) [1]=> string(6) " array(2) { [0]=> - int(%d) + int(309) [1]=> string(2) "$x" } @@ -35,7 +35,7 @@ array(17) { [3]=> array(2) { [0]=> - int(%d) + int(371) [1]=> string(6) "<<
array(2) { [0]=> - int(%d) + int(307) [1]=> string(13) "jhdsjkfhjdsh " @@ -51,67 +51,83 @@ array(17) { [5]=> array(2) { [0]=> - int(%d) + int(372) [1]=> string(2) "DD" } [6]=> - string(1) "." + array(2) { + [0]=> + int(370) + [1]=> + string(1) " +" + } [7]=> + string(1) "." + [8]=> array(2) { [0]=> - int(%d) + int(315) [1]=> string(2) """" } - [8]=> - string(1) ";" [9]=> + string(1) ";" + [10]=> array(2) { [0]=> - int(%d) + int(370) [1]=> string(1) " " } - [10]=> + [11]=> array(2) { [0]=> - int(%d) + int(309) [1]=> string(2) "$a" } - [11]=> - string(1) "=" [12]=> + string(1) "=" + [13]=> array(2) { [0]=> - int(%d) + int(371) [1]=> string(8) "<< + [14]=> array(2) { [0]=> - int(%d) + int(307) [1]=> string(13) "jhdsjkfhjdsh " } - [14]=> + [15]=> array(2) { [0]=> - int(%d) + int(372) [1]=> string(4) "DDDD" } - [15]=> - string(1) ";" [16]=> + string(1) ";" + [17]=> + array(2) { + [0]=> + int(370) + [1]=> + string(1) " +" + } + [18]=> array(2) { [0]=> - int(%d) + int(369) [1]=> string(2) "?>" }