date and time created 90/05/03 17:47:31 by bostic
[unix-history] / usr / src / lib / libcompat / 4.3 / gcvt.c
CommitLineData
2ce81398
DS
1#if defined(LIBC_SCCS) && !defined(lint)
2static char sccsid[] = "@(#)gcvt.c 5.2 (Berkeley) %G%";
3#endif LIBC_SCCS and not lint
b8f253e8 4
c99ed8cf
BJ
5/*
6 * gcvt - Floating output conversion to
7 * minimal length string
8 */
9
10char *ecvt();
11
12char *
13gcvt(number, ndigit, buf)
14double number;
15char *buf;
16{
17 int sign, decpt;
18 register char *p1, *p2;
19 register i;
20
21 p1 = ecvt(number, ndigit, &decpt, &sign);
22 p2 = buf;
23 if (sign)
24 *p2++ = '-';
25 for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
26 ndigit--;
27 if (decpt >= 0 && decpt-ndigit > 4
28 || decpt < 0 && decpt < -3) { /* use E-style */
29 decpt--;
30 *p2++ = *p1++;
31 *p2++ = '.';
32 for (i=1; i<ndigit; i++)
33 *p2++ = *p1++;
34 *p2++ = 'e';
35 if (decpt<0) {
36 decpt = -decpt;
37 *p2++ = '-';
38 } else
39 *p2++ = '+';
40 *p2++ = decpt/10 + '0';
41 *p2++ = decpt%10 + '0';
42 } else {
43 if (decpt<=0) {
44 if (*p1!='0')
45 *p2++ = '.';
46 while (decpt<0) {
47 decpt++;
48 *p2++ = '0';
49 }
50 }
51 for (i=1; i<=ndigit; i++) {
52 *p2++ = *p1++;
53 if (i==decpt)
54 *p2++ = '.';
55 }
56 if (ndigit<decpt) {
57 while (ndigit++<decpt)
58 *p2++ = '0';
59 *p2++ = '.';
60 }
61 }
62 if (p2[-1]=='.')
63 p2--;
64 *p2 = '\0';
65 return(buf);
66}