xref: /csrg-svn/lib/libcompat/4.3/ecvt.c (revision 26889)
1*26889Smckusick #if defined(LIBC_SCCS) && !defined(lint)
2*26889Smckusick static char sccsid[] = "@(#)ecvt.c	5.1 (Berkeley) 03/15/86";
3*26889Smckusick #endif LIBC_SCCS and not lint
4*26889Smckusick 
51963Swnj /*
61963Swnj  *	ecvt converts to decimal
71963Swnj  *	the number of digits is specified by ndigit
81963Swnj  *	decpt is set to the position of the decimal point
91963Swnj  *	sign is set to 0 for positive, 1 for negative
101963Swnj  */
111963Swnj 
121963Swnj char	*cvt();
131963Swnj 
141963Swnj #define	NDIG	80
151963Swnj char*
161963Swnj ecvt(arg, ndigits, decpt, sign)
171963Swnj double arg;
181963Swnj int ndigits, *decpt, *sign;
191963Swnj {
201963Swnj 	return(cvt(arg, ndigits, decpt, sign, 1));
211963Swnj }
221963Swnj 
231963Swnj char*
241963Swnj fcvt(arg, ndigits, decpt, sign)
251963Swnj double arg;
261963Swnj int ndigits, *decpt, *sign;
271963Swnj {
281963Swnj 	return(cvt(arg, ndigits, decpt, sign, 0));
291963Swnj }
301963Swnj 
311963Swnj static char*
321963Swnj cvt(arg, ndigits, decpt, sign, eflag)
331963Swnj double arg;
341963Swnj int ndigits, *decpt, *sign;
351963Swnj {
361963Swnj 	register int r2;
371963Swnj 	double fi, fj;
381963Swnj 	register char *p, *p1;
391963Swnj 	static char buf[NDIG];
401963Swnj 	double modf();
411963Swnj 
421963Swnj 	if (ndigits<0)
431963Swnj 		ndigits = 0;
441963Swnj 	if (ndigits>=NDIG-1)
451963Swnj 		ndigits = NDIG-2;
461963Swnj 	r2 = 0;
471963Swnj 	*sign = 0;
481963Swnj 	p = &buf[0];
491963Swnj 	if (arg<0) {
501963Swnj 		*sign = 1;
511963Swnj 		arg = -arg;
521963Swnj 	}
531963Swnj 	arg = modf(arg, &fi);
541963Swnj 	p1 = &buf[NDIG];
551963Swnj 	/*
561963Swnj 	 * Do integer part
571963Swnj 	 */
581963Swnj 	if (fi != 0) {
591963Swnj 		p1 = &buf[NDIG];
601963Swnj 		while (fi != 0) {
611963Swnj 			fj = modf(fi/10, &fi);
621963Swnj 			*--p1 = (int)((fj+.03)*10) + '0';
631963Swnj 			r2++;
641963Swnj 		}
651963Swnj 		while (p1 < &buf[NDIG])
661963Swnj 			*p++ = *p1++;
671963Swnj 	} else if (arg > 0) {
681963Swnj 		while ((fj = arg*10) < 1) {
691963Swnj 			arg = fj;
701963Swnj 			r2--;
711963Swnj 		}
721963Swnj 	}
731963Swnj 	p1 = &buf[ndigits];
741963Swnj 	if (eflag==0)
751963Swnj 		p1 += r2;
761963Swnj 	*decpt = r2;
771963Swnj 	if (p1 < &buf[0]) {
781963Swnj 		buf[0] = '\0';
791963Swnj 		return(buf);
801963Swnj 	}
811963Swnj 	while (p<=p1 && p<&buf[NDIG]) {
821963Swnj 		arg *= 10;
831963Swnj 		arg = modf(arg, &fj);
841963Swnj 		*p++ = (int)fj + '0';
851963Swnj 	}
861963Swnj 	if (p1 >= &buf[NDIG]) {
871963Swnj 		buf[NDIG-1] = '\0';
881963Swnj 		return(buf);
891963Swnj 	}
901963Swnj 	p = p1;
911963Swnj 	*p1 += 5;
921963Swnj 	while (*p1 > '9') {
931963Swnj 		*p1 = '0';
941963Swnj 		if (p1>buf)
951963Swnj 			++*--p1;
961963Swnj 		else {
971963Swnj 			*p1 = '1';
981963Swnj 			(*decpt)++;
991963Swnj 			if (eflag==0) {
1001963Swnj 				if (p>buf)
1011963Swnj 					*p = '0';
1021963Swnj 				p++;
1031963Swnj 			}
1041963Swnj 		}
1051963Swnj 	}
1061963Swnj 	*p = '\0';
1071963Swnj 	return(buf);
1081963Swnj }
109