summaryrefslogtreecommitdiffstats
path: root/package/busybox/busybox-1.12.0-awk.patch
blob: f89ae043f02179e22848877de6f9d8aad437cb17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
--- busybox-1.12.0/editors/awk.c	Wed Aug  6 00:56:11 2008
+++ busybox-1.12.0-awk/editors/awk.c	Fri Aug 29 01:17:05 2008
@@ -973,7 +973,12 @@
 
 		} 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 @@
 		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: