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