cvs: ZendEngine2(PHP_5_3) / zend_compile.c zend_highlight.c zend_language_parser.y zend_language_scanner.l /tests heredoc_001.phpt heredoc_002.phpt heredoc_003.phpt heredoc_004.phpt heredoc_005.phpt heredoc_006.phpt heredoc_007.phpt heredoc_008.phpt heredoc_009.phpt heredoc_010.phpt heredoc_011.phpt nowdoc.inc nowdoc_001.phpt nowdoc_002.phpt nowdoc_003.phpt nowdoc_004.phpt nowdoc_005.phpt nowdoc_006.phpt nowdoc_007.phpt nowdoc_008.phpt nowdoc_009.phpt nowdoc_010.phpt nowdoc_011.phpt nowdoc_012.phpt nowdoc_013.phpt nowdoc_014.phpt nowdoc_015.phpt php-src NEWS

[email protected] ("Dmitry Stogov")
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1202808466@cvsserver>
dmitry		Tue Feb 12 09:27:46 2008 UTC

  Added files:                 (Branch: PHP_5_3)
    /ZendEngine2/tests	heredoc_001.phpt heredoc_002.phpt 
                      	heredoc_003.phpt heredoc_004.phpt 
                      	heredoc_005.phpt heredoc_006.phpt 
                      	heredoc_007.phpt heredoc_008.phpt 
                      	heredoc_009.phpt heredoc_010.phpt 
                      	heredoc_011.phpt nowdoc.inc nowdoc_001.phpt 
                      	nowdoc_002.phpt nowdoc_003.phpt nowdoc_004.phpt 
                      	nowdoc_005.phpt nowdoc_006.phpt nowdoc_007.phpt 
                      	nowdoc_008.phpt nowdoc_009.phpt nowdoc_010.phpt 
                      	nowdoc_011.phpt nowdoc_012.phpt nowdoc_013.phpt 
                      	nowdoc_014.phpt nowdoc_015.phpt 

  Modified files:              
    /php-src	NEWS 
    /ZendEngine2	zend_compile.c zend_highlight.c zend_language_parser.y 
                	zend_language_scanner.l 
  Log:
  Added NEWDOC
dmitry-20080212092746.txt (text/plain, 12.1 KB)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.110&r2=1.2027.2.547.2.965.2.111&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.110 php-src/NEWS:1.2027.2.547.2.965.2.111
--- php-src/NEWS:1.2027.2.547.2.965.2.110	Tue Feb 12 00:24:12 2008
+++ php-src/NEWS	Tue Feb 12 09:27:45 2008
@@ -2,6 +2,7 @@
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 20??, PHP 5.3.0
 - Added and improved PHP syntax and semantics:
+  . Added NOWDOC. (Gwynne Raskind, Stas, Dmitry)
   . Added "?:" operator. (Marcus)
   . Added support for namespaces. (Dmitry, Stas, Gregory)
   . Added support for Late Static Binding. (Dmitry, Etienne Kneuss)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.41&r2=1.647.2.27.2.41.2.42&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.41 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.42
--- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.41	Tue Feb 12 01:17:48 2008
+++ ZendEngine2/zend_compile.c	Tue Feb 12 09:27:45 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.41 2008/02/12 01:17:48 stas Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.42 2008/02/12 09:27:45 dmitry Exp $ */
 
 #include <zend_language_parser.h>
 #include "zend.h"
@@ -4642,6 +4642,7 @@
 			retval = T_ECHO;
 			break;
 		case T_END_HEREDOC:
+		case T_END_NOWDOC:
 			efree(Z_STRVAL(zendlval->u.constant));
 			break;
 		case EOF:
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_highlight.c?r1=1.49.2.3.2.2.2.1&r2=1.49.2.3.2.2.2.2&diff_format=u
Index: ZendEngine2/zend_highlight.c
diff -u ZendEngine2/zend_highlight.c:1.49.2.3.2.2.2.1 ZendEngine2/zend_highlight.c:1.49.2.3.2.2.2.2
--- ZendEngine2/zend_highlight.c:1.49.2.3.2.2.2.1	Mon Dec 31 07:17:04 2007
+++ ZendEngine2/zend_highlight.c	Tue Feb 12 09:27:45 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_highlight.c,v 1.49.2.3.2.2.2.1 2007/12/31 07:17:04 sebastian Exp $ */
+/* $Id: zend_highlight.c,v 1.49.2.3.2.2.2.2 2008/02/12 09:27:45 dmitry Exp $ */
 
 #include "zend.h"
 #include <zend_language_parser.h>
