#include <sys/cdefs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char *__dtoa(double, int, int, int *, int *, char **);
extern void __freedtoa(char *);
static char *__cvt(double, int, int *, int *, int, int);
static char *
__cvt(double value, int ndigit, int * __restrict decpt, int * __restrict sign, int fmode, int pad)
{
static char *s;
char *p, *rve, c;
size_t siz;
if (ndigit == 0) {
*sign = value < 0.0;
*decpt = 0;
return ("");
}
if (s) {
free(s);
s = NULL;
}
if (ndigit < 0)
siz = -ndigit + 1;
else
siz = ndigit + 1;
if (value == 0.0) {
*decpt = 1 - fmode;
*sign = 0;
if ((rve = s = (char *)malloc(siz)) == NULL)
return(NULL);
*rve++ = '0';
*rve = '\0';
} else {
p = __dtoa(value, fmode + 2, ndigit, decpt, sign, &rve);
if (p == NULL)
return (NULL);
if (*decpt == 9999) {
*decpt = 0;
c = *p;
__freedtoa(p);
return(c == 'I' ? "inf" : "nan");
}
if (pad && fmode)
siz += *decpt;
if ((s = (char *)malloc(siz)) == NULL) {
__freedtoa(p);
return(NULL);
}
(void) strlcpy(s, p, siz);
rve = s + (rve - p);
__freedtoa(p);
}
if (pad) {
siz -= rve - s;
while (--siz)
*rve++ = '0';
*rve = '\0';
}
return(s);
}
char *
ecvt(double value, int ndigit, int * __restrict decpt, int * __restrict sign)
{
return(__cvt(value, ndigit, decpt, sign, 0, 1));
}
char *
fcvt(double value, int ndigit, int * __restrict decpt, int * __restrict sign)
{
return(__cvt(value, ndigit, decpt, sign, 1, 1));
}