]>
Commit | Line | Data |
---|---|---|
fc8c9395 | 1 | --- gawk-3.1.5/node.c.num2str 2005-07-26 20:07:43.000000000 +0200 |
2 | +++ gawk-3.1.5/node.c 2005-12-22 19:41:55.000000000 +0100 | |
3 | @@ -151,6 +151,7 @@ | |
4 | register char *sp = buf; | |
5 | double val; | |
6 | char *orig, *trans, save; | |
7 | + register long num; | |
8 | ||
9 | if (! do_traditional && (s->flags & INTLSTR) != 0) { | |
10 | save = s->stptr[s->stlen]; | |
11 | @@ -163,9 +164,12 @@ | |
12 | return tmp_string(trans, strlen(trans)); | |
13 | } | |
14 | ||
15 | - /* not an integral value, or out of range */ | |
16 | - if ((val = double_to_int(s->numbr)) != s->numbr | |
17 | - || val < LONG_MIN || val > LONG_MAX) { | |
18 | + /* conversion to long overflows, or out of range, or not integral */ | |
19 | + val = double_to_int(s->numbr); | |
20 | + num = (long) val; | |
21 | + if ( (s->numbr > 0 && num < 0) | |
22 | + || (s->numbr < 0 && num > 0) | |
23 | + || val < LONG_MIN || val > LONG_MAX || val != s->numbr) { | |
24 | /* | |
25 | * Once upon a time, if GFMT_WORKAROUND wasn't defined, | |
26 | * we just blindly did this: | |
27 | @@ -199,9 +203,7 @@ | |
28 | ||
29 | goto no_malloc; | |
30 | } else { | |
31 | - /* integral value */ | |
32 | - /* force conversion to long only once */ | |
33 | - register long num = (long) val; | |
34 | + /* integral value, in range, too! */ | |
35 | if (num < NVAL && num >= 0) { | |
36 | sp = (char *) values[num]; | |
37 | s->stlen = 1; |