diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-28 20:13:33 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-28 20:13:33 +0100 |
commit | f19e3c1c6c96e3c709ac732ff70c586521f792d3 (patch) | |
tree | f2b16759f1eae8ac09205f0fb29f822d70610a36 /shell/math.c | |
parent | 675d24aeaff29dbce6dc116a4b7c9f6026ed5069 (diff) | |
download | busybox-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.c | 19 |
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 */ |