diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-28 23:16:58 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-28 23:16:58 +0000 |
commit | 7cbcd1cbf44df893c8c289ea3c9f03fb62b8b152 (patch) | |
tree | 0f7f7c762dc684ffb49cb64e2b4231692bc5dda8 | |
parent | 996a61475a7204f17dbaa1960b123b1233027f0f (diff) | |
download | busybox-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.c | 14 |
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: |