Merge branch 'vendor/GDTOA'
authorPeter Avalos <pavalos@dragonflybsd.org>
Mon, 31 Jan 2011 06:28:20 +0000 (20:28 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Mon, 31 Jan 2011 06:28:20 +0000 (20:28 -1000)
1  2 
contrib/gdtoa/gdtoaimp.h

diff --combined contrib/gdtoa/gdtoaimp.h
@@@ -113,7 -113,12 +113,12 @@@ THIS SOFTWARE
   * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
   *    if memory is available and otherwise does something you deem
   *    appropriate.  If MALLOC is undefined, malloc will be invoked
-  *    directly -- and assumed always to succeed.
+  *    directly -- and assumed always to succeed.  Similarly, if you
+  *    want something other than the system's free() to be called to
+  *    recycle memory acquired from MALLOC, #define FREE to be the
+  *    name of the alternate routine.  (FREE or free is only called in
+  *    pathological cases, e.g., in a gdtoa call after a gdtoa return in
+  *    mode 3 with thousands of digits requested.)
   * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
   *    memory allocations from a private pool of memory when possible.
   *    When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,
   * #define NO_STRING_H to use private versions of memcpy.
   *    On some K&R systems, it may also be necessary to
   *    #define DECLARE_SIZE_T in this case.
-  * #define YES_ALIAS to permit aliasing certain double values with
-  *    arrays of ULongs.  This leads to slightly better code with
-  *    some compilers and was always used prior to 19990916, but it
-  *    is not strictly legal and can cause trouble with aggressively
-  *    optimizing compilers (e.g., gcc 2.95.1 under -O2).
   * #define USE_LOCALE to use the current locale's decimal_point value.
   */
  
  #ifndef GDTOAIMP_H_INCLUDED
  #define GDTOAIMP_H_INCLUDED
 +
 +#define       Long    int
 +
 +#define USE_LOCALE
 +#define Honor_FLT_ROUNDS
 +
  #include "gdtoa.h"
  #include "gd_qnan.h"
  #ifdef Honor_FLT_ROUNDS
  #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
  #endif
  
 +#include "limits.h"
  #include "stdlib.h"
  #include "string.h"
 +#include "libc_private.h"
 +
 +#include "namespace.h"
 +#include <pthread.h>
 +#include "un-namespace.h"
  
  #ifdef KR_headers
  #define Char char
@@@ -282,25 -270,14 +282,14 @@@ Exactly one of IEEE_8087, IEEE_MC68k, V
  
  typedef union { double d; ULong L[2]; } U;
  
- #ifdef YES_ALIAS
- #define dval(x) x
  #ifdef IEEE_8087
- #define word0(x) ((ULong *)&x)[1]
- #define word1(x) ((ULong *)&x)[0]
+ #define word0(x) (x)->L[1]
+ #define word1(x) (x)->L[0]
  #else
- #define word0(x) ((ULong *)&x)[0]
- #define word1(x) ((ULong *)&x)[1]
+ #define word0(x) (x)->L[0]
+ #define word1(x) (x)->L[1]
  #endif
- #else /* !YES_ALIAS */
- #ifdef IEEE_8087
- #define word0(x) ((U*)&x)->L[1]
- #define word1(x) ((U*)&x)->L[0]
- #else
- #define word0(x) ((U*)&x)->L[0]
- #define word1(x) ((U*)&x)->L[1]
- #endif
- #define dval(x) ((U*)&x)->d
- #endif /* YES_ALIAS */
+ #define dval(x) (x)->d
  
  /* The following definition of Storeinc is appropriate for MIPS processors.
   * An alternative that might be better on some machines is
@@@ -469,18 -446,12 +458,18 @@@ extern double rnd_prod(double, double)
  #define ALL_ON 0xffff
  #endif
  
 -#ifndef MULTIPLE_THREADS
 -#define ACQUIRE_DTOA_LOCK(n)  /*nothing*/
 -#define FREE_DTOA_LOCK(n)     /*nothing*/
 -#endif
 +#define MULTIPLE_THREADS
 +extern pthread_mutex_t __gdtoa_locks[2];
 +#define ACQUIRE_DTOA_LOCK(n)  do {                            \
 +      if (__isthreaded)                                       \
 +              _pthread_mutex_lock(&__gdtoa_locks[n]);         \
 +} while(0)
 +#define FREE_DTOA_LOCK(n)     do {                            \
 +      if (__isthreaded)                                       \
 +              _pthread_mutex_unlock(&__gdtoa_locks[n]);       \
 +} while(0)
  
