P8000/WEGA/contrib/lcc/lib/libc/port/gen/gcvt.c

72 lines
1.2 KiB
C

/*
* gcvt - Floating output conversion to
*
* pleasant-looking string.
*/
extern char *ecvt();
char *
gcvt(number, ndigit, buf)
double number;
int ndigit;
char *buf;
{
int sign, decpt;
register char *p1, *p2 = buf;
register int i;
p1 = ecvt(number, ndigit, &decpt, &sign);
if (sign)
*p2++ = '-';
if (decpt > ndigit || decpt <= -4) { /* E-style */
decpt--;
*p2++ = *p1++;
*p2++ = '.';
for (i = 1; i < ndigit; i++)
*p2++ = *p1++;
#ifdef TRIMZERO
while (p2[-1] == '0')
p2--;
if (p2[-1] == '.')
p2--;
#endif
*p2++ = 'e';
if (decpt < 0) {
decpt = -decpt;
*p2++ = '-';
} else
*p2++ = '+';
for (i = 1000; i != 0; i /= 10) /* 3B or CRAY, for example */
if (i <= decpt || i <= 10) /* force 2 digits */
*p2++ = (decpt / i) % 10 + '0';
} else {
if (decpt <= 0) {
*p2++ = '0';
*p2++ = '.';
while (decpt < 0) {
decpt++;
*p2++ = '0';
}
}
for (i = 1; i <= ndigit; i++) {
*p2++ = *p1++;
if (i == decpt)
*p2++ = '.';
}
if (ndigit < decpt) {
while (ndigit++ < decpt)
*p2++ = '0';
*p2++ = '.';
}
#ifdef TRIMZERO
while (*--p2 == '0' && p2 > buf)
;
if (*p2 != '.')
p2++;
#endif
}
*p2 = '\0';
return (buf);
}