|
@@ -812,3 +812,73 @@ void conf_set_changed_callback(void (*fn)(void))
|
|
|
{
|
|
|
conf_changed_callback = fn;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+void conf_set_all_new_symbols(enum conf_def_mode mode)
|
|
|
+{
|
|
|
+ struct symbol *sym, *csym;
|
|
|
+ struct property *prop;
|
|
|
+ struct expr *e;
|
|
|
+ int i, cnt, def;
|
|
|
+
|
|
|
+ for_all_symbols(i, sym) {
|
|
|
+ if (sym_has_value(sym))
|
|
|
+ continue;
|
|
|
+ switch (sym_get_type(sym)) {
|
|
|
+ case S_BOOLEAN:
|
|
|
+ case S_TRISTATE:
|
|
|
+ switch (mode) {
|
|
|
+ case def_yes:
|
|
|
+ sym->def[S_DEF_USER].tri = yes;
|
|
|
+ break;
|
|
|
+ case def_mod:
|
|
|
+ sym->def[S_DEF_USER].tri = mod;
|
|
|
+ break;
|
|
|
+ case def_no:
|
|
|
+ sym->def[S_DEF_USER].tri = no;
|
|
|
+ break;
|
|
|
+ case def_random:
|
|
|
+ sym->def[S_DEF_USER].tri = (tristate)(rand() % 3);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!sym_is_choice(sym) || mode != def_random)
|
|
|
+ sym->flags |= SYMBOL_DEF_USER;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (modules_sym)
|
|
|
+ sym_calc_value(modules_sym);
|
|
|
+
|
|
|
+ if (mode != def_random)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for_all_symbols(i, csym) {
|
|
|
+ if (sym_has_value(csym) || !sym_is_choice(csym))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ sym_calc_value(csym);
|
|
|
+ prop = sym_get_choice_prop(csym);
|
|
|
+ def = -1;
|
|
|
+ while (1) {
|
|
|
+ cnt = 0;
|
|
|
+ expr_list_for_each_sym(prop->expr, e, sym) {
|
|
|
+ if (sym->visible == no)
|
|
|
+ continue;
|
|
|
+ if (def == cnt++) {
|
|
|
+ csym->def[S_DEF_USER].val = sym;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (def >= 0 || cnt < 2)
|
|
|
+ break;
|
|
|
+ def = (rand() % cnt) + 1;
|
|
|
+ }
|
|
|
+ csym->flags |= SYMBOL_DEF_USER;
|
|
|
+ }
|
|
|
+}
|