]> git.saurik.com Git - apple/libc.git/blob - gdtoa/FreeBSD/gdtoa-strtodg.c.patch
Libc-763.11.tar.gz
[apple/libc.git] / gdtoa / FreeBSD / gdtoa-strtodg.c.patch
1 --- gdtoa-strtodg.c.orig 2010-01-29 16:43:20.000000000 -0800
2 +++ gdtoa-strtodg.c 2010-01-29 18:13:37.000000000 -0800
3 @@ -29,13 +29,29 @@ 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
11 #ifdef USE_LOCALE
12 #include "locale.h"
13 #endif
14
15 - static CONST int
16 +#define fivesbits __fivesbits_D2A
17 +#define all_on __all_on_D2A
18 +#define set_ones __set_ones_D2A
19 +#define rvOK __rvOK_D2A
20 +#define mantbits __mantbits_D2A
21 +
22 +#ifdef BUILDING_VARIANT
23 +extern CONST int fivesbits[];
24 +int all_on(Bigint *b, int n);
25 +Bigint *set_ones(Bigint *b, int n);
26 +int rvOK(U *d, FPI *fpi, Long *exp, ULong *bits, int exact, int rd, int *irv);
27 +int mantbits(U *d);
28 +#else /* !BUILDING_VARIANT */
29 +
30 + __private_extern__ CONST int
31 fivesbits[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21,
32 24, 26, 28, 31, 33, 35, 38, 40, 42, 45,
33 47, 49, 52
34 @@ -121,7 +137,7 @@ decrement(Bigint *b)
35 #endif
36 }
37
38 - static int
39 + __private_extern__ int
40 #ifdef KR_headers
41 all_on(b, n) Bigint *b; int n;
42 #else
43 @@ -168,7 +184,7 @@ set_ones(Bigint *b, int n)
44 return b;
45 }
46
47 - static int
48 + __private_extern__ int
49 rvOK
50 #ifdef KR_headers
51 (d, fpi, exp, bits, exact, rd, irv)
52 @@ -289,7 +305,7 @@ rvOK
53 return rv;
54 }
55
56 - static int
57 + __private_extern__ int
58 #ifdef KR_headers
59 mantbits(d) U *d;
60 #else
61 @@ -312,13 +328,15 @@ mantbits(U *d)
62 return P - 32 - lo0bits(&L);
63 }
64
65 +#endif /* BUILDING_VARIANT */
66 +
67 int
68 strtodg
69 #ifdef KR_headers
70 - (s00, se, fpi, exp, bits)
71 - CONST char *s00; char **se; FPI *fpi; Long *exp; ULong *bits;
72 + (s00, se, fpi, exp, bits, loc)
73 + CONST char *s00; char **se; FPI *fpi; Long *exp; ULong *bits; locale_t loc;
74 #else
75 - (CONST char *s00, char **se, FPI *fpi, Long *exp, ULong *bits)
76 + (CONST char *s00, char **se, FPI *fpi, Long *exp, ULong *bits, locale_t loc)
77 #endif
78 {
79 int abe, abits, asub;
80 @@ -327,21 +345,23 @@ strtodg
81 int j, k, nbits, nd, nd0, nf, nz, nz0, rd, rvbits, rve, rve1, sign;
82 int sudden_underflow;
83 CONST char *s, *s0, *s1;
84 + char *strunc = NULL;
85 double adj0, tol;
86 Long L;
87 U adj, rv;
88 ULong *b, *be, y, z;
89 Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0;
90 #ifdef USE_LOCALE /*{{*/
91 + NORMALIZE_LOCALE(loc);
92 #ifdef NO_LOCALE_CACHE
93 - char *decimalpoint = localeconv()->decimal_point;
94 + char *decimalpoint = localeconv_l(loc)->decimal_point;
95 int dplen = strlen(decimalpoint);
96 #else
97 char *decimalpoint;
98 static char *decimalpoint_cache;
99 static int dplen;
100 if (!(s0 = decimalpoint_cache)) {
101 - s0 = localeconv()->decimal_point;
102 + s0 = localeconv_l(loc)->decimal_point;
103 if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) {
104 strcpy(decimalpoint_cache, s0);
105 s0 = decimalpoint_cache;
106 @@ -388,7 +408,7 @@ strtodg
107 switch(s[1]) {
108 case 'x':
109 case 'X':
110 - irv = gethex(&s, fpi, exp, &rvb, sign);
111 + irv = gethex(&s, fpi, exp, &rvb, sign, loc);
112 if (irv == STRTOG_NoNumber) {
113 s = s00;
114 sign = 0;
115 @@ -525,6 +545,7 @@ strtodg
116 }
117 goto ret;
118 }
119 + TRUNCATE_DIGITS(s0, strunc, nd, nd0, nf, fpi->nbits, fpi->emin, dplen);
120
121 irv = STRTOG_Normal;
122 e1 = e -= nf;
123 @@ -693,6 +714,10 @@ strtodg
124 rvb->x[0] = 0;
125 *exp = emin;
126 irv = STRTOG_Underflow | STRTOG_Inexlo;
127 +/* When __DARWIN_UNIX03 is set, we don't need this (errno is set later) */
128 +#if !defined(NO_ERRNO) && !__DARWIN_UNIX03
129 + errno = ERANGE;
130 +#endif
131 goto ret;
132 }
133 rvb->x[0] = rvb->wds = rvbits = 1;
134 @@ -1038,7 +1063,7 @@ strtodg
135 if (sudden_underflow) {
136 rvb->wds = 0;
137 irv = STRTOG_Underflow | STRTOG_Inexlo;
138 -#ifndef NO_ERRNO
139 +#if !defined(NO_ERRNO) && __DARWIN_UNIX03
140 errno = ERANGE;
141 #endif
142 }
143 @@ -1047,7 +1072,7 @@ strtodg
144 (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero);
145 if (irv & STRTOG_Inexact) {
146 irv |= STRTOG_Underflow;
147 -#ifndef NO_ERRNO
148 +#if !defined(NO_ERRNO) && __DARWIN_UNIX03
149 errno = ERANGE;
150 #endif
151 }
152 @@ -1061,5 +1086,11 @@ strtodg
153 copybits(bits, nbits, rvb);
154 Bfree(rvb);
155 }
156 + if (strunc)
157 +#ifdef FREE
158 + FREE(strunc);
159 +#else
160 + free(strunc);
161 +#endif
162 return irv;
163 }