* bool FOO!=n => FOO */
| 400 | * bool FOO!=n => FOO |
| 401 | */ |
| 402 | struct expr *expr_trans_bool(struct expr *e) |
| 403 | { |
| 404 | if (!e) |
| 405 | return NULL; |
| 406 | switch (e->type) { |
| 407 | case E_AND: |
| 408 | case E_OR: |
| 409 | case E_NOT: |
| 410 | e->left.expr = expr_trans_bool(e->left.expr); |
| 411 | e->right.expr = expr_trans_bool(e->right.expr); |
| 412 | break; |
| 413 | case E_UNEQUAL: |
| 414 | // FOO!=n -> FOO |
| 415 | if (e->left.sym->type == S_TRISTATE) { |
| 416 | if (e->right.sym == &symbol_no) { |
| 417 | e->type = E_SYMBOL; |
| 418 | e->right.sym = NULL; |
| 419 | } |
| 420 | } |
| 421 | break; |
| 422 | default: |
| 423 | ; |
| 424 | } |
| 425 | return e; |
| 426 | } |
| 427 | |
| 428 | /* |
| 429 | * e1 || e2 -> ? |