Research V7 development
[unix-history] / usr / src / cmd / adb / output.c
CommitLineData
d94e2462
M
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9
10
11INT mkfault;
12INT infile;
13INT outfile 1;
14INT maxpos;
15
16CHAR printbuf[MAXLIN];
17CHAR *printptr printbuf;
18CHAR *digitptr;
19
20
21eqstr(s1, s2)
22 REG STRING s1, s2;
23{
24 REG STRING es1;
25 es1 = s1+8;
26 WHILE *s1++ == *s2
27 DO IF *s2++ == 0 ORF s1>=es1
28 THEN return(1);
29 FI
30 OD
31 return(0);
32}
33
34length(s)
35 STRING s;
36{
37 INT n 0;
38 WHILE *s++ DO n++; OD
39 return(n);
40}
41
42printc(c)
43 CHAR c;
44{
45 CHAR d;
46 STRING q;
47 INT posn, tabs, p;
48
49 IF mkfault
50 THEN return;
51 ELIF (*printptr=c)==EOR
52 THEN tabs=0; posn=0; q=printbuf;
53 FOR p=0; p<printptr-printbuf; p++
54 DO d=printbuf[p];
55 IF (p&7)==0 ANDF posn
56 THEN tabs++; posn=0;
57 FI
58 IF d==SP
59 THEN posn++;
60 ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
61 WHILE posn>0 DO *q++=SP; posn--; OD
62 *q++=d;
63 FI
64 OD
65 *q++=EOR;
66 write(outfile,printbuf,q-printbuf);
67 printptr=printbuf;
68 ELIF c==TB
69 THEN *printptr++=SP;
70 WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
71 ELIF c
72 THEN printptr++;
73 FI
74}
75
76charpos()
77{ return(printptr-printbuf);
78}
79
80flushbuf()
81{ IF printptr!=printbuf
82 THEN printc(EOR);
83 FI
84}
85
86printf(fmat,a1)
87 STRING fmat;
88 STRING *a1;
89{
90 STRING fptr, s;
91 INT *vptr;
92 L_INT *dptr;
93 L_REAL *rptr;
94 INT width, prec;
95 CHAR c, adj;
96 INT x, decpt, n;
97 L_INT lx;
98 CHAR digits[64];
99
100 fptr = fmat; vptr = &a1;
101
102 WHILE c = *fptr++
103 DO IF c!='%'
104 THEN printc(c);
105 ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
106 width=convert(&fptr);
107 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
108 digitptr=digits;
109 dptr=rptr=vptr; lx = *dptr; x = *vptr++;
110 s=0;
111 switch (c = *fptr++) {
112
113 case 'd':
114 case 'u':
115 printnum(x,c,10); break;
116 case 'o':
117 printoct(0,x,0); break;
118 case 'q':
119 lx=x; printoct(lx,-1); break;
120 case 'x':
121 printdbl(0,x,c,16); break;
122 case 'Y':
123 printdate(lx); vptr++; break;
124 case 'D':
125 case 'U':
126 printdbl(lx,c,10); vptr++; break;
127 case 'O':
128 printoct(lx,0); vptr++; break;
129 case 'Q':
130 printoct(lx,-1); vptr++; break;
131 case 'X':
132 printdbl(lx,'x',16); vptr++; break;
133 case 'c':
134 printc(x); break;
135 case 's':
136 s=x; break;
137 case 'f':
138 case 'F':
139 vptr += 7;
140 s=ecvt(*rptr, prec, &decpt, &n);
141 *digitptr++=(n?'-':'+');
142 *digitptr++ = (decpt<=0 ? '0' : *s++);
143 IF decpt>0 THEN decpt--; FI
144 *digitptr++ = '.';
145 WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD
146 WHILE *--digitptr=='0' DONE
147 digitptr += (digitptr-digits>=3 ? 1 : 2);
148 IF decpt
149 THEN *digitptr++ = 'e'; printnum(decpt,'d',10);
150 FI
151 s=0; prec = -1; break;
152 case 'm':
153 vptr--; break;
154 case 'M':
155 width=x; break;
156 case 'T':
157 case 't':
158 IF c=='T'
159 THEN width=x;
160 ELSE vptr--;
161 FI
162 IF width
163 THEN width -= charpos()%width;
164 FI
165 break;
166 default:
167 printc(c); vptr--;
168 }
169
170 IF s==0
171 THEN *digitptr=0; s=digits;
172 FI
173 n=length(s);
174 n=(prec<n ANDF prec>=0 ? prec : n);
175 width -= n;
176 IF adj=='r'
177 THEN WHILE width-- > 0
178 DO printc(SP); OD
179 FI
180 WHILE n-- DO printc(*s++); OD
181 WHILE width-- > 0 DO printc(SP); OD
182 digitptr=digits;
183 FI
184 OD
185}
186
187printdate(tvec)
188 L_INT tvec;
189{
190 REG INT i;
191 REG STRING timeptr;
192 timeptr = ctime(&tvec);
193 FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
194 FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
195} /*printdate*/
196
197prints(s)
198char *s;
199{ printf("%s",s);
200}
201
202newline()
203{
204 printc(EOR);
205}
206
207convert(cp)
208REG STRING *cp;
209{
210 REG CHAR c;
211 INT n;
212 n=0;
213 WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
214 (*cp)--;
215 return(n);
216}
217
218printnum(n,fmat,base)
219 REG INT n;
220{
221 REG CHAR k;
222 REG INT *dptr;
223 INT digs[15];
224 dptr=digs;
225 IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI
226 WHILE n
227 DO *dptr++ = ((POS)n)%base;
228 n=((POS)n)/base;
229 OD
230 IF dptr==digs THEN *dptr++=0; FI
231 WHILE dptr!=digs
232 DO k = *--dptr;
233 *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
234 OD
235}
236
237printoct(o,s)
238 L_INT o;
239 INT s;
240{
241 INT i;
242 L_INT po = o;
243 CHAR digs[12];
244
245 IF s
246 THEN IF po<0
247 THEN po = -po; *digitptr++='-';
248 ELSE IF s>0 THEN *digitptr++='+'; FI
249 FI
250 FI
251 FOR i=0;i<=11;i++
252 DO digs[i] = po&7; po =>> 3; OD
253 digs[10] &= 03; digs[11]=0;
254 FOR i=11;i>=0;i--
255 DO IF digs[i] THEN break; FI OD
256 FOR i++;i>=0;i--
257 DO *digitptr++=digs[i]+'0'; OD
258}
259
260printdbl(lx,ly,fmat,base)
261INT lx, ly; char fmat; int base;
262{ int digs[20]; int *dptr; char k;
263 L_REAL f ,g; long q;
264 dptr=digs;
265 IF fmat!='D'
266 THEN f=leng(lx); f *= itol(1,0); f += leng(ly);
267 IF fmat=='x' THEN *digitptr++='#'; FI
268 ELSE f=itol(lx,ly);
269 IF f<0 THEN *digitptr++='-'; f = -f; FI
270 FI
271 WHILE f
272 DO q=f/base; g=q;
273 *dptr++ = f-g*base;
274 f=q;
275 OD
276 IF dptr==digs THEN *dptr++=0; FI
277 WHILE dptr!=digs
278 DO k = *--dptr;
279 *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
280 OD
281}
282
283iclose()
284{
285 IF infile
286 THEN close(infile); infile=0;
287 FI
288}
289
290oclose()
291{
292 IF outfile!=1
293 THEN flushbuf(); close(outfile); outfile=1;
294 FI
295}
296
297endline()
298{
299 IF charpos()>=maxpos
300 THEN printf("\n");
301 FI
302}