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

Reply via email to