Hi all,
Just noticed that the 'b' prefix doesn't appear in syntax highlighting, nor
Tokenizer extension, with T_CONSTANT_ENCAPSED_STRING (and with heredocs in
5.2). That's because yytext is incremented. I've attached patches (didn't
test HEAD's) with a quick fix if it's acceptable. :-)
Matt
Index: zend_language_scanner.l
===================================================================
RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
retrieving revision 1.160
diff -u -r1.160 zend_language_scanner.l
--- zend_language_scanner.l 23 Nov 2006 22:04:32 -0000 1.160
+++ zend_language_scanner.l 9 Jan 2007 02:32:29 -0000
@@ -1271,13 +1271,13 @@
return T_CONSTANT_ENCAPSED_STRING;
}
-int zend_scan_binary_double_string(zval *zendlval TSRMLS_DC)
+int zend_scan_binary_double_string(zval *zendlval, int bprefix TSRMLS_DC)
{
register char *s, *t;
char *end;
- Z_STRVAL_P(zendlval) = estrndup(yytext+1, yyleng-2);
- Z_STRLEN_P(zendlval) = yyleng-2;
+ Z_STRVAL_P(zendlval) = estrndup(yytext+bprefix+1, yyleng-bprefix-2);
+ Z_STRLEN_P(zendlval) = yyleng-bprefix-2;
Z_TYPE_P(zendlval) = IS_STRING;
HANDLE_NEWLINES(yytext, yyleng);
@@ -1353,13 +1353,13 @@
return T_CONSTANT_ENCAPSED_STRING;
}
-int zend_scan_binary_single_string(zval *zendlval TSRMLS_DC)
+int zend_scan_binary_single_string(zval *zendlval, int bprefix TSRMLS_DC)
{
register char *s, *t;
char *end;
- Z_STRVAL_P(zendlval) = estrndup(yytext+1, yyleng-2);
- Z_STRLEN_P(zendlval) = yyleng-2;
+ Z_STRVAL_P(zendlval) = estrndup(yytext+bprefix+1, yyleng-bprefix-2);
+ Z_STRLEN_P(zendlval) = yyleng-bprefix-2;
Z_TYPE_P(zendlval) = IS_STRING;
HANDLE_NEWLINES(yytext, yyleng);
@@ -2221,15 +2221,13 @@
if (UG(unicode)) {
return zend_scan_unicode_double_string(zendlval TSRMLS_CC);
} else {
- return zend_scan_binary_double_string(zendlval TSRMLS_CC);
+ return zend_scan_binary_double_string(zendlval, 0 TSRMLS_CC);
}
}
<ST_IN_SCRIPTING>(b["]([^$"\\]|("\\".))*["]) {
- yytext++; /* adjust for 'b' */
- yyleng--;
- return zend_scan_binary_double_string(zendlval TSRMLS_CC);
+ return zend_scan_binary_double_string(zendlval, 1 TSRMLS_CC);
}
@@ -2237,15 +2235,13 @@
if (UG(unicode)) {
return zend_scan_unicode_single_string(zendlval TSRMLS_CC);
} else {
- return zend_scan_binary_single_string(zendlval TSRMLS_CC);
+ return zend_scan_binary_single_string(zendlval, 0 TSRMLS_CC);
}
}
<ST_IN_SCRIPTING>("b'"([^'\\]|("\\".))*[']) {
- yytext++; /* adjust for 'b' */
- yyleng--;
- return zend_scan_binary_single_string(zendlval TSRMLS_CC);
+ return zend_scan_binary_single_string(zendlval, 1 TSRMLS_CC);
}
Index: zend_language_scanner.l
===================================================================
RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
retrieving revision 1.131.2.11.2.5
diff -u -r1.131.2.11.2.5 zend_language_scanner.l
--- zend_language_scanner.l 26 Dec 2006 16:44:20 -0000 1.131.2.11.2.5
+++ zend_language_scanner.l 9 Jan 2007 02:06:13 -0000
@@ -1578,14 +1578,10 @@
<ST_IN_SCRIPTING>("b"?["]([^$"\\]|("\\".))*["]) {
register char *s, *t;
char *end;
+ int bprefix = (*yytext == 'b') ? 1 : 0;
- if (*yytext == 'b') {
- yytext++;
- yyleng--;
- }
-
- zendlval->value.str.val = estrndup(yytext+1, yyleng-2);
- zendlval->value.str.len = yyleng-2;
+ zendlval->value.str.val = estrndup(yytext+bprefix+1, yyleng-bprefix-2);
+ zendlval->value.str.len = yyleng-bprefix-2;
zendlval->type = IS_STRING;
HANDLE_NEWLINES(yytext, yyleng);
@@ -1673,14 +1669,10 @@
<ST_IN_SCRIPTING>("b"?[']([^'\\]|("\\".))*[']) {
register char *s, *t;
char *end;
+ int bprefix = (*yytext == 'b') ? 1 : 0;
- if (*yytext == 'b') {
- yytext++;
- yyleng--;
- }
-
- zendlval->value.str.val = estrndup(yytext+1, yyleng-2);
- zendlval->value.str.len = yyleng-2;
+ zendlval->value.str.val = estrndup(yytext+bprefix+1, yyleng-bprefix-2);
+ zendlval->value.str.len = yyleng-bprefix-2;
zendlval->type = IS_STRING;
HANDLE_NEWLINES(yytext, yyleng);
@@ -1731,15 +1723,11 @@
<ST_IN_SCRIPTING>"b"?"<<<"{TABS_AND_SPACES}{LABEL}{NEWLINE} {
char *s;
-
- if (*yytext == 'b') {
- yytext++;
- yyleng--;
- }
+ int bprefix = (*yytext == 'b') ? 1 : 0;
CG(zend_lineno)++;
- CG(heredoc_len) = yyleng-3-1-(yytext[yyleng-2]=='\r'?1:0);
- s = yytext+3;
+ 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)--;
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php