]> git.saurik.com Git - apple/libc.git/blob - gdtoa/FreeBSD/gdtoa-strtod.c.patch
Libc-763.12.tar.gz
[apple/libc.git] / gdtoa / FreeBSD / gdtoa-strtod.c.patch
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 "."). */
6
7 +#include "xlocale_private.h"
8 +
9 #include "gdtoaimp.h"
10 #ifndef NO_FENV_H
11 #include <fenv.h>
12 @@ -58,11 +60,11 @@ static CONST double tinytens[] = { 1e-16
13 #endif
14
15 double
16 -strtod
17 +strtod_l
18 #ifdef KR_headers
19 - (s00, se) CONST char *s00; char **se;
20 + (s00, se, loc) CONST char *s00; char **se; locale_t loc;
21 #else
22 - (CONST char *s00, char **se)
23 + (CONST char *s00, char **se, locale_t loc)
24 #endif
25 {
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;
32 double aadj;
33 Long L;
34 U adj, aadj1, rv, rv0;
35 @@ -80,15 +83,16 @@ strtod
36 int inexact, oldinexact;
37 #endif
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);
44 #else
45 char *decimalpoint;
46 static char *decimalpoint_cache;
47 static int dplen;
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
55 #else
56 #define fpi1 fpi
57 #endif
58 - switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) {
59 + switch((i = gethex(&s, &fpi1, &exp, &bb, sign, loc)) & STRTOG_Retmask) {
60 case STRTOG_NoNumber:
61 s = s00;
62 sign = 0;
63 @@ -310,6 +314,9 @@ strtod
64 }
65 goto ret;
66 }
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);
70 e1 = e -= nf;
71
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 */
76 if (sign) {
77 - rv = -rv;
78 + dval(&rv) = -dval(&rv);
79 sign = 0;
80 }
81 #endif
82 @@ -362,7 +369,7 @@ strtod
83 #ifdef Honor_FLT_ROUNDS
84 /* round correctly FLT_ROUNDS = 2 or 3 */
85 if (sign) {
86 - rv = -rv;
87 + dval(&rv) = -dval(&rv);
88 sign = 0;
89 }
90 #endif
91 @@ -390,7 +397,7 @@ strtod
92 #ifdef Honor_FLT_ROUNDS
93 /* round correctly FLT_ROUNDS = 2 or 3 */
94 if (sign) {
95 - rv = -rv;
96 + dval(&rv) = -dval(&rv);
97 sign = 0;
98 }
99 #endif
100 @@ -672,17 +679,17 @@ strtod
101 else
102 #endif /*Sudden_Underflow*/
103 #endif /*Avoid_Underflow*/
104 - dval(&rv) += adj*ulp(&rv);
105 + dval(&rv) += dval(&adj)*ulp(&rv);
106 }
107 break;
108 }
109 dval(&adj) = ratio(delta, bs);
110 - if (adj < 1.)
111 + if (dval(&adj) < 1.)
112 dval(&adj) = 1.;
113 - if (adj <= 0x7ffffffe) {
114 + if (dval(&adj) <= 0x7ffffffe) {
115 /* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */
116 - y = adj;
117 - if (y != adj) {
118 + y = dval(&adj);
119 + if (y != dval(&adj)) {
120 if (!((Rounding>>1) ^ dsign))
121 y++;
122 dval(&adj) = y;
123 @@ -709,10 +716,10 @@ strtod
124 if (dsign) {
125 if (word0(&rv) == Big0 && word1(&rv) == Big1)
126 goto ovfl;
127 - dval(&rv) += adj;
128 + dval(&rv) += dval(&adj);
129 }
130 else
131 - dval(&rv) -= adj;
132 + dval(&rv) -= dval(&adj);
133 goto cont;
134 }
135 #endif /*Honor_FLT_ROUNDS*/
136 @@ -991,7 +998,7 @@ strtod
137 dval(&rv) *= dval(&rv0);
138 #ifndef NO_ERRNO
139 /* try to avoid the bug of testing an 8087 register value */
140 -#ifdef IEEE_Arith
141 +#if defined(IEEE_Arith) && __DARWIN_UNIX03
142 if (!(word0(&rv) & Exp_mask))
143 #else
144 if (word0(&rv) == 0 && word1(&rv) == 0)
145 @@ -1016,6 +1023,22 @@ strtod
146 ret:
147 if (se)
148 *se = (char *)s;
149 + if (strunc)
150 +#ifdef FREE
151 + FREE(strunc);
152 +#else
153 + free(strunc);
154 +#endif
155 return sign ? -dval(&rv) : dval(&rv);
156 }
157
158 + double
159 +strtod
160 +#ifdef KR_headers
161 + (s00, se) CONST char *s00; char **se;
162 +#else
163 + (CONST char *s00, char **se)
164 +#endif
165 +{
166 + return strtod_l(s00, se, __current_locale());
167 +}