@@ -92,6 +92,24 @@ void zend_ini_do_op(char type, zval *result, zval *op1, zval *op2)
92
92
result->type = IS_STRING;
93
93
}
94
94
95
+ void zend_ini_init_string (zval *result)
96
+ {
97
+ result->value .str .val = malloc (1 );
98
+ result->value .str .val [0 ] = 0 ;
99
+ result->value .str .len = 0 ;
100
+ result->type = IS_STRING;
101
+ }
102
+
103
+ void zend_ini_add_string (zval *result, zval *op1, zval *op2)
104
+ {
105
+ int length = op1->value .str .len + op2->value .str .len ;
106
+
107
+ result->value .str .val = (char *) realloc (op1->value .str .val , length+1 );
108
+ memcpy (result->value .str .val +op1->value .str .len , op2->value .str .val , op2->value .str .len );
109
+ result->value .str .val [length] = 0 ;
110
+ result->value .str .len = length;
111
+ result->type = IS_STRING;
112
+ }
95
113
96
114
void zend_ini_get_constant (zval *result, zval *name)
97
115
{
@@ -112,6 +130,20 @@ void zend_ini_get_constant(zval *result, zval *name)
112
130
}
113
131
}
114
132
133
+ void zend_ini_get_var (zval *result, zval *name)
134
+ {
135
+ zval curval;
136
+ char *envvar;
137
+ TSRMLS_FETCH ();
138
+
139
+ if (zend_get_configuration_directive (name->value .str .val , name->value .str .len +1 , &curval) == SUCCESS) {
140
+ result->value .str .val = zend_strndup (curval.value .str .val , curval.value .str .len );
141
+ result->value .str .len = curval.value .str .len ;
142
+ } else {
143
+ zend_ini_init_string (result);
144
+ }
145
+ }
146
+
115
147
116
148
static void ini_error (char *str)
117
149
{
@@ -175,6 +207,7 @@ int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, zend_
175
207
%token SECTION
176
208
%token CFG_TRUE
177
209
%token CFG_FALSE
210
+ %token TC_DOLLAR_CURLY
178
211
%left ' |' ' &'
179
212
%right ' ~' ' !'
180
213
@@ -210,13 +243,25 @@ statement:
210
243
211
244
string_or_value :
212
245
expr { $$ = $1 ; }
213
- | TC_ENCAPSULATED_STRING { $$ = $1 ; }
214
246
| CFG_TRUE { $$ = $1 ; }
215
247
| CFG_FALSE { $$ = $1 ; }
216
- | ' \n' { $$ .value.str.val = strdup(" " ); $$ .value.str.len=0 ; $$ .type = IS_STRING; }
217
- | /* empty */ { $$ .value.str.val = strdup(" " ); $$ .value.str.len=0 ; $$ .type = IS_STRING; }
248
+ | var_string_list { $$ = $1 ; }
249
+ | ' \n' { zend_ini_init_string(&$$ ); }
250
+ | /* empty */ { zend_ini_init_string(&$$ ); }
218
251
;
219
252
253
+
254
+ var_string_list :
255
+ var_string_list cfg_var_ref { zend_ini_add_string(&$$ , &$1 , &$2 ); free($2 .value.str.val); }
256
+ | var_string_list TC_ENCAPSULATED_STRING { zend_ini_add_string(&$$ , &$1 , &$2 ); }
257
+ | var_string_list constant_string { zend_ini_add_string(&$$ , &$1 , &$2 ); }
258
+ | /* empty */ { zend_ini_init_string(&$$ ); }
259
+
260
+
261
+ cfg_var_ref :
262
+ TC_DOLLAR_CURLY TC_STRING ' }' { zend_ini_get_var(&$$ , &$2 ); }
263
+
264
+
220
265
expr :
221
266
constant_string { $$ = $1 ; }
222
267
| expr ' |' expr { zend_ini_do_op(' |' , &$$ , &$1 , &$3 ); }
0 commit comments