#ifndef COSMOPOLITAN_THIRD_PARTY_GDTOA_GDTOA_H_
#define COSMOPOLITAN_THIRD_PARTY_GDTOA_GDTOA_H_
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_

#define dtoa      __dtoa
#define gdtoa     __gdtoa
#define strtodg   __strtodg
#define freedtoa  __freedtoa
#define g_ddfmt   __g_ddfmt
#define g_ddfmt_p __g_ddfmt_p
#define g_dfmt    __g_dfmt
#define g_dfmt_p  __g_dfmt_p
#define g_ffmt    __g_ffmt
#define g_ffmt_p  __g_ffmt_p
#define g_Qfmt    __g_Qfmt
#define g_Qfmt_p  __g_Qfmt_p
#define g_xfmt    __g_xfmt
#define g_xfmt_p  __g_xfmt_p
#define g_xLfmt   __g_xLfmt
#define g_xLfmt_p __g_xLfmt_p
#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

/**
 * Configures g_*fmt()
 *
 * @param ic
 * 	0 ==> Infinity or NaN
 * 	1 ==> infinity or nan
 * 	2 ==> INFINITY or NAN
 * 	3 ==> Inf or NaN
 * 	4 ==> inf or nan
 * 	5 ==> INF or NAN
 * @param ic determines if NaNs are rendered as NaN(...)
 * 	0 ==> no
 * 	1 ==> yes
 * 	2 ==> no for default NaN values; yes otherwise
 * @param ns determines sign of NaN values reported
 * 	0 ==> distinguish NaN and -NaN
 * 	1 ==> report both as NaN
 */
#define NIK(ic, nb, ns) (ic + 6 * (nb + 3 * ns))

enum {
  /* return values from strtodg */
  STRTOG_Zero = 0,
  STRTOG_Normal = 1,
  STRTOG_Denormal = 2,
  STRTOG_Infinite = 3,
  STRTOG_NaN = 4,
  STRTOG_NaNbits = 5,
  STRTOG_NoNumber = 6,
  STRTOG_Retmask = 7,
  /* The following may be or-ed into one of the above values. */
  STRTOG_Neg = 0x08,    /* does not affect STRTOG_Inexlo or STRTOG_Inexhi */
  STRTOG_Inexlo = 0x10, /* returned result rounded toward zero */
  STRTOG_Inexhi = 0x20, /* returned result rounded away from zero */
  STRTOG_Inexact = 0x30,
  STRTOG_Underflow = 0x40,
  STRTOG_Overflow = 0x80
};

typedef struct FPI {
  int nbits;
  int emin;
  int emax;
  int rounding;
  int sudden_underflow;
  int int_max;
} FPI;

enum {
  /* FPI.rounding values: same as FLT_ROUNDS */
  FPI_Round_zero = 0,
  FPI_Round_near = 1,
  FPI_Round_up = 2,
  FPI_Round_down = 3
};

char *dtoa(double, int, int, int *, int *, char **);
char *gdtoa(const FPI *, int, unsigned *, int *, int, int, int *, char **);
int strtodg(const char *, char **, const FPI *, int *, unsigned *);
void freedtoa(char *);

char *g_ddfmt(char *, double *, int, size_t);
char *g_ddfmt_p(char *, double *, int, size_t, int);
char *g_dfmt(char *, double *, int, size_t);
char *g_dfmt_p(char *, double *, int, size_t, int);
char *g_ffmt(char *, float *, int, size_t);
char *g_ffmt_p(char *, float *, int, size_t, int);
char *g_Qfmt(char *, void *, int, size_t);
char *g_Qfmt_p(char *, void *, int, size_t, int);
char *g_xfmt(char *, void *, int, size_t);
char *g_xfmt_p(char *, void *, int, size_t, int);
char *g_xLfmt(char *, void *, int, size_t);
char *g_xLfmt_p(char *, void *, int, size_t, int);

int strtoId(const char *, char **, double *, double *);
int strtoIdd(const char *, char **, double *, double *);
int strtoIf(const char *, char **, float *, float *);
int strtoIQ(const char *, char **, void *, void *);
int strtoIx(const char *, char **, void *, void *);
int strtoIxL(const char *, char **, void *, void *);
int strtord(const char *, char **, int, double *);
int strtordd(const char *, char **, int, double *);
int strtorf(const char *, char **, int, float *);
int strtorQ(const char *, char **, int, void *);
int strtorx(const char *, char **, int, void *);
int strtorxL(const char *, char **, int, void *);

int strtodI(const char *, char **, double *);
int strtopd(const char *, char **, double *);
int strtopdd(const char *, char **, double *);
int strtopf(const char *, char **, float *);
int strtopQ(const char *, char **, void *);
int strtopx(const char *, char **, void *);
int strtopxL(const char *, char **, void *);

COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_THIRD_PARTY_GDTOA_GDTOA_H_ */