xref: /csrg-svn/lib/libcompat/4.3/gcvt.c (revision 61241)
148399Sbostic /*-
2*61241Sbostic  * Copyright (c) 1991, 1993
3*61241Sbostic  *	The Regents of the University of California.  All rights reserved.
448399Sbostic  *
548399Sbostic  * %sccs.include.proprietary.c%
648399Sbostic  */
748399Sbostic 
826553Sdonn #if defined(LIBC_SCCS) && !defined(lint)
9*61241Sbostic static char sccsid[] = "@(#)gcvt.c	8.1 (Berkeley) 06/04/93";
1048399Sbostic #endif /* LIBC_SCCS and not lint */
1122089Smckusick 
122012Swnj /*
132012Swnj  * gcvt  - Floating output conversion to
142012Swnj  * minimal length string
152012Swnj  */
162012Swnj 
172012Swnj char	*ecvt();
182012Swnj 
192012Swnj char *
gcvt(number,ndigit,buf)202012Swnj gcvt(number, ndigit, buf)
212012Swnj double number;
222012Swnj char *buf;
232012Swnj {
242012Swnj 	int sign, decpt;
252012Swnj 	register char *p1, *p2;
262012Swnj 	register i;
272012Swnj 
282012Swnj 	p1 = ecvt(number, ndigit, &decpt, &sign);
292012Swnj 	p2 = buf;
302012Swnj 	if (sign)
312012Swnj 		*p2++ = '-';
322012Swnj 	for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
332012Swnj 		ndigit--;
342012Swnj 	if (decpt >= 0 && decpt-ndigit > 4
352012Swnj 	 || decpt < 0 && decpt < -3) { /* use E-style */
362012Swnj 		decpt--;
372012Swnj 		*p2++ = *p1++;
382012Swnj 		*p2++ = '.';
392012Swnj 		for (i=1; i<ndigit; i++)
402012Swnj 			*p2++ = *p1++;
412012Swnj 		*p2++ = 'e';
422012Swnj 		if (decpt<0) {
432012Swnj 			decpt = -decpt;
442012Swnj 			*p2++ = '-';
452012Swnj 		} else
462012Swnj 			*p2++ = '+';
472012Swnj 		*p2++ = decpt/10 + '0';
482012Swnj 		*p2++ = decpt%10 + '0';
492012Swnj 	} else {
502012Swnj 		if (decpt<=0) {
512012Swnj 			if (*p1!='0')
522012Swnj 				*p2++ = '.';
532012Swnj 			while (decpt<0) {
542012Swnj 				decpt++;
552012Swnj 				*p2++ = '0';
562012Swnj 			}
572012Swnj 		}
582012Swnj 		for (i=1; i<=ndigit; i++) {
592012Swnj 			*p2++ = *p1++;
602012Swnj 			if (i==decpt)
612012Swnj 				*p2++ = '.';
622012Swnj 		}
632012Swnj 		if (ndigit<decpt) {
642012Swnj 			while (ndigit++<decpt)
652012Swnj 				*p2++ = '0';
662012Swnj 			*p2++ = '.';
672012Swnj 		}
682012Swnj 	}
692012Swnj 	if (p2[-1]=='.')
702012Swnj 		p2--;
712012Swnj 	*p2 = '\0';
722012Swnj 	return(buf);
732012Swnj }
74