break;
}
} else if (token_type == T_END_HEREDOC) {
- zend_bool has_semicolon=(strchr(token.value.str.val, ';')?1:0);
-
efree(token.value.str.val);
- if (has_semicolon) {
- /* the following semicolon was unput(), ignore it */
- lex_scan(&token TSRMLS_CC);
- }
}
token.type = 0;
}
}
if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) {
- zendlval->value.str.val = estrndup(yytext, yyleng); /* unput destroys yytext */
- zendlval->value.str.len = yyleng;
+ zendlval->value.str.val = estrndup(yytext, label_len); /* unput destroys yytext */
+ zendlval->value.str.len = label_len;
if (unput_semicolon) {
unput(';');
}
--- /dev/null
+--TEST--
+highlight_string() handling of heredoc
+--FILE--
+<?php
+$str = '
+$x=<<<DD
+jhdsjkfhjdsh
+DD
+."";
+$a=<<<DDDD
+jhdsjkfhjdsh
+DDDD;
+';
+highlight_string($str);
+?>
+--EXPECT--
+<code><font color="#000000">
+<br />$x=<<<DD<br />jhdsjkfhjdsh<br />DD<br />."";<br />$a=<<<DDDD<br />jhdsjkfhjdsh<br />DDDD;<br /></font>
+</code>
--- /dev/null
+--TEST--
+Bug #26463 (token_get_all() does not correctly handle semicolons after T_END_HEREDOC)
+--FILE--
+<?php
+$str = '<?php
+$x=<<<DD
+jhdsjkfhjdsh
+DD
+."";
+$a=<<<DDDD
+jhdsjkfhjdsh
+DDDD;
+?>';
+var_dump(token_get_all($str));
+?>
+--EXPECT--
+array(17) {
+ [0]=>
+ array(2) {
+ [0]=>
+ int(363)
+ [1]=>
+ string(6) "<?php
+"
+ }
+ [1]=>
+ array(2) {
+ [0]=>
+ int(307)
+ [1]=>
+ string(2) "$x"
+ }
+ [2]=>
+ string(1) "="
+ [3]=>
+ array(2) {
+ [0]=>
+ int(367)
+ [1]=>
+ string(6) "<<<DD
+"
+ }
+ [4]=>
+ array(2) {
+ [0]=>
+ int(305)
+ [1]=>
+ string(13) "jhdsjkfhjdsh
+"
+ }
+ [5]=>
+ array(2) {
+ [0]=>
+ int(368)
+ [1]=>
+ string(2) "DD"
+ }
+ [6]=>
+ string(1) "."
+ [7]=>
+ array(2) {
+ [0]=>
+ int(313)
+ [1]=>
+ string(2) """"
+ }
+ [8]=>
+ string(1) ";"
+ [9]=>
+ array(2) {
+ [0]=>
+ int(366)
+ [1]=>
+ string(1) "
+"
+ }
+ [10]=>
+ array(2) {
+ [0]=>
+ int(307)
+ [1]=>
+ string(2) "$a"
+ }
+ [11]=>
+ string(1) "="
+ [12]=>
+ array(2) {
+ [0]=>
+ int(367)
+ [1]=>
+ string(8) "<<<DDDD
+"
+ }
+ [13]=>
+ array(2) {
+ [0]=>
+ int(305)
+ [1]=>
+ string(13) "jhdsjkfhjdsh
+"
+ }
+ [14]=>
+ array(2) {
+ [0]=>
+ int(368)
+ [1]=>
+ string(4) "DDDD"
+ }
+ [15]=>
+ string(1) ";"
+ [16]=>
+ array(2) {
+ [0]=>
+ int(365)
+ [1]=>
+ string(2) "?>"
+ }
+}
MAKE_STD_ZVAL(keyword);
array_init(keyword);
add_next_index_long(keyword, token_type);
- add_next_index_stringl(keyword, zendtext, zendleng, 1);
+ if (token_type == T_END_HEREDOC) {
+ add_next_index_stringl(keyword, Z_STRVAL(token), Z_STRLEN(token), 1);
+ efree(Z_STRVAL(token));
+ } else {
+ add_next_index_stringl(keyword, zendtext, zendleng, 1);
+ }
add_next_index_zval(return_value, keyword);
} else {
add_next_index_stringl(return_value, zendtext, zendleng, 1);
if (destroy && Z_TYPE(token) != IS_NULL) {
zval_dtor(&token);
}
- if (token_type == T_END_HEREDOC) {
- efree(Z_STRVAL(token));
- }
ZVAL_NULL(&token);
}
}