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 | } | ||
