const char * prop_get_type_name(enum prop_type type);
/* preprocess.c */
+enum variable_flavor {
+ VAR_SIMPLE,
+ VAR_RECURSIVE,
+};
void env_write_dep(FILE *f, const char *auto_conf_name);
-void variable_add(const char *name, const char *value);
+void variable_add(const char *name, const char *value,
+ enum variable_flavor flavor);
void variable_all_del(void);
char *expand_string(const char *in);
char *expand_dollar(const char **str);
struct variable {
char *name;
char *value;
+ enum variable_flavor flavor;
struct list_head node;
};
static char *variable_expand(const char *name, int argc, char *argv[])
{
struct variable *v;
+ char *res;
v = variable_lookup(name);
if (!v)
return NULL;
- return expand_string_with_args(v->value, argc, argv);
+ if (v->flavor == VAR_RECURSIVE)
+ res = expand_string_with_args(v->value, argc, argv);
+ else
+ res = xstrdup(v->value);
+
+ return res;
}
-void variable_add(const char *name, const char *value)
+void variable_add(const char *name, const char *value,
+ enum variable_flavor flavor)
{
struct variable *v;
list_add_tail(&v->node, &variable_list);
}
- v->value = xstrdup(value);
+ v->flavor = flavor;
+
+ if (flavor == VAR_SIMPLE)
+ v->value = expand_string(value);
+ else
+ v->value = xstrdup(value);
}
static void variable_del(struct variable *v)
yylval.string = text;
return T_VARIABLE;
}
- "=" { BEGIN(ASSIGN_VAL); return T_ASSIGN; }
+ "=" { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_RECURSIVE; return T_ASSIGN; }
+ ":=" { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_SIMPLE; return T_ASSIGN; }
[[:blank:]]+
. warn_ignored_character(*yytext);
\n {
struct expr *expr;
struct menu *menu;
const struct kconf_id *id;
+ enum variable_flavor flavor;
}
%token <id>T_MAINMENU
%token T_OPEN_PAREN
%token T_EOL
%token <string> T_VARIABLE
-%token T_ASSIGN
+%token <flavor> T_ASSIGN
%token <string> T_ASSIGN_VAL
%left T_OR
/* assignment statement */
-assignment_stmt: T_VARIABLE T_ASSIGN assign_val T_EOL { variable_add($1, $3); free($1); free($3); }
+assignment_stmt: T_VARIABLE T_ASSIGN assign_val T_EOL { variable_add($1, $3, $2); free($1); free($3); }
assign_val:
/* empty */ { $$ = xstrdup(""); };