@@ -150,6 +150,7 @@
 		}
 		switch (token_type) {
 			case T_END_HEREDOC:
+			case T_END_NOWDOC:
 				zend_html_puts(token.value.str.val, token.value.str.len TSRMLS_CC);
 				break;
 			default:
@@ -172,7 +173,7 @@
 					efree(token.value.str.val);
 					break;
 			}
-		} else if (token_type == T_END_HEREDOC) {
+		} else if (token_type == T_END_HEREDOC || token_type == T_END_NOWDOC) {
 			efree(token.value.str.val);
 		}
 		token.type = 0;
@@ -222,6 +223,7 @@
 				return;
 			
 			case T_END_HEREDOC:
+			case T_END_NOWDOC:
 				zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
 				efree(token.value.str.val);
 				/* read the following character, either newline or ; */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.160.2.4.2.8.2.16&r2=1.160.2.4.2.8.2.17&diff_format=u
Index: ZendEngine2/zend_language_parser.y
diff -u ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.16 ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.17
--- ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.16	Tue Feb 12 08:49:08 2008
+++ ZendEngine2/zend_language_parser.y	Tue Feb 12 09:27:45 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.16 2008/02/12 08:49:08 dmitry Exp $ */
+/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.17 2008/02/12 09:27:45 dmitry Exp $ */
 
 /*
  * LALR shift/reduce conflicts and how they are resolved:
@@ -146,6 +146,8 @@
 %token T_NAMESPACE
 %token T_NS_C
 %token T_DIR
+%token T_START_NOWDOC
+%token T_END_NOWDOC
 
 %% /* Rules */
 
@@ -721,6 +723,7 @@
 	|	T_METHOD_C					{ $$ = $1; }
 	|	T_FUNC_C					{ $$ = $1; }
 	|	T_NS_C						{ $$ = $1; }
+	|	T_START_NOWDOC T_ENCAPSED_AND_WHITESPACE T_END_NOWDOC	{ $$ = $2; }
 ;
 
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.l?r1=1.131.2.11.2.13.2.5&r2=1.131.2.11.2.13.2.6&diff_format=u
Index: ZendEngine2/zend_language_scanner.l
diff -u ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.5 ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.6
--- ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.5	Tue Feb 12 00:20:33 2008
+++ ZendEngine2/zend_language_scanner.l	Tue Feb 12 09:27:45 2008
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_language_scanner.l,v 1.131.2.11.2.13.2.5 2008/02/12 00:20:33 stas Exp $ */
+/* $Id: zend_language_scanner.l,v 1.131.2.11.2.13.2.6 2008/02/12 09:27:45 dmitry Exp $ */
 
 #define yyleng SCNG(yy_leng)
 #define yytext SCNG(yy_text)
@@ -39,6 +39,9 @@
 %x ST_HEREDOC
 %x ST_START_HEREDOC
 %x ST_END_HEREDOC
+%x ST_NOWDOC
+%x ST_START_NOWDOC
+%x ST_END_NOWDOC
 %x ST_LOOKING_FOR_PROPERTY
 %x ST_LOOKING_FOR_VARNAME
 %x ST_VAR_OFFSET
@@ -965,6 +968,8 @@
 BACKQUOTE_CHARS     ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
 HEREDOC_CHARS       ("{"*([^$\n\r\\{]|("\\"[^\n\r]))|{HEREDOC_LITERAL_DOLLAR}|({HEREDOC_NEWLINE}+({HEREDOC_NON_LABEL}|{HEREDOC_LABEL_NO_NEWLINE})))
 
+NOWDOC_CHARS		({NEWLINE}*(([^a-zA-Z_\x7f-\xff\n\r][^\n\r]*)|({LABEL}[^a-zA-Z0-9_\x7f-\xff;\n\r][^\n\r]*)|({LABEL}[;][^\n\r]+)))
+
 %option noyylineno
 %option noyywrap
 %%
@@ -2065,6 +2070,102 @@
 }
 
 
