* Performs various simplifications involving logical operators and * comparisons. * * Allocates and returns a new expression. */
| 692 | * Allocates and returns a new expression. |
| 693 | */ |
| 694 | struct expr *expr_transform(struct expr *e) |
| 695 | { |
| 696 | struct expr *tmp; |
| 697 | |
| 698 | if (!e) |
| 699 | return NULL; |
| 700 | switch (e->type) { |
| 701 | case E_EQUAL: |
| 702 | case E_GEQ: |
| 703 | case E_GTH: |
| 704 | case E_LEQ: |
| 705 | case E_LTH: |
| 706 | case E_UNEQUAL: |
| 707 | case E_SYMBOL: |
| 708 | case E_LIST: |
| 709 | break; |
| 710 | default: |
| 711 | e->left.expr = expr_transform(e->left.expr); |
| 712 | e->right.expr = expr_transform(e->right.expr); |
| 713 | } |
| 714 | |
| 715 | switch (e->type) { |
| 716 | case E_EQUAL: |
| 717 | if (e->left.sym->type != S_BOOLEAN) |
| 718 | break; |
| 719 | if (e->right.sym == &symbol_no) { |
| 720 | e->type = E_NOT; |
| 721 | e->left.expr = expr_alloc_symbol(e->left.sym); |
| 722 | e->right.sym = NULL; |
| 723 | break; |
| 724 | } |
| 725 | if (e->right.sym == &symbol_mod) { |
| 726 | printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); |
| 727 | e->type = E_SYMBOL; |
| 728 | e->left.sym = &symbol_no; |
| 729 | e->right.sym = NULL; |
| 730 | break; |
| 731 | } |
| 732 | if (e->right.sym == &symbol_yes) { |
| 733 | e->type = E_SYMBOL; |
| 734 | e->right.sym = NULL; |
| 735 | break; |
| 736 | } |
| 737 | break; |
| 738 | case E_UNEQUAL: |
| 739 | if (e->left.sym->type != S_BOOLEAN) |
| 740 | break; |
| 741 | if (e->right.sym == &symbol_no) { |
| 742 | e->type = E_SYMBOL; |
| 743 | e->right.sym = NULL; |
| 744 | break; |
| 745 | } |
| 746 | if (e->right.sym == &symbol_mod) { |
| 747 | printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); |
| 748 | e->type = E_SYMBOL; |
| 749 | e->left.sym = &symbol_yes; |
| 750 | e->right.sym = NULL; |
| 751 | break; |
no test coverage detected