---- gdtoa-hexnan.c.orig 2008-03-15 10:08:33.000000000 -0700
-+++ gdtoa-hexnan.c 2008-08-30 17:55:23.000000000 -0700
-@@ -30,6 +30,7 @@ THIS SOFTWARE.
+--- gdtoa-hexnan.c.orig 2010-01-29 16:36:11.000000000 -0800
++++ gdtoa-hexnan.c 2010-01-29 16:40:59.000000000 -0800
+@@ -30,7 +30,9 @@ THIS SOFTWARE.
* with " at " changed at "@" and " dot " changed to "."). */
#include "gdtoaimp.h"
+#include <fpmath.h>
++#ifndef __APPLE__
static void
#ifdef KR_headers
-@@ -57,94 +58,53 @@ hexnan(sp, fpi, x0)
+ L_shift(x, x1, i) ULong *x; ULong *x1; int i;
+@@ -48,6 +50,7 @@ L_shift(ULong *x, ULong *x1, int i)
+ x[1] >>= i;
+ } while(++x < x1);
+ }
++#endif /* !__APPLE__ */
+
+ int
+ #ifdef KR_headers
+@@ -57,10 +60,21 @@ hexnan(sp, fpi, x0)
hexnan( CONST char **sp, FPI *fpi, ULong *x0)
#endif
{
-- ULong c, h, *x, *x1, *xe;
++#ifdef __APPLE__
+ int nbits, len;
+ char *cp;
++#else /* !__APPLE__ */
+ ULong c, h, *x, *x1, *xe;
++#endif /* __APPLE__ */
CONST char *s;
-- int havedig, hd0, i, nbits;
++#ifndef __APPLE__
+ int havedig, hd0, i, nbits;
++#endif /* !__APPLE__ */
-- if (!hexdig['0'])
-- hexdig_init_D2A();
-- nbits = fpi->nbits;
-- x = x0 + (nbits >> kshift);
-- if (nbits & kmask)
-- x++;
-- *--x = 0;
-- x1 = xe = x;
-- havedig = hd0 = i = 0;
++#ifdef __APPLE__
+ if (sp == NULL || *sp == NULL || **sp != '(')
+ return STRTOG_NaN;
++#else /* !__APPLE__ */
+ if (!hexdig['0'])
+ hexdig_init_D2A();
+ nbits = fpi->nbits;
+@@ -70,7 +84,17 @@ hexnan( CONST char **sp, FPI *fpi, ULong
+ *--x = 0;
+ x1 = xe = x;
+ havedig = hd0 = i = 0;
++#endif /* __APPLE__ */
s = *sp;
-- /* allow optional initial 0x or 0X */
-- while((c = *(CONST unsigned char*)(s+1)) && c <= ' ')
-- ++s;
-- if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')
-- && *(CONST unsigned char*)(s+3) > ' ')
-- s += 2;
-- while(c = *(CONST unsigned char*)++s) {
-- if (!(h = hexdig[c])) {
-- if (c <= ' ') {
-- if (hd0 < havedig) {
-- if (x < x1 && i < 8)
-- L_shift(x, x1, i);
-- if (x <= x0) {
-- i = 8;
-- continue;
-- }
-- hd0 = havedig;
-- *--x = 0;
-- x1 = x;
-- i = 0;
-- }
-- while(*(CONST unsigned char*)(s+1) <= ' ')
-- ++s;
-- if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')
-- && *(CONST unsigned char*)(s+3) > ' ')
-- s += 2;
-- continue;
-- }
-- if (/*(*/ c == ')' && havedig) {
-- *sp = s + 1;
-- break;
-- }
--#ifndef GDTOA_NON_PEDANTIC_NANCHECK
-- do {
-- if (/*(*/ c == ')') {
-- *sp = s + 1;
-- break;
-- }
-- } while(c = *++s);
--#endif
++#ifdef __APPLE__
+ if ((cp = strchr(s + 1, ')')) == NULL) {
-+ *sp += strlen(s);
-+ cp = s + 1;
++ return STRTOG_NaN;
+ }
+ else {
+ len = cp - (s + 1);
+ cp = alloca(len + 1);
+ if (!cp)
++#else /* !__APPLE__ */
+ /* allow optional initial 0x or 0X */
+ while((c = *(CONST unsigned char*)(s+1)) && c <= ' ')
+ ++s;
+@@ -111,7 +135,12 @@ hexnan( CONST char **sp, FPI *fpi, ULong
+ }
+ } while((c = *++s));
+ #endif
++#endif /* __APPLE__ */
return STRTOG_NaN;
-- }
-- havedig++;
-- if (++i > 8) {
-- if (x <= x0)
-- continue;
-- i = 1;
-- *--x = 0;
-- }
-- *x = (*x << 4) | h & 0xf;
++#ifdef __APPLE__
+ strlcpy(cp, s + 1, len + 1);
+ *sp += len + 2;
++#else /* !__APPLE__ */
+ }
+ havedig++;
+ if (++i > 8) {
+@@ -121,7 +150,17 @@ hexnan( CONST char **sp, FPI *fpi, ULong
+ *--x = 0;
+ }
+ *x = (*x << 4) | (h & 0xf);
++#endif /* __APPLE__ */
}
-- if (!havedig)
-- return STRTOG_NaN;
-- if (x < x1 && i < 8)
-- L_shift(x, x1, i);
-- if (x > x0) {
-- x1 = x0;
-- do *x1++ = *x++;
-- while(x <= xe);
-- do *x1++ = 0;
-- while(x1 <= xe);
++#ifdef __APPLE__
+ nbits = fpi->nbits;
+ /* a hack */
+ if (nbits == 52) { /* double */
+ u.d = nan(cp);
+ x0[1] = u.bits.manh;
+ x0[0] = u.bits.manl;
++#else /* !__APPLE__ */
+ if (!havedig)
+ return STRTOG_NaN;
+ if (x < x1 && i < 8)
+@@ -132,12 +171,36 @@ hexnan( CONST char **sp, FPI *fpi, ULong
+ while(x <= xe);
+ do *x1++ = 0;
+ while(x1 <= xe);
++#endif /* __APPLE__ */
}
-- else {
-- /* truncate high-order word if necessary */
-- if ( (i = nbits & (ULbits-1)) !=0)
-- *xe &= ((ULong)0xffffffff) >> (ULbits - i);
++#ifdef __APPLE__
+ else if (nbits < 52) { /* float */
+ union IEEEf2bits u;
+ u.f = nanf(cp);
+ x0[0] = u.bits.man;
++#else /* !__APPLE__ */
+ else {
+ /* truncate high-order word if necessary */
+ if ( (i = nbits & (ULbits-1)) !=0)
+ *xe &= ((ULong)0xffffffff) >> (ULbits - i);
++#endif /* __APPLE__ */
}
-- for(x1 = xe;; --x1) {
-- if (*x1 != 0)
-- break;
-- if (x1 == x0) {
-- *x1 = 1;
-- break;
-- }
++#ifdef __APPLE__
+ else { /* long double */
+ union IEEEl2bits u;
+ u.e = nanl(cp);
+#else
+#error unsupported architecture
+#endif
++#else /* !__APPLE__ */
+ for(x1 = xe;; --x1) {
+ if (*x1 != 0)
+ break;
+@@ -145,6 +208,7 @@ hexnan( CONST char **sp, FPI *fpi, ULong
+ *x1 = 1;
+ break;
+ }
++#endif /* __APPLE__ */
}
-+
return STRTOG_NaNbits;
}