|
@@ -226,22 +226,18 @@ static void sym_calc_visibility(struct symbol *sym)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static struct symbol *sym_calc_choice(struct symbol *sym)
|
|
|
+/*
|
|
|
+ * Find the default symbol for a choice.
|
|
|
+ * First try the default values for the choice symbol
|
|
|
+ * Next locate the first visible choice value
|
|
|
+ * Return NULL if none was found
|
|
|
+ */
|
|
|
+struct symbol *sym_choice_default(struct symbol *sym)
|
|
|
{
|
|
|
struct symbol *def_sym;
|
|
|
struct property *prop;
|
|
|
struct expr *e;
|
|
|
|
|
|
- /* first calculate all choice values' visibilities */
|
|
|
- prop = sym_get_choice_prop(sym);
|
|
|
- expr_list_for_each_sym(prop->expr, e, def_sym)
|
|
|
- sym_calc_visibility(def_sym);
|
|
|
-
|
|
|
- /* is the user choice visible? */
|
|
|
- def_sym = sym->def[S_DEF_USER].val;
|
|
|
- if (def_sym && def_sym->visible != no)
|
|
|
- return def_sym;
|
|
|
-
|
|
|
/* any of the defaults visible? */
|
|
|
for_all_defaults(sym, prop) {
|
|
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
|
@@ -258,11 +254,35 @@ static struct symbol *sym_calc_choice(struct symbol *sym)
|
|
|
if (def_sym->visible != no)
|
|
|
return def_sym;
|
|
|
|
|
|
- /* no choice? reset tristate value */
|
|
|
- sym->curr.tri = no;
|
|
|
+ /* failed to locate any defaults */
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+static struct symbol *sym_calc_choice(struct symbol *sym)
|
|
|
+{
|
|
|
+ struct symbol *def_sym;
|
|
|
+ struct property *prop;
|
|
|
+ struct expr *e;
|
|
|
+
|
|
|
+ /* first calculate all choice values' visibilities */
|
|
|
+ prop = sym_get_choice_prop(sym);
|
|
|
+ expr_list_for_each_sym(prop->expr, e, def_sym)
|
|
|
+ sym_calc_visibility(def_sym);
|
|
|
+
|
|
|
+ /* is the user choice visible? */
|
|
|
+ def_sym = sym->def[S_DEF_USER].val;
|
|
|
+ if (def_sym && def_sym->visible != no)
|
|
|
+ return def_sym;
|
|
|
+
|
|
|
+ def_sym = sym_choice_default(sym);
|
|
|
+
|
|
|
+ if (def_sym == NULL)
|
|
|
+ /* no choice? reset tristate value */
|
|
|
+ sym->curr.tri = no;
|
|
|
+
|
|
|
+ return def_sym;
|
|
|
+}
|
|
|
+
|
|
|
void sym_calc_value(struct symbol *sym)
|
|
|
{
|
|
|
struct symbol_value newval, oldval;
|