shell: handle $((NUM++...) like bash does. Closes 10706
No binary (build failed)
—
(log yok)
| @@ -0,0 +1,5 @@ | |
| + | 1 1 |
| + | 1 1 |
| + | 1 1 |
| + | 1 1 |
| + | Ok:0 |
| @@ -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 )) | |
| @@ -0,0 +1,5 @@ | |
| + | 1 1 |
| + | 1 1 |
| + | 1 1 |
| + | 1 1 |
| + | Ok:0 |
| @@ -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 )) | |
| @@ -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 */ | |