Make the loop support stuff be much less evil, and make it cope
[oweals/busybox.git] / scripts / config / expr.c
index d1af2a5810dfc1b0b9e6c752d5cbcbb620b300f1..3f15ae859a5b291a657a8b2f00a6325250378710 100644 (file)
@@ -55,6 +55,13 @@ struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
        return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
 }
 
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
+{
+       if (!e1)
+               return e2;
+       return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
+}
+
 struct expr *expr_copy(struct expr *org)
 {
        struct expr *e;
@@ -158,9 +165,22 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
 
 void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
 {
-       if (!e1 || !e2 || e1->type != e2->type)
+       if (!e1 || !e2)
                return;
-       __expr_eliminate_eq(e1->type, ep1, ep2);
+       switch (e1->type) {
+       case E_OR:
+       case E_AND:
+               __expr_eliminate_eq(e1->type, ep1, ep2);
+       default:
+               ;
+       }
+       if (e1->type != e2->type) switch (e2->type) {
+       case E_OR:
+       case E_AND:
+               __expr_eliminate_eq(e2->type, ep1, ep2);
+       default:
+               ;
+       }
        e1 = expr_eliminate_yn(e1);
        e2 = expr_eliminate_yn(e2);
 }
@@ -195,6 +215,7 @@ int expr_eq(struct expr *e1, struct expr *e2)
                trans_count = old_count;
                return res;
        case E_CHOICE:
+       case E_RANGE:
        case E_NONE:
                /* panic */;
        }
@@ -897,6 +918,7 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
        case E_SYMBOL:
                return expr_alloc_comp(type, e->left.sym, sym);
        case E_CHOICE:
+       case E_RANGE:
        case E_NONE:
                /* panic */;
        }
@@ -914,7 +936,7 @@ tristate expr_calc_value(struct expr *e)
        switch (e->type) {
        case E_SYMBOL:
                sym_calc_value(e->left.sym);
-               return S_TRI(e->left.sym->curr);
+               return e->left.sym->curr.tri;
        case E_AND:
                val1 = expr_calc_value(e->left.expr);
                val2 = expr_calc_value(e->right.expr);
@@ -1017,11 +1039,18 @@ void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, in
                expr_print(e->right.expr, fn, data, E_AND);
                break;
        case E_CHOICE:
+               fn(data, e->right.sym->name);
                if (e->left.expr) {
-                       expr_print(e->left.expr, fn, data, E_CHOICE);
                        fn(data, " ^ ");
+                       expr_print(e->left.expr, fn, data, E_CHOICE);
                }
+               break;
+       case E_RANGE:
+               fn(data, "[");
+               fn(data, e->left.sym->name);
+               fn(data, " ");
                fn(data, e->right.sym->name);
+               fn(data, "]");
                break;
        default:
          {