xref: /original-bsd/lib/libcompat/4.3/gcvt.c (revision 57124d5e)
1 #if defined(LIBC_SCCS) && !defined(lint)
2 static char sccsid[] = "@(#)gcvt.c	5.2 (Berkeley) 03/09/86";
3 #endif LIBC_SCCS and not lint
4 
5 /*
6  * gcvt  - Floating output conversion to
7  * minimal length string
8  */
9 
10 char	*ecvt();
11 
12 char *
13 gcvt(number, ndigit, buf)
14 double number;
15 char *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 }
67