BSD 4 development
[unix-history] / usr / src / cmd / apl / a2.c
CommitLineData
ed12929c
BJ
1#include "apl.h"
2
3ex_print()
4{
5
6 epr0();
7 aputchar('\n');
8}
9
10ex_hprint()
11{
12
13 epr0();
14 pop();
15}
16
17epr0()
18{
19 register struct item *p;
20 register data *dp;
21 data dp2;
22 short int dp7;
23 register i;
24 int j;
25 int param[4];
26
27 p = fetch1();
28 if(p->size == 0)
29 return;
30 if(p->type == DA) {
31 for(i=0; i<4; i++)
32 param[i] = 0;
33 dp = p->datap;
34 dp2 = *(dp);
35 for(i=0; i<p->size; i++)
36 epr1(*dp++, param);
37 i = param[1] + param[2]; /* size if fp */
38 if(i > thread.digits)
39 i += 100;
40 if(param[2])
41 i++;
42 if(i > param[0]+5) {
43 i = param[0] + 5; /* size if ep */
44 param[1] = param[0];
45 param[2] = -1;
46 }
47 if(param[3])
48 i++; /* sign */
49 i++; /* leading space */
50 param[0] = i;
51 dp = p->datap;
52 }
53 bidx(p);
54 for(i=1; i<p->size; i++) {
55 if(intflg)
56 break;
57 if(p->type == CH) {
58 j = getdat(p);
59 aputchar(j);
60 } else
61 epr2(*dp++, param);
62 for(j=p->rank-2; j>=0; j--)
63 if(i%idx.del[j] == 0)
64 aputchar('\n');
65 }
66 if(p->type == CH) {
67 j = getdat(p);
68 aputchar(j);
69 } else
70 epr2(*dp, param);
71}
72
73epr1(d, param)
74data d;
75int *param;
76{
77 double f;
78 register a;
79 register char *c;
80 int dp, sg;
81
82 f = d;
83 c = ecvt(f, thread.digits, &dp, &sg);
84 a = thread.digits;
85 while(c[a-1]=='0' && a>1)
86 a--;
87 if(a > param[0]) /* sig digits */
88 param[0] = a;
89 a -= dp;
90 if(a < 0)
91 a = 0;
92 if(a > param[2]) /* digits to right of dp */
93 param[2] = a;
94 if(dp > param[1]) /* digits to left of dp */
95 param[1] = dp;
96 param[3] |= sg; /* and sign */
97}
98
99epr2(d, param)
100int *param;
101data d;
102{
103 register i;
104 register char *c, *mc;
105 double f;
106 int dp, sg;
107
108 if(param[0]+column > thread.width) {
109 aputchar('\n');
110 putto(param[0]);
111 }
112 f = d;
113 c = ecvt(f, thread.digits, &dp, &sg);
114 mc = c + thread.digits;
115 aputchar(' ');
116 sg = sg? '@': ' ';
117 if(param[2] < 0) {
118 if(param[3])
119 aputchar(sg);
120 for(i=0; i<param[1]; i++) {
121 aputchar(*c++);
122 if(i == 0)
123 aputchar('.');
124 }
125 aputchar('e');
126 dp--;
127 if(dp < 0) {
128 aputchar('@');
129 dp = -dp;
130 } else
131 aputchar('-'); /* an apl style plus sign */
132 aputchar(dp/10 + '0');
133 aputchar(dp%10 + '0');
134 return;
135 }
136 i = dp;
137 if(i < 0)
138 i = 0;
139 for(; i<param[1]; i++)
140 aputchar(' ');
141 if(param[3])
142 aputchar(sg);
143 for(i=0; i<dp; i++)
144 if(c >= mc)
145 aputchar('0'); else
146 aputchar(*c++);
147 for(i=0; i<param[2]; i++) {
148 if(i == 0)
149 aputchar('.');
150 if(dp < 0) {
151 aputchar('0');
152 dp++;
153 } else
154 if(c >= mc)
155 aputchar('0'); else
156 aputchar(*c++);
157 }
158}