xref: /csrg-svn/lib/libcompat/4.3/gcvt.c (revision 26553)
1*26553Sdonn #if defined(LIBC_SCCS) && !defined(lint)
2*26553Sdonn static char sccsid[] = "@(#)gcvt.c	5.2 (Berkeley) 03/09/86";
3*26553Sdonn #endif LIBC_SCCS and not lint
422089Smckusick 
52012Swnj /*
62012Swnj  * gcvt  - Floating output conversion to
72012Swnj  * minimal length string
82012Swnj  */
92012Swnj 
102012Swnj char	*ecvt();
112012Swnj 
122012Swnj char *
132012Swnj gcvt(number, ndigit, buf)
142012Swnj double number;
152012Swnj char *buf;
162012Swnj {
172012Swnj 	int sign, decpt;
182012Swnj 	register char *p1, *p2;
192012Swnj 	register i;
202012Swnj 
212012Swnj 	p1 = ecvt(number, ndigit, &decpt, &sign);
222012Swnj 	p2 = buf;
232012Swnj 	if (sign)
242012Swnj 		*p2++ = '-';
252012Swnj 	for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
262012Swnj 		ndigit--;
272012Swnj 	if (decpt >= 0 && decpt-ndigit > 4
282012Swnj 	 || decpt < 0 && decpt < -3) { /* use E-style */
292012Swnj 		decpt--;
302012Swnj 		*p2++ = *p1++;
312012Swnj 		*p2++ = '.';
322012Swnj 		for (i=1; i<ndigit; i++)
332012Swnj 			*p2++ = *p1++;
342012Swnj 		*p2++ = 'e';
352012Swnj 		if (decpt<0) {
362012Swnj 			decpt = -decpt;
372012Swnj 			*p2++ = '-';
382012Swnj 		} else
392012Swnj 			*p2++ = '+';
402012Swnj 		*p2++ = decpt/10 + '0';
412012Swnj 		*p2++ = decpt%10 + '0';
422012Swnj 	} else {
432012Swnj 		if (decpt<=0) {
442012Swnj 			if (*p1!='0')
452012Swnj 				*p2++ = '.';
462012Swnj 			while (decpt<0) {
472012Swnj 				decpt++;
482012Swnj 				*p2++ = '0';
492012Swnj 			}
502012Swnj 		}
512012Swnj 		for (i=1; i<=ndigit; i++) {
522012Swnj 			*p2++ = *p1++;
532012Swnj 			if (i==decpt)
542012Swnj 				*p2++ = '.';
552012Swnj 		}
562012Swnj 		if (ndigit<decpt) {
572012Swnj 			while (ndigit++<decpt)
582012Swnj 				*p2++ = '0';
592012Swnj 			*p2++ = '.';
602012Swnj 		}
612012Swnj 	}
622012Swnj 	if (p2[-1]=='.')
632012Swnj 		p2--;
642012Swnj 	*p2 = '\0';
652012Swnj 	return(buf);
662012Swnj }
67