1.1 --- a/kconfig/confdata.c Mon May 14 19:28:14 2007 +0000
1.2 +++ b/kconfig/confdata.c Tue Oct 28 15:07:28 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 +}