|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2ß12, PHP 5.3.20
+- Zend Engine:
+ . Fixed bug #63512 (parse_ini_file() with INI_SCANNER_RAW removes quotes
+ from value). (Pierrick)
- Core:
. Fixed bug #63451 (config.guess file does not have AIX 7 defined,
shared objects are not created). (kemcline at au1 dot ibm dot com)
SECTION_RAW_CHARS [^\]\n\r]
SINGLE_QUOTED_CHARS [^']
-RAW_VALUE_CHARS [^"\n\r;\000]
+RAW_VALUE_CHARS [^\n\r;\000]
LITERAL_DOLLAR ("$"([^{\000]|("\\"{ANY_CHAR})))
VALUE_CHARS ([^$= \t\n\r;&|~()!"'\000]|{LITERAL_DOLLAR})
return '=';
}
-<ST_RAW>["] {
+<ST_RAW>{RAW_VALUE_CHARS} { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
+ char *sc = NULL;
while (YYCURSOR < YYLIMIT) {
- switch (*YYCURSOR++) {
+ switch (*YYCURSOR) {
case '\n':
- SCNG(lineno)++;
- break;
case '\r':
- if (*YYCURSOR != '\n') {
- SCNG(lineno)++;
- }
+ goto end_raw_value_chars;
break;
- case '"':
- yyleng = YYCURSOR - SCNG(yy_text) - 2;
- SCNG(yy_text)++;
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
- case '\\':
- if (YYCURSOR < YYLIMIT) {
- YYCURSOR++;
+ case ';':
+ if (sc == NULL) {
+ sc = YYCURSOR;
}
+ /* no break */
+ default:
+ YYCURSOR++;
break;
}
}
+end_raw_value_chars:
yyleng = YYCURSOR - SCNG(yy_text);
- RETURN_TOKEN(TC_RAW, yytext, yyleng);
-}
-<ST_RAW>{RAW_VALUE_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
+ /* Eat trailing semicolons */
+ while (yytext[yyleng - 1] == ';') {
+ yyleng--;
+ }
+
+ /* Eat leading and trailing double quotes */
+ if (yytext[0] == '"' && yytext[yyleng - 1] == '"') {
+ SCNG(yy_text)++;
+ yyleng = yyleng - 2;
+ } else if (sc) {
+ YYCURSOR = sc;
+ yyleng = YYCURSOR - SCNG(yy_text);
+ }
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
--- /dev/null
+--TEST--
+Fixed bug #63512 (parse_ini_file() with INI_SCANNER_RAW removes quotes from value).
+--FILE--
+<?php
+
+$array = parse_ini_string('
+ int = 123
+ constant = INSTALL_ROOT
+ quotedString = "string"
+ a = INSTALL_ROOT "waa"
+ b = "INSTALL_ROOT"
+ c = "waa" INSTALL_ROOT
+ d = INSTALL_ROOT "INSTALL_ROOT"', false, INI_SCANNER_RAW);
+
+var_dump($array);
+--EXPECTF--
+array(7) {
+ ["int"]=>
+ string(3) "123"
+ ["constant"]=>
+ string(12) "INSTALL_ROOT"
+ ["quotedString"]=>
+ string(6) "string"
+ ["a"]=>
+ string(18) "INSTALL_ROOT "waa""
+ ["b"]=>
+ string(12) "INSTALL_ROOT"
+ ["c"]=>
+ string(18) ""waa" INSTALL_ROOT"
+ ["d"]=>
+ string(27) "INSTALL_ROOT "INSTALL_ROOT""
+}
+