xref: /csrg-svn/lib/libcompat/4.3/ecvt.c (revision 1963)
1*1963Swnj /* @(#)ecvt.c	4.1 (Berkeley) 12/21/80 */
2*1963Swnj /*
3*1963Swnj  *	ecvt converts to decimal
4*1963Swnj  *	the number of digits is specified by ndigit
5*1963Swnj  *	decpt is set to the position of the decimal point
6*1963Swnj  *	sign is set to 0 for positive, 1 for negative
7*1963Swnj  */
8*1963Swnj 
9*1963Swnj char	*cvt();
10*1963Swnj 
11*1963Swnj #define	NDIG	80
12*1963Swnj char*
13*1963Swnj ecvt(arg, ndigits, decpt, sign)
14*1963Swnj double arg;
15*1963Swnj int ndigits, *decpt, *sign;
16*1963Swnj {
17*1963Swnj 	return(cvt(arg, ndigits, decpt, sign, 1));
18*1963Swnj }
19*1963Swnj 
20*1963Swnj char*
21*1963Swnj fcvt(arg, ndigits, decpt, sign)
22*1963Swnj double arg;
23*1963Swnj int ndigits, *decpt, *sign;
24*1963Swnj {
25*1963Swnj 	return(cvt(arg, ndigits, decpt, sign, 0));
26*1963Swnj }
27*1963Swnj 
28*1963Swnj static char*
29*1963Swnj cvt(arg, ndigits, decpt, sign, eflag)
30*1963Swnj double arg;
31*1963Swnj int ndigits, *decpt, *sign;
32*1963Swnj {
33*1963Swnj 	register int r2;
34*1963Swnj 	double fi, fj;
35*1963Swnj 	register char *p, *p1;
36*1963Swnj 	static char buf[NDIG];
37*1963Swnj 	double modf();
38*1963Swnj 
39*1963Swnj 	if (ndigits<0)
40*1963Swnj 		ndigits = 0;
41*1963Swnj 	if (ndigits>=NDIG-1)
42*1963Swnj 		ndigits = NDIG-2;
43*1963Swnj 	r2 = 0;
44*1963Swnj 	*sign = 0;
45*1963Swnj 	p = &buf[0];
46*1963Swnj 	if (arg<0) {
47*1963Swnj 		*sign = 1;
48*1963Swnj 		arg = -arg;
49*1963Swnj 	}
50*1963Swnj 	arg = modf(arg, &fi);
51*1963Swnj 	p1 = &buf[NDIG];
52*1963Swnj 	/*
53*1963Swnj 	 * Do integer part
54*1963Swnj 	 */
55*1963Swnj 	if (fi != 0) {
56*1963Swnj 		p1 = &buf[NDIG];
57*1963Swnj 		while (fi != 0) {
58*1963Swnj 			fj = modf(fi/10, &fi);
59*1963Swnj 			*--p1 = (int)((fj+.03)*10) + '0';
60*1963Swnj 			r2++;
61*1963Swnj 		}
62*1963Swnj 		while (p1 < &buf[NDIG])
63*1963Swnj 			*p++ = *p1++;
64*1963Swnj 	} else if (arg > 0) {
65*1963Swnj 		while ((fj = arg*10) < 1) {
66*1963Swnj 			arg = fj;
67*1963Swnj 			r2--;
68*1963Swnj 		}
69*1963Swnj 	}
70*1963Swnj 	p1 = &buf[ndigits];
71*1963Swnj 	if (eflag==0)
72*1963Swnj 		p1 += r2;
73*1963Swnj 	*decpt = r2;
74*1963Swnj 	if (p1 < &buf[0]) {
75*1963Swnj 		buf[0] = '\0';
76*1963Swnj 		return(buf);
77*1963Swnj 	}
78*1963Swnj 	while (p<=p1 && p<&buf[NDIG]) {
79*1963Swnj 		arg *= 10;
80*1963Swnj 		arg = modf(arg, &fj);
81*1963Swnj 		*p++ = (int)fj + '0';
82*1963Swnj 	}
83*1963Swnj 	if (p1 >= &buf[NDIG]) {
84*1963Swnj 		buf[NDIG-1] = '\0';
85*1963Swnj 		return(buf);
86*1963Swnj 	}
87*1963Swnj 	p = p1;
88*1963Swnj 	*p1 += 5;
89*1963Swnj 	while (*p1 > '9') {
90*1963Swnj 		*p1 = '0';
91*1963Swnj 		if (p1>buf)
92*1963Swnj 			++*--p1;
93*1963Swnj 		else {
94*1963Swnj 			*p1 = '1';
95*1963Swnj 			(*decpt)++;
96*1963Swnj 			if (eflag==0) {
97*1963Swnj 				if (p>buf)
98*1963Swnj 					*p = '0';
99*1963Swnj 				p++;
100*1963Swnj 			}
101*1963Swnj 		}
102*1963Swnj 	}
103*1963Swnj 	*p = '\0';
104*1963Swnj 	return(buf);
105*1963Swnj }
106