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