Lines Matching +full:- +full:e
2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
15 static struct expr *expr_eliminate_yn(struct expr *e);
19 struct expr *e = xcalloc(1, sizeof(*e)); in expr_alloc_symbol() local
20 e->type = E_SYMBOL; in expr_alloc_symbol()
21 e->left.sym = sym; in expr_alloc_symbol()
22 return e; in expr_alloc_symbol()
27 struct expr *e = xcalloc(1, sizeof(*e)); in expr_alloc_one() local
28 e->type = type; in expr_alloc_one()
29 e->left.expr = ce; in expr_alloc_one()
30 return e; in expr_alloc_one()
35 struct expr *e = xcalloc(1, sizeof(*e)); in expr_alloc_two() local
36 e->type = type; in expr_alloc_two()
37 e->left.expr = e1; in expr_alloc_two()
38 e->right.expr = e2; in expr_alloc_two()
39 return e; in expr_alloc_two()
44 struct expr *e = xcalloc(1, sizeof(*e)); in expr_alloc_comp() local
45 e->type = type; in expr_alloc_comp()
46 e->left.sym = s1; in expr_alloc_comp()
47 e->right.sym = s2; in expr_alloc_comp()
48 return e; in expr_alloc_comp()
67 struct expr *e; in expr_copy() local
72 e = xmalloc(sizeof(*org)); in expr_copy()
73 memcpy(e, org, sizeof(*org)); in expr_copy()
74 switch (org->type) { in expr_copy()
76 e->left = org->left; in expr_copy()
79 e->left.expr = expr_copy(org->left.expr); in expr_copy()
87 e->left.sym = org->left.sym; in expr_copy()
88 e->right.sym = org->right.sym; in expr_copy()
93 e->left.expr = expr_copy(org->left.expr); in expr_copy()
94 e->right.expr = expr_copy(org->right.expr); in expr_copy()
97 printf("can't copy type %d\n", e->type); in expr_copy()
98 free(e); in expr_copy()
99 e = NULL; in expr_copy()
103 return e; in expr_copy()
106 void expr_free(struct expr *e) in expr_free() argument
108 if (!e) in expr_free()
111 switch (e->type) { in expr_free()
115 expr_free(e->left.expr); in expr_free()
126 expr_free(e->left.expr); in expr_free()
127 expr_free(e->right.expr); in expr_free()
130 printf("how to free type %d?\n", e->type); in expr_free()
133 free(e); in expr_free()
143 if (e1->type == type) { in __expr_eliminate_eq()
144 __expr_eliminate_eq(type, &e1->left.expr, &e2); in __expr_eliminate_eq()
145 __expr_eliminate_eq(type, &e1->right.expr, &e2); in __expr_eliminate_eq()
148 if (e2->type == type) { in __expr_eliminate_eq()
149 __expr_eliminate_eq(type, &e1, &e2->left.expr); in __expr_eliminate_eq()
150 __expr_eliminate_eq(type, &e1, &e2->right.expr); in __expr_eliminate_eq()
153 if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && in __expr_eliminate_eq()
154 e1->left.sym == e2->left.sym && in __expr_eliminate_eq()
155 (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) in __expr_eliminate_eq()
179 switch (e1->type) { in expr_eliminate_eq()
182 __expr_eliminate_eq(e1->type, ep1, ep2); in expr_eliminate_eq()
186 if (e1->type != e2->type) switch (e2->type) { in expr_eliminate_eq()
189 __expr_eliminate_eq(e2->type, ep1, ep2); in expr_eliminate_eq()
204 if (e1->type != e2->type) in expr_eq()
206 switch (e1->type) { in expr_eq()
213 return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; in expr_eq()
215 return e1->left.sym == e2->left.sym; in expr_eq()
217 return expr_eq(e1->left.expr, e2->left.expr); in expr_eq()
224 res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && in expr_eq()
225 e1->left.sym == e2->left.sym); in expr_eq()
246 static struct expr *expr_eliminate_yn(struct expr *e) in expr_eliminate_yn() argument
250 if (e) switch (e->type) { in expr_eliminate_yn()
252 e->left.expr = expr_eliminate_yn(e->left.expr); in expr_eliminate_yn()
253 e->right.expr = expr_eliminate_yn(e->right.expr); in expr_eliminate_yn()
254 if (e->left.expr->type == E_SYMBOL) { in expr_eliminate_yn()
255 if (e->left.expr->left.sym == &symbol_no) { in expr_eliminate_yn()
256 expr_free(e->left.expr); in expr_eliminate_yn()
257 expr_free(e->right.expr); in expr_eliminate_yn()
258 e->type = E_SYMBOL; in expr_eliminate_yn()
259 e->left.sym = &symbol_no; in expr_eliminate_yn()
260 e->right.expr = NULL; in expr_eliminate_yn()
261 return e; in expr_eliminate_yn()
262 } else if (e->left.expr->left.sym == &symbol_yes) { in expr_eliminate_yn()
263 free(e->left.expr); in expr_eliminate_yn()
264 tmp = e->right.expr; in expr_eliminate_yn()
265 *e = *(e->right.expr); in expr_eliminate_yn()
267 return e; in expr_eliminate_yn()
270 if (e->right.expr->type == E_SYMBOL) { in expr_eliminate_yn()
271 if (e->right.expr->left.sym == &symbol_no) { in expr_eliminate_yn()
272 expr_free(e->left.expr); in expr_eliminate_yn()
273 expr_free(e->right.expr); in expr_eliminate_yn()
274 e->type = E_SYMBOL; in expr_eliminate_yn()
275 e->left.sym = &symbol_no; in expr_eliminate_yn()
276 e->right.expr = NULL; in expr_eliminate_yn()
277 return e; in expr_eliminate_yn()
278 } else if (e->right.expr->left.sym == &symbol_yes) { in expr_eliminate_yn()
279 free(e->right.expr); in expr_eliminate_yn()
280 tmp = e->left.expr; in expr_eliminate_yn()
281 *e = *(e->left.expr); in expr_eliminate_yn()
283 return e; in expr_eliminate_yn()
288 e->left.expr = expr_eliminate_yn(e->left.expr); in expr_eliminate_yn()
289 e->right.expr = expr_eliminate_yn(e->right.expr); in expr_eliminate_yn()
290 if (e->left.expr->type == E_SYMBOL) { in expr_eliminate_yn()
291 if (e->left.expr->left.sym == &symbol_no) { in expr_eliminate_yn()
292 free(e->left.expr); in expr_eliminate_yn()
293 tmp = e->right.expr; in expr_eliminate_yn()
294 *e = *(e->right.expr); in expr_eliminate_yn()
296 return e; in expr_eliminate_yn()
297 } else if (e->left.expr->left.sym == &symbol_yes) { in expr_eliminate_yn()
298 expr_free(e->left.expr); in expr_eliminate_yn()
299 expr_free(e->right.expr); in expr_eliminate_yn()
300 e->type = E_SYMBOL; in expr_eliminate_yn()
301 e->left.sym = &symbol_yes; in expr_eliminate_yn()
302 e->right.expr = NULL; in expr_eliminate_yn()
303 return e; in expr_eliminate_yn()
306 if (e->right.expr->type == E_SYMBOL) { in expr_eliminate_yn()
307 if (e->right.expr->left.sym == &symbol_no) { in expr_eliminate_yn()
308 free(e->right.expr); in expr_eliminate_yn()
309 tmp = e->left.expr; in expr_eliminate_yn()
310 *e = *(e->left.expr); in expr_eliminate_yn()
312 return e; in expr_eliminate_yn()
313 } else if (e->right.expr->left.sym == &symbol_yes) { in expr_eliminate_yn()
314 expr_free(e->left.expr); in expr_eliminate_yn()
315 expr_free(e->right.expr); in expr_eliminate_yn()
316 e->type = E_SYMBOL; in expr_eliminate_yn()
317 e->left.sym = &symbol_yes; in expr_eliminate_yn()
318 e->right.expr = NULL; in expr_eliminate_yn()
319 return e; in expr_eliminate_yn()
326 return e; in expr_eliminate_yn()
332 struct expr *expr_trans_bool(struct expr *e) in expr_trans_bool() argument
334 if (!e) in expr_trans_bool()
336 switch (e->type) { in expr_trans_bool()
340 e->left.expr = expr_trans_bool(e->left.expr); in expr_trans_bool()
341 e->right.expr = expr_trans_bool(e->right.expr); in expr_trans_bool()
344 // FOO!=n -> FOO in expr_trans_bool()
345 if (e->left.sym->type == S_TRISTATE) { in expr_trans_bool()
346 if (e->right.sym == &symbol_no) { in expr_trans_bool()
347 e->type = E_SYMBOL; in expr_trans_bool()
348 e->right.sym = NULL; in expr_trans_bool()
355 return e; in expr_trans_bool()
359 * e1 || e2 -> ?
368 if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) in expr_join_or()
370 if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) in expr_join_or()
372 if (e1->type == E_NOT) { in expr_join_or()
373 tmp = e1->left.expr; in expr_join_or()
374 if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) in expr_join_or()
376 sym1 = tmp->left.sym; in expr_join_or()
378 sym1 = e1->left.sym; in expr_join_or()
379 if (e2->type == E_NOT) { in expr_join_or()
380 if (e2->left.expr->type != E_SYMBOL) in expr_join_or()
382 sym2 = e2->left.expr->left.sym; in expr_join_or()
384 sym2 = e2->left.sym; in expr_join_or()
387 if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) in expr_join_or()
389 if (sym1->type == S_TRISTATE) { in expr_join_or()
390 if (e1->type == E_EQUAL && e2->type == E_EQUAL && in expr_join_or()
391 ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || in expr_join_or()
392 (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { in expr_join_or()
393 // (a='y') || (a='m') -> (a!='n') in expr_join_or()
396 if (e1->type == E_EQUAL && e2->type == E_EQUAL && in expr_join_or()
397 ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || in expr_join_or()
398 (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { in expr_join_or()
399 // (a='y') || (a='n') -> (a!='m') in expr_join_or()
402 if (e1->type == E_EQUAL && e2->type == E_EQUAL && in expr_join_or()
403 ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || in expr_join_or()
404 (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { in expr_join_or()
405 // (a='m') || (a='n') -> (a!='y') in expr_join_or()
409 if (sym1->type == S_BOOLEAN && sym1 == sym2) { in expr_join_or()
410 if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || in expr_join_or()
411 (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) in expr_join_or()
432 if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) in expr_join_and()
434 if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) in expr_join_and()
436 if (e1->type == E_NOT) { in expr_join_and()
437 tmp = e1->left.expr; in expr_join_and()
438 if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) in expr_join_and()
440 sym1 = tmp->left.sym; in expr_join_and()
442 sym1 = e1->left.sym; in expr_join_and()
443 if (e2->type == E_NOT) { in expr_join_and()
444 if (e2->left.expr->type != E_SYMBOL) in expr_join_and()
446 sym2 = e2->left.expr->left.sym; in expr_join_and()
448 sym2 = e2->left.sym; in expr_join_and()
451 if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) in expr_join_and()
454 if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || in expr_join_and()
455 (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) in expr_join_and()
456 // (a) && (a='y') -> (a='y') in expr_join_and()
459 if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || in expr_join_and()
460 (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) in expr_join_and()
461 // (a) && (a!='n') -> (a) in expr_join_and()
464 if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || in expr_join_and()
465 (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) in expr_join_and()
466 // (a) && (a!='m') -> (a='y') in expr_join_and()
469 if (sym1->type == S_TRISTATE) { in expr_join_and()
470 if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { in expr_join_and()
471 // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' in expr_join_and()
472 sym2 = e1->right.sym; in expr_join_and()
473 if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) in expr_join_and()
474 return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) in expr_join_and()
477 if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { in expr_join_and()
478 // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' in expr_join_and()
479 sym2 = e2->right.sym; in expr_join_and()
480 if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) in expr_join_and()
481 return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) in expr_join_and()
484 if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && in expr_join_and()
485 ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || in expr_join_and()
486 (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) in expr_join_and()
487 // (a!='y') && (a!='n') -> (a='m') in expr_join_and()
490 if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && in expr_join_and()
491 ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || in expr_join_and()
492 (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) in expr_join_and()
493 // (a!='y') && (a!='m') -> (a='n') in expr_join_and()
496 if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && in expr_join_and()
497 ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || in expr_join_and()
498 (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) in expr_join_and()
499 // (a!='m') && (a!='n') -> (a='m') in expr_join_and()
502 if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || in expr_join_and()
503 (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || in expr_join_and()
504 (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || in expr_join_and()
505 (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) in expr_join_and()
525 if (e1->type == type) { in expr_eliminate_dups1()
526 expr_eliminate_dups1(type, &e1->left.expr, &e2); in expr_eliminate_dups1()
527 expr_eliminate_dups1(type, &e1->right.expr, &e2); in expr_eliminate_dups1()
530 if (e2->type == type) { in expr_eliminate_dups1()
531 expr_eliminate_dups1(type, &e1, &e2->left.expr); in expr_eliminate_dups1()
532 expr_eliminate_dups1(type, &e1, &e2->right.expr); in expr_eliminate_dups1()
538 switch (e1->type) { in expr_eliminate_dups1()
540 expr_eliminate_dups1(e1->type, &e1, &e1); in expr_eliminate_dups1()
571 struct expr *expr_eliminate_dups(struct expr *e) in expr_eliminate_dups() argument
574 if (!e) in expr_eliminate_dups()
575 return e; in expr_eliminate_dups()
580 switch (e->type) { in expr_eliminate_dups()
582 expr_eliminate_dups1(e->type, &e, &e); in expr_eliminate_dups()
588 e = expr_eliminate_yn(e); in expr_eliminate_dups()
591 return e; in expr_eliminate_dups()
594 struct expr *expr_transform(struct expr *e) in expr_transform() argument
598 if (!e) in expr_transform()
600 switch (e->type) { in expr_transform()
611 e->left.expr = expr_transform(e->left.expr); in expr_transform()
612 e->right.expr = expr_transform(e->right.expr); in expr_transform()
615 switch (e->type) { in expr_transform()
617 if (e->left.sym->type != S_BOOLEAN) in expr_transform()
619 if (e->right.sym == &symbol_no) { in expr_transform()
620 e->type = E_NOT; in expr_transform()
621 e->left.expr = expr_alloc_symbol(e->left.sym); in expr_transform()
622 e->right.sym = NULL; in expr_transform()
625 if (e->right.sym == &symbol_mod) { in expr_transform()
626 printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); in expr_transform()
627 e->type = E_SYMBOL; in expr_transform()
628 e->left.sym = &symbol_no; in expr_transform()
629 e->right.sym = NULL; in expr_transform()
632 if (e->right.sym == &symbol_yes) { in expr_transform()
633 e->type = E_SYMBOL; in expr_transform()
634 e->right.sym = NULL; in expr_transform()
639 if (e->left.sym->type != S_BOOLEAN) in expr_transform()
641 if (e->right.sym == &symbol_no) { in expr_transform()
642 e->type = E_SYMBOL; in expr_transform()
643 e->right.sym = NULL; in expr_transform()
646 if (e->right.sym == &symbol_mod) { in expr_transform()
647 printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); in expr_transform()
648 e->type = E_SYMBOL; in expr_transform()
649 e->left.sym = &symbol_yes; in expr_transform()
650 e->right.sym = NULL; in expr_transform()
653 if (e->right.sym == &symbol_yes) { in expr_transform()
654 e->type = E_NOT; in expr_transform()
655 e->left.expr = expr_alloc_symbol(e->left.sym); in expr_transform()
656 e->right.sym = NULL; in expr_transform()
661 switch (e->left.expr->type) { in expr_transform()
663 // !!a -> a in expr_transform()
664 tmp = e->left.expr->left.expr; in expr_transform()
665 free(e->left.expr); in expr_transform()
666 free(e); in expr_transform()
667 e = tmp; in expr_transform()
668 e = expr_transform(e); in expr_transform()
672 // !a='x' -> a!='x' in expr_transform()
673 tmp = e->left.expr; in expr_transform()
674 free(e); in expr_transform()
675 e = tmp; in expr_transform()
676 e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; in expr_transform()
680 // !a<='x' -> a>'x' in expr_transform()
681 tmp = e->left.expr; in expr_transform()
682 free(e); in expr_transform()
683 e = tmp; in expr_transform()
684 e->type = e->type == E_LEQ ? E_GTH : E_LTH; in expr_transform()
688 // !a<'x' -> a>='x' in expr_transform()
689 tmp = e->left.expr; in expr_transform()
690 free(e); in expr_transform()
691 e = tmp; in expr_transform()
692 e->type = e->type == E_LTH ? E_GEQ : E_LEQ; in expr_transform()
695 // !(a || b) -> !a && !b in expr_transform()
696 tmp = e->left.expr; in expr_transform()
697 e->type = E_AND; in expr_transform()
698 e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); in expr_transform()
699 tmp->type = E_NOT; in expr_transform()
700 tmp->right.expr = NULL; in expr_transform()
701 e = expr_transform(e); in expr_transform()
704 // !(a && b) -> !a || !b in expr_transform()
705 tmp = e->left.expr; in expr_transform()
706 e->type = E_OR; in expr_transform()
707 e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); in expr_transform()
708 tmp->type = E_NOT; in expr_transform()
709 tmp->right.expr = NULL; in expr_transform()
710 e = expr_transform(e); in expr_transform()
713 if (e->left.expr->left.sym == &symbol_yes) { in expr_transform()
714 // !'y' -> 'n' in expr_transform()
715 tmp = e->left.expr; in expr_transform()
716 free(e); in expr_transform()
717 e = tmp; in expr_transform()
718 e->type = E_SYMBOL; in expr_transform()
719 e->left.sym = &symbol_no; in expr_transform()
722 if (e->left.expr->left.sym == &symbol_mod) { in expr_transform()
723 // !'m' -> 'm' in expr_transform()
724 tmp = e->left.expr; in expr_transform()
725 free(e); in expr_transform()
726 e = tmp; in expr_transform()
727 e->type = E_SYMBOL; in expr_transform()
728 e->left.sym = &symbol_mod; in expr_transform()
731 if (e->left.expr->left.sym == &symbol_no) { in expr_transform()
732 // !'n' -> 'y' in expr_transform()
733 tmp = e->left.expr; in expr_transform()
734 free(e); in expr_transform()
735 e = tmp; in expr_transform()
736 e->type = E_SYMBOL; in expr_transform()
737 e->left.sym = &symbol_yes; in expr_transform()
748 return e; in expr_transform()
756 switch (dep->type) { in expr_contains_symbol()
759 return expr_contains_symbol(dep->left.expr, sym) || in expr_contains_symbol()
760 expr_contains_symbol(dep->right.expr, sym); in expr_contains_symbol()
762 return dep->left.sym == sym; in expr_contains_symbol()
769 return dep->left.sym == sym || in expr_contains_symbol()
770 dep->right.sym == sym; in expr_contains_symbol()
772 return expr_contains_symbol(dep->left.expr, sym); in expr_contains_symbol()
784 switch (dep->type) { in expr_depends_symbol()
786 return expr_depends_symbol(dep->left.expr, sym) || in expr_depends_symbol()
787 expr_depends_symbol(dep->right.expr, sym); in expr_depends_symbol()
789 return dep->left.sym == sym; in expr_depends_symbol()
791 if (dep->left.sym == sym) { in expr_depends_symbol()
792 if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) in expr_depends_symbol()
797 if (dep->left.sym == sym) { in expr_depends_symbol()
798 if (dep->right.sym == &symbol_no) in expr_depends_symbol()
808 struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) in expr_trans_compare() argument
812 if (!e) { in expr_trans_compare()
813 e = expr_alloc_symbol(sym); in expr_trans_compare()
815 e = expr_alloc_one(E_NOT, e); in expr_trans_compare()
816 return e; in expr_trans_compare()
818 switch (e->type) { in expr_trans_compare()
820 e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); in expr_trans_compare()
821 e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); in expr_trans_compare()
823 e = expr_alloc_two(E_AND, e1, e2); in expr_trans_compare()
825 e = expr_alloc_two(E_OR, e1, e2); in expr_trans_compare()
827 e = expr_alloc_one(E_NOT, e); in expr_trans_compare()
828 return e; in expr_trans_compare()
830 e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); in expr_trans_compare()
831 e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); in expr_trans_compare()
833 e = expr_alloc_two(E_OR, e1, e2); in expr_trans_compare()
835 e = expr_alloc_two(E_AND, e1, e2); in expr_trans_compare()
837 e = expr_alloc_one(E_NOT, e); in expr_trans_compare()
838 return e; in expr_trans_compare()
840 return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); in expr_trans_compare()
849 return expr_copy(e); in expr_trans_compare()
853 return expr_alloc_one(E_NOT, expr_copy(e)); in expr_trans_compare()
856 return expr_alloc_one(E_NOT, expr_copy(e)); in expr_trans_compare()
860 return expr_copy(e); in expr_trans_compare()
864 return expr_alloc_comp(type, e->left.sym, sym); in expr_trans_compare()
898 val->s = strtoll(str, &tail, 10); in expr_parse_string()
902 val->u = strtoull(str, &tail, 16); in expr_parse_string()
907 val->s = strtoll(str, &tail, 0); in expr_parse_string()
913 return !errno && !*tail && tail > str && isxdigit(tail[-1]) in expr_parse_string()
917 tristate expr_calc_value(struct expr *e) in expr_calc_value() argument
925 if (!e) in expr_calc_value()
928 switch (e->type) { in expr_calc_value()
930 sym_calc_value(e->left.sym); in expr_calc_value()
931 return e->left.sym->curr.tri; in expr_calc_value()
933 val1 = expr_calc_value(e->left.expr); in expr_calc_value()
934 val2 = expr_calc_value(e->right.expr); in expr_calc_value()
937 val1 = expr_calc_value(e->left.expr); in expr_calc_value()
938 val2 = expr_calc_value(e->right.expr); in expr_calc_value()
941 val1 = expr_calc_value(e->left.expr); in expr_calc_value()
951 printf("expr_calc_value: %d?\n", e->type); in expr_calc_value()
955 sym_calc_value(e->left.sym); in expr_calc_value()
956 sym_calc_value(e->right.sym); in expr_calc_value()
957 str1 = sym_get_string_value(e->left.sym); in expr_calc_value()
958 str2 = sym_get_string_value(e->right.sym); in expr_calc_value()
960 if (e->left.sym->type != S_STRING || e->right.sym->type != S_STRING) { in expr_calc_value()
961 k1 = expr_parse_string(str1, e->left.sym->type, &lval); in expr_calc_value()
962 k2 = expr_parse_string(str2, e->right.sym->type, &rval); in expr_calc_value()
968 if (e->type != E_EQUAL && e->type != E_UNEQUAL) { in expr_calc_value()
974 res = (lval.u > rval.u) - (lval.u < rval.u); in expr_calc_value()
976 res = (lval.s > rval.s) - (lval.s < rval.s); in expr_calc_value()
978 switch(e->type) { in expr_calc_value()
992 printf("expr_calc_value: relation %d?\n", e->type); in expr_calc_value()
1025 return -1; in expr_compare_type()
1032 expr_get_leftmost_symbol(const struct expr *e) in expr_get_leftmost_symbol() argument
1035 if (e == NULL) in expr_get_leftmost_symbol()
1038 while (e->type != E_SYMBOL) in expr_get_leftmost_symbol()
1039 e = e->left.expr; in expr_get_leftmost_symbol()
1041 return expr_copy(e); in expr_get_leftmost_symbol()
1046 * sub-expression of `e1' not containing 'e2.
1052 switch (e1->type) { in expr_simplify_unmet_dep()
1055 expr_simplify_unmet_dep(e1->left.expr, e2), in expr_simplify_unmet_dep()
1056 expr_simplify_unmet_dep(e1->right.expr, e2)); in expr_simplify_unmet_dep()
1058 struct expr *e; in expr_simplify_unmet_dep() local
1059 e = expr_alloc_and(expr_copy(e1), expr_copy(e2)); in expr_simplify_unmet_dep()
1060 e = expr_eliminate_dups(e); in expr_simplify_unmet_dep()
1061 ret = (!expr_eq(e, e1)) ? e1 : NULL; in expr_simplify_unmet_dep()
1062 expr_free(e); in expr_simplify_unmet_dep()
1073 void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int … in expr_print() argument
1075 if (!e) { in expr_print()
1080 if (expr_compare_type(prevtoken, e->type) > 0) in expr_print()
1082 switch (e->type) { in expr_print()
1084 if (e->left.sym->name) in expr_print()
1085 fn(data, e->left.sym, e->left.sym->name); in expr_print()
1091 expr_print(e->left.expr, fn, data, E_NOT); in expr_print()
1094 if (e->left.sym->name) in expr_print()
1095 fn(data, e->left.sym, e->left.sym->name); in expr_print()
1099 fn(data, e->right.sym, e->right.sym->name); in expr_print()
1103 if (e->left.sym->name) in expr_print()
1104 fn(data, e->left.sym, e->left.sym->name); in expr_print()
1107 fn(data, NULL, e->type == E_LEQ ? "<=" : "<"); in expr_print()
1108 fn(data, e->right.sym, e->right.sym->name); in expr_print()
1112 if (e->left.sym->name) in expr_print()
1113 fn(data, e->left.sym, e->left.sym->name); in expr_print()
1116 fn(data, NULL, e->type == E_GEQ ? ">=" : ">"); in expr_print()
1117 fn(data, e->right.sym, e->right.sym->name); in expr_print()
1120 if (e->left.sym->name) in expr_print()
1121 fn(data, e->left.sym, e->left.sym->name); in expr_print()
1125 fn(data, e->right.sym, e->right.sym->name); in expr_print()
1128 expr_print(e->left.expr, fn, data, E_OR); in expr_print()
1130 expr_print(e->right.expr, fn, data, E_OR); in expr_print()
1133 expr_print(e->left.expr, fn, data, E_AND); in expr_print()
1135 expr_print(e->right.expr, fn, data, E_AND); in expr_print()
1138 fn(data, e->right.sym, e->right.sym->name); in expr_print()
1139 if (e->left.expr) { in expr_print()
1141 expr_print(e->left.expr, fn, data, E_LIST); in expr_print()
1146 fn(data, e->left.sym, e->left.sym->name); in expr_print()
1148 fn(data, e->right.sym, e->right.sym->name); in expr_print()
1154 sprintf(buf, "<unknown type %d>", e->type); in expr_print()
1159 if (expr_compare_type(prevtoken, e->type) > 0) in expr_print()
1168 void expr_fprint(struct expr *e, FILE *out) in expr_fprint() argument
1170 expr_print(e, expr_print_file_helper, out, E_NONE); in expr_fprint()
1181 if (gs->max_width) { in expr_print_gstr_helper()
1183 const char *last_cr = strrchr(gs->s, '\n'); in expr_print_gstr_helper()
1190 last_cr = gs->s; in expr_print_gstr_helper()
1192 last_line_length = strlen(gs->s) - (last_cr - gs->s); in expr_print_gstr_helper()
1194 if ((last_line_length + extra_length) > gs->max_width) in expr_print_gstr_helper()
1199 if (sym && sym->type != S_UNKNOWN) in expr_print_gstr_helper()
1203 void expr_gstr_print(struct expr *e, struct gstr *gs) in expr_gstr_print() argument
1205 expr_print(e, expr_print_gstr_helper, gs, E_NONE); in expr_gstr_print()