← Commit list

f19e3c1c6

Denys Vlasenko
Denys Vlasenko
2018-01-28
SUCCESS Duration: 143s

Subject

shell: handle $((NUM++...) like bash does. Closes 10706

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash_test/ash-arith/arith-postinc.right+5 -0
@@ -0,0 +1,5 @@
+1 1
+1 1
+1 1
+1 1
+Ok:0
shell/ash_test/ash-arith/arith-postinc.tests+5 -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:$?
shell/ash_test/ash-arith/arith.right+4 -0
@@ -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
shell/ash_test/ash-arith/arith2.sub+6 -6
@@ -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 ))
shell/hush_test/hush-arith/arith-postinc.right+5 -0
@@ -0,0 +1,5 @@
+1 1
+1 1
+1 1
+1 1
+Ok:0
shell/hush_test/hush-arith/arith-postinc.tests+5 -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:$?
shell/hush_test/hush-arith/arith.right+4 -0
@@ -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
shell/hush_test/hush-arith/arith2.sub+6 -6
@@ -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 ))
shell/math.c+17 -2
@@ -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 */