| 808 | /* Handle +, - operators. */ |
| 809 | |
| 810 | static VALUE * |
| 811 | eval3 (bool evaluate) |
| 812 | { |
| 813 | #ifdef EVAL_TRACE |
| 814 | trace ("eval3"); |
| 815 | #endif |
| 816 | VALUE *l = eval4 (evaluate); |
| 817 | while (true) |
| 818 | { |
| 819 | enum { plus, minus } fxn; |
| 820 | |
| 821 | if (nextarg ("+")) |
| 822 | fxn = plus; |
| 823 | else if (nextarg ("-")) |
| 824 | fxn = minus; |
| 825 | else |
| 826 | return l; |
| 827 | VALUE *r = eval4 (evaluate); |
| 828 | if (evaluate) |
| 829 | { |
| 830 | if (!toarith (l) || !toarith (r)) |
| 831 | error (EXPR_INVALID, 0, _("non-integer argument")); |
| 832 | (fxn == plus ? mpz_add : mpz_sub) (l->u.i, l->u.i, r->u.i); |
| 833 | } |
| 834 | freev (r); |
| 835 | } |
| 836 | } |
| 837 | |
| 838 | /* Handle comparisons. */ |
| 839 | |