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: |
