kconfig/confdata.c
changeset 1001 c8ac48ba1411
parent 94 f32c4f663805
child 1228 5a32746fa3e9
     1.1 --- a/kconfig/confdata.c	Mon May 14 19:28:14 2007 +0000
     1.2 +++ b/kconfig/confdata.c	Mon Oct 27 18:42:26 2008 +0000
     1.3 @@ -83,6 +83,68 @@
     1.4  	return name;
     1.5  }
     1.6  
     1.7 +static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
     1.8 +{
     1.9 +	char *p2;
    1.10 +
    1.11 +	switch (sym->type) {
    1.12 +	case S_TRISTATE:
    1.13 +		if (p[0] == 'm') {
    1.14 +			sym->def[def].tri = mod;
    1.15 +			sym->flags |= def_flags;
    1.16 +			break;
    1.17 +		}
    1.18 +	case S_BOOLEAN:
    1.19 +		if (p[0] == 'y') {
    1.20 +			sym->def[def].tri = yes;
    1.21 +			sym->flags |= def_flags;
    1.22 +			break;
    1.23 +		}
    1.24 +		if (p[0] == 'n') {
    1.25 +			sym->def[def].tri = no;
    1.26 +			sym->flags |= def_flags;
    1.27 +			break;
    1.28 +		}
    1.29 +		conf_warning("symbol value '%s' invalid for %s", p, sym->name);
    1.30 +		break;
    1.31 +	case S_OTHER:
    1.32 +		if (*p != '"') {
    1.33 +			for (p2 = p; *p2 && !isspace(*p2); p2++)
    1.34 +				;
    1.35 +			sym->type = S_STRING;
    1.36 +			goto done;
    1.37 +		}
    1.38 +	case S_STRING:
    1.39 +		if (*p++ != '"')
    1.40 +			break;
    1.41 +		for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
    1.42 +			if (*p2 == '"') {
    1.43 +				*p2 = 0;
    1.44 +				break;
    1.45 +			}
    1.46 +			memmove(p2, p2 + 1, strlen(p2));
    1.47 +		}
    1.48 +		if (!p2) {
    1.49 +			conf_warning("invalid string found");
    1.50 +			return 1;
    1.51 +		}
    1.52 +	case S_INT:
    1.53 +	case S_HEX:
    1.54 +	done:
    1.55 +		if (sym_string_valid(sym, p)) {
    1.56 +			sym->def[def].val = strdup(p);
    1.57 +			sym->flags |= def_flags;
    1.58 +		} else {
    1.59 +			conf_warning("symbol value '%s' invalid for %s", p, sym->name);
    1.60 +			return 1;
    1.61 +		}
    1.62 +		break;
    1.63 +	default:
    1.64 +		;
    1.65 +	}
    1.66 +	return 0;
    1.67 +}
    1.68 +
    1.69  int conf_read_simple(const char *name, int def)
    1.70  {
    1.71  	FILE *in = NULL;
    1.72 @@ -161,7 +223,7 @@
    1.73  			if (def == S_DEF_USER) {
    1.74  				sym = sym_find(line + 5);
    1.75  				if (!sym) {
    1.76 -					conf_warning("trying to assign nonexistent symbol %s", line + 5);
    1.77 +					sym_add_change_count(1);
    1.78  					break;
    1.79  				}
    1.80  			} else {
    1.81 @@ -170,8 +232,7 @@
    1.82  					sym->type = S_BOOLEAN;
    1.83  			}
    1.84  			if (sym->flags & def_flags) {
    1.85 -				conf_warning("trying to reassign symbol %s", sym->name);
    1.86 -				break;
    1.87 +				conf_warning("override: reassigning to symbol %s", sym->name);
    1.88  			}
    1.89  			switch (sym->type) {
    1.90  			case S_BOOLEAN:
    1.91 @@ -201,7 +262,7 @@
    1.92  			if (def == S_DEF_USER) {
    1.93  				sym = sym_find(line + 3);
    1.94  				if (!sym) {
    1.95 -					conf_warning("trying to assign nonexistent symbol %s", line + 3);
    1.96 +					sym_add_change_count(1);
    1.97  					break;
    1.98  				}
    1.99  			} else {
   1.100 @@ -210,64 +271,10 @@
   1.101  					sym->type = S_OTHER;
   1.102  			}
   1.103  			if (sym->flags & def_flags) {
   1.104 -				conf_warning("trying to reassign symbol %s", sym->name);
   1.105 -				break;
   1.106 +				conf_warning("override: reassigning to symbol %s", sym->name);
   1.107  			}
   1.108 -			switch (sym->type) {
   1.109 -			case S_TRISTATE:
   1.110 -				if (p[0] == 'm') {
   1.111 -					sym->def[def].tri = mod;
   1.112 -					sym->flags |= def_flags;
   1.113 -					break;
   1.114 -				}
   1.115 -			case S_BOOLEAN:
   1.116 -				if (p[0] == 'y') {
   1.117 -					sym->def[def].tri = yes;
   1.118 -					sym->flags |= def_flags;
   1.119 -					break;
   1.120 -				}
   1.121 -				if (p[0] == 'n') {
   1.122 -					sym->def[def].tri = no;
   1.123 -					sym->flags |= def_flags;
   1.124 -					break;
   1.125 -				}
   1.126 -				conf_warning("symbol value '%s' invalid for %s", p, sym->name);
   1.127 -				break;
   1.128 -			case S_OTHER:
   1.129 -				if (*p != '"') {
   1.130 -					for (p2 = p; *p2 && !isspace(*p2); p2++)
   1.131 -						;
   1.132 -					sym->type = S_STRING;
   1.133 -					goto done;
   1.134 -				}
   1.135 -			case S_STRING:
   1.136 -				if (*p++ != '"')
   1.137 -					break;
   1.138 -				for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
   1.139 -					if (*p2 == '"') {
   1.140 -						*p2 = 0;
   1.141 -						break;
   1.142 -					}
   1.143 -					memmove(p2, p2 + 1, strlen(p2));
   1.144 -				}
   1.145 -				if (!p2) {
   1.146 -					conf_warning("invalid string found");
   1.147 -					continue;
   1.148 -				}
   1.149 -			case S_INT:
   1.150 -			case S_HEX:
   1.151 -			done:
   1.152 -				if (sym_string_valid(sym, p)) {
   1.153 -					sym->def[def].val = strdup(p);
   1.154 -					sym->flags |= def_flags;
   1.155 -				} else {
   1.156 -					conf_warning("symbol value '%s' invalid for %s", p, sym->name);
   1.157 -					continue;
   1.158 -				}
   1.159 -				break;
   1.160 -			default:
   1.161 -				;
   1.162 -			}
   1.163 +			if (conf_set_sym_val(sym, def, def_flags, p))
   1.164 +				continue;
   1.165  			break;
   1.166  		case '\r':
   1.167  		case '\n':
   1.168 @@ -288,14 +295,12 @@
   1.169  				}
   1.170  				break;
   1.171  			case yes:
   1.172 -				if (cs->def[def].tri != no) {
   1.173 -					conf_warning("%s creates inconsistent choice state", sym->name);
   1.174 -					cs->flags &= ~def_flags;
   1.175 -				} else
   1.176 -					cs->def[def].val = sym;
   1.177 +				if (cs->def[def].tri != no)
   1.178 +					conf_warning("override: %s changes choice state", sym->name);
   1.179 +				cs->def[def].val = sym;
   1.180  				break;
   1.181  			}
   1.182 -			cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri);
   1.183 +			cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
   1.184  		}
   1.185  	}
   1.186  	fclose(in);
   1.187 @@ -307,7 +312,7 @@
   1.188  
   1.189  int conf_read(const char *name)
   1.190  {
   1.191 -	struct symbol *sym;
   1.192 +	struct symbol *sym, *choice_sym;
   1.193  	struct property *prop;
   1.194  	struct expr *e;
   1.195  	int i, flags;
   1.196 @@ -341,27 +346,42 @@
   1.197  		conf_unsaved++;
   1.198  		/* maybe print value in verbose mode... */
   1.199  	sym_ok:
   1.200 +		if (!sym_is_choice(sym))
   1.201 +			continue;
   1.202 +		/* The choice symbol only has a set value (and thus is not new)
   1.203 +		 * if all its visible childs have values.
   1.204 +		 */
   1.205 +		prop = sym_get_choice_prop(sym);
   1.206 +		flags = sym->flags;
   1.207 +		expr_list_for_each_sym(prop->expr, e, choice_sym)
   1.208 +			if (choice_sym->visible != no)
   1.209 +				flags &= choice_sym->flags;
   1.210 +		sym->flags &= flags | ~SYMBOL_DEF_USER;
   1.211 +	}
   1.212 +
   1.213 +	for_all_symbols(i, sym) {
   1.214  		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
   1.215 -			if (sym->visible == no)
   1.216 +			/* Reset values of generates values, so they'll appear
   1.217 +			 * as new, if they should become visible, but that
   1.218 +			 * doesn't quite work if the Kconfig and the saved
   1.219 +			 * configuration disagree.
   1.220 +			 */
   1.221 +			if (sym->visible == no && !conf_unsaved)
   1.222  				sym->flags &= ~SYMBOL_DEF_USER;
   1.223  			switch (sym->type) {
   1.224  			case S_STRING:
   1.225  			case S_INT:
   1.226  			case S_HEX:
   1.227 -				if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val))
   1.228 -					sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
   1.229 +				/* Reset a string value if it's out of range */
   1.230 +				if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
   1.231 +					break;
   1.232 +				sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
   1.233 +				conf_unsaved++;
   1.234 +				break;
   1.235  			default:
   1.236  				break;
   1.237  			}
   1.238  		}
   1.239 -		if (!sym_is_choice(sym))
   1.240 -			continue;
   1.241 -		prop = sym_get_choice_prop(sym);
   1.242 -		flags = sym->flags;
   1.243 -		for (e = prop->expr; e; e = e->left.expr)
   1.244 -			if (e->right.sym->visible != no)
   1.245 -				flags &= e->right.sym->flags;
   1.246 -		sym->flags &= flags | ~SYMBOL_DEF_USER;
   1.247  	}
   1.248  
   1.249  	sym_add_change_count(conf_warnings || conf_unsaved);
   1.250 @@ -425,7 +445,7 @@
   1.251  
   1.252  	fprintf(out, _("#\n"
   1.253  		       "# Automatically generated make config: don't edit\n"
   1.254 -		       "# "PROJECT_NAME" version: %s\n"
   1.255 +		       "# " PACKAGE " version: %s\n"
   1.256  		       "%s%s"
   1.257  		       "#\n"),
   1.258  		     sym_get_string_value(sym),
   1.259 @@ -673,13 +693,13 @@
   1.260  	time(&now);
   1.261  	fprintf(out, "#\n"
   1.262  		     "# Automatically generated make config: don't edit\n"
   1.263 -		     "# "PROJECT_NAME" version: %s\n"
   1.264 +		     "# " PACKAGE " version: %s\n"
   1.265  		     "# %s"
   1.266  		     "#\n",
   1.267  		     sym_get_string_value(sym), ctime(&now));
   1.268  	fprintf(out_h, "/*\n"
   1.269  		       " * Automatically generated C config: don't edit\n"
   1.270 -		       " * "PROJECT_NAME" version: %s\n"
   1.271 +		       " * " PACKAGE " version: %s\n"
   1.272  		       " * %s"
   1.273  		       " */\n"
   1.274  		       "#define AUTOCONF_INCLUDED\n",
   1.275 @@ -788,3 +808,73 @@
   1.276  {
   1.277  	conf_changed_callback = fn;
   1.278  }
   1.279 +
   1.280 +
   1.281 +void conf_set_all_new_symbols(enum conf_def_mode mode)
   1.282 +{
   1.283 +	struct symbol *sym, *csym;
   1.284 +	struct property *prop;
   1.285 +	struct expr *e;
   1.286 +	int i, cnt, def;
   1.287 +
   1.288 +	for_all_symbols(i, sym) {
   1.289 +		if (sym_has_value(sym))
   1.290 +			continue;
   1.291 +		switch (sym_get_type(sym)) {
   1.292 +		case S_BOOLEAN:
   1.293 +		case S_TRISTATE:
   1.294 +			switch (mode) {
   1.295 +			case def_yes:
   1.296 +				sym->def[S_DEF_USER].tri = yes;
   1.297 +				break;
   1.298 +			case def_mod:
   1.299 +				sym->def[S_DEF_USER].tri = mod;
   1.300 +				break;
   1.301 +			case def_no:
   1.302 +				sym->def[S_DEF_USER].tri = no;
   1.303 +				break;
   1.304 +			case def_random:
   1.305 +				sym->def[S_DEF_USER].tri = (tristate)(rand() % 3);
   1.306 +				break;
   1.307 +			default:
   1.308 +				continue;
   1.309 +			}
   1.310 +			if (!sym_is_choice(sym) || mode != def_random)
   1.311 +				sym->flags |= SYMBOL_DEF_USER;
   1.312 +			break;
   1.313 +		default:
   1.314 +			break;
   1.315 +		}
   1.316 +
   1.317 +	}
   1.318 +
   1.319 +	if (modules_sym)
   1.320 +		sym_calc_value(modules_sym);
   1.321 +
   1.322 +	if (mode != def_random)
   1.323 +		return;
   1.324 +
   1.325 +	for_all_symbols(i, csym) {
   1.326 +		if (sym_has_value(csym) || !sym_is_choice(csym))
   1.327 +			continue;
   1.328 +
   1.329 +		sym_calc_value(csym);
   1.330 +		prop = sym_get_choice_prop(csym);
   1.331 +		def = -1;
   1.332 +		while (1) {
   1.333 +			cnt = 0;
   1.334 +			expr_list_for_each_sym(prop->expr, e, sym) {
   1.335 +				if (sym->visible == no)
   1.336 +					continue;
   1.337 +				if (def == cnt++) {
   1.338 +					csym->def[S_DEF_USER].val = sym;
   1.339 +					break;
   1.340 +				}
   1.341 +			}
   1.342 +			if (def >= 0 || cnt < 2)
   1.343 +				break;
   1.344 +			def = (rand() % cnt) + 1;
   1.345 +		}
   1.346 +		csym->flags |= SYMBOL_DEF_USER;
   1.347 +	}
   1.348 +}