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>
This commit is contained in:
Denys Vlasenko 2018-01-28 20:13:33 +01:00
parent 675d24aeaf
commit f19e3c1c6c
9 changed files with 57 additions and 14 deletions

View File

@ -0,0 +1,5 @@
1 1
1 1
1 1
1 1
Ok:0

View File

@ -0,0 +1,5 @@
echo 1 $((0++1))
echo 1 $((0--1))
x=-1; echo 1 $((0-$x))
x=+1; echo 1 $((0+$x))
echo Ok:$?

View File

@ -126,6 +126,10 @@ ghi
./arith2.sub: line 5: arithmetic syntax error ./arith2.sub: line 5: arithmetic syntax error
5 5 5 5
1 1 1 1
6 6
2 2
3 3
1 1
4 4 4 4
0 0 0 0
./arith2.sub: line 42: arithmetic syntax error ./arith2.sub: line 42: arithmetic syntax error

View File

@ -23,14 +23,14 @@
echo 5 $(( 4 + ++a )) echo 5 $(( 4 + ++a ))
echo 1 $a echo 1 $a
# ash doesn't handle it right... # this is treated as 4 + ++a
#ash# echo 6 $(( 4+++a )) echo 6 $(( 4+++a ))
#ash# echo 2 $a echo 2 $a
a=2 a=2
# ash doesn't handle it right... # this is treated as 4 - --a
#ash# echo 3 $(( 4---a )) echo 3 $(( 4---a ))
#ash# echo 1 $a echo 1 $a
a=1 a=1
echo 4 $(( 4 - -- a )) echo 4 $(( 4 - -- a ))

View File

@ -0,0 +1,5 @@
1 1
1 1
1 1
1 1
Ok:0

View File

@ -0,0 +1,5 @@
echo 1 $((0++1))
echo 1 $((0--1))
x=-1; echo 1 $((0-$x))
x=+1; echo 1 $((0+$x))
echo Ok:$?

View File

@ -135,6 +135,10 @@ hush: arithmetic syntax error
hush: arithmetic syntax error hush: arithmetic syntax error
5 5 5 5
1 1 1 1
6 6
2 2
3 3
1 1
4 4 4 4
0 0 0 0
hush: arithmetic syntax error hush: arithmetic syntax error

View File

@ -23,14 +23,14 @@
echo 5 $(( 4 + ++a )) echo 5 $(( 4 + ++a ))
echo 1 $a echo 1 $a
# ash doesn't handle it right... # this is treated as 4 + ++a
#ash# echo 6 $(( 4+++a )) echo 6 $(( 4+++a ))
#ash# echo 2 $a echo 2 $a
a=2 a=2
# ash doesn't handle it right... # this is treated as 4 - --a
#ash# echo 3 $(( 4---a )) echo 3 $(( 4---a ))
#ash# echo 1 $a echo 1 $a
a=1 a=1
echo 4 $(( 4 - -- a )) echo 4 $(( 4 - -- a ))

View File

@ -598,10 +598,24 @@ evaluate_string(arith_state_t *math_state, const char *expr)
} }
/* Should be an operator */ /* Should be an operator */
/* Special case: NUM-- and NUM++ are not recognized if NUM
* is a literal number, not a variable. IOW:
* "a+++v" is a++ + v.
* "7+++v" is 7 + ++v, not 7++ + v.
*/
if (lasttok == TOK_NUM && !numstackptr[-1].var /* number literal */
&& (expr[0] == '+' || expr[0] == '-')
&& (expr[1] == expr[0])
) {
//bb_error_msg("special %c%c", expr[0], expr[0]);
op = (expr[0] == '+' ? TOK_ADD : TOK_SUB);
expr += 1;
goto tok_found1;
}
p = op_tokens; p = op_tokens;
while (1) { while (1) {
// TODO: bash allows 7+++v, treats it as 7 + ++v
// we treat it as 7++ + v and reject
/* Compare expr to current op_tokens[] element */ /* Compare expr to current op_tokens[] element */
const char *e = expr; const char *e = expr;
while (1) { while (1) {
@ -627,6 +641,7 @@ evaluate_string(arith_state_t *math_state, const char *expr)
} }
tok_found: tok_found:
op = p[1]; /* fetch TOK_foo value */ op = p[1]; /* fetch TOK_foo value */
tok_found1:
/* NB: expr now points past the operator */ /* NB: expr now points past the operator */
/* post grammar: a++ reduce to num */ /* post grammar: a++ reduce to num */