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:
parent
675d24aeaf
commit
f19e3c1c6c
5
shell/ash_test/ash-arith/arith-postinc.right
Normal file
5
shell/ash_test/ash-arith/arith-postinc.right
Normal file
@ -0,0 +1,5 @@
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
Ok:0
|
5
shell/ash_test/ash-arith/arith-postinc.tests
Executable file
5
shell/ash_test/ash-arith/arith-postinc.tests
Executable 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:$?
|
@ -126,6 +126,10 @@ ghi
|
||||
./arith2.sub: line 5: arithmetic syntax error
|
||||
5 5
|
||||
1 1
|
||||
6 6
|
||||
2 2
|
||||
3 3
|
||||
1 1
|
||||
4 4
|
||||
0 0
|
||||
./arith2.sub: line 42: arithmetic syntax error
|
||||
|
@ -23,14 +23,14 @@
|
||||
echo 5 $(( 4 + ++a ))
|
||||
echo 1 $a
|
||||
|
||||
# ash doesn't handle it right...
|
||||
#ash# echo 6 $(( 4+++a ))
|
||||
#ash# echo 2 $a
|
||||
# this is treated as 4 + ++a
|
||||
echo 6 $(( 4+++a ))
|
||||
echo 2 $a
|
||||
a=2
|
||||
|
||||
# ash doesn't handle it right...
|
||||
#ash# echo 3 $(( 4---a ))
|
||||
#ash# echo 1 $a
|
||||
# this is treated as 4 - --a
|
||||
echo 3 $(( 4---a ))
|
||||
echo 1 $a
|
||||
a=1
|
||||
|
||||
echo 4 $(( 4 - -- a ))
|
||||
|
5
shell/hush_test/hush-arith/arith-postinc.right
Normal file
5
shell/hush_test/hush-arith/arith-postinc.right
Normal file
@ -0,0 +1,5 @@
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
1 1
|
||||
Ok:0
|
5
shell/hush_test/hush-arith/arith-postinc.tests
Executable file
5
shell/hush_test/hush-arith/arith-postinc.tests
Executable 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:$?
|
@ -135,6 +135,10 @@ hush: arithmetic syntax error
|
||||
hush: arithmetic syntax error
|
||||
5 5
|
||||
1 1
|
||||
6 6
|
||||
2 2
|
||||
3 3
|
||||
1 1
|
||||
4 4
|
||||
0 0
|
||||
hush: arithmetic syntax error
|
||||
|
@ -23,14 +23,14 @@
|
||||
echo 5 $(( 4 + ++a ))
|
||||
echo 1 $a
|
||||
|
||||
# ash doesn't handle it right...
|
||||
#ash# echo 6 $(( 4+++a ))
|
||||
#ash# echo 2 $a
|
||||
# this is treated as 4 + ++a
|
||||
echo 6 $(( 4+++a ))
|
||||
echo 2 $a
|
||||
a=2
|
||||
|
||||
# ash doesn't handle it right...
|
||||
#ash# echo 3 $(( 4---a ))
|
||||
#ash# echo 1 $a
|
||||
# this is treated as 4 - --a
|
||||
echo 3 $(( 4---a ))
|
||||
echo 1 $a
|
||||
a=1
|
||||
|
||||
echo 4 $(( 4 - -- a ))
|
||||
|
19
shell/math.c
19
shell/math.c
@ -598,10 +598,24 @@ evaluate_string(arith_state_t *math_state, const char *expr)
|
||||
}
|
||||
|
||||
/* 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;
|
||||
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 */
|
||||
const char *e = expr;
|
||||
while (1) {
|
||||
@ -627,6 +641,7 @@ evaluate_string(arith_state_t *math_state, const char *expr)
|
||||
}
|
||||
tok_found:
|
||||
op = p[1]; /* fetch TOK_foo value */
|
||||
tok_found1:
|
||||
/* NB: expr now points past the operator */
|
||||
|
||||
/* post grammar: a++ reduce to num */
|
||||
|
Loading…
Reference in New Issue
Block a user