ack/lang/cem/libcc/gen/gcvt.c

63 lines
1.1 KiB
C
Raw Normal View History

1987-03-31 10:45:53 +00:00
/* $Header$ */
1987-01-27 15:57:55 +00:00
#ifndef NOFLOAT
extern char *ecvt();
#define NDIGINEXP 2
char *
gcvt(value, ndigit, buf)
double value;
char *buf;
register int ndigit;
{
int sign, dp;
register char *s1, *s2;
register int i;
s1 = ecvt(value, ndigit, &dp, &sign);
s2 = buf;
if (sign) *s2++ = '-';
for (i = ndigit - 1; i > 0 && s1[i] == '0'; i--) ndigit--;
if (dp - ndigit > NDIGINEXP + 2 || dp < -NDIGINEXP - 1) {
/* Use E format, otherwise we need too many '0''s */
dp--;
*s2++ = *s1++;
*s2++ = '.';
while (--ndigit > 0) *s2++ = *s1++;
*s2++ = 'e';
if (dp < 0) {
*s2++ = '-';
dp = -dp;
}
else *s2++ = '+';
s2 += NDIGINEXP;
for (i = NDIGINEXP; i > 0; i--) {
*--s2 = dp % 10 + '0';
dp /= 10;
}
return buf;
}
if (dp <= 0) {
if (*s1 != '0') {
/* otherwise the whole number is 0 */
*s2++ = '.';
}
while (dp < 0) {
dp++;
*s2++ = '0';
}
}
for (i = 1; i <= ndigit; i++) {
*s2++ = *s1++;
if (i == dp) *s2++ = '.';
}
if (i <= dp) {
while (i++ <= dp) *s2++ = '0';
*s2++ = '.';
}
if (s2[-1]=='.') s2--;
*s2 = '\0';
return buf;
}
#endif