ZEND_ARG_INFO(0, scanner_mode)
ZEND_END_ARG_INFO()
+static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_parse_ini_string, 0, 0, 1)
+ ZEND_ARG_INFO(0, ini_string)
+ ZEND_ARG_INFO(0, process_sections)
+ ZEND_ARG_INFO(0, scanner_mode)
+ZEND_END_ARG_INFO()
+
#if ZEND_DEBUG
static
ZEND_BEGIN_ARG_INFO(arginfo_config_get_hash, 0)
PHP_FE(connection_status, arginfo_connection_status)
PHP_FE(ignore_user_abort, arginfo_ignore_user_abort)
PHP_FE(parse_ini_file, arginfo_parse_ini_file)
+ PHP_FE(parse_ini_string, arginfo_parse_ini_string)
#if ZEND_DEBUG
PHP_FE(config_get_hash, arginfo_config_get_hash)
#endif
}
/* }}} */
+/* {{{ proto array parse_ini_string(string ini_string [, bool process_sections [, int scanner_mode]])
+ Parse configuration string */
+PHP_FUNCTION(parse_ini_string)
+{
+ char *string = NULL, *str = NULL;
+ int str_len = 0;
+ zend_bool process_sections = 0;
+ long scanner_mode = ZEND_INI_SCANNER_NORMAL;
+ zend_ini_parser_cb_t ini_parser_cb;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|bl", &str, &str_len, &process_sections, &scanner_mode) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ /* Set callback function */
+ if (process_sections) {
+ BG(active_ini_file_section) = NULL;
+ ini_parser_cb = (zend_ini_parser_cb_t) php_ini_parser_cb_with_sections;
+ } else {
+ ini_parser_cb = (zend_ini_parser_cb_t) php_simple_ini_parser_cb;
+ }
+
+ /* Setup string */
+ string = (char *) emalloc(str_len + ZEND_MMAP_AHEAD);
+ memcpy(string, str, str_len);
+ memset(string + str_len, 0, ZEND_MMAP_AHEAD);
+
+ array_init(return_value);
+ if (zend_parse_ini_string(string, 0, scanner_mode, ini_parser_cb, return_value TSRMLS_CC) == FAILURE) {
+ zend_hash_destroy(Z_ARRVAL_P(return_value));
+ efree(Z_ARRVAL_P(return_value));
+ RETVAL_FALSE;
+ }
+ efree(string);
+}
+/* }}} */
+
#if ZEND_DEBUG
/* This function returns an array of ALL valid ini options with values and
* is not the same as ini_get_all() which returns only registered ini options. Only useful for devs to debug php.ini scanner/parser! */
--- /dev/null
+--TEST--
+Test parse_ini_string() function
+--FILE--
+<?php
+/* Prototype: array parse_ini_string(string $string [,bool $process_sections]);
+ Description: parse_ini_string() loads in the ini file specified in filename,
+ and returns the settings in it in an associative array.
+*/
+
+$parse_string = <<<EOD
+; Comment starts with semi-colon(;)
+; Section starts with [<section name>]
+
+; start of ini file
+
+[Constans]
+one = 1
+five = 5
+animal = BIRD
+Language = PHP
+PHP_CONSTANT = 1.2345678
+10 = Ten
+HELLO = HELLO
+
+[date]
+date =
+time =
+
+[paths]
+path = /usr/local/bin
+URL = http://www.php.net
+
+[Decimal]
+Decimal_value1 = 100
+Decimal_value2 = -100
+Decimal_value3 = -2147483647
+Decimal_value4 = 2147483647
+Decimal_value5 = -2147483648
+Decimal_value6 = 2147483648
+
+[Octal]
+Octal_value = 0100
+
+[Hex]
+Hex_value1 = 0x101
+Hex_Value2 = 0x102
+Hex_Value2 = 0x103
+
+[Non-alphanumerics_as_values]
+;Non-alpha numeric chars without quotes
+Non_alpha1 = ;
+Non_alpha2 = +
+Non_alpha3 = *
+Non_alpha4 = %
+Non_alpha5 = <>
+Non_alpha6 = @
+Non_alpha7 = #
+Non_alpha8 = ^
+Non_alpha9 = -
+Non_alpha10 = :
+Non_alpha11 = ?
+Non_alpha12 = /
+Non_alpha13 = \
+;These chars have a special meaning when used in the value,
+; hence parser throws an error
+;Non_alpha14 = &
+;Non_alpha15 = {}
+;Non_alpha16 = |
+;Non_alpha17 = ~
+;Non_alpha18 = !
+;Non_alpha19 = $
+;Non_alpha20 = ()
+
+Non_alpha1_quotes = ";"
+Non_alpha2_quotes = "+"
+Non_alpha3_quotes = "*"
+Non_alpha4_quotes = "%"
+Non_alpha5_quotes = "<>"
+Non_alpha6_quotes = "@"
+Non_alpha7_quotes = "#"
+Non_alpha8_quotes = "^"
+Non_alpha9_quotes = "-"
+Non_alpha10_quotes = "="
+Non_alpha11_quotes = ":"
+Non_alpha12_quotes = "?"
+Non_alpha13_quotes = "/"
+;Non_alpha14_quotes = "\"
+Non_alpha15_quotes = "&"
+Non_alpha16_quotes = "{}"
+Non_alpha17_quotes = "|"
+Non_alpha18_quotes = "~"
+Non_alpha19_quotes = "!"
+;Non_alpha20_quotes = "$"
+Non_alpha21_quotes = "()"
+
+[Non-alpha numerics in strings]
+;expected error, as the non-alphanumeric chars not enclosed in double quotes("")
+Non_alpha_string1 = Hello@world
+;Non_alpha_string2 = Hello!world
+;Non_alpha_string3 = Hello#world
+;Non_alpha_string4 = Hello%world
+;Non_alpha_string5 = Hello&world
+;Non_alpha_string6 = Hello*world
+;Non_alpha_string7 = Hello+world
+;Non_alpha_string8 = Hello-world
+;Non_alpha_string9 = Hello'world
+;Non_alpha_string10 = Hello:world
+;Non_alpha_string11 = Hello;world
+;Non_alpha_string12 = Hello<world
+;Non_alpha_string13 = Hello>world
+;Non_alpha_string14 = Hello>world
+;Non_alpha_string15 = Hello?world
+;Non_alpha_string16 = Hello\world
+;Non_alpha_string17 = Hello^world
+;Non_alpha_string18 = Hello_world
+;Non_alpha_string19 = Hello|world
+;Non_alpha_string20 = Hello~world
+;Non_alpha_string21 = Hello`world
+;Non_alpha_string22 = Hello(world)
+
+[Non-alpha numerics in strings -with quotes]
+Non_alpha_string1_quotes = "Hello@world"
+Non_alpha_string2_quotes = "Hello!world"
+Non_alpha_string3_quotes = "Hello#world"
+Non_alpha_string4_quotes = "Hello&world"
+Non_alpha_string5_quotes = "Hello*world"
+Non_alpha_string6_quotes = "Hello+world"
+Non_alpha_string7_quotes = "Hello-world"
+Non_alpha_string8_quotes = "Hello'world"
+Non_alpha_string9_quotes = "Hello:world"
+Non_alpha_string10_quotes = "Hello;world"
+Non_alpha_string11_quotes = "Hello<world"
+Non_alpha_string12_quotes = "Hello>world"
+Non_alpha_string13_quotes = "Hello>world"
+Non_alpha_string14_quotes = "Hello?world"
+Non_alpha_string15_quotes = "Hello\world"
+Non_alpha_string16_quotes = "Hello^world"
+Non_alpha_string17_quotes = "Hello_world"
+Non_alpha_string18_quotes = "Hello|world"
+Non_alpha_string19_quotes = "Hello~world"
+Non_alpha_string20_quotes = "Hello`world"
+Non_alpha_string21_quotes = "Hello(world)"
+
+[Newlines_in_Values]
+String1 = "Hello, world\nGood Morning"
+String2 = "\nHello, world
+ Good Morning\n"
+String3 = 'Hello, world\tGood Morning'
+String4 = "\n"
+String5 = "\n\n"
+String6 = Hello, world\tGood Morning
+
+[ReservedKeys_as_Values]
+Key1 = YES
+Key2 = Yes
+Key3 = yEs
+Key4 = NO
+Key5 = No
+Key6 = nO
+Key7 = TRUE
+Key8 = True
+Key9 = tRUE
+Key10 = true
+Key11 = FALSE
+Key12 = False
+Key13 = false
+Key14 = fAlSE
+Key15 = NULL
+Key16 = Null
+Key17 = nuLL
+Key18 = null
+
+[ReservedKeys_as_Keys]
+; Expected:error, reserved key words must not be used as keys for ini file
+;YES = 1
+;Yes = 2
+;yEs = 1.2
+;YES = YES
+;NO = ""
+;No = "string"
+;nO = "\0"
+;TRUE = 1.1
+;True = 1
+;tRUE = 5
+;true = TRUE
+;FALSE = FALSE
+;False = ""
+;false = "hello"
+;fAlSE = ""
+;NULL = ""
+;Null = 0
+;nuLL = "\0"
+;null = NULL
+
+; end of ini file
+EOD;
+
+echo "*** Test parse_ini_string() function: with various keys and values given in string ***\n";
+echo "-- ini string without process_sections optional arg --\n";
+define('BIRD', 'Humming bird');
+$ini_array = parse_ini_string($parse_string);
+print_r($ini_array);
+
+echo "\n-- ini string with process_sections as TRUE --\n";
+$ini_array = parse_ini_string($parse_string, TRUE);
+print_r($ini_array);
+
+echo "*** Done **\n";
+?>
+--EXPECTF--
+*** Test parse_ini_string() function: with various keys and values given in string ***
+-- ini string without process_sections optional arg --
+Array
+(
+ [one] => 1
+ [five] => 5
+ [animal] => Humming bird
+ [Language] => PHP
+ [PHP_CONSTANT] => 1.2345678
+ [10] => Ten
+ [HELLO] => HELLO
+ [date] =>
+ [time] =>
+ [path] => /usr/local/bin
+ [URL] => http://www.php.net
+ [Decimal_value1] => 100
+ [Decimal_value2] => -100
+ [Decimal_value3] => -2147483647
+ [Decimal_value4] => 2147483647
+ [Decimal_value5] => -2147483648
+ [Decimal_value6] => 2147483648
+ [Octal_value] => 0100
+ [Hex_value1] => 0x101
+ [Hex_Value2] => 0x103
+ [Non_alpha1] =>
+ [Non_alpha2] => +
+ [Non_alpha3] => *
+ [Non_alpha4] => %
+ [Non_alpha5] => <>
+ [Non_alpha6] => @
+ [Non_alpha7] => #
+ [Non_alpha8] => ^
+ [Non_alpha9] => -
+ [Non_alpha10] => :
+ [Non_alpha11] => ?
+ [Non_alpha12] => /
+ [Non_alpha13] => \
+ [Non_alpha1_quotes] => ;
+ [Non_alpha2_quotes] => +
+ [Non_alpha3_quotes] => *
+ [Non_alpha4_quotes] => %
+ [Non_alpha5_quotes] => <>
+ [Non_alpha6_quotes] => @
+ [Non_alpha7_quotes] => #
+ [Non_alpha8_quotes] => ^
+ [Non_alpha9_quotes] => -
+ [Non_alpha10_quotes] => =
+ [Non_alpha11_quotes] => :
+ [Non_alpha12_quotes] => ?
+ [Non_alpha13_quotes] => /
+ [Non_alpha15_quotes] => &
+ [Non_alpha16_quotes] => {}
+ [Non_alpha17_quotes] => |
+ [Non_alpha18_quotes] => ~
+ [Non_alpha19_quotes] => !
+ [Non_alpha21_quotes] => ()
+ [Non_alpha_string1] => Hello@world
+ [Non_alpha_string1_quotes] => Hello@world
+ [Non_alpha_string2_quotes] => Hello!world
+ [Non_alpha_string3_quotes] => Hello#world
+ [Non_alpha_string4_quotes] => Hello&world
+ [Non_alpha_string5_quotes] => Hello*world
+ [Non_alpha_string6_quotes] => Hello+world
+ [Non_alpha_string7_quotes] => Hello-world
+ [Non_alpha_string8_quotes] => Hello'world
+ [Non_alpha_string9_quotes] => Hello:world
+ [Non_alpha_string10_quotes] => Hello;world
+ [Non_alpha_string11_quotes] => Hello<world
+ [Non_alpha_string12_quotes] => Hello>world
+ [Non_alpha_string13_quotes] => Hello>world
+ [Non_alpha_string14_quotes] => Hello?world
+ [Non_alpha_string15_quotes] => Hello\world
+ [Non_alpha_string16_quotes] => Hello^world
+ [Non_alpha_string17_quotes] => Hello_world
+ [Non_alpha_string18_quotes] => Hello|world
+ [Non_alpha_string19_quotes] => Hello~world
+ [Non_alpha_string20_quotes] => Hello`world
+ [Non_alpha_string21_quotes] => Hello(world)
+ [String1] => Hello, world
+Good Morning
+ [String2] =>
+Hello, world
+ Good Morning
+
+ [String3] => Hello, world Good Morning
+ [String4] =>
+
+ [String5] =>
+
+
+ [String6] => Hello, world Good Morning
+ [Key1] => 1
+ [Key2] => 1
+ [Key3] => 1
+ [Key4] =>
+ [Key5] =>
+ [Key6] =>
+ [Key7] => 1
+ [Key8] => 1
+ [Key9] => 1
+ [Key10] => 1
+ [Key11] =>
+ [Key12] =>
+ [Key13] =>
+ [Key14] =>
+ [Key15] =>
+ [Key16] =>
+ [Key17] =>
+ [Key18] =>
+)
+
+-- ini string with process_sections as TRUE --
+Array
+(
+ [Constans] => Array
+ (
+ [one] => 1
+ [five] => 5
+ [animal] => Humming bird
+ [Language] => PHP
+ [PHP_CONSTANT] => 1.2345678
+ [10] => Ten
+ [HELLO] => HELLO
+ )
+
+ [date] => Array
+ (
+ [date] =>
+ [time] =>
+ )
+
+ [paths] => Array
+ (
+ [path] => /usr/local/bin
+ [URL] => http://www.php.net
+ )
+
+ [Decimal] => Array
+ (
+ [Decimal_value1] => 100
+ [Decimal_value2] => -100
+ [Decimal_value3] => -2147483647
+ [Decimal_value4] => 2147483647
+ [Decimal_value5] => -2147483648
+ [Decimal_value6] => 2147483648
+ )
+
+ [Octal] => Array
+ (
+ [Octal_value] => 0100
+ )
+
+ [Hex] => Array
+ (
+ [Hex_value1] => 0x101
+ [Hex_Value2] => 0x103
+ )
+
+ [Non-alphanumerics_as_values] => Array
+ (
+ [Non_alpha1] =>
+ [Non_alpha2] => +
+ [Non_alpha3] => *
+ [Non_alpha4] => %
+ [Non_alpha5] => <>
+ [Non_alpha6] => @
+ [Non_alpha7] => #
+ [Non_alpha8] => ^
+ [Non_alpha9] => -
+ [Non_alpha10] => :
+ [Non_alpha11] => ?
+ [Non_alpha12] => /
+ [Non_alpha13] => \
+ [Non_alpha1_quotes] => ;
+ [Non_alpha2_quotes] => +
+ [Non_alpha3_quotes] => *
+ [Non_alpha4_quotes] => %
+ [Non_alpha5_quotes] => <>
+ [Non_alpha6_quotes] => @
+ [Non_alpha7_quotes] => #
+ [Non_alpha8_quotes] => ^
+ [Non_alpha9_quotes] => -
+ [Non_alpha10_quotes] => =
+ [Non_alpha11_quotes] => :
+ [Non_alpha12_quotes] => ?
+ [Non_alpha13_quotes] => /
+ [Non_alpha15_quotes] => &
+ [Non_alpha16_quotes] => {}
+ [Non_alpha17_quotes] => |
+ [Non_alpha18_quotes] => ~
+ [Non_alpha19_quotes] => !
+ [Non_alpha21_quotes] => ()
+ )
+
+ [Non-alpha numerics in strings] => Array
+ (
+ [Non_alpha_string1] => Hello@world
+ )
+
+ [Non-alpha numerics in strings -with quotes] => Array
+ (
+ [Non_alpha_string1_quotes] => Hello@world
+ [Non_alpha_string2_quotes] => Hello!world
+ [Non_alpha_string3_quotes] => Hello#world
+ [Non_alpha_string4_quotes] => Hello&world
+ [Non_alpha_string5_quotes] => Hello*world
+ [Non_alpha_string6_quotes] => Hello+world
+ [Non_alpha_string7_quotes] => Hello-world
+ [Non_alpha_string8_quotes] => Hello'world
+ [Non_alpha_string9_quotes] => Hello:world
+ [Non_alpha_string10_quotes] => Hello;world
+ [Non_alpha_string11_quotes] => Hello<world
+ [Non_alpha_string12_quotes] => Hello>world
+ [Non_alpha_string13_quotes] => Hello>world
+ [Non_alpha_string14_quotes] => Hello?world
+ [Non_alpha_string15_quotes] => Hello\world
+ [Non_alpha_string16_quotes] => Hello^world
+ [Non_alpha_string17_quotes] => Hello_world
+ [Non_alpha_string18_quotes] => Hello|world
+ [Non_alpha_string19_quotes] => Hello~world
+ [Non_alpha_string20_quotes] => Hello`world
+ [Non_alpha_string21_quotes] => Hello(world)
+ )
+
+ [Newlines_in_Values] => Array
+ (
+ [String1] => Hello, world
+Good Morning
+ [String2] =>
+Hello, world
+ Good Morning
+
+ [String3] => Hello, world Good Morning
+ [String4] =>
+
+ [String5] =>
+
+
+ [String6] => Hello, world Good Morning
+ )
+
+ [ReservedKeys_as_Values] => Array
+ (
+ [Key1] => 1
+ [Key2] => 1
+ [Key3] => 1
+ [Key4] =>
+ [Key5] =>
+ [Key6] =>
+ [Key7] => 1
+ [Key8] => 1
+ [Key9] => 1
+ [Key10] => 1
+ [Key11] =>
+ [Key12] =>
+ [Key13] =>
+ [Key14] =>
+ [Key15] =>
+ [Key16] =>
+ [Key17] =>
+ [Key18] =>
+ )
+
+ [ReservedKeys_as_Keys] => Array
+ (
+ )
+
+)
+*** Done **
--- /dev/null
+--TEST--
+parse_ini_string() multiple calls
+--FILE--
+<?php
+
+var_dump(parse_ini_string());
+var_dump(parse_ini_string(1,1,1,1));
+
+$ini = "
+test =
+";
+var_dump(parse_ini_string($ini));
+$ini = "
+test==
+";
+var_dump(parse_ini_string($ini));
+
+$ini = "
+test=test=
+";
+var_dump(parse_ini_string($ini));
+
+$ini = "
+test= \"new
+line\"
+";
+var_dump(parse_ini_string($ini));
+
+define("TEST_CONST", "test const value");
+$ini = "
+test=TEST_CONST
+";
+var_dump(parse_ini_string($ini));
+
+$ini = "
+[section]
+test=hello
+";
+var_dump(parse_ini_string($ini, true));
+
+$ini = "
+[section]
+test=hello
+";
+var_dump(parse_ini_string($ini, false));
+
+$ini = "
+section.test=hello
+";
+var_dump(parse_ini_string($ini, true));
+
+$ini = "
+[section]
+section.test=hello
+";
+var_dump(parse_ini_string($ini, true));
+
+$ini = "
+[section]
+1=2
+";
+var_dump(parse_ini_string($ini, true));
+
+$ini = "
+1=2
+";
+var_dump(parse_ini_string($ini, true));
+$ini = "
+test=test2
+test=test3
+test=test4
+";
+var_dump(parse_ini_string($ini, true));
+
+/* From bug #44574 */
+$ini = "[section1]\nname = value";
+var_dump(parse_ini_string($ini, true));
+
+/* #44842, labels starting with underscore */
+$ini = <<<'INI'
+foo=bar1
+_foo=bar2
+foo_=bar3
+INI;
+var_dump(parse_ini_string($ini, true));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: parse_ini_string() expects at least 1 parameter, 0 given in %s
+bool(false)
+
+Warning: parse_ini_string() expects at most 3 parameters, 4 given in %s
+bool(false)
+array(1) {
+ [%u|b%"test"]=>
+ %unicode|string%(0) ""
+}
+
+Warning: syntax error, unexpected '=' in Unknown on line 2
+ in %s
+bool(false)
+
+Warning: syntax error, unexpected '=' in Unknown on line 2
+ in %s
+bool(false)
+array(1) {
+ [%u|b%"test"]=>
+ %unicode|string%(8) "new
+line"
+}
+array(1) {
+ [%u|b%"test"]=>
+ %unicode|string%(16) "test const value"
+}
+array(1) {
+ [%u|b%"section"]=>
+ array(1) {
+ [%u|b%"test"]=>
+ %unicode|string%(5) "hello"
+ }
+}
+array(1) {
+ [%u|b%"test"]=>
+ %unicode|string%(5) "hello"
+}
+array(1) {
+ [%u|b%"section.test"]=>
+ %unicode|string%(5) "hello"
+}
+array(1) {
+ [%u|b%"section"]=>
+ array(1) {
+ [%u|b%"section.test"]=>
+ %unicode|string%(5) "hello"
+ }
+}
+array(1) {
+ [%u|b%"section"]=>
+ array(1) {
+ [1]=>
+ %unicode|string%(1) "2"
+ }
+}
+array(1) {
+ [1]=>
+ %unicode|string%(1) "2"
+}
+array(1) {
+ [%u|b%"test"]=>
+ %unicode|string%(5) "test4"
+}
+array(1) {
+ [%u|b%"section1"]=>
+ array(1) {
+ [%u|b%"name"]=>
+ %unicode|string%(5) "value"
+ }
+}
+array(3) {
+ [%u|b%"foo"]=>
+ %unicode|string%(4) "bar1"
+ [%u|b%"_foo"]=>
+ %unicode|string%(4) "bar2"
+ [%u|b%"foo_"]=>
+ %unicode|string%(4) "bar3"
+}
+Done