[PATCH 1/3] explicitly introduce expression list

2008-01-13 Thread Roman Zippel

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 <[EMAIL PROTECTED]>

---
 scripts/kconfig/confdata.c |8 
 scripts/kconfig/expr.c |   16 
 scripts/kconfig/expr.h |5 -
 scripts/kconfig/menu.c |2 +-
 scripts/kconfig/symbol.c   |   13 +++--
 5 files changed, 24 insertions(+), 20 deletions(-)

Index: linux-2.6/scripts/kconfig/confdata.c
===
--- linux-2.6.orig/scripts/kconfig/confdata.c
+++ linux-2.6/scripts/kconfig/confdata.c
@@ -316,7 +316,7 @@ load:
 
 int conf_read(const char *name)
 {
-   struct symbol *sym;
+   struct symbol *sym, *choice_sym;
struct property *prop;
struct expr *e;
int i, flags;
@@ -357,9 +357,9 @@ int conf_read(const char *name)
 */
prop = sym_get_choice_prop(sym);
flags = sym->flags;
-   for (e = prop->expr; e; e = e->left.expr)
-   if (e->right.sym->visible != no)
-   flags &= e->right.sym->flags;
+   expr_list_for_each_sym(prop->expr, e, choice_sym)
+   if (choice_sym->visible != no)
+   flags &= choice_sym->flags;
sym->flags &= flags | ~SYMBOL_DEF_USER;
}
 
