diff options
Diffstat (limited to 'editors/awk.c')
-rw-r--r-- | editors/awk.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/editors/awk.c b/editors/awk.c index 571d68193..72eca245f 100644 --- a/editors/awk.c +++ b/editors/awk.c | |||
@@ -973,7 +973,12 @@ static uint32_t next_token(uint32_t expected) | |||
973 | 973 | ||
974 | } else if (*p == '.' || isdigit(*p)) { | 974 | } else if (*p == '.' || isdigit(*p)) { |
975 | /* it's a number */ | 975 | /* it's a number */ |
976 | t_double = strtod(p, &p); | 976 | #if ENABLE_DESKTOP |
977 | if (p[0] == '0' && (p[1] | 0x20) == 'x') | ||
978 | t_double = strtoll(p, &p, 0); | ||
979 | else | ||
980 | #endif | ||
981 | t_double = strtod(p, &p); | ||
977 | if (*p == '.') | 982 | if (*p == '.') |
978 | syntax_error(EMSG_UNEXP_TOKEN); | 983 | syntax_error(EMSG_UNEXP_TOKEN); |
979 | tc = TC_NUMBER; | 984 | tc = TC_NUMBER; |
@@ -2034,28 +2039,30 @@ static var *exec_builtin(node *op, var *res) | |||
2034 | setvar_p(res, s); | 2039 | setvar_p(res, s); |
2035 | break; | 2040 | break; |
2036 | 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" */ | ||
2037 | case B_an: | 2044 | case B_an: |
2038 | 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])); |
2039 | break; | 2046 | break; |
2040 | 2047 | ||
2041 | case B_co: | 2048 | case B_co: |
2042 | setvar_i(res, ~(long)getvar_i(av[0])); | 2049 | setvar_i(res, ~(unsigned long)getvar_i(av[0])); |
2043 | break; | 2050 | break; |
2044 | 2051 | ||
2045 | case B_ls: | 2052 | case B_ls: |
2046 | 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])); |
2047 | break; | 2054 | break; |
2048 | 2055 | ||
2049 | case B_or: | 2056 | case B_or: |
2050 | 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])); |
2051 | break; | 2058 | break; |
2052 | 2059 | ||
2053 | case B_rs: | 2060 | case B_rs: |
2054 | 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])); |
2055 | break; | 2062 | break; |
2056 | 2063 | ||
2057 | case B_xo: | 2064 | case B_xo: |
2058 | 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])); |
2059 | break; | 2066 | break; |
2060 | 2067 | ||
2061 | case B_lo: | 2068 | case B_lo: |