aboutsummaryrefslogtreecommitdiff
path: root/shell/math.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-01-28 20:13:33 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-01-28 20:13:33 +0100
commitf19e3c1c6c96e3c709ac732ff70c586521f792d3 (patch)
treef2b16759f1eae8ac09205f0fb29f822d70610a36 /shell/math.c
parent675d24aeaff29dbce6dc116a4b7c9f6026ed5069 (diff)
downloadbusybox-w32-f19e3c1c6c96e3c709ac732ff70c586521f792d3.tar.gz
busybox-w32-f19e3c1c6c96e3c709ac732ff70c586521f792d3.tar.bz2
busybox-w32-f19e3c1c6c96e3c709ac732ff70c586521f792d3.zip
shell: handle $((NUM++...) like bash does. Closes 10706
function old new delta evaluate_string 680 729 +49 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to '')
-rw-r--r--shell/math.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/shell/math.c b/shell/math.c
index f01f24362..611b3beab 100644
--- a/shell/math.c
+++ b/shell/math.c
@@ -598,10 +598,24 @@ evaluate_string(arith_state_t *math_state, const char *expr)
598 } 598 }
599 599
600 /* Should be an operator */ 600 /* Should be an operator */
601
602 /* Special case: NUM-- and NUM++ are not recognized if NUM
603 * is a literal number, not a variable. IOW:
604 * "a+++v" is a++ + v.
605 * "7+++v" is 7 + ++v, not 7++ + v.
606 */
607 if (lasttok == TOK_NUM && !numstackptr[-1].var /* number literal */
608 && (expr[0] == '+' || expr[0] == '-')
609 && (expr[1] == expr[0])
610 ) {
611 //bb_error_msg("special %c%c", expr[0], expr[0]);
612 op = (expr[0] == '+' ? TOK_ADD : TOK_SUB);
613 expr += 1;
614 goto tok_found1;
615 }
616
601 p = op_tokens; 617 p = op_tokens;
602 while (1) { 618 while (1) {
603// TODO: bash allows 7+++v, treats it as 7 + ++v
604// we treat it as 7++ + v and reject
605 /* Compare expr to current op_tokens[] element */ 619 /* Compare expr to current op_tokens[] element */
606 const char *e = expr; 620 const char *e = expr;
607 while (1) { 621 while (1) {
@@ -627,6 +641,7 @@ evaluate_string(arith_state_t *math_state, const char *expr)
627 } 641 }
628 tok_found: 642 tok_found:
629 op = p[1]; /* fetch TOK_foo value */ 643 op = p[1]; /* fetch TOK_foo value */
644 tok_found1:
630 /* NB: expr now points past the operator */ 645 /* NB: expr now points past the operator */
631 646
632 /* post grammar: a++ reduce to num */ 647 /* post grammar: a++ reduce to num */