- #define Kmax (sizeof(size_t) << 3)
+ #define Kmax 9
  
   struct
  Bigint {
@@@ -501,89 -472,51 +490,89 @@@ extern void memcpy_D2A ANSI((void*, con
  #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
  #endif /* NO_STRING_H */
  
 -#define Balloc Balloc_D2A
 -#define Bfree Bfree_D2A
 -#define ULtoQ ULtoQ_D2A
 -#define ULtof ULtof_D2A
 -#define ULtod ULtod_D2A
 -#define ULtodd ULtodd_D2A
 -#define ULtox ULtox_D2A
 -#define ULtoxL ULtoxL_D2A
 -#define any_on any_on_D2A
 -#define b2d b2d_D2A
 -#define bigtens bigtens_D2A
 -#define cmp cmp_D2A
 -#define copybits copybits_D2A
 -#define d2b d2b_D2A
 -#define decrement decrement_D2A
 -#define diff diff_D2A
 -#define dtoa_result dtoa_result_D2A
 -#define g__fmt g__fmt_D2A
 -#define gethex gethex_D2A
 -#define hexdig hexdig_D2A
 -#define hexnan hexnan_D2A
 -#define hi0bits(x) hi0bits_D2A((ULong)(x))
 -#define i2b i2b_D2A
 -#define increment increment_D2A
 -#define lo0bits lo0bits_D2A
 -#define lshift lshift_D2A
 -#define match match_D2A
 -#define mult mult_D2A
 -#define multadd multadd_D2A
 -#define nrv_alloc nrv_alloc_D2A
 -#define pow5mult pow5mult_D2A
 -#define quorem quorem_D2A
 -#define ratio ratio_D2A
 -#define rshift rshift_D2A
 -#define rv_alloc rv_alloc_D2A
 -#define s2b s2b_D2A
 -#define set_ones set_ones_D2A
 -#define strcp strcp_D2A
 -#define strtoIg strtoIg_D2A
 -#define sum sum_D2A
 -#define tens tens_D2A
 -#define tinytens tinytens_D2A
 -#define tinytens tinytens_D2A
 -#define trailz trailz_D2A
 -#define ulp ulp_D2A
 +/*
 + * Paranoia: Protect exported symbols, including ones in files we don't
 + * compile right now.  The standard strtof and strtod survive.
 + */
 +#define       dtoa            __dtoa
 +#define       gdtoa           __gdtoa
 +#define       freedtoa        __freedtoa
 +#define       strtodg         __strtodg
 +#define       g_ddfmt         __g_ddfmt
 +#define       g_dfmt          __g_dfmt
 +#define       g_ffmt          __g_ffmt
 +#define       g_Qfmt          __g_Qfmt
 +#define       g_xfmt          __g_xfmt
 +#define       g_xLfmt         __g_xLfmt
 +#define       strtoId         __strtoId
 +#define       strtoIdd        __strtoIdd
 +#define       strtoIf         __strtoIf
 +#define       strtoIQ         __strtoIQ
 +#define       strtoIx         __strtoIx
 +#define       strtoIxL        __strtoIxL
 +#define       strtord         __strtord
 +#define       strtordd        __strtordd
 +#define       strtorf         __strtorf
 +#define       strtorQ         __strtorQ
 +#define       strtorx         __strtorx
 +#define       strtorxL        __strtorxL
 +#define       strtodI         __strtodI
 +#define       strtopd         __strtopd
 +#define       strtopdd        __strtopdd
 +#define       strtopf         __strtopf
 +#define       strtopQ         __strtopQ
 +#define       strtopx         __strtopx
 +#define       strtopxL        __strtopxL
 +
 +/* Protect gdtoa-internal symbols */
 +#define       Balloc          __Balloc_D2A
 +#define       Bfree           __Bfree_D2A
 +#define       ULtoQ           __ULtoQ_D2A
 +#define       ULtof           __ULtof_D2A
 +#define       ULtod           __ULtod_D2A
 +#define       ULtodd          __ULtodd_D2A
 +#define       ULtox           __ULtox_D2A
 +#define       ULtoxL          __ULtoxL_D2A
 +#define       any_on          __any_on_D2A
 +#define       b2d             __b2d_D2A
 +#define       bigtens         __bigtens_D2A
 +#define       cmp             __cmp_D2A
 +#define       copybits        __copybits_D2A
 +#define       d2b             __d2b_D2A
 +#define       decrement       __decrement_D2A
 +#define       diff            __diff_D2A
 +#define       dtoa_result     __dtoa_result_D2A
 +#define       g__fmt          __g__fmt_D2A
 +#define       gethex          __gethex_D2A
 +#define       hexdig          __hexdig_D2A
 +#define       hexdig_init_D2A __hexdig_init_D2A
 +#define       hexnan          __hexnan_D2A
 +#define       hi0bits(x)      __hi0bits_D2A((ULong)(x))
 +#define       hi0bits_D2A     __hi0bits_D2A
 +#define       i2b             __i2b_D2A
 +#define       increment       __increment_D2A
 +#define       lo0bits         __lo0bits_D2A
 +#define       lshift          __lshift_D2A
 +#define       match           __match_D2A
 +#define       mult            __mult_D2A
 +#define       multadd         __multadd_D2A
 +#define       nrv_alloc       __nrv_alloc_D2A
 +#define       pow5mult        __pow5mult_D2A
 +#define       quorem          __quorem_D2A
 +#define       ratio           __ratio_D2A
 +#define       rshift          __rshift_D2A
 +#define       rv_alloc        __rv_alloc_D2A
 +#define       s2b             __s2b_D2A
 +#define       set_ones        __set_ones_D2A
 +#define       strcp           __strcp_D2A
 +#define       strcp_D2A       __strcp_D2A
 +#define       strtoIg         __strtoIg_D2A
 +#define       sum             __sum_D2A
 +#define       tens            __tens_D2A
 +#define       tinytens        __tinytens_D2A
 +#define       tinytens        __tinytens_D2A
 +#define       trailz          __trailz_D2A
 +#define       ulp             __ulp_D2A
  
   extern char *dtoa_result;
   extern CONST double bigtens[], tens[], tinytens[];
   extern Bigint *diff ANSI((Bigint*, Bigint*));
   extern char *dtoa ANSI((double d, int mode, int ndigits,
                        int *decpt, int *sign, char **rve));
 + extern void freedtoa ANSI((char*));
   extern char *g__fmt ANSI((char*, char*, char*, int, ULong, size_t));
 + extern char *gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp,
 +                        int mode, int ndigits, int *decpt, char **rve));
   extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int));
   extern void hexdig_init_D2A(Void);
   extern int hexnan ANSI((CONST char**, FPI*, ULong*));
   extern Bigint *s2b ANSI((CONST char*, int, int, ULong, int));
   extern Bigint *set_ones ANSI((Bigint*, int));
   extern char *strcp ANSI((char*, const char*));
 + extern int strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*));
 +
 + extern int strtoId ANSI((CONST char *, char **, double *, double *));
 + extern int strtoIdd ANSI((CONST char *, char **, double *, double *));
 + extern int strtoIf ANSI((CONST char *, char **, float *, float *));
   extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*));
 + extern int strtoIQ ANSI((CONST char *, char **, void *, void *));
 + extern int strtoIx ANSI((CONST char *, char **, void *, void *));
 + extern int strtoIxL ANSI((CONST char *, char **, void *, void *));
   extern double strtod ANSI((const char *s00, char **se));
 + extern int strtopQ ANSI((CONST char *, char **, Void *));
 + extern int strtopf ANSI((CONST char *, char **, float *));
 + extern int strtopd ANSI((CONST char *, char **, double *));
 + extern int strtopdd ANSI((CONST char *, char **, double *));
 + extern int strtopx ANSI((CONST char *, char **, Void *));
 + extern int strtopxL ANSI((CONST char *, char **, Void *));
 + extern int strtord ANSI((CONST char *, char **, int, double *));
 + extern int strtordd ANSI((CONST char *, char **, int, double *));
 + extern int strtorf ANSI((CONST char *, char **, int, float *));
 + extern int strtorQ ANSI((CONST char *, char **, int, void *));
 + extern int strtorx ANSI((CONST char *, char **, int, void *));
 + extern int strtorxL ANSI((CONST char *, char **, int, void *));
   extern Bigint *sum ANSI((Bigint*, Bigint*));
   extern int trailz ANSI((Bigint*));
-  extern double ulp ANSI((double));
+  extern double ulp ANSI((U*));
  
  #ifdef __cplusplus
  }