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