- 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)
--- /dev/null
+--TEST--
+Bug #35655 (whitespace following end of heredoc is lost)
+--FILE--
+<?php
+$code = '
+<?
+ $x = <<<EOT
+some string
+EOT
+ $y = 2;
+?>';
+highlight_string($code);
+?>
+--EXPECT--
+<code><span style="color: #000000">
+<br /><span style="color: #0000BB"><? <br /> $x </span><span style="color: #007700">= <<<EOT<br /></span><span style="color: #0000BB">some string <br /></span><span style="color: #007700">EOT<br /> </span><span style="color: #0000BB">$y </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
+</span>
+</code>
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("<code>");
zend_printf("<span style=\"color: %s\">\n", last_color);
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;
}
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;
<ST_HEREDOC>^{LABEL}(";")?{NEWLINE} {
int label_len;
- unsigned char unput_semicolon;
CG(zend_lineno)++;
if (yytext[yyleng-2]=='\r') {
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;