aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kconfig/confdata.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kconfig/confdata.c')
-rw-r--r--scripts/kconfig/confdata.c78
1 files changed, 72 insertions, 6 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index ee5fe943d58d..df6a188b9930 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -222,10 +222,8 @@ load:
222 continue; 222 continue;
223 if (def == S_DEF_USER) { 223 if (def == S_DEF_USER) {
224 sym = sym_find(line + 9); 224 sym = sym_find(line + 9);
225 if (!sym) { 225 if (!sym)
226 conf_warning("trying to assign nonexistent symbol %s", line + 9);
227 break; 226 break;
228 }
229 } else { 227 } else {
230 sym = sym_lookup(line + 9, 0); 228 sym = sym_lookup(line + 9, 0);
231 if (sym->type == S_UNKNOWN) 229 if (sym->type == S_UNKNOWN)
@@ -261,10 +259,8 @@ load:
261 } 259 }
262 if (def == S_DEF_USER) { 260 if (def == S_DEF_USER) {
263 sym = sym_find(line + 7); 261 sym = sym_find(line + 7);
264 if (!sym) { 262 if (!sym)
265 conf_warning("trying to assign nonexistent symbol %s", line + 7);
266 break; 263 break;
267 }
268 } else { 264 } else {
269 sym = sym_lookup(line + 7, 0); 265 sym = sym_lookup(line + 7, 0);
270 if (sym->type == S_UNKNOWN) 266 if (sym->type == S_UNKNOWN)
@@ -812,3 +808,73 @@ void conf_set_changed_callback(void (*fn)(void))
812{ 808{
813 conf_changed_callback = fn; 809 conf_changed_callback = fn;
814} 810}
811
812
813void conf_set_all_new_symbols(enum conf_def_mode mode)
814{
815 struct symbol *sym, *csym;
816 struct property *prop;
817 struct expr *e;
818 int i, cnt, def;
819
820 for_all_symbols(i, sym) {
821 if (sym_has_value(sym))
822 continue;
823 switch (sym_get_type(sym)) {
824 case S_BOOLEAN:
825 case S_TRISTATE:
826 switch (mode) {
827 case def_yes:
828 sym->def[S_DEF_USER].tri = yes;
829 break;
830 case def_mod:
831 sym->def[S_DEF_USER].tri = mod;
832 break;
833 case def_no:
834 sym->def[S_DEF_USER].tri = no;
835 break;
836 case def_random:
837 sym->def[S_DEF_USER].tri = (tristate)(rand() % 3);
838 break;
839 default:
840 continue;
841 }
842 if (!sym_is_choice(sym) || mode != def_random)
843 sym->flags |= SYMBOL_DEF_USER;
844 break;
845 default:
846 break;
847 }
848
849 }
850
851 if (modules_sym)
852 sym_calc_value(modules_sym);
853
854 if (mode != def_random)
855 return;
856
857 for_all_symbols(i, csym) {
858 if (sym_has_value(csym) || !sym_is_choice(csym))
859 continue;
860
861 sym_calc_value(csym);
862 prop = sym_get_choice_prop(csym);
863 def = -1;
864 while (1) {
865 cnt = 0;
866 expr_list_for_each_sym(prop->expr, e, sym) {
867 if (sym->visible == no)
868 continue;
869 if (def == cnt++) {
870 csym->def[S_DEF_USER].val = sym;
871 break;
872 }
873 }
874 if (def >= 0 || cnt < 2)
875 break;
876 def = (rand() % cnt) + 1;
877 }
878 csym->flags |= SYMBOL_DEF_USER;
879 }
880}