Index: linux-2.6/scripts/kconfig/expr.c
===
--- linux-2.6.orig/scripts/kconfig/expr.c
+++ linux-2.6/scripts/kconfig/expr.c
@@ -87,7 +87,7 @@ struct expr *expr_copy(struct expr *org)
break;
case E_AND:
case E_OR:
-   case E_CHOICE:
+   case E_LIST:
e->left.expr = expr_copy(org->left.expr);
e->right.expr = expr_copy(org->right.expr);
break;
@@ -217,7 +217,7 @@ int expr_eq(struct expr *e1, struct expr
expr_free(e2);
trans_count = old_count;
return res;
-   case E_CHOICE:
+   case E_LIST:
case E_RANGE:
case E_NONE:
/* panic */;
@@ -648,7 +648,7 @@ struct expr *expr_transform(struct expr 
case E_EQUAL:
case E_UNEQUAL:
case E_SYMBOL:
-   case E_CHOICE:
+   case E_LIST:
break;
default:
e->left.expr = expr_transform(e->left.expr);
@@ -932,7 +932,7 @@ struct expr *expr_trans_compare(struct e
break;
case E_SYMBOL:
return expr_alloc_comp(type, e->left.sym, sym);
-   case E_CHOICE:
+   case E_LIST:
case E_RANGE:
case E_NONE:
/* panic */;
@@ -1000,9 +1000,9 @@ int expr_compare_type(enum expr_type t1,
if (t2 == E_OR)
return 1;
case E_OR:
-   if (t2 == E_CHOICE)
+   if (t2 == E_LIST)
return 1;
-   case E_CHOICE:
+   case E_LIST:
if (t2 == 0)
return 1;
default:
@@ -1053,11 +1053,11 @@ void expr_print(struct expr *e, void (*f
fn(data, NULL, " && ");
expr_print(e->right.expr, fn, data, E_AND);
break;
-   case E_CHOICE:
+   case E_LIST:
fn(data, e->right.sym, e->right.sym->name);
if (e->left.expr) {
fn(data, NULL, " ^ ");
-   expr_print(e->left.expr, fn, data, E_CHOICE);
+   expr_print(e->left.expr, fn, data, E_LIST);
}
break;
case E_RANGE:
Index: linux-2.6/scripts/kconfig/expr.h
===
--- linux-2.6.orig/scripts/kconfig/expr.h
+++ linux-2.6/scripts/kconfig/expr.h
@@ -32,7 +32,7 @@ typedef enum tristate {
 } tristate;
 
 enum expr_type {
-   E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, 
E_RANGE
+   E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, 
E_RANGE
 };
 
 union expr_data {
@@ -49,6 +49,9 @@ struct expr {
 #define E_AND(dep1, dep2)  (((dep1)<(dep2))?(dep1):(dep2))
 #define E_NOT(dep) (2-(dep))
 
+#define expr_list_for_each_sym(l, e, s) \
+   for (e = (l); e && (s = e->right.sym); e = e->left.expr)
+
 struct expr_value {
struct expr *expr;
tristate tri;
Index: linux-2.6/scripts/kconfig/menu.c
===
--- linux-2.6.orig/scripts/kconfig/menu.c
+++ linux-2.6/scripts/kconfig/menu.c
@@ -331,7 +331,7 @@ void menu_finalize(struct menu *parent)
prop = sym_get_choice_prop(sym);
for (ep = >expr; *ep; ep = &(*ep)->left.expr)
;
-   *ep = 

[PATCH 1/3] explicitly introduce expression list

2008-01-13 Thread Roman Zippel

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 [EMAIL PROTECTED]

---
 scripts/kconfig/confdata.c |8 
 scripts/kconfig/expr.c |   16 
 scripts/kconfig/expr.h |5 -
 scripts/kconfig/menu.c |2 +-
 scripts/kconfig/symbol.c   |   13 +++--
 5 files changed, 24 insertions(+), 20 deletions(-)

Index: linux-2.6/scripts/kconfig/confdata.c
===
--- linux-2.6.orig/scripts/kconfig/confdata.c
+++ linux-2.6/scripts/kconfig/confdata.c
@@ -316,7 +316,7 @@ load:
 
 int conf_read(const char *name)
 {
-   struct symbol *sym;
+   struct symbol *sym, *choice_sym;
struct property *prop;
struct expr *e;
int i, flags;
@@ -357,9 +357,9 @@ int conf_read(const char *name)
 */
prop = sym_get_choice_prop(sym);
flags = sym-flags;
-   for (e = prop-expr; e; e = e-left.expr)
-   if (e-right.sym-visible != no)
-   flags = e-right.sym-flags;
+   expr_list_for_each_sym(prop-expr, e, choice_sym)
+   if (choice_sym-visible != no)
+   flags = choice_sym-flags;
sym-flags = flags | ~SYMBOL_DEF_USER;
}
 
Index: linux-2.6/scripts/kconfig/expr.c
===
--- linux-2.6.orig/scripts/kconfig/expr.c
+++ linux-2.6/scripts/kconfig/expr.c
@@ -87,7 +87,7 @@ struct expr *expr_copy(struct expr *org)
break;
case E_AND:
case E_OR:
-   case E_CHOICE:
+   case E_LIST:
e-left.expr = expr_copy(org-left.expr);
e-right.expr = expr_copy(org-right.expr);
break;
@@ -217,7 +217,7 @@ int expr_eq(struct expr *e1, struct expr
expr_free(e2);
trans_count = old_count;
return res;
-   case E_CHOICE:
+   case E_LIST:
case E_RANGE:
case E_NONE:
/* panic */;
@@ -648,7 +648,7 @@ struct expr *expr_transform(struct expr 
case E_EQUAL:
case E_UNEQUAL:
case E_SYMBOL:
-   case E_CHOICE:
+   case E_LIST:
break;
default:
e-left.expr = expr_transform(e-left.expr);
@@ -932,7 +932,7 @@ struct expr *expr_trans_compare(struct e
break;
case E_SYMBOL:
return expr_alloc_comp(type, e-left.sym, sym);
-   case E_CHOICE:
+   case E_LIST:
case E_RANGE:
case E_NONE:
/* panic */;
@@ -1000,9 +1000,9 @@ int expr_compare_type(enum expr_type t1,
if (t2 == E_OR)
return 1;
case E_OR:
-   if (t2 == E_CHOICE)
+   if (t2 == E_LIST)
return 1;
-   case E_CHOICE:
+   case E_LIST:
if (t2 == 0)
return 1;
default:
@@ -1053,11 +1053,11 @@ void expr_print(struct expr *e, void (*f
fn(data, NULL,   );
expr_print(e-right.expr, fn, data, E_AND);
break;
-   case E_CHOICE:
+   case E_LIST:
fn(data, e-right.sym, e-right.sym-name);
if (e-left.expr) {
fn(data, NULL,  ^ );
-   expr_print(e-left.expr, fn, data, E_CHOICE);
+   expr_print(e-left.expr, fn, data, E_LIST);
}
break;
case E_RANGE:
Index: linux-2.6/scripts/kconfig/expr.h
===
--- linux-2.6.orig/scripts/kconfig/expr.h
+++ linux-2.6/scripts/kconfig/expr.h
@@ -32,7 +32,7 @@ typedef enum tristate {
 } tristate;
 
 enum expr_type {
-   E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, 
E_RANGE
+   E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, 
E_RANGE
 };
 
 union expr_data {
@@ -49,6 +49,9 @@ struct expr {
 #define E_AND(dep1, dep2)  (((dep1)(dep2))?(dep1):(dep2))
 #define E_NOT(dep) (2-(dep))
 
+#define expr_list_for_each_sym(l, e, s) \
+   for (e = (l); e  (s = e-right.sym); e = e-left.expr)
+
 struct expr_value {
struct expr *expr;
tristate tri;
Index: linux-2.6/scripts/kconfig/menu.c
===
--- linux-2.6.orig/scripts/kconfig/menu.c
+++ linux-2.6/scripts/kconfig/menu.c
@@ -331,7 +331,7 @@ void menu_finalize(struct menu *parent)
prop = sym_get_choice_prop(sym);
for (ep = prop-expr; *ep; ep = (*ep)-left.expr)
;
-   *ep = expr_alloc_one(E_CHOICE, NULL);
+   *ep =