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:
		
							
								
								
									
										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 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user