jani Mon Feb 4 20:45:20 2008 UTC Modified files: (Branch: PHP_5_3) /ZendEngine2 zend_ini_parser.y zend_ini_scanner.l /php-src/ext/standard/tests/general_functions parse_ini_basic.data parse_ini_basic.phpt parse_ini_booleans.data parse_ini_booleans.phpt Log: MFH: - Fixed bugs #43915, #43923 and #44019, a tiny performance issue fixed too
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_ini_parser.y?r1=1.41.2.2.2.2.2.3&r2=1.41.2.2.2.2.2.4&diff_format=u Index: ZendEngine2/zend_ini_parser.y diff -u ZendEngine2/zend_ini_parser.y:1.41.2.2.2.2.2.3 ZendEngine2/zend_ini_parser.y:1.41.2.2.2.2.2.4 --- ZendEngine2/zend_ini_parser.y:1.41.2.2.2.2.2.3 Mon Dec 31 07:17:04 2007 +++ ZendEngine2/zend_ini_parser.y Mon Feb 4 20:45:20 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini_parser.y,v 1.41.2.2.2.2.2.3 2007/12/31 07:17:04 sebastian Exp $ */ +/* $Id: zend_ini_parser.y,v 1.41.2.2.2.2.2.4 2008/02/04 20:45:20 jani Exp $ */ #define DEBUG_CFG_PARSER 0 @@ -246,13 +246,16 @@ %} -%expect 1 +%expect 0 %pure_parser %token TC_SECTION %token TC_RAW +%token TC_CONSTANT %token TC_NUMBER %token TC_STRING +%token TC_WHITESPACE +%token TC_LABEL %token TC_OFFSET %token TC_DOLLAR_CURLY %token TC_VARNAME @@ -260,7 +263,7 @@ %token BOOL_TRUE %token BOOL_FALSE %token END_OF_LINE -%token '=' ':' ',' '.' '"' '\'' '^' '+' '-' '/' '*' '%' '$' '~' '<' '>' '?' '@' +%token '=' ':' ',' '.' '"' '\'' '^' '+' '-' '/' '*' '%' '$' '~' '<' '>' '?' '@' '{' '}' %left '|' '&' %right '~' '!' @@ -279,7 +282,7 @@ ZEND_INI_PARSER_CB(&$2, NULL, NULL, ZEND_INI_PARSER_SECTION, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL($2)); } - | TC_STRING '=' string_or_value { + | TC_LABEL '=' string_or_value { #if DEBUG_CFG_PARSER printf("NORMAL: '%s' = '%s'\n", Z_STRVAL($1), Z_STRVAL($3)); #endif @@ -296,32 +299,24 @@ free(Z_STRVAL($2)); free(Z_STRVAL($5)); } - | TC_STRING { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL($1)); } + | TC_LABEL { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL($1)); } | END_OF_LINE ; section_string_or_value: - TC_RAW { $$ = $1; } - | section_var_list { $$ = $1; } - | '"' encapsed_list '"' { $$ = $2; } + var_string_list { $$ = $1; } | /* empty */ { zend_ini_init_string(&$$); } ; string_or_value: expr { $$ = $1; } - | TC_RAW { $$ = $1; } - | TC_NUMBER { $$ = $1; } | BOOL_TRUE { $$ = $1; } | BOOL_FALSE { $$ = $1; } - | '"' encapsed_list '"' { $$ = $2; } | END_OF_LINE { zend_ini_init_string(&$$); } ; option_offset: - TC_NUMBER { $$ = $1; } - | TC_RAW { $$ = $1; } - | var_string_list { $$ = $1; } - | '"' encapsed_list '"' { $$ = $2; } + var_string_list { $$ = $1; } | /* empty */ { zend_ini_init_string(&$$); } ; @@ -331,18 +326,13 @@ | /* empty */ { zend_ini_init_string(&$$); } ; -section_var_list: - cfg_var_ref { $$ = $1; } - | TC_STRING { $$ = $1; } - | section_var_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); } - | section_var_list TC_STRING { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); } -; - var_string_list: cfg_var_ref { $$ = $1; } | constant_string { $$ = $1; } + | '"' encapsed_list '"' { $$ = $2; } | var_string_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); } | var_string_list constant_string { zend_ini_add_string(&$$, &$1, &$2); free(Z_STRVAL($2)); } + | var_string_list '"' encapsed_list '"' { zend_ini_add_string(&$$, &$1, &$3); free(Z_STRVAL($3)); } ; expr: @@ -359,7 +349,11 @@ ; constant_string: - TC_STRING { zend_ini_get_constant(&$$, &$1 TSRMLS_CC); } + TC_CONSTANT { zend_ini_get_constant(&$$, &$1 TSRMLS_CC); } + | TC_RAW { $$ = $1; /*printf("TC_RAW: '%s'\n", Z_STRVAL($1));*/ } + | TC_NUMBER { $$ = $1; /*printf("TC_NUMBER: '%s'\n", Z_STRVAL($1));*/ } + | TC_STRING { $$ = $1; /*printf("TC_STRING: '%s'\n", Z_STRVAL($1));*/ } + | TC_WHITESPACE { $$ = $1; /*printf("TC_WHITESPACE: '%s'\n", Z_STRVAL($1));*/ } ; /* http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_ini_scanner.l?r1=1.41.2.2.2.2.2.1&r2=1.41.2.2.2.2.2.2&diff_format=u Index: ZendEngine2/zend_ini_scanner.l diff -u ZendEngine2/zend_ini_scanner.l:1.41.2.2.2.2.2.1 ZendEngine2/zend_ini_scanner.l:1.41.2.2.2.2.2.2 --- ZendEngine2/zend_ini_scanner.l:1.41.2.2.2.2.2.1 Fri Sep 28 02:05:08 2007 +++ ZendEngine2/zend_ini_scanner.l Mon Feb 4 20:45:20 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_ini_scanner.l,v 1.41.2.2.2.2.2.1 2007/09/28 02:05:08 jani Exp $ */ +/* $Id: zend_ini_scanner.l,v 1.41.2.2.2.2.2.2 2008/02/04 20:45:20 jani Exp $ */ #define DEBUG_CFG_SCANNER 0 @@ -258,7 +258,6 @@ } else { *t++ = *s; } - if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { SCNG(lineno)++; } @@ -272,25 +271,26 @@ LNUM [0-9]+ DNUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*) -NUMBER {LNUM}|{DNUM} -ANY_CHAR (.|[\n]) +NUMBER [-]?{LNUM}|{DNUM} +ANY_CHAR (.|[\n\t]) NEWLINE ("\r"|"\n"|"\r\n") TABS_AND_SPACES [ \t] +WHITESPACE [ \t]+ CONSTANT [a-zA-Z][a-zA-Z0-9_]* -LABEL [a-zA-Z0-9][a-zA-Z0-9._]* -TOKENS [:,.\[\]"'()|^&+-/*=%$!~<>[EMAIL PROTECTED] +LABEL [a-zA-Z0-9][a-zA-Z0-9._-]* +TOKENS [:,.\[\]"'()|^&+-/*=%$!~<>[EMAIL PROTECTED] OPERATORS [&|~()!] +DOLLAR_CURLY "${" -LITERAL_DOLLAR ("$"+([^a-zA-Z0-9$"'\\{]|("\\"{ANY_CHAR}))) -VALUE_CHARS ("{"*([^=\n\r;&|~()!$"'\\{]|("\\"{ANY_CHAR}))|{LITERAL_DOLLAR}) -RAW_VALUE_CHARS [^=\n\r;] -SINGLE_QUOTED_CHARS [^'] - -SECTION_VALUE_CHARS ("{"*([^\n\r;$"'\\{\]]|("\\"{ANY_CHAR}))|{LITERAL_DOLLAR}) SECTION_RAW_CHARS [^\]\n\r] +SINGLE_QUOTED_CHARS [^'] +RAW_VALUE_CHARS [^=\n\r;] -/* Allow using ${foobar} inside quoted strings */ -DOUBLE_QUOTES_CHARS ("{"*([^$"\\{]|("\\"{ANY_CHAR}))|{LITERAL_DOLLAR}) +/* Allow using ${foobar} in sections, quoted strings and values */ +LITERAL_DOLLAR ("$"([^a-zA-Z0-9{]|("\\"{ANY_CHAR}))) +VALUE_CHARS ([^$= \t\n\r;&|~()!"']|{LITERAL_DOLLAR}) +SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR}) +DOUBLE_QUOTES_CHARS ([^$"\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR}) /* " */ @@ -343,7 +343,7 @@ return ']'; } -<ST_DOUBLE_QUOTES,ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>"${" { /* Variable start */ +<ST_DOUBLE_QUOTES,ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{DOLLAR_CURLY} { /* Variable start */ yy_push_state(ST_VARNAME TSRMLS_CC); return TC_DOLLAR_CURLY; } @@ -365,8 +365,8 @@ RETURN_TOKEN(BOOL_FALSE, "", 0); } -<INITIAL,ST_OFFSET>{LABEL} { /* Get option name or option offset value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); +<INITIAL>{LABEL} { /* Get option name */ + RETURN_TOKEN(TC_LABEL, yytext, yyleng); } <INITIAL>{TABS_AND_SPACES}*[=]{TABS_AND_SPACES}* { /* Start option value */ @@ -392,17 +392,17 @@ RETURN_TOKEN(TC_RAW, yytext, yyleng); } -<ST_VALUE,ST_RAW>{NEWLINE} { /* End of option value */ +<ST_VALUE,ST_RAW>{TABS_AND_SPACES}*{NEWLINE} { /* End of option value */ BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; } -<ST_VALUE,ST_OFFSET>{CONSTANT} { /* Get constant option value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); +<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{CONSTANT} { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } -<ST_VALUE,ST_OFFSET>{NUMBER} { /* Get number option value as string */ +<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{NUMBER} { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } @@ -421,8 +421,6 @@ } <ST_VALUE>{VALUE_CHARS}+ { /* Get everything else as option/offset value */ - /* Eat trailing tabs and spaces */ - EAT_TRAILING_WHITESPACE(); RETURN_TOKEN(TC_STRING, yytext, yyleng); } @@ -430,7 +428,7 @@ RETURN_TOKEN(TC_STRING, yytext, yyleng); } -<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>["] { /* Double quoted '"' string start */ +<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{TABS_AND_SPACES}*["] { /* Double quoted '"' string start */ yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); return '"'; } @@ -440,21 +438,25 @@ return TC_QUOTED_STRING; } -<ST_DOUBLE_QUOTES>["] { /* Double quoted '"' string ends */ +<ST_DOUBLE_QUOTES>["]{TABS_AND_SPACES}* { /* Double quoted '"' string ends */ yy_pop_state(TSRMLS_C); return '"'; } -<INITIAL,ST_VALUE,ST_RAW,ST_OFFSET>{TABS_AND_SPACES} { +<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{WHITESPACE} { + RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); +} + +<INITIAL,ST_RAW>{TABS_AND_SPACES}+ { /* eat whitespace */ } -<INITIAL>{NEWLINE} { +<INITIAL>{TABS_AND_SPACES}*{NEWLINE} { SCNG(lineno)++; return END_OF_LINE; } -<INITIAL,ST_VALUE,ST_RAW>[;][^\r\n]*{NEWLINE} { /* Comment */ +<INITIAL,ST_VALUE,ST_RAW>{TABS_AND_SPACES}*[;][^\r\n]*{NEWLINE} { /* Comment */ BEGIN(INITIAL); SCNG(lineno)++; return END_OF_LINE; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/parse_ini_basic.data?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-src/ext/standard/tests/general_functions/parse_ini_basic.data diff -u php-src/ext/standard/tests/general_functions/parse_ini_basic.data:1.1.2.2 php-src/ext/standard/tests/general_functions/parse_ini_basic.data:1.1.2.3 --- php-src/ext/standard/tests/general_functions/parse_ini_basic.data:1.1.2.2 Fri Sep 28 02:05:09 2007 +++ php-src/ext/standard/tests/general_functions/parse_ini_basic.data Mon Feb 4 20:45:20 2008 @@ -13,6 +13,7 @@ sqstring = 'adsasdadasdasd' dqstring = "asdadfsdjkslkj [EMAIL PROTECTED] { } !^~|¥¥{[()/)&/% ¤ # #" php_constant = E_ALL +user_constant = TEST_CONSTANT [basic with whitespace] basicval = bar @@ -89,7 +90,7 @@ ;[PATH="${basicval}/path/quoted"] ["PATH=${basicval}/all/quoted"] -; The rest is from bug #29306 +; This is test for bug #29306 [01] e=e f=f @@ -104,3 +105,25 @@ d=d [0815] bla=bla + +;Test for bug #43923 +[bug #43923] +curly1 = { +curly2 = "{" +curly3 = '{' + +;Test for bug #44019 +[bug #44019] +concatenation_before = TEST_CONSTANT "+some_text_after" +concatenation_middle = "some_text_before+" TEST_CONSTANT "+some_text_after" +concatenation_after = "some_text_before+" TEST_CONSTANT +concatenation_nows_before = TEST_CONSTANT"+some_text_after" +concatenation_nows_middle = "some_text_before+"TEST_CONSTANT"+some_text_after" +concatenation_nows_after = "some_text_before+"TEST_CONSTANT + +;Test for bug #43915 +[bug #43915] +ini_with-hyphen = with hyphen and underscore +ini.with-hyphen = dot and hyphen +ini-with.hyphen = hyphen and dot + http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/parse_ini_basic.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-src/ext/standard/tests/general_functions/parse_ini_basic.phpt diff -u php-src/ext/standard/tests/general_functions/parse_ini_basic.phpt:1.1.2.2 php-src/ext/standard/tests/general_functions/parse_ini_basic.phpt:1.1.2.3 --- php-src/ext/standard/tests/general_functions/parse_ini_basic.phpt:1.1.2.2 Fri Sep 28 02:05:09 2007 +++ php-src/ext/standard/tests/general_functions/parse_ini_basic.phpt Mon Feb 4 20:45:20 2008 @@ -8,14 +8,16 @@ $ini_file = dirname(__FILE__)."/parse_ini_basic.data"; +define('TEST_CONSTANT', 'this_is_test_constant'); + var_dump(parse_ini_file($ini_file, 1)); echo "Done.\n"; ?> --EXPECTF-- -array(22) { +array(25) { ["basic"]=> - array(14) { + array(15) { ["basicval"]=> string(3) "bar" ["longval"]=> @@ -44,6 +46,8 @@ string(51) "asdadfsdjkslkj [EMAIL PROTECTED] { } !^~|¥¥{[()/)&/% ¤ # #" ["php_constant"]=> string(4) "6143" + ["user_constant"]=> + string(21) "this_is_test_constant" } ["basic with whitespace"]=> array(13) { @@ -235,5 +239,38 @@ ["bla"]=> string(3) "bla" } + ["bug #43923"]=> + array(3) { + ["curly1"]=> + string(1) "{" + ["curly2"]=> + string(1) "{" + ["curly3"]=> + string(1) "{" + } + ["bug #44019"]=> + array(6) { + ["concatenation_before"]=> + string(37) "this_is_test_constant+some_text_after" + ["concatenation_middle"]=> + string(54) "some_text_before+this_is_test_constant+some_text_after" + ["concatenation_after"]=> + string(38) "some_text_before+this_is_test_constant" + ["concatenation_nows_before"]=> + string(37) "this_is_test_constant+some_text_after" + ["concatenation_nows_middle"]=> + string(54) "some_text_before+this_is_test_constant+some_text_after" + ["concatenation_nows_after"]=> + string(38) "some_text_before+this_is_test_constant" + } + ["bug #43915"]=> + array(3) { + ["ini_with-hyphen"]=> + string(26) "with hyphen and underscore" + ["ini.with-hyphen"]=> + string(14) "dot and hyphen" + ["ini-with.hyphen"]=> + string(14) "hyphen and dot" + } } Done. http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/parse_ini_booleans.data?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-src/ext/standard/tests/general_functions/parse_ini_booleans.data diff -u php-src/ext/standard/tests/general_functions/parse_ini_booleans.data:1.1.2.2 php-src/ext/standard/tests/general_functions/parse_ini_booleans.data:1.1.2.3 --- php-src/ext/standard/tests/general_functions/parse_ini_booleans.data:1.1.2.2 Fri Sep 28 02:05:09 2007 +++ php-src/ext/standard/tests/general_functions/parse_ini_booleans.data Mon Feb 4 20:45:20 2008 @@ -6,7 +6,7 @@ error_reporting3 = E_ALL & ~E_NOTICE error_reporting4 = E_ALL & ~E_NOTICE | E_STRICT -[true or false] +['true or false'] bool_true = true bool_yes = yes bool_on = on http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/parse_ini_booleans.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-src/ext/standard/tests/general_functions/parse_ini_booleans.phpt diff -u php-src/ext/standard/tests/general_functions/parse_ini_booleans.phpt:1.1.2.2 php-src/ext/standard/tests/general_functions/parse_ini_booleans.phpt:1.1.2.3 --- php-src/ext/standard/tests/general_functions/parse_ini_booleans.phpt:1.1.2.2 Fri Sep 28 02:05:09 2007 +++ php-src/ext/standard/tests/general_functions/parse_ini_booleans.phpt Mon Feb 4 20:45:20 2008 @@ -15,7 +15,7 @@ ["error_reporting values"]=> array(6) { ["foo"]=> - string(14) "E_ALL E_NOTICE" + string(6) "6143 8" ["error_reporting"]=> string(4) "6143" ["error_reporting1"]=>
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php