1 --- gdtoa-strtod.c.orig 2010-01-29 16:43:20.000000000 -0800
2 +++ gdtoa-strtod.c 2010-01-29 18:05:44.000000000 -0800
3 @@ -29,6 +29,8 @@ THIS SOFTWARE.
4 /* Please send bug reports to David M. Gay (dmg at acm dot org,
5 * with " at " changed at "@" and " dot " changed to "."). */
7 +#include "xlocale_private.h"
12 @@ -58,11 +60,11 @@ static CONST double tinytens[] = { 1e-16
19 - (s00, se) CONST char *s00; char **se;
20 + (s00, se, loc) CONST char *s00; char **se; locale_t loc;
22 - (CONST char *s00, char **se)
23 + (CONST char *s00, char **se, locale_t loc)
26 #ifdef Avoid_Underflow
27 @@ -71,6 +73,7 @@ strtod
28 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
29 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
30 CONST char *s, *s0, *s1;
31 + char *strunc = NULL;
34 U adj, aadj1, rv, rv0;
35 @@ -80,15 +83,16 @@ strtod
36 int inexact, oldinexact;
38 #ifdef USE_LOCALE /*{{*/
39 + NORMALIZE_LOCALE(loc);
40 #ifdef NO_LOCALE_CACHE
41 - char *decimalpoint = localeconv()->decimal_point;
42 + char *decimalpoint = localeconv_l(loc)->decimal_point;
43 int dplen = strlen(decimalpoint);
46 static char *decimalpoint_cache;
48 if (!(s0 = decimalpoint_cache)) {
49 - s0 = localeconv()->decimal_point;
50 + s0 = localeconv_l(loc)->decimal_point;
51 if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) {
52 strcpy(decimalpoint_cache, s0);
53 s0 = decimalpoint_cache;
54 @@ -154,7 +158,7 @@ strtod
58 - switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) {
59 + switch((i = gethex(&s, &fpi1, &exp, &bb, sign, loc)) & STRTOG_Retmask) {
63 @@ -310,6 +314,9 @@ strtod
67 +#define FPIEMIN (1-1023-53+1) // fpi.emin
68 +#define FPINBITS 52 // fpi.nbits
69 + TRUNCATE_DIGITS(s0, strunc, nd, nd0, nf, FPINBITS, FPIEMIN, dplen);
72 /* Now we have nd0 digits, starting at s0, followed by a
73 @@ -346,7 +353,7 @@ strtod
74 #ifdef Honor_FLT_ROUNDS
75 /* round correctly FLT_ROUNDS = 2 or 3 */
78 + dval(&rv) = -dval(&rv);
82 @@ -362,7 +369,7 @@ strtod
83 #ifdef Honor_FLT_ROUNDS
84 /* round correctly FLT_ROUNDS = 2 or 3 */
87 + dval(&rv) = -dval(&rv);
91 @@ -390,7 +397,7 @@ strtod
92 #ifdef Honor_FLT_ROUNDS
93 /* round correctly FLT_ROUNDS = 2 or 3 */
96 + dval(&rv) = -dval(&rv);
100 @@ -672,17 +679,17 @@ strtod
102 #endif /*Sudden_Underflow*/
103 #endif /*Avoid_Underflow*/
104 - dval(&rv) += adj*ulp(&rv);
105 + dval(&rv) += dval(&adj)*ulp(&rv);
109 dval(&adj) = ratio(delta, bs);
111 + if (dval(&adj) < 1.)
113 - if (adj <= 0x7ffffffe) {
114 + if (dval(&adj) <= 0x7ffffffe) {
115 /* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */
119 + if (y != dval(&adj)) {
120 if (!((Rounding>>1) ^ dsign))
123 @@ -709,10 +716,10 @@ strtod
125 if (word0(&rv) == Big0 && word1(&rv) == Big1)
128 + dval(&rv) += dval(&adj);
132 + dval(&rv) -= dval(&adj);
135 #endif /*Honor_FLT_ROUNDS*/
136 @@ -991,7 +998,7 @@ strtod
137 dval(&rv) *= dval(&rv0);
139 /* try to avoid the bug of testing an 8087 register value */
141 +#if defined(IEEE_Arith) && __DARWIN_UNIX03
142 if (!(word0(&rv) & Exp_mask))
144 if (word0(&rv) == 0 && word1(&rv) == 0)
145 @@ -1016,6 +1023,22 @@ strtod
155 return sign ? -dval(&rv) : dval(&rv);
161 + (s00, se) CONST char *s00; char **se;
163 + (CONST char *s00, char **se)
166 + return strtod_l(s00, se, __current_locale());