gdtoa-strtof.c.patch [plain text]
--- gdtoa-strtof.c.orig 2007-04-03 12:19:28.000000000 -0700
+++ gdtoa-strtof.c 2007-04-06 12:52:45.000000000 -0700
@@ -29,24 +29,41 @@
/* Please send bug reports to David M. Gay (dmg at acm dot org,
* with " at " changed at "@" and " dot " changed to "."). */
+#include "xlocale_private.h"
+
#include "gdtoaimp.h"
float
#ifdef KR_headers
-strtof(s, sp) CONST char *s; char **sp;
+strtof_l(s, sp, loc) CONST char *s; char **sp; locale_t loc;
#else
-strtof(CONST char *s, char **sp)
+strtof_l(CONST char *s, char **sp, locale_t loc)
#endif
{
- static FPI fpi = { 24, 1-127-24+1, 254-127-24+1, 1, SI };
+ static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI };
ULong bits[1];
Long exp;
int k;
union { ULong L[1]; float f; } u;
+ FPI *fpi = &fpi0, fpi1;
+#ifdef Honor_FLT_ROUNDS
+ int rounding = Flt_Rounds;
+#endif
- k = strtodg(s, sp, &fpi, &exp, bits);
+ NORMALIZE_LOCALE(loc);
+#ifdef Honor_FLT_ROUNDS
+ if (rounding != fpi0.rounding) {
+ fpi1 = fpi0; /* for thread safety */
+ fpi1.rounding = rounding;
+ fpi = &fpi1;
+ }
+#endif /* Honor_FLT_ROUNDS */
+ k = strtodg(s, sp, fpi, &exp, bits, loc);
switch(k & STRTOG_Retmask) {
case STRTOG_NoNumber:
+ u.L[0] = 0;
+ return u.f; // avoid setting sign
+
case STRTOG_Zero:
u.L[0] = 0;
break;
@@ -71,3 +88,13 @@
u.L[0] |= 0x80000000L;
return u.f;
}
+
+ float
+#ifdef KR_headers
+strtof(s, sp) CONST char *s; char **sp;
+#else
+strtof(CONST char *s, char **sp)
+#endif
+{
+ return strtof_l(s, sp, __current_locale());
+}