]> granicus.if.org Git - php/commitdiff
Adding ability to refer to existing .ini variables from within .ini
authorAndrei Zmievski <andrei@php.net>
Fri, 14 May 2004 20:58:15 +0000 (20:58 +0000)
committerAndrei Zmievski <andrei@php.net>
Fri, 14 May 2004 20:58:15 +0000 (20:58 +0000)
files. Example:

open_basedir = ${open_basedir} ":/new/dir"

Zend/zend_ini_parser.y
Zend/zend_ini_scanner.l

index 1d90e34f5f599b5ef21c442f2375a84314c2bf34..b2de5e97952669de0ec812413c5787aba7605bc6 100644 (file)
@@ -92,6 +92,24 @@ void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
        result->type = IS_STRING;
 }
 
+void zend_ini_init_string(zval *result)
+{
+       result->value.str.val = malloc(1);
+       result->value.str.val[0] = 0;
+       result->value.str.len = 0;
+       result->type = IS_STRING;
+}
+
+void zend_ini_add_string(zval *result, zval *op1, zval *op2)
+{           
+    int length = op1->value.str.len + op2->value.str.len;
+
+       result->value.str.val = (char *) realloc(op1->value.str.val, length+1);
+    memcpy(result->value.str.val+op1->value.str.len, op2->value.str.val, op2->value.str.len);
+    result->value.str.val[length] = 0;
+    result->value.str.len = length;
+    result->type = IS_STRING;
+}    
 
 void zend_ini_get_constant(zval *result, zval *name)
 {
@@ -112,6 +130,20 @@ void zend_ini_get_constant(zval *result, zval *name)
        }
 }
 
+void zend_ini_get_var(zval *result, zval *name)
+{
+       zval curval;
+       char *envvar;
+       TSRMLS_FETCH();
+
+       if (zend_get_configuration_directive(name->value.str.val, name->value.str.len+1, &curval) == SUCCESS) {
+               result->value.str.val = zend_strndup(curval.value.str.val, curval.value.str.len);
+               result->value.str.len = curval.value.str.len;
+       } else {
+               zend_ini_init_string(result);
+       }
+}
+
 
 static void ini_error(char *str)
 {
@@ -175,6 +207,7 @@ int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, zend_
 %token SECTION
 %token CFG_TRUE
 %token CFG_FALSE
+%token TC_DOLLAR_CURLY
 %left '|' '&'
 %right '~' '!'
 
@@ -210,13 +243,25 @@ statement:
 
 string_or_value:
                expr { $$ = $1; }
-       |       TC_ENCAPSULATED_STRING { $$ = $1; }
        |       CFG_TRUE { $$ = $1; }
        |       CFG_FALSE { $$ = $1; }
-       |       '\n' { $$.value.str.val = strdup(""); $$.value.str.len=0; $$.type = IS_STRING; }
-       |       /* empty */ { $$.value.str.val = strdup(""); $$.value.str.len=0; $$.type = IS_STRING; }
+       |   var_string_list { $$ = $1; }
+       |       '\n' { zend_ini_init_string(&$$); }
+       |       /* empty */ { zend_ini_init_string(&$$); }
 ;
 
+
+var_string_list:
+               var_string_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
+       |       var_string_list TC_ENCAPSULATED_STRING { zend_ini_add_string(&$$, &$1, &$2); }
+       |       var_string_list constant_string { zend_ini_add_string(&$$, &$1, &$2); }
+       |       /* empty */ { zend_ini_init_string(&$$); }
+
+
+cfg_var_ref:
+               TC_DOLLAR_CURLY TC_STRING '}' { zend_ini_get_var(&$$, &$2); }
+
+
 expr:
                constant_string                 { $$ = $1; }
        |       expr '|' expr                   { zend_ini_do_op('|', &$$, &$1, &$3); }
index f2da5998e33c7c739d891b4de5bd7527c0d88e71..3217e08f5659eea5d92486bb8476a7cbae6b6bf8 100644 (file)
@@ -153,12 +153,20 @@ NEWLINE ("\r"|"\n"|"\r\n")
        return TC_ENCAPSULATED_STRING;
 }
 
-<INITIAL>[&|~()!] {
+<INITIAL>[&|~$(){}!] {
        return yytext[0];
 }
 
+<INITIAL>"${" {
+       return TC_DOLLAR_CURLY;
+}
+
+<INITIAL>"}" {
+       ini_lval->value.lval = (long) yytext[0];
+       return yytext[0];
+}
 
-<INITIAL>[^=\n\r\t;|&~()!"\[]+ {
+<INITIAL>[^=\n\r\t;|&$~(){}!"\[]+ {
        /* STRING */
        register int i;
 
@@ -190,8 +198,6 @@ NEWLINE ("\r"|"\n"|"\r\n")
        }
 }
 
-
-
 <INITIAL>[=\n] {
        if (yytext[0] == '\n') {
                SCNG(lineno)++;