diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-12 06:26:09 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-12 06:26:09 +0100 |
commit | 50de1043dc325c8e1adda94c6113607e741d4015 (patch) | |
tree | 46ffeb55fa3b5931bc1125858de6bf394487e5d4 /expressions.cpp | |
parent | 59eb0628db77e1145db797406e4de9f97b70d8e2 (diff) | |
download | sciteco-50de1043dc325c8e1adda94c6113607e741d4015.tar.gz |
various arithmetic expression fixes: SUB must have higher precedence than ADD; fixed num_sign (unary minus) handling
Diffstat (limited to 'expressions.cpp')
-rw-r--r-- | expressions.cpp | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/expressions.cpp b/expressions.cpp index 6999312..d9c5a1e 100644 --- a/expressions.cpp +++ b/expressions.cpp @@ -28,6 +28,11 @@ Expressions::push(gint64 number) push(OP_NUMBER); + if (num_sign < 0) { + set_num_sign(1); + number *= -1; + } + numbers.undo_pop(); return numbers.push(number); } @@ -61,7 +66,7 @@ Expressions::add_digit(gchar digit) { gint64 n = args() > 0 ? pop_num() : 0; - return push(n*radix + num_sign*(digit - '0')); + return push(n*radix + (n < 0 ? -1 : 1)*(digit - '0')); } Expressions::Operator @@ -106,11 +111,7 @@ Expressions::calc(void) gint64 vleft = pop_num(); switch (op) { - case OP_POW: - result = 1; - while (vright--) - result *= vleft; - break; + case OP_POW: for (result = 1; vright--; result *= vleft); break; case OP_MUL: result = vleft * vright; break; case OP_DIV: result = vleft / vright; break; case OP_MOD: result = vleft % vright; break; @@ -129,14 +130,11 @@ Expressions::calc(void) void Expressions::eval(bool pop_brace) { - if (numbers.items() < 2) - return; - for (;;) { gint n = first_op(); Operator op; - if (!n) + if (n < 2) break; op = operators.peek(n); |