xref: /original-bsd/old/adb/adb.vax/output.c (revision 5133e8a4)
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 
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 
39 length(s)
40 	REG STRING		s;
41 {
42 	INT		n = 0;
43 	WHILE *s++ DO n++; OD
44 	return(n);
45 }
46 
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 
89 charpos()
90 {	return(printptr-printbuf);
91 }
92 
93 flushbuf()
94 {	IF printptr!=printbuf
95 	THEN printc(EOR);
96 	FI
97 }
98 
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 
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 
249 prints(s)
250 char *s;
251 {	printf("%s",s);
252 }
253 
254 newline()
255 {
256 	printc(EOR);
257 }
258 
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 
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 
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
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 
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 
397 oclose()
398 {
399 	IF outfile!=1
400 	THEN	flushbuf(); close(outfile); outfile=1;
401 	FI
402 }
403 
404 endline()
405 {
406 
407 	if (maxpos <= charpos())
408 		printf("\n");
409 }
410