+%{
+/* BEGIN nowdoc */
+%}
+<ST_IN_SCRIPTING>b?"<<<"{TABS_AND_SPACES}[']{LABEL}[']{NEWLINE} {
+	int bprefix = (yytext[0] != '<') ? 1 : 0;
+	char *s;
+	CG(zend_lineno)++;
+	/* 3 is <<<, 2 is quotes, 1 is newline */
+	CG(heredoc_len) = yyleng-bprefix-3-2-1-(yytext[yyleng-2]=='\r'?1:0);
+	s = yytext+bprefix+3;
+	while ((*s == ' ') || (*s == '\t')) {
+		s++;
+		CG(heredoc_len)--;
+	}
+	s++; /* first quote */
+	CG(heredoc) = estrndup(s, CG(heredoc_len));
+	BEGIN(ST_START_NOWDOC);
+	return T_START_NOWDOC;
+}
+
+<ST_START_NOWDOC>{ANY_CHAR} {
+	yyless(0);
+	BEGIN(ST_NOWDOC);
+}
+
+<ST_START_NOWDOC>{LABEL}";"?[\r\n] {
+	int label_len = yyleng - 1;
+
+	if (yytext[label_len-1]==';') {
+		label_len--;
+	}
+
+	if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) {
+		yyless(label_len-1);
+		yyleng = 0;
+		BEGIN(ST_END_NOWDOC);
+		ZVAL_EMPTY_STRING(zendlval);
+		return T_ENCAPSED_AND_WHITESPACE;
+	} else {
+		yyless(label_len);
+		yymore();
+		BEGIN(ST_NOWDOC);
+	}
+}
+
+<ST_NOWDOC>{NOWDOC_CHARS}*{NEWLINE}+{LABEL}";"?[\n\r] {
+	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 */
+
+		if (len > 0 && yytext[len - 1] == '\r' && yytext[len] == '\n') {
+			len--;
+		}
+
+		/* Go back before last label char, to match in ST_END_HEREDOC state */
+		yyless(yyleng - 2);
+
+		/* Subtract the remaining label length. yyleng must include newline
+		 * before label, for zend_highlight/strip, tokenizer, etc. */
+		yyleng -= CG(heredoc_len) - 1;
+
+		CG(increment_lineno) = 1; /* For newline before label */
+		BEGIN(ST_END_NOWDOC);
+
+		HANDLE_NEWLINES(yytext, len);
+		zend_copy_value(zendlval, yytext, len);
+		zendlval->type = IS_STRING;
+		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();
+	}
+}
+
+<ST_END_NOWDOC>{ANY_CHAR} {
+	Z_STRVAL_P(zendlval) = CG(heredoc);
+	Z_STRLEN_P(zendlval) = CG(heredoc_len);
+	yytext = CG(heredoc);
+	yyleng = CG(heredoc_len);
+	CG(heredoc) = NULL;
+	CG(heredoc_len) = 0;
+	BEGIN(ST_IN_SCRIPTING);
+	return T_END_NOWDOC;
+}
+%{
+/* END nowdoc */
+%}
+
 <ST_DOUBLE_QUOTES>["] {
 	BEGIN(ST_IN_SCRIPTING);
 	return '"';

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_001.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_001.phpt
+++ ZendEngine2/tests/heredoc_001.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_002.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_002.phpt
+++ ZendEngine2/tests/heredoc_002.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_003.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_003.phpt
+++ ZendEngine2/tests/heredoc_003.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_004.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_004.phpt
+++ ZendEngine2/tests/heredoc_004.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_005.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_005.phpt
+++ ZendEngine2/tests/heredoc_005.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_006.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_006.phpt
+++ ZendEngine2/tests/heredoc_006.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_007.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_007.phpt
+++ ZendEngine2/tests/heredoc_007.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_008.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_008.phpt
+++ ZendEngine2/tests/heredoc_008.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_009.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_009.phpt
+++ ZendEngine2/tests/heredoc_009.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_010.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_010.phpt
+++ ZendEngine2/tests/heredoc_010.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_011.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_011.phpt
+++ ZendEngine2/tests/heredoc_011.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc.inc?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc.inc
+++ ZendEngine2/tests/nowdoc.inc

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_001.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_001.phpt
+++ ZendEngine2/tests/nowdoc_001.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_002.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_002.phpt
+++ ZendEngine2/tests/nowdoc_002.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_003.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_003.phpt
+++ ZendEngine2/tests/nowdoc_003.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_004.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_004.phpt
+++ ZendEngine2/tests/nowdoc_004.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_005.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_005.phpt
+++ ZendEngine2/tests/nowdoc_005.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_006.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_006.phpt
+++ ZendEngine2/tests/nowdoc_006.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_007.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_007.phpt
+++ ZendEngine2/tests/nowdoc_007.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_008.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_008.phpt
+++ ZendEngine2/tests/nowdoc_008.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_009.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_009.phpt
+++ ZendEngine2/tests/nowdoc_009.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_010.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_010.phpt
+++ ZendEngine2/tests/nowdoc_010.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_011.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_011.phpt
+++ ZendEngine2/tests/nowdoc_011.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_012.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_012.phpt
+++ ZendEngine2/tests/nowdoc_012.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_013.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_013.phpt
+++ ZendEngine2/tests/nowdoc_013.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_014.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_014.phpt
+++ ZendEngine2/tests/nowdoc_014.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_015.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_015.phpt
+++ ZendEngine2/tests/nowdoc_015.phpt
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.