Hello,
Here's a patch again PHP_5_3 to add a parse_ini_string() function.
It just works as parse_ini_file(), except it accepts a string instead of
a filename, obviously.
We've been using for months a simple PHP function to do that, and while
I had to modify it to accept constants (as parse_ini_file() does), I
thought it was time to use the core parsers instead of reinventing the
wheel.
I have the same patch available for 5.2, if anyone is interested.
Thank you for all the time and effort you put into PHP !
Olivier
Index: ext/standard/basic_functions.c
===================================================================
RCS file: /repository/php-src/ext/standard/basic_functions.c,v
retrieving revision 1.725.2.31.2.64.2.68
diff -u -r1.725.2.31.2.64.2.68 basic_functions.c
--- ext/standard/basic_functions.c 2 Nov 2008 21:19:37 -0000
1.725.2.31.2.64.2.68
+++ ext/standard/basic_functions.c 5 Nov 2008 15:42:37 -0000
@@ -989,6 +989,13 @@
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, str)
+ 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)
@@ -3450,6 +3457,7 @@
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
@@ -6372,6 +6380,42 @@
}
/* }}} */
+/* {{{ proto array parse_ini_string(string str [, 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 + 1);
+ strcpy(string, str);
+ *(string + str_len + 1) = '\0';
+
+ 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));
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
#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! */
Index: ext/standard/basic_functions.h
===================================================================
RCS file: /repository/php-src/ext/standard/basic_functions.h,v
retrieving revision 1.139.2.4.2.6.2.9
diff -u -r1.139.2.4.2.6.2.9 basic_functions.h
--- ext/standard/basic_functions.h 15 Apr 2008 08:44:21 -0000
1.139.2.4.2.6.2.9
+++ ext/standard/basic_functions.h 5 Nov 2008 15:42:37 -0000
@@ -127,6 +127,7 @@
/* From the INI parser */
PHP_FUNCTION(parse_ini_file);
+PHP_FUNCTION(parse_ini_string);
#if ZEND_DEBUG
PHP_FUNCTION(config_get_hash);
#endif
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php