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