BSD 2 development
[unix-history] / .ref-BSD-1 / px / pwrite.c
CommitLineData
4e754410
BJ
1#
2#include "0x.h"
3#include "opcode.h"
4
5pwrite(opc, subopc, av)
6{
7 register char *ap, *cp;
8 register i;
9 int w, w1, sign, decpt;
10 char *acp;
11 long along;
12 double adouble;
13 int k2,k3;
14
15 ap = &av;
16 if (opc == O_WRITLN || opc == O_PAGE)
17 opc = O_WRITC;
18 switch(opc) {
19 case O_WRIT2:
20 along = ap->pint;
21 ap =+ 2;
22 w = 10;
23 break;
24 case O_WRIT4:
25 along = ap->plong;
26 ap =+ 4;
27 w = 10;
28 break;
29 case O_WRITC:
30 acp = ap;
31 ap =+ 2;
32 w = 1;
33 break;
34 case O_WRITB:
35 i = ap->pint;
36 ap =+ 2;
37 w = 10;
38 break;
39 case O_WRITG:
40 w1 = ap->pint;
41 ap =+ 2;
42 acp = ap;
43 ap =+ (w1 + 1) & ~1;
44 w = 0;
45 break;
46 case O_WRIT8:
47 case O_WRIT82:
48 adouble = ap->pdouble;
49 ap =+ 8;
50 w = 22;
51 break;
52 case O_WRHEX2:
53 case O_WROCT2:
54 (&along)->pint = 0;
55 (&along)->p2int = ap->pint;
56 ap =+ 2;
57 w = opc == O_WROCT2 ? 11 : 8;
58 break;
59 case O_WRHEX2+1: /* ugh, cc string table too small */
60 case O_WROCT2+1: /* ugh, cc string table too small */
61 along = ap->plong;
62 ap =+ 4;
63 w = opc == O_WROCT2+1 ? 11 : 8;
64 break;
65 }
66again:
67 switch(subopc & 07) {
68 case 0:
69 break;
70 case 2:
71 w = ap->pint;
72 ap =+ 2;
73 break;
74 case 4:
75 w = ap->plong;
76 ap =+ 4;
77 break;
78 }
79 if (opc == O_WRIT82 && (i = (subopc >> 3) & 07) != 0) {
80 subopc = i;
81 w1 = w;
82 goto again;
83 }
84 switch(opc) {
85 case O_WROCT2+1:
86 case O_WROCT2:
87 while (w > 11) {
88 pputch(' ');
89 w--;
90 }
91 if (w > 0)
92 wro(along, w);
93 break;
94 case O_WRHEX2:
95 case O_WRHEX2+1:
96 while (w > 8) {
97 pputch(' ');
98 w--;
99 }
100 if (w > 0)
101 wrhex(along, w);
102 break;
103 case O_WRIT2:
104 case O_WRIT4:
105 pwril(w, along);
106 break;
107 case O_WRITC:
108 while (w > 1) {
109 pputch(' ');
110 w--;
111 }
112 pputch(*acp);
113 break;
114 case O_WRITB:
115 if (i) {
116 acp = "true";
117 w1 = 4;
118 } else {
119 acp = "false";
120 w1 = 5;
121 }
122 case O_WRITG:
123 cp = acp;
124 while (w > w1) {
125 pputch(' ');
126 w--;
127 }
128 while(w1 > 0) {
129 pputch(*cp++);
130 w1--;
131 }
132 break;
133 case O_WRIT8:
134 if (adouble == 0.0) {
135 do
136 pputch(' ');
137 while (--w > 0);
138 pputch('0');
139 break;
140 }
141 if (w <= 9)
142 w = 3;
143 else
144 w =- 6;
145 do
146 pputch(' ');
147 while (--w > 17);
148 cp = ecvt(adouble, w+1, &decpt, &sign);
149 pputch(sign ? '-' : ' ');
150 pputch(*cp++);
151 pputch('.');
152 do
153 pputch(*cp++);
154 while (--w > 0);
155 pputch('e');
156 if (--decpt >= 0)
157 pputch('+');
158 else {
159 pputch('-');
160 decpt = -decpt;
161 }
162 pputch(decpt / 10 + '0');
163 pputch(decpt % 10 + '0');
164 break;
165 case O_WRIT82:
166 if (adouble == 0.0) {
167 do
168 pputch(' ');
169 while(--w1 > 1);
170 pputch('0');
171 break;
172 }
173 if (w < 0)
174 w = 0;
175 cp = fcvt(adouble, w, &decpt, &sign);
176 cp[17] = '\0';
177 if (decpt > 0) {
178 w1 = w1-w-decpt-2;
179 k2 = decpt;
180 k3 = 0;
181 } else {
182 w1 = w1-w-3;
183 k2 = 0;
184 if (w+decpt >= 0)
185 k3 = -decpt;
186 else
187 k3 = w;
188 w =- k3;
189 }
190 while (w1 > 0) {
191 pputch(' ');
192 w1--;
193 }
194 pputch(sign ? '-' : ' ');
195 if (k2 <= 0)
196 pputch('0');
197 else
198 do
199 pputch(*cp ? *cp++ : '0');
200 while (--k2 > 0);
201 pputch('.');
202 if (k3 <= 0 && w <= 0) {
203 pputch('0');
204 break;
205 }
206 while(k3 > 0) {
207 pputch('0');
208 k3--;
209 }
210 while(w > 0) {
211 pputch(*cp ? *cp++ : '0');
212 w--;
213 }
214 break;
215 }
216 return(ap);
217}
218
219wro(l, w)
220long l;
221{
222 register c;
223
224 c = (&l)->p2int & 07;
225 l =>> 3;
226 (&l)->pint =& 017777;
227 if (w > 1 || l != 0)
228 wro(l, w-1);
229 pputch(c | '0');
230}
231
232wrhex(l, w)
233long l;
234{
235 register c;
236
237 c = (&l)->p2int & 017;
238 l =>> 4;
239 (&l)->pint =& 07777;
240 if (w > 1 || l != 0)
241 wrhex(l, w-1);
242 pputch(c <= 9 ? c | '0' : 'a' + (c - 10));
243}