From: Arnaud Le Blanc Date: Wed, 5 Nov 2008 21:33:19 +0000 (+0000) Subject: Added parse_ini_string() function (grange at lemonde dot fr, Arnaud) X-Git-Tag: BEFORE_HEAD_NS_CHANGE~78 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c0039b30be6ee882439f0fc0268544239513edee;p=php Added parse_ini_string() function (grange at lemonde dot fr, Arnaud) [DOC] new function parse_ini_string() proto array parse_ini_string(string ini_string [, bool process_sections [, int scanner_mode]]) Same as parse_ini_file() except that it takes a string instead of a filename. --- diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l index 74ff6ecfa9..482d351bdc 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -188,7 +188,7 @@ int zend_ini_scanner_get_lineno(TSRMLS_D) */ char *zend_ini_scanner_get_filename(TSRMLS_D) { - return ini_filename; + return ini_filename ? ini_filename : "Unknown"; } /* }}} */ diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 2f9f26eda8..29ca859119 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -982,6 +982,13 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_parse_ini_file, 0, 0, 1) 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) @@ -3474,6 +3481,7 @@ const zend_function_entry basic_functions[] = { /* {{{ */ 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 @@ -6495,6 +6503,43 @@ PHP_FUNCTION(parse_ini_file) } /* }}} */ +/* {{{ proto array parse_ini_string(string ini_string [, bool process_sections [, int scanner_mode]]) U + 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! */ diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h index d7e492ca4e..ea92d9f6de 100644 --- a/ext/standard/basic_functions.h +++ b/ext/standard/basic_functions.h @@ -126,6 +126,7 @@ PHP_FUNCTION(move_uploaded_file); /* From the INI parser */ PHP_FUNCTION(parse_ini_file); +PHP_FUNCTION(parse_ini_string); #if ZEND_DEBUG PHP_FUNCTION(config_get_hash); #endif diff --git a/ext/standard/tests/general_functions/parse_ini_string_001.phpt b/ext/standard/tests/general_functions/parse_ini_string_001.phpt new file mode 100644 index 0000000000..e135210aa6 --- /dev/null +++ b/ext/standard/tests/general_functions/parse_ini_string_001.phpt @@ -0,0 +1,479 @@ +--TEST-- +Test parse_ini_string() function +--FILE-- +] + +; 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 = Helloworld +;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 +--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 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 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 ** diff --git a/ext/standard/tests/general_functions/parse_ini_string_002.phpt b/ext/standard/tests/general_functions/parse_ini_string_002.phpt new file mode 100644 index 0000000000..0da959ab86 --- /dev/null +++ b/ext/standard/tests/general_functions/parse_ini_string_002.phpt @@ -0,0 +1,168 @@ +--TEST-- +parse_ini_string() multiple calls +--FILE-- + +--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