xref: /csrg-svn/lib/libcompat/4.3/gcvt.c (revision 2012)
1*2012Swnj /* @(#)gcvt.c	4.1 (Berkeley) 12/21/80 */
2*2012Swnj /*
3*2012Swnj  * gcvt  - Floating output conversion to
4*2012Swnj  * minimal length string
5*2012Swnj  */
6*2012Swnj 
7*2012Swnj char	*ecvt();
8*2012Swnj 
9*2012Swnj char *
10*2012Swnj gcvt(number, ndigit, buf)
11*2012Swnj double number;
12*2012Swnj char *buf;
13*2012Swnj {
14*2012Swnj 	int sign, decpt;
15*2012Swnj 	register char *p1, *p2;
16*2012Swnj 	register i;
17*2012Swnj 
18*2012Swnj 	p1 = ecvt(number, ndigit, &decpt, &sign);
19*2012Swnj 	p2 = buf;
20*2012Swnj 	if (sign)
21*2012Swnj 		*p2++ = '-';
22*2012Swnj 	for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
23*2012Swnj 		ndigit--;
24*2012Swnj 	if (decpt >= 0 && decpt-ndigit > 4
25*2012Swnj 	 || decpt < 0 && decpt < -3) { /* use E-style */
26*2012Swnj 		decpt--;
27*2012Swnj 		*p2++ = *p1++;
28*2012Swnj 		*p2++ = '.';
29*2012Swnj 		for (i=1; i<ndigit; i++)
30*2012Swnj 			*p2++ = *p1++;
31*2012Swnj 		*p2++ = 'e';
32*2012Swnj 		if (decpt<0) {
33*2012Swnj 			decpt = -decpt;
34*2012Swnj 			*p2++ = '-';
35*2012Swnj 		} else
36*2012Swnj 			*p2++ = '+';
37*2012Swnj 		*p2++ = decpt/10 + '0';
38*2012Swnj 		*p2++ = decpt%10 + '0';
39*2012Swnj 	} else {
40*2012Swnj 		if (decpt<=0) {
41*2012Swnj 			if (*p1!='0')
42*2012Swnj 				*p2++ = '.';
43*2012Swnj 			while (decpt<0) {
44*2012Swnj 				decpt++;
45*2012Swnj 				*p2++ = '0';
46*2012Swnj 			}
47*2012Swnj 		}
48*2012Swnj 		for (i=1; i<=ndigit; i++) {
49*2012Swnj 			*p2++ = *p1++;
50*2012Swnj 			if (i==decpt)
51*2012Swnj 				*p2++ = '.';
52*2012Swnj 		}
53*2012Swnj 		if (ndigit<decpt) {
54*2012Swnj 			while (ndigit++<decpt)
55*2012Swnj 				*p2++ = '0';
56*2012Swnj 			*p2++ = '.';
57*2012Swnj 		}
58*2012Swnj 	}
59*2012Swnj 	if (p2[-1]=='.')
60*2012Swnj 		p2--;
61*2012Swnj 	*p2 = '\0';
62*2012Swnj 	return(buf);
63*2012Swnj }
64