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

Reply via email to