cvs: ZendEngine2 / zend_ini_parser.y zend_ini_scanner.l
| From: | Andrei Zmievski | Date: | Fri, 14 May 2004 20:58:15 +0000 |
| Subject: | cvs: ZendEngine2 / zend_ini_parser.y zend_ini_scanner.l | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-2640@lists.php.net to get a copy of this message | ||
andrei Fri May 14 16:58:15 2004 EDT
Modified files:
/ZendEngine2 zend_ini_parser.y zend_ini_scanner.l
Log:
Adding ability to refer to existing .ini variables from within .ini
files. Example:
open_basedir = ${open_basedir} ":/new/dir"
http://cvs.php.net/diff.php/ZendEngine2/zend_ini_parser.y?r1=1.29&r2=1.30&ty=u
Index: ZendEngine2/zend_ini_parser.y
diff -u ZendEngine2/zend_ini_parser.y:1.29 ZendEngine2/zend_ini_parser.y:1.30
--- ZendEngine2/zend_ini_parser.y:1.29 Tue Jan 13 12:00:10 2004
+++ ZendEngine2/zend_ini_parser.y Fri May 14 16:58:15 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_ini_parser.y,v 1.29 2004/01/13 17:00:10 wez Exp $ */
+/* $Id: zend_ini_parser.y,v 1.30 2004/05/14 20:58:15 andrei Exp $ */
#define DEBUG_CFG_PARSER 0
#include "zend.h"
@@ -92,6 +92,24 @@
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_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 @@
%token SECTION
%token CFG_TRUE
%token CFG_FALSE
+%token TC_DOLLAR_CURLY
%left '|' '&'
%right '~' '!'
@@ -210,13 +243,25 @@
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); }
http://cvs.php.net/diff.php/ZendEngine2/zend_ini_scanner.l?r1=1.33&r2=1.34&ty=u
Index: ZendEngine2/zend_ini_scanner.l
diff -u ZendEngine2/zend_ini_scanner.l:1.33 ZendEngine2/zend_ini_scanner.l:1.34
--- ZendEngine2/zend_ini_scanner.l:1.33 Thu Jan 8 03:23:23 2004
+++ ZendEngine2/zend_ini_scanner.l Fri May 14 16:58:15 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_ini_scanner.l,v 1.33 2004/01/08 08:23:23 andi Exp $ */
+/* $Id: zend_ini_scanner.l,v 1.34 2004/05/14 20:58:15 andrei Exp $ */
#define yyleng SCNG(yy_leng)
#define yytext SCNG(yy_text)
@@ -153,12 +153,20 @@
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 @@
}
}
-
-
<INITIAL>[=\n] {
if (yytext[0] == '\n') {
SCNG(lineno)++;