xref: /csrg-svn/old/adb/adb.tahoe/output.c (revision 26421)
1*26421Ssam #ifndef lint
2*26421Ssam static	char sccsid[] = "@(#)output.c	1.1 (Berkeley) 02/25/86";
3*26421Ssam #endif
4*26421Ssam /*
5*26421Ssam  *
6*26421Ssam  *	UNIX debugger
7*26421Ssam  *
8*26421Ssam  */
9*26421Ssam 
10*26421Ssam #include "defs.h"
11*26421Ssam 
12*26421Ssam INT		mkfault;
13*26421Ssam INT		infile;
14*26421Ssam INT		outfile = 1;
15*26421Ssam L_INT		maxpos;
16*26421Ssam ADDR		maxoff;
17*26421Ssam INT		radix = 16;
18*26421Ssam 
19*26421Ssam CHAR		printbuf[MAXLIN];
20*26421Ssam CHAR		*printptr = printbuf;
21*26421Ssam CHAR		*digitptr;
22*26421Ssam MSG		TOODEEP;
23*26421Ssam 
24*26421Ssam printc(c)
25*26421Ssam 	CHAR		c;
26*26421Ssam {
27*26421Ssam 	CHAR		d;
28*26421Ssam 	REG	STRING	q;
29*26421Ssam 	REG		posn, tabs, p;
30*26421Ssam 
31*26421Ssam 	IF mkfault
32*26421Ssam 	THEN	return;
33*26421Ssam 	ELIF (*printptr=c)==EOR
34*26421Ssam 	THEN tabs=0; posn=0; q=printbuf;
35*26421Ssam 	     FOR p=0; p<printptr-printbuf; p++
36*26421Ssam 	     DO d=printbuf[p];
37*26421Ssam 		IF (p&7)==0 ANDF posn
38*26421Ssam 		THEN tabs++; posn=0;
39*26421Ssam 		FI
40*26421Ssam 		IF d==SP
41*26421Ssam 		THEN posn++;
42*26421Ssam 		ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
43*26421Ssam 		     WHILE posn>0 DO *q++=SP; posn--; OD
44*26421Ssam 		     *q++=d;
45*26421Ssam 		FI
46*26421Ssam 	     OD
47*26421Ssam 	     *q++=EOR;
48*26421Ssam #ifdef EDDT
49*26421Ssam 		printptr=printbuf; do putchar(*printptr++); while (printptr<q);
50*26421Ssam #else
51*26421Ssam 	     write(outfile,printbuf,q-printbuf);
52*26421Ssam #endif
53*26421Ssam 	     printptr=printbuf;
54*26421Ssam 	ELIF c==TB
55*26421Ssam 	THEN *printptr++=SP;
56*26421Ssam 	     WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
57*26421Ssam 	ELIF c
58*26421Ssam 	THEN printptr++;
59*26421Ssam 	FI
60*26421Ssam 	IF printptr >= &printbuf[MAXLIN-9] THEN
61*26421Ssam 		write(outfile, printbuf, printptr - printbuf);
62*26421Ssam 		printptr = printbuf;
63*26421Ssam 	FI
64*26421Ssam }
65*26421Ssam 
66*26421Ssam charpos()
67*26421Ssam {	return(printptr-printbuf);
68*26421Ssam }
69*26421Ssam 
70*26421Ssam flushbuf()
71*26421Ssam {	IF printptr!=printbuf
72*26421Ssam 	THEN printc(EOR);
73*26421Ssam 	FI
74*26421Ssam }
75*26421Ssam 
76*26421Ssam /* VARARGS1 */
77*26421Ssam printf(fmat,a1)
78*26421Ssam 	STRING		fmat;
79*26421Ssam 	STRING		a1;
80*26421Ssam {
81*26421Ssam 	STRING	fptr;
82*26421Ssam 	REG	STRING	s;
83*26421Ssam 	REG	L_INT	*dptr;
84*26421Ssam 	L_REAL		*rptr;
85*26421Ssam 	REG		width, prec;
86*26421Ssam 	CHAR		c, adj;
87*26421Ssam 	INT		x, n;
88*26421Ssam 	REG	L_INT	lx;
89*26421Ssam 	CHAR		digits[64];
90*26421Ssam 
91*26421Ssam 	fptr = fmat; dptr = (L_INT *)&a1;
92*26421Ssam 
93*26421Ssam 	WHILE c = *fptr++
94*26421Ssam 	DO  IF c!='%'
95*26421Ssam 	    THEN printc(c);
96*26421Ssam 	    ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
97*26421Ssam 		 width=convert(&fptr);
98*26421Ssam 		 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
99*26421Ssam 		 digitptr=digits;
100*26421Ssam 		 rptr=(L_REAL *)dptr; x = lx = *dptr++;
101*26421Ssam 		 s=0;
102*26421Ssam 		 switch (c = *fptr++) {
103*26421Ssam 
104*26421Ssam 		    case 'd':
105*26421Ssam 			printnum(x, -10); break;
106*26421Ssam 		    case 'u':
107*26421Ssam 			printnum((unsigned short)x, 10); break;
108*26421Ssam 		    case 'o':
109*26421Ssam 			printnum((unsigned short)x, 8); break;
110*26421Ssam 		    case 'q':
111*26421Ssam 			printnum(x, -8); break;
112*26421Ssam 		    case 'x':
113*26421Ssam 			printnum((unsigned short)x, 16); break;
114*26421Ssam 		    case 'z':
115*26421Ssam 			printnum((unsigned short)x, -16); break;
116*26421Ssam 		    case 'R':
117*26421Ssam 			printnum(lx, radix); break;
118*26421Ssam 		    case 'Y':
119*26421Ssam 			printdate(lx); break;
120*26421Ssam 		    case 'D':
121*26421Ssam 			printnum(lx, -10); break;
122*26421Ssam 		    case 'U':
123*26421Ssam 			printnum(lx, 10); break;
124*26421Ssam 		    case 'O':
125*26421Ssam 			printnum(lx, 8); break;
126*26421Ssam 		    case 'Q':
127*26421Ssam 			printnum(lx, -8); break;
128*26421Ssam 		    case 'X':
129*26421Ssam 			printnum(lx, 16); break;
130*26421Ssam 		    case 'Z':
131*26421Ssam 			printnum(lx, -16); break;
132*26421Ssam 		    case 'c':
133*26421Ssam 			printc(x); break;
134*26421Ssam 		    case 's':
135*26421Ssam 			s=(STRING)lx; break;
136*26421Ssam #ifndef EDDT
137*26421Ssam 		    case 'f':
138*26421Ssam 		    case 'F':
139*26421Ssam 			dptr++;
140*26421Ssam 			sprintf(s=digits, "%*.*f", width, prec, *rptr); prec= -1; break;
141*26421Ssam #endif
142*26421Ssam 		    case 'm':
143*26421Ssam 			break;
144*26421Ssam 		    case 'M':
145*26421Ssam 			width=x; break;
146*26421Ssam 		    case 'T':
147*26421Ssam 		    case 't':
148*26421Ssam 			IF c=='T'
149*26421Ssam 			THEN width=x;
150*26421Ssam 			ELSE dptr--;
151*26421Ssam 			FI
152*26421Ssam 			IF width
153*26421Ssam 			THEN width -= charpos()%width;
154*26421Ssam 			FI
155*26421Ssam 			break;
156*26421Ssam 		    default:
157*26421Ssam 			printc(c); dptr--;
158*26421Ssam 		}
159*26421Ssam 
160*26421Ssam 		IF s==0
161*26421Ssam 		THEN *digitptr=0; s=digits;
162*26421Ssam 		FI
163*26421Ssam 		n=strlen(s);
164*26421Ssam 		n=(prec<n ANDF prec>=0 ? prec : n);
165*26421Ssam 		width -= n;
166*26421Ssam 		IF adj=='r'
167*26421Ssam 		THEN WHILE width-- > 0
168*26421Ssam 		     DO printc(SP); OD
169*26421Ssam 		FI
170*26421Ssam 		WHILE n-- DO printc(*s++); OD
171*26421Ssam 		WHILE width-- > 0 DO printc(SP); OD
172*26421Ssam 		digitptr=digits;
173*26421Ssam 	    FI
174*26421Ssam 	OD
175*26421Ssam }
176*26421Ssam 
177*26421Ssam printdate(tvec)
178*26421Ssam 	L_INT		tvec;
179*26421Ssam {
180*26421Ssam 	REG		i;
181*26421Ssam 	REG STRING	timeptr;
182*26421Ssam 	STRING		ctime();
183*26421Ssam 
184*26421Ssam #ifndef EDDT
185*26421Ssam 	timeptr = ctime(&tvec);
186*26421Ssam #else
187*26421Ssam 	timeptr="????????????????????????";
188*26421Ssam #endif
189*26421Ssam 	FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
190*26421Ssam 	FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
191*26421Ssam } /*printdate*/
192*26421Ssam 
193*26421Ssam convert(cp)
194*26421Ssam REG STRING	*cp;
195*26421Ssam {
196*26421Ssam 	REG CHAR	c;
197*26421Ssam 	INT		n;
198*26421Ssam 	n=0;
199*26421Ssam 	WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
200*26421Ssam 	(*cp)--;
201*26421Ssam 	return(n);
202*26421Ssam }
203*26421Ssam 
204*26421Ssam printnum(n, base)
205*26421Ssam 	REG POS		n;
206*26421Ssam {
207*26421Ssam 	REG CHAR	*dptr;
208*26421Ssam 	CHAR		digs[15];
209*26421Ssam 	dptr=digs;
210*26421Ssam 	IF base<0 THEN base = -base;
211*26421Ssam 		IF (L_INT)n<0 THEN n = -n; *digitptr++ = '-'; FI
212*26421Ssam 	FI
213*26421Ssam 	WHILE n
214*26421Ssam 	DO  *dptr++ = n%base;
215*26421Ssam 	    n /= base;
216*26421Ssam 	OD
217*26421Ssam 	IF dptr==digs THEN *dptr++=0; FI
218*26421Ssam 	WHILE dptr!=digs
219*26421Ssam 	DO  n = *--dptr;
220*26421Ssam 	    *digitptr++ = (n+(n<=9 ? '0' : 'a'-10));
221*26421Ssam 	OD
222*26421Ssam }
223*26421Ssam 
224*26421Ssam #define	MAXIFD	5
225*26421Ssam struct {
226*26421Ssam 	int	fd;
227*26421Ssam 	int	r9;
228*26421Ssam } istack[MAXIFD];
229*26421Ssam int	ifiledepth;
230*26421Ssam 
231*26421Ssam iclose(stack, err)
232*26421Ssam {
233*26421Ssam 	IF err
234*26421Ssam 	THEN	IF infile
235*26421Ssam 		THEN	close(infile); infile=0;
236*26421Ssam 		FI
237*26421Ssam 		WHILE --ifiledepth >= 0
238*26421Ssam 		DO	IF istack[ifiledepth].fd
239*26421Ssam 			THEN	close(istack[ifiledepth].fd);
240*26421Ssam 			FI
241*26421Ssam 		OD
242*26421Ssam 		ifiledepth = 0;
243*26421Ssam 	ELIF stack == 0
244*26421Ssam 	THEN	IF infile
245*26421Ssam 		THEN	close(infile); infile=0;
246*26421Ssam 		FI
247*26421Ssam 	ELIF stack > 0
248*26421Ssam 	THEN	IF ifiledepth >= MAXIFD
249*26421Ssam 		THEN	error(TOODEEP);
250*26421Ssam 		FI
251*26421Ssam 		istack[ifiledepth].fd = infile;
252*26421Ssam 		istack[ifiledepth].r9 = var[9];
253*26421Ssam 		ifiledepth++;
254*26421Ssam 		infile = 0;
255*26421Ssam 	ELSE	IF infile
256*26421Ssam 		THEN	close(infile); infile=0;
257*26421Ssam 		FI
258*26421Ssam 		IF ifiledepth > 0
259*26421Ssam 		THEN	infile = istack[--ifiledepth].fd;
260*26421Ssam 			var[9] = istack[ifiledepth].r9;
261*26421Ssam 		FI
262*26421Ssam 	FI
263*26421Ssam }
264*26421Ssam 
265*26421Ssam oclose()
266*26421Ssam {
267*26421Ssam 	IF outfile!=1
268*26421Ssam 	THEN	flushbuf(); close(outfile); outfile=1;
269*26421Ssam 	FI
270*26421Ssam }
271*26421Ssam 
272*26421Ssam endline()
273*26421Ssam {
274*26421Ssam 
275*26421Ssam 	if (maxpos <= charpos())
276*26421Ssam 		printf("\n");
277*26421Ssam }
278