summaryrefslogtreecommitdiff
path: root/scripts/kconfig/expr.c
Unidiff
Diffstat (limited to 'scripts/kconfig/expr.c') (more/less context) (show whitespace changes)
-rw-r--r--scripts/kconfig/expr.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
index d1af2a5..3f15ae8 100644
--- a/scripts/kconfig/expr.c
+++ b/scripts/kconfig/expr.c
@@ -56,4 +56,11 @@ struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
56} 56}
57 57
58struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
59{
60 if (!e1)
61 return e2;
62 return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
63}
64
58struct expr *expr_copy(struct expr *org) 65struct expr *expr_copy(struct expr *org)
59{ 66{
@@ -159,7 +166,20 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
159void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) 166void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
160{ 167{
161 if (!e1 || !e2 || e1->type != e2->type) 168 if (!e1 || !e2)
162 return; 169 return;
170 switch (e1->type) {
171 case E_OR:
172 case E_AND:
163 __expr_eliminate_eq(e1->type, ep1, ep2); 173 __expr_eliminate_eq(e1->type, ep1, ep2);
174 default:
175 ;
176 }
177 if (e1->type != e2->type) switch (e2->type) {
178 case E_OR:
179 case E_AND:
180 __expr_eliminate_eq(e2->type, ep1, ep2);
181 default:
182 ;
183 }
164 e1 = expr_eliminate_yn(e1); 184 e1 = expr_eliminate_yn(e1);
165 e2 = expr_eliminate_yn(e2); 185 e2 = expr_eliminate_yn(e2);
@@ -196,4 +216,5 @@ int expr_eq(struct expr *e1, struct expr *e2)
196 return res; 216 return res;
197 case E_CHOICE: 217 case E_CHOICE:
218 case E_RANGE:
198 case E_NONE: 219 case E_NONE:
199 /* panic */; 220 /* panic */;
@@ -898,4 +919,5 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
898 return expr_alloc_comp(type, e->left.sym, sym); 919 return expr_alloc_comp(type, e->left.sym, sym);
899 case E_CHOICE: 920 case E_CHOICE:
921 case E_RANGE:
900 case E_NONE: 922 case E_NONE:
901 /* panic */; 923 /* panic */;
@@ -915,5 +937,5 @@ tristate expr_calc_value(struct expr *e)
915 case E_SYMBOL: 937 case E_SYMBOL:
916 sym_calc_value(e->left.sym); 938 sym_calc_value(e->left.sym);
917 return S_TRI(e->left.sym->curr); 939 return e->left.sym->curr.tri;
918 case E_AND: 940 case E_AND:
919 val1 = expr_calc_value(e->left.expr); 941 val1 = expr_calc_value(e->left.expr);
@@ -1018,9 +1040,16 @@ void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, in
1018 break; 1040 break;
1019 case E_CHOICE: 1041 case E_CHOICE:
1042 fn(data, e->right.sym->name);
1020 if (e->left.expr) { 1043 if (e->left.expr) {
1021 expr_print(e->left.expr, fn, data, E_CHOICE);
1022 fn(data, " ^ "); 1044 fn(data, " ^ ");
1045 expr_print(e->left.expr, fn, data, E_CHOICE);
1023 } 1046 }
1047 break;
1048 case E_RANGE:
1049 fn(data, "[");
1050 fn(data, e->left.sym->name);
1051 fn(data, " ");
1024 fn(data, e->right.sym->name); 1052 fn(data, e->right.sym->name);
1053 fn(data, "]");
1025 break; 1054 break;
1026 default: 1055 default: