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