sh: arith: Return only 0 and 1 from && and ||.

This agrees with C, POSIX and other shells.
This commit is contained in:
Jilles Tjoelker 2009-12-30 15:59:40 +00:00
parent 8ca5ff35e6
commit 63ccda7719
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=201259
2 changed files with 32 additions and 2 deletions

View File

@ -85,9 +85,9 @@ expr:
ARITH_LPAREN expr ARITH_RPAREN
{ $$ = $2; } |
expr ARITH_OR expr
{ $$ = $1 ? $1 : $3 ? $3 : 0; } |
{ $$ = $1 || $3; } |
expr ARITH_AND expr
{ $$ = $1 ? ( $3 ? $3 : 0 ) : 0; } |
{ $$ = $1 && $3; } |
expr ARITH_BOR expr
{ $$ = $1 | $3; } |
expr ARITH_BXOR expr

View File

@ -0,0 +1,30 @@
# $FreeBSD$
failures=0
check() {
if [ $(($1)) != $2 ]; then
failures=$((failures+1))
echo "For $1, expected $2 actual $(($1))"
fi
}
check "0&&0" 0
check "1&&0" 0
check "0&&1" 0
check "1&&1" 1
check "2&&2" 1
check "1&&2" 1
check "1<<40&&1<<40" 1
check "1<<40&&4" 1
check "0||0" 0
check "1||0" 1
check "0||1" 1
check "1||1" 1
check "2||2" 1
check "1||2" 1
check "1<<40||1<<40" 1
check "1<<40||4" 1
exit $((failures != 0))