Lines Matching refs:expr

16 static struct expr *expr_eliminate_yn(struct expr *e);
18 struct expr *expr_alloc_symbol(struct symbol *sym)
20 struct expr *e = xcalloc(1, sizeof(*e));
26 struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
28 struct expr *e = xcalloc(1, sizeof(*e));
30 e->left.expr = ce;
34 struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
36 struct expr *e = xcalloc(1, sizeof(*e));
38 e->left.expr = e1;
39 e->right.expr = e2;
43 struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
45 struct expr *e = xcalloc(1, sizeof(*e));
52 struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
59 struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
66 struct expr *expr_copy(const struct expr *org)
68 struct expr *e;
80 e->left.expr = expr_copy(org->left.expr);
94 e->left.expr = expr_copy(org->left.expr);
95 e->right.expr = expr_copy(org->right.expr);
107 void expr_free(struct expr *e)
116 expr_free(e->left.expr);
127 expr_free(e->left.expr);
128 expr_free(e->right.expr);
150 static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
155 __expr_eliminate_eq(type, &e1->left.expr, &e2);
156 __expr_eliminate_eq(type, &e1->right.expr, &e2);
160 __expr_eliminate_eq(type, &e1, &e2->left.expr);
161 __expr_eliminate_eq(type, &e1, &e2->right.expr);
221 void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
252 int expr_eq(struct expr *e1, struct expr *e2)
257 * A NULL expr is taken to be yes, but there's also a different way to
276 return expr_eq(e1->left.expr, e2->left.expr);
309 * expr && n -> n
310 * expr && y -> expr
311 * expr || n -> expr
312 * expr || y -> y
316 static struct expr *expr_eliminate_yn(struct expr *e)
318 struct expr *tmp;
322 e->left.expr = expr_eliminate_yn(e->left.expr);
323 e->right.expr = expr_eliminate_yn(e->right.expr);
324 if (e->left.expr->type == E_SYMBOL) {
325 if (e->left.expr->left.sym == &symbol_no) {
326 expr_free(e->left.expr);
327 expr_free(e->right.expr);
330 e->right.expr = NULL;
332 } else if (e->left.expr->left.sym == &symbol_yes) {
333 free(e->left.expr);
334 tmp = e->right.expr;
335 *e = *(e->right.expr);
340 if (e->right.expr->type == E_SYMBOL) {
341 if (e->right.expr->left.sym == &symbol_no) {
342 expr_free(e->left.expr);
343 expr_free(e->right.expr);
346 e->right.expr = NULL;
348 } else if (e->right.expr->left.sym == &symbol_yes) {
349 free(e->right.expr);
350 tmp = e->left.expr;
351 *e = *(e->left.expr);
358 e->left.expr = expr_eliminate_yn(e->left.expr);
359 e->right.expr = expr_eliminate_yn(e->right.expr);
360 if (e->left.expr->type == E_SYMBOL) {
361 if (e->left.expr->left.sym == &symbol_no) {
362 free(e->left.expr);
363 tmp = e->right.expr;
364 *e = *(e->right.expr);
367 } else if (e->left.expr->left.sym == &symbol_yes) {
368 expr_free(e->left.expr);
369 expr_free(e->right.expr);
372 e->right.expr = NULL;
376 if (e->right.expr->type == E_SYMBOL) {
377 if (e->right.expr->left.sym == &symbol_no) {
378 free(e->right.expr);
379 tmp = e->left.expr;
380 *e = *(e->left.expr);
383 } else if (e->right.expr->left.sym == &symbol_yes) {
384 expr_free(e->left.expr);
385 expr_free(e->right.expr);
388 e->right.expr = NULL;
402 struct expr *expr_trans_bool(struct expr *e)
410 e->left.expr = expr_trans_bool(e->left.expr);
411 e->right.expr = expr_trans_bool(e->right.expr);
431 static struct expr *expr_join_or(struct expr *e1, struct expr *e2)
433 struct expr *tmp;
443 tmp = e1->left.expr;
450 if (e2->left.expr->type != E_SYMBOL)
452 sym2 = e2->left.expr->left.sym;
480 if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) ||
481 (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL))
495 static struct expr *expr_join_and(struct expr *e1, struct expr *e2)
497 struct expr *tmp;
507 tmp = e1->left.expr;
514 if (e2->left.expr->type != E_SYMBOL)
516 sym2 = e2->left.expr->left.sym;
596 static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
600 struct expr *tmp;
605 expr_eliminate_dups1(type, &e1->left.expr, &e2);
606 expr_eliminate_dups1(type, &e1->right.expr, &e2);
610 expr_eliminate_dups1(type, &e1, &e2->left.expr);
611 expr_eliminate_dups1(type, &e1, &e2->right.expr);
664 struct expr *expr_eliminate_dups(struct expr *e)
694 struct expr *expr_transform(struct expr *e)
696 struct expr *tmp;
711 e->left.expr = expr_transform(e->left.expr);
712 e->right.expr = expr_transform(e->right.expr);
721 e->left.expr = expr_alloc_symbol(e->left.sym);
755 e->left.expr = expr_alloc_symbol(e->left.sym);
761 switch (e->left.expr->type) {
764 tmp = e->left.expr->left.expr;
765 free(e->left.expr);
773 tmp = e->left.expr;
781 tmp = e->left.expr;
789 tmp = e->left.expr;
796 tmp = e->left.expr;
798 e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
800 tmp->right.expr = NULL;
805 tmp = e->left.expr;
807 e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
809 tmp->right.expr = NULL;
813 if (e->left.expr->left.sym == &symbol_yes) {
815 tmp = e->left.expr;
822 if (e->left.expr->left.sym == &symbol_mod) {
824 tmp = e->left.expr;
831 if (e->left.expr->left.sym == &symbol_no) {
833 tmp = e->left.expr;
851 int expr_contains_symbol(struct expr *dep, struct symbol *sym)
859 return expr_contains_symbol(dep->left.expr, sym) ||
860 expr_contains_symbol(dep->right.expr, sym);
872 return expr_contains_symbol(dep->left.expr, sym);
879 bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
886 return expr_depends_symbol(dep->left.expr, sym) ||
887 expr_depends_symbol(dep->right.expr, sym);
922 struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
924 struct expr *e1, *e2;
934 e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
935 e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
944 e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
945 e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
954 return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
1030 tristate expr_calc_value(struct expr *e)
1046 val1 = expr_calc_value(e->left.expr);
1047 val2 = expr_calc_value(e->right.expr);
1050 val1 = expr_calc_value(e->left.expr);
1051 val2 = expr_calc_value(e->right.expr);
1054 val1 = expr_calc_value(e->left.expr);
1138 void expr_print(struct expr *e,
1158 expr_print(e->left.expr, fn, data, E_NOT);
1195 expr_print(e->left.expr, fn, data, E_OR);
1197 expr_print(e->right.expr, fn, data, E_OR);
1200 expr_print(e->left.expr, fn, data, E_AND);
1202 expr_print(e->right.expr, fn, data, E_AND);
1206 if (e->left.expr) {
1208 expr_print(e->left.expr, fn, data, E_LIST);
1235 void expr_fprint(struct expr *e, FILE *out)
1270 void expr_gstr_print(struct expr *e, struct gstr *gs)
1280 static void expr_print_revdep(struct expr *e,
1285 expr_print_revdep(e->left.expr, fn, data, pr_type, title);
1286 expr_print_revdep(e->right.expr, fn, data, pr_type, title);
1299 void expr_gstr_print_revdep(struct expr *e, struct gstr *gs,