Merge branch 'vendor/GDTOA'
[dragonfly.git] / contrib / gdtoa / gdtoaimp.h
index 2c188d6..e1b58ea 100644 (file)
@@ -172,6 +172,12 @@ THIS SOFTWARE.
 
 #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
@@ -183,8 +189,14 @@ THIS SOFTWARE.
 #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
@@ -446,10 +458,16 @@ extern double rnd_prod(double, double), rnd_quot(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 9
 
@@ -472,51 +490,89 @@ extern void memcpy_D2A ANSI((void*, const void*, size_t));
 #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[];
@@ -539,7 +595,10 @@ extern void memcpy_D2A ANSI((void*, const void*, size_t));
  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*));
@@ -560,8 +619,28 @@ extern void memcpy_D2A ANSI((void*, const void*, size_t));
  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((U*));