aboutsummaryrefslogtreecommitdiffhomepage
path: root/expressions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'expressions.cpp')
-rw-r--r--expressions.cpp18
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);