diff options
Diffstat (limited to 'scripts/kconfig/confdata.c')
-rw-r--r-- | scripts/kconfig/confdata.c | 78 |
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 | |||
813 | void 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 | } | ||