summaryrefslogtreecommitdiff
path: root/editors/awk.c
diff options
context:
space:
mode:
authorDenis Vlasenko2008-09-28 16:40:25 +0000
committerDenis Vlasenko2008-09-28 16:40:25 +0000
commitbacaff6e5474d6c5f080ce4cd2a55e8ff1ba5c94 (patch)
tree5ca8c92753ef2c2fb7d39f125dc90deb18cfc1b8 /editors/awk.c
parent261cf4784fa39fb6cb3b7db99e809a7832d94d0a (diff)
downloadbusybox-bacaff6e5474d6c5f080ce4cd2a55e8ff1ba5c94.zip
busybox-bacaff6e5474d6c5f080ce4cd2a55e8ff1ba5c94.tar.gz
apply post-1.12.0 fixes, bump version to 1.12.11_12_1
Diffstat (limited to 'editors/awk.c')
-rw-r--r--editors/awk.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/editors/awk.c b/editors/awk.c
index 571d681..72eca24 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -973,7 +973,12 @@ static uint32_t next_token(uint32_t expected)
} else if (*p == '.' || isdigit(*p)) {
/* it's a number */
- t_double = strtod(p, &p);
+#if ENABLE_DESKTOP
+ if (p[0] == '0' && (p[1] | 0x20) == 'x')
+ t_double = strtoll(p, &p, 0);
+ else
+#endif
+ t_double = strtod(p, &p);
if (*p == '.')
syntax_error(EMSG_UNEXP_TOKEN);
tc = TC_NUMBER;
@@ -2034,28 +2039,30 @@ static var *exec_builtin(node *op, var *res)
setvar_p(res, s);
break;
+ /* Bitwise ops must assume that operands are unsigned. GNU Awk 3.1.5:
+ * awk '{ print or(-1,1) }' gives "4.29497e+09", not "-2.xxxe+09" */
case B_an:
- setvar_i(res, (long)getvar_i(av[0]) & (long)getvar_i(av[1]));
+ setvar_i(res, (unsigned long)getvar_i(av[0]) & (unsigned long)getvar_i(av[1]));
break;
case B_co:
- setvar_i(res, ~(long)getvar_i(av[0]));
+ setvar_i(res, ~(unsigned long)getvar_i(av[0]));
break;
case B_ls:
- setvar_i(res, (long)getvar_i(av[0]) << (long)getvar_i(av[1]));
+ setvar_i(res, (unsigned long)getvar_i(av[0]) << (unsigned long)getvar_i(av[1]));
break;
case B_or:
- setvar_i(res, (long)getvar_i(av[0]) | (long)getvar_i(av[1]));
+ setvar_i(res, (unsigned long)getvar_i(av[0]) | (unsigned long)getvar_i(av[1]));
break;
case B_rs:
- setvar_i(res, (long)((unsigned long)getvar_i(av[0]) >> (unsigned long)getvar_i(av[1])));
+ setvar_i(res, (unsigned long)getvar_i(av[0]) >> (unsigned long)getvar_i(av[1]));
break;
case B_xo:
- setvar_i(res, (long)getvar_i(av[0]) ^ (long)getvar_i(av[1]));
+ setvar_i(res, (unsigned long)getvar_i(av[0]) ^ (unsigned long)getvar_i(av[1]));
break;
case B_lo: