diff options
author | Roman Zippel <zippel@linux-m68k.org> | 2008-01-13 22:50:23 -0500 |
---|---|---|
committer | Sam Ravnborg <sam@ravnborg.org> | 2008-01-28 17:14:39 -0500 |
commit | 7a962923359768e04137125bd479fd0dfa6117d3 (patch) | |
tree | 9da466ba7ee1806bd40a53496533fc1f0ddd6cc2 /scripts/kconfig | |
parent | 0ffce8d94487abbd332cd36f98db61b7c8a3db3c (diff) |
kconfig: explicitly introduce expression list
Rename E_CHOICE to E_LIST to explicitly add support for expression
lists. Add a helper macro expr_list_for_each_sym to more easily iterate
over the list.
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts/kconfig')
-rw-r--r-- | scripts/kconfig/confdata.c | 8 | ||||
-rw-r--r-- | scripts/kconfig/expr.c | 16 | ||||
-rw-r--r-- | scripts/kconfig/expr.h | 5 | ||||
-rw-r--r-- | scripts/kconfig/menu.c | 2 | ||||
-rw-r--r-- | scripts/kconfig/symbol.c | 13 |
5 files changed, 24 insertions, 20 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 497a19e85a07..ee5fe943d58d 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
@@ -312,7 +312,7 @@ load: | |||
312 | 312 | ||
313 | int conf_read(const char *name) | 313 | int conf_read(const char *name) |
314 | { | 314 | { |
315 | struct symbol *sym; | 315 | struct symbol *sym, *choice_sym; |
316 | struct property *prop; | 316 | struct property *prop; |
317 | struct expr *e; | 317 | struct expr *e; |
318 | int i, flags; | 318 | int i, flags; |
@@ -353,9 +353,9 @@ int conf_read(const char *name) | |||
353 | */ | 353 | */ |
354 | prop = sym_get_choice_prop(sym); | 354 | prop = sym_get_choice_prop(sym); |
355 | flags = sym->flags; | 355 | flags = sym->flags; |
356 | for (e = prop->expr; e; e = e->left.expr) | 356 | expr_list_for_each_sym(prop->expr, e, choice_sym) |
357 | if (e->right.sym->visible != no) | 357 | if (choice_sym->visible != no) |
358 | flags &= e->right.sym->flags; | 358 | flags &= choice_sym->flags; |
359 | sym->flags &= flags | ~SYMBOL_DEF_USER; | 359 | sym->flags &= flags | ~SYMBOL_DEF_USER; |
360 | } | 360 | } |
361 | 361 | ||
diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index c8793d1d908f..13788ada5228 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c | |||
@@ -87,7 +87,7 @@ struct expr *expr_copy(struct expr *org) | |||
87 | break; | 87 | break; |
88 | case E_AND: | 88 | case E_AND: |
89 | case E_OR: | 89 | case E_OR: |
90 | case E_CHOICE: | 90 | case E_LIST: |
91 | e->left.expr = expr_copy(org->left.expr); | 91 | e->left.expr = expr_copy(org->left.expr); |
92 | e->right.expr = expr_copy(org->right.expr); | 92 | e->right.expr = expr_copy(org->right.expr); |
93 | break; | 93 | break; |
@@ -217,7 +217,7 @@ int expr_eq(struct expr *e1, struct expr *e2) | |||
217 | expr_free(e2); | 217 | expr_free(e2); |
218 | trans_count = old_count; | 218 | trans_count = old_count; |
219 | return res; | 219 | return res; |
220 | case E_CHOICE: | 220 | case E_LIST: |
221 | case E_RANGE: | 221 | case E_RANGE: |
222 | case E_NONE: | 222 | case E_NONE: |
223 | /* panic */; | 223 | /* panic */; |
@@ -648,7 +648,7 @@ struct expr *expr_transform(struct expr *e) | |||
648 | case E_EQUAL: | 648 | case E_EQUAL: |
649 | case E_UNEQUAL: | 649 | case E_UNEQUAL: |
650 | case E_SYMBOL: | 650 | case E_SYMBOL: |
651 | case E_CHOICE: | 651 | case E_LIST: |
652 | break; | 652 | break; |
653 | default: | 653 | default: |
654 | e->left.expr = expr_transform(e->left.expr); | 654 | e->left.expr = expr_transform(e->left.expr); |
@@ -932,7 +932,7 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb | |||
932 | break; | 932 | break; |
933 | case E_SYMBOL: | 933 | case E_SYMBOL: |
934 | return expr_alloc_comp(type, e->left.sym, sym); | 934 | return expr_alloc_comp(type, e->left.sym, sym); |
935 | case E_CHOICE: | 935 | case E_LIST: |
936 | case E_RANGE: | 936 | case E_RANGE: |
937 | case E_NONE: | 937 | case E_NONE: |
938 | /* panic */; | 938 | /* panic */; |
@@ -1000,9 +1000,9 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2) | |||
1000 | if (t2 == E_OR) | 1000 | if (t2 == E_OR) |
1001 | return 1; | 1001 | return 1; |
1002 | case E_OR: | 1002 | case E_OR: |
1003 | if (t2 == E_CHOICE) | 1003 | if (t2 == E_LIST) |
1004 | return 1; | 1004 | return 1; |
1005 | case E_CHOICE: | 1005 | case E_LIST: |
1006 | if (t2 == 0) | 1006 | if (t2 == 0) |
1007 | return 1; | 1007 | return 1; |
1008 | default: | 1008 | default: |
@@ -1053,11 +1053,11 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char * | |||
1053 | fn(data, NULL, " && "); | 1053 | fn(data, NULL, " && "); |
1054 | expr_print(e->right.expr, fn, data, E_AND); | 1054 | expr_print(e->right.expr, fn, data, E_AND); |
1055 | break; | 1055 | break; |
1056 | case E_CHOICE: | 1056 | case E_LIST: |
1057 | fn(data, e->right.sym, e->right.sym->name); | 1057 | fn(data, e->right.sym, e->right.sym->name); |
1058 | if (e->left.expr) { | 1058 | if (e->left.expr) { |
1059 | fn(data, NULL, " ^ "); | 1059 | fn(data, NULL, " ^ "); |
1060 | expr_print(e->left.expr, fn, data, E_CHOICE); | 1060 | expr_print(e->left.expr, fn, data, E_LIST); |
1061 | } | 1061 | } |
1062 | break; | 1062 | break; |
1063 | case E_RANGE: | 1063 | case E_RANGE: |
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index 1ee8b1642d3b..b6f922c77e0b 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h | |||
@@ -31,7 +31,7 @@ typedef enum tristate { | |||
31 | } tristate; | 31 | } tristate; |
32 | 32 | ||
33 | enum expr_type { | 33 | enum expr_type { |
34 | E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE | 34 | E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, E_RANGE |
35 | }; | 35 | }; |
36 | 36 | ||
37 | union expr_data { | 37 | union expr_data { |
@@ -48,6 +48,9 @@ struct expr { | |||
48 | #define EXPR_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) | 48 | #define EXPR_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) |
49 | #define EXPR_NOT(dep) (2-(dep)) | 49 | #define EXPR_NOT(dep) (2-(dep)) |
50 | 50 | ||
51 | #define expr_list_for_each_sym(l, e, s) \ | ||
52 | for (e = (l); e && (s = e->right.sym); e = e->left.expr) | ||
53 | |||
51 | struct expr_value { | 54 | struct expr_value { |
52 | struct expr *expr; | 55 | struct expr *expr; |
53 | tristate tri; | 56 | tristate tri; |
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index e9deebe22eed..3637d1057e13 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c | |||
@@ -331,7 +331,7 @@ void menu_finalize(struct menu *parent) | |||
331 | prop = sym_get_choice_prop(sym); | 331 | prop = sym_get_choice_prop(sym); |
332 | for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) | 332 | for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) |
333 | ; | 333 | ; |
334 | *ep = expr_alloc_one(E_CHOICE, NULL); | 334 | *ep = expr_alloc_one(E_LIST, NULL); |
335 | (*ep)->right.sym = menu->sym; | 335 | (*ep)->right.sym = menu->sym; |
336 | } | 336 | } |
337 | if (menu->list && (!menu->prompt || !menu->prompt->text)) { | 337 | if (menu->list && (!menu->prompt || !menu->prompt->text)) { |
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index add068c8e513..a7dfc82fc858 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c | |||
@@ -247,8 +247,7 @@ static struct symbol *sym_calc_choice(struct symbol *sym) | |||
247 | 247 | ||
248 | /* just get the first visible value */ | 248 | /* just get the first visible value */ |
249 | prop = sym_get_choice_prop(sym); | 249 | prop = sym_get_choice_prop(sym); |
250 | for (e = prop->expr; e; e = e->left.expr) { | 250 | expr_list_for_each_sym(prop->expr, e, def_sym) { |
251 | def_sym = e->right.sym; | ||
252 | sym_calc_visibility(def_sym); | 251 | sym_calc_visibility(def_sym); |
253 | if (def_sym->visible != no) | 252 | if (def_sym->visible != no) |
254 | return def_sym; | 253 | return def_sym; |
@@ -361,12 +360,14 @@ void sym_calc_value(struct symbol *sym) | |||
361 | } | 360 | } |
362 | 361 | ||
363 | if (sym_is_choice(sym)) { | 362 | if (sym_is_choice(sym)) { |
363 | struct symbol *choice_sym; | ||
364 | int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); | 364 | int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); |
365 | |||
365 | prop = sym_get_choice_prop(sym); | 366 | prop = sym_get_choice_prop(sym); |
366 | for (e = prop->expr; e; e = e->left.expr) { | 367 | expr_list_for_each_sym(prop->expr, e, choice_sym) { |
367 | e->right.sym->flags |= flags; | 368 | choice_sym->flags |= flags; |
368 | if (flags & SYMBOL_CHANGED) | 369 | if (flags & SYMBOL_CHANGED) |
369 | sym_set_changed(e->right.sym); | 370 | sym_set_changed(choice_sym); |
370 | } | 371 | } |
371 | } | 372 | } |
372 | } | 373 | } |
@@ -849,7 +850,7 @@ struct property *prop_alloc(enum prop_type type, struct symbol *sym) | |||
849 | struct symbol *prop_get_symbol(struct property *prop) | 850 | struct symbol *prop_get_symbol(struct property *prop) |
850 | { | 851 | { |
851 | if (prop->expr && (prop->expr->type == E_SYMBOL || | 852 | if (prop->expr && (prop->expr->type == E_SYMBOL || |
852 | prop->expr->type == E_CHOICE)) | 853 | prop->expr->type == E_LIST)) |
853 | return prop->expr->left.sym; | 854 | return prop->expr->left.sym; |
854 | return NULL; | 855 | return NULL; |
855 | } | 856 | } |