Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | --- gdtoa-strtodg.c.orig 2008-10-28 12:23:36.000000000 -0700 +++ gdtoa-strtodg.c 2008-10-28 12:34:18.000000000 -0700 @@ -29,13 +29,29 @@ THIS SOFTWARE. /* 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" #ifdef USE_LOCALE #include "locale.h" #endif - static CONST int +#define fivesbits __fivesbits_D2A +#define all_on __all_on_D2A +#define set_ones __set_ones_D2A +#define rvOK __rvOK_D2A +#define mantbits __mantbits_D2A + +#ifdef BUILDING_VARIANT +extern CONST int fivesbits[]; +int all_on(Bigint *b, int n); +Bigint *set_ones(Bigint *b, int n); +int rvOK(double d, FPI *fpi, Long *exp, ULong *bits, int exact, int rd, int *irv); +int mantbits(double d); +#else /* !BUILDING_VARIANT */ + + __private_extern__ CONST int fivesbits[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21, 24, 26, 28, 31, 33, 35, 38, 40, 42, 45, 47, 49, 52 @@ -121,7 +137,7 @@ decrement(Bigint *b) #endif } - static int + __private_extern__ int #ifdef KR_headers all_on(b, n) Bigint *b; int n; #else @@ -168,7 +184,7 @@ set_ones(Bigint *b, int n) return b; } - static int + __private_extern__ int rvOK #ifdef KR_headers (d, fpi, exp, bits, exact, rd, irv) @@ -289,7 +305,7 @@ rvOK return rv; } - static int + __private_extern__ int #ifdef KR_headers mantbits(d) double d; #else @@ -312,13 +328,15 @@ mantbits(double d) return P - 32 - lo0bits(&L); } +#endif /* BUILDING_VARIANT */ + int strtodg #ifdef KR_headers - (s00, se, fpi, exp, bits) - CONST char *s00; char **se; FPI *fpi; Long *exp; ULong *bits; + (s00, se, fpi, exp, bits, loc) + CONST char *s00; char **se; FPI *fpi; Long *exp; ULong *bits; locale_t loc; #else - (CONST char *s00, char **se, FPI *fpi, Long *exp, ULong *bits) + (CONST char *s00, char **se, FPI *fpi, Long *exp, ULong *bits, locale_t loc) #endif { int abe, abits, asub; @@ -332,13 +350,14 @@ strtodg ULong *b, *be, y, z; Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0; #ifdef USE_LOCALE + NORMALIZE_LOCALE(loc) #ifdef NO_LOCALE_CACHE - char *decimalpoint = localeconv()->decimal_point; + char *decimalpoint = localeconv_l(loc)->decimal_point; #else char *decimalpoint; static char *decimalpoint_cache; if (!(s0 = decimalpoint_cache)) { - s0 = localeconv()->decimal_point; + s0 = localeconv_l(loc)->decimal_point; if ((decimalpoint_cache = (char*)malloc(strlen(s0) + 1))) { strcpy(decimalpoint_cache, s0); s0 = decimalpoint_cache; @@ -382,7 +401,7 @@ strtodg switch(s[1]) { case 'x': case 'X': - irv = gethex(&s, fpi, exp, &rvb, sign); + irv = gethex(&s, fpi, exp, &rvb, sign, loc); if (irv == STRTOG_NoNumber) { s = s00; sign = 0; @@ -687,6 +706,10 @@ strtodg rvb->x[0] = 0; *exp = emin; irv = STRTOG_Underflow | STRTOG_Inexlo; +/* When __DARWIN_UNIX03 is set, we don't need this (errno is set later) */ +#if !defined(NO_ERRNO) && !__DARWIN_UNIX03 + errno = ERANGE; +#endif goto ret; } rvb->x[0] = rvb->wds = rvbits = 1; @@ -703,7 +726,11 @@ strtodg /* Put digits into bd: true value = bd * 10^e */ - bd0 = s2b(s0, nd0, nd, y); +#ifdef USE_LOCALE + bd0 = s2b(s0, nd0, nd, y, strlen(decimalpoint)); +#else + bd0 = s2b(s0, nd0, nd, y, 1); +#endif for(;;) { bd = Balloc(bd0->k); @@ -1032,7 +1059,7 @@ strtodg if (sudden_underflow) { rvb->wds = 0; irv = STRTOG_Underflow | STRTOG_Inexlo; -#ifndef NO_ERRNO +#if !defined(NO_ERRNO) && __DARWIN_UNIX03 errno = ERANGE; #endif } @@ -1041,7 +1068,7 @@ strtodg (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero); if (irv & STRTOG_Inexact) { irv |= STRTOG_Underflow; -#ifndef NO_ERRNO +#if !defined(NO_ERRNO) && __DARWIN_UNIX03 errno = ERANGE; #endif } |