]> git.saurik.com Git - apple/libc.git/blobdiff - gdtoa/FreeBSD/gdtoa-hexnan.c.patch
Libc-763.11.tar.gz
[apple/libc.git] / gdtoa / FreeBSD / gdtoa-hexnan.c.patch
index c9c60ba0ebac0b50c312a2948b87f5ea0ffd0ed1..ac98f17e0824cf01284d9cb17170eb68da11c505 100644 (file)
---- 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;
        }