awk: use "long long" as integer type, not "int"
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 20 Jul 2013 19:23:01 +0000 (21:23 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 20 Jul 2013 19:23:01 +0000 (21:23 +0200)
Testcase:
awk "BEGIN{n=(2^31)-1; print n, int(n), n%1, ++n, int(n), n%1}"
2147483647 2147483647 0 2147483648 2147483648 0

(last three values weren't showing right)

function                                             old     new   delta
evaluate                                            3444    3458     +14
fmt_num                                              221     230      +9

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/awk.c

index 0b573a065c18bfd237886ee563f661c5199acc78..a2e20215bf7d7e4346ccea1599d98771cb6a959e 100644 (file)
@@ -190,7 +190,7 @@ typedef struct tsplitter_s {
 
 /* combined token classes */
 #define        TC_BINOP   (TC_BINOPX | TC_COMMA | TC_PIPE | TC_IN)
-#define        TC_UNARYOP (TC_UOPPRE | TC_UOPPOST)
+//#define      TC_UNARYOP (TC_UOPPRE | TC_UOPPOST)
 #define        TC_OPERAND (TC_VARIABLE | TC_ARRAY | TC_FUNCTION \
                    | TC_BUILTIN | TC_GETLINE | TC_SEQSTART | TC_STRING | TC_NUMBER)
 
@@ -2015,8 +2015,8 @@ static int fmt_num(char *b, int size, const char *format, double n, int int_as_i
        char c;
        const char *s = format;
 
-       if (int_as_int && n == (int)n) {
-               r = snprintf(b, size, "%d", (int)n);
+       if (int_as_int && n == (long long)n) {
+               r = snprintf(b, size, "%lld", (long long)n);
        } else {
                do { c = *s; } while (c && *++s);
                if (strchr("diouxX", c)) {
@@ -2733,7 +2733,7 @@ static var *evaluate(node *op, var *res)
 
                        switch (opn) {
                        case F_in:
-                               R_d = (int)L_d;
+                               R_d = (long long)L_d;
                                break;
 
                        case F_rn:
@@ -2931,7 +2931,7 @@ static var *evaluate(node *op, var *res)
                        case '%':
                                if (R_d == 0)
                                        syntax_error(EMSG_DIV_BY_ZERO);
-                               L_d -= (int)(L_d / R_d) * R_d;
+                               L_d -= (long long)(L_d / R_d) * R_d;
                                break;
                        }
                        debug_printf_eval("BINARY/REPLACE result:%f\n", L_d);