summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-08-28 23:16:58 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-08-28 23:16:58 +0000
commit7cbcd1cbf44df893c8c289ea3c9f03fb62b8b152 (patch)
tree0f7f7c762dc684ffb49cb64e2b4231692bc5dda8
parent996a61475a7204f17dbaa1960b123b1233027f0f (diff)
downloadbusybox-w32-7cbcd1cbf44df893c8c289ea3c9f03fb62b8b152.tar.gz
busybox-w32-7cbcd1cbf44df893c8c289ea3c9f03fb62b8b152.tar.bz2
busybox-w32-7cbcd1cbf44df893c8c289ea3c9f03fb62b8b152.zip
awk: bitwise ops cast oprands and results to unsigned long,
not signed. closes 4774.
-rw-r--r--editors/awk.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/editors/awk.c b/editors/awk.c
index 19f48401e..72eca245f 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -2039,28 +2039,30 @@ static var *exec_builtin(node *op, var *res)
2039 setvar_p(res, s); 2039 setvar_p(res, s);
2040 break; 2040 break;
2041 2041
2042 /* Bitwise ops must assume that operands are unsigned. GNU Awk 3.1.5:
2043 * awk '{ print or(-1,1) }' gives "4.29497e+09", not "-2.xxxe+09" */
2042 case B_an: 2044 case B_an:
2043 setvar_i(res, (long)getvar_i(av[0]) & (long)getvar_i(av[1])); 2045 setvar_i(res, (unsigned long)getvar_i(av[0]) & (unsigned long)getvar_i(av[1]));
2044 break; 2046 break;
2045 2047
2046 case B_co: 2048 case B_co:
2047 setvar_i(res, ~(long)getvar_i(av[0])); 2049 setvar_i(res, ~(unsigned long)getvar_i(av[0]));
2048 break; 2050 break;
2049 2051
2050 case B_ls: 2052 case B_ls:
2051 setvar_i(res, (long)getvar_i(av[0]) << (long)getvar_i(av[1])); 2053 setvar_i(res, (unsigned long)getvar_i(av[0]) << (unsigned long)getvar_i(av[1]));
2052 break; 2054 break;
2053 2055
2054 case B_or: 2056 case B_or:
2055 setvar_i(res, (long)getvar_i(av[0]) | (long)getvar_i(av[1])); 2057 setvar_i(res, (unsigned long)getvar_i(av[0]) | (unsigned long)getvar_i(av[1]));
2056 break; 2058 break;
2057 2059
2058 case B_rs: 2060 case B_rs:
2059 setvar_i(res, (long)((unsigned long)getvar_i(av[0]) >> (unsigned long)getvar_i(av[1]))); 2061 setvar_i(res, (unsigned long)getvar_i(av[0]) >> (unsigned long)getvar_i(av[1]));
2060 break; 2062 break;
2061 2063
2062 case B_xo: 2064 case B_xo:
2063 setvar_i(res, (long)getvar_i(av[0]) ^ (long)getvar_i(av[1])); 2065 setvar_i(res, (unsigned long)getvar_i(av[0]) ^ (unsigned long)getvar_i(av[1]));
2064 break; 2066 break;
2065 2067
2066 case B_lo: 2068 case B_lo: