diff options
Diffstat (limited to 'support/kconfig/symbol.c')
| -rw-r--r-- | support/kconfig/symbol.c | 66 | 
1 files changed, 58 insertions, 8 deletions
diff --git a/support/kconfig/symbol.c b/support/kconfig/symbol.c index a796c95fe..ecc5aa5f8 100644 --- a/support/kconfig/symbol.c +++ b/support/kconfig/symbol.c @@ -9,7 +9,6 @@  #include <regex.h>  #include <sys/utsname.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  struct symbol symbol_yes = { @@ -263,11 +262,18 @@ static struct symbol *sym_calc_choice(struct symbol *sym)  	struct symbol *def_sym;  	struct property *prop;  	struct expr *e; +	int flags;  	/* first calculate all choice values' visibilities */ +	flags = sym->flags;  	prop = sym_get_choice_prop(sym); -	expr_list_for_each_sym(prop->expr, e, def_sym) +	expr_list_for_each_sym(prop->expr, e, def_sym) {  		sym_calc_visibility(def_sym); +		if (def_sym->visible != no) +			flags &= def_sym->flags; +	} + +	sym->flags &= flags | ~SYMBOL_DEF_USER;  	/* is the user choice visible? */  	def_sym = sym->def[S_DEF_USER].val; @@ -650,11 +656,11 @@ bool sym_set_string_value(struct symbol *sym, const char *newval)  	size = strlen(newval) + 1;  	if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {  		size += 2; -		sym->def[S_DEF_USER].val = val = malloc(size); +		sym->def[S_DEF_USER].val = val = xmalloc(size);  		*val++ = '0';  		*val++ = 'x';  	} else if (!oldval || strcmp(oldval, newval)) -		sym->def[S_DEF_USER].val = val = malloc(size); +		sym->def[S_DEF_USER].val = val = xmalloc(size);  	else  		return true; @@ -751,7 +757,8 @@ const char *sym_get_string_value(struct symbol *sym)  		case no:  			return "n";  		case mod: -			return "m"; +			sym_calc_value(modules_sym); +			return (modules_sym->curr.tri == no) ? "n" : "m";  		case yes:  			return "y";  		} @@ -805,7 +812,7 @@ struct symbol *sym_lookup(const char *name, int flags)  		hash = 0;  	} -	symbol = malloc(sizeof(*symbol)); +	symbol = xmalloc(sizeof(*symbol));  	memset(symbol, 0, sizeof(*symbol));  	symbol->name = new_name;  	symbol->type = S_UNKNOWN; @@ -856,7 +863,7 @@ const char *sym_expand_string_value(const char *in)  	size_t reslen;  	reslen = strlen(in) + 1; -	res = malloc(reslen); +	res = xmalloc(reslen);  	res[0] = '\0';  	while ((src = strchr(in, '$'))) { @@ -893,6 +900,49 @@ const char *sym_expand_string_value(const char *in)  	return res;  } +const char *sym_escape_string_value(const char *in) +{ +	const char *p; +	size_t reslen; +	char *res; +	size_t l; + +	reslen = strlen(in) + strlen("\"\"") + 1; + +	p = in; +	for (;;) { +		l = strcspn(p, "\"\\"); +		p += l; + +		if (p[0] == '\0') +			break; + +		reslen++; +		p++; +	} + +	res = xmalloc(reslen); +	res[0] = '\0'; + +	strcat(res, "\""); + +	p = in; +	for (;;) { +		l = strcspn(p, "\"\\"); +		strncat(res, p, l); +		p += l; + +		if (p[0] == '\0') +			break; + +		strcat(res, "\\"); +		strncat(res, p++, 1); +	} + +	strcat(res, "\""); +	return res; +} +  struct symbol **sym_re_search(const char *pattern)  {  	struct symbol *sym, **sym_arr = NULL; @@ -1178,7 +1228,7 @@ struct property *prop_alloc(enum prop_type type, struct symbol *sym)  	struct property *prop;  	struct property **propp; -	prop = malloc(sizeof(*prop)); +	prop = xmalloc(sizeof(*prop));  	memset(prop, 0, sizeof(*prop));  	prop->type = type;  	prop->sym = sym;  | 
