xref: /csrg-svn/old/adb/adb.tahoe/output.c (revision 32423)
126421Ssam #ifndef lint
2*32423Sbostic static	char sccsid[] = "@(#)output.c	1.2 (Berkeley) 10/22/87";
326421Ssam #endif
426421Ssam /*
526421Ssam  *
626421Ssam  *	UNIX debugger
726421Ssam  *
826421Ssam  */
926421Ssam 
1026421Ssam #include "defs.h"
1126421Ssam 
1226421Ssam INT		mkfault;
1326421Ssam INT		infile;
1426421Ssam INT		outfile = 1;
1526421Ssam L_INT		maxpos;
1626421Ssam ADDR		maxoff;
1726421Ssam INT		radix = 16;
1826421Ssam 
1926421Ssam CHAR		printbuf[MAXLIN];
2026421Ssam CHAR		*printptr = printbuf;
2126421Ssam CHAR		*digitptr;
2226421Ssam MSG		TOODEEP;
2326421Ssam 
printc(c)2426421Ssam printc(c)
2526421Ssam 	CHAR		c;
2626421Ssam {
2726421Ssam 	CHAR		d;
2826421Ssam 	REG	STRING	q;
2926421Ssam 	REG		posn, tabs, p;
3026421Ssam 
3126421Ssam 	IF mkfault
3226421Ssam 	THEN	return;
3326421Ssam 	ELIF (*printptr=c)==EOR
3426421Ssam 	THEN tabs=0; posn=0; q=printbuf;
3526421Ssam 	     FOR p=0; p<printptr-printbuf; p++
3626421Ssam 	     DO d=printbuf[p];
3726421Ssam 		IF (p&7)==0 ANDF posn
3826421Ssam 		THEN tabs++; posn=0;
3926421Ssam 		FI
4026421Ssam 		IF d==SP
4126421Ssam 		THEN posn++;
4226421Ssam 		ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
4326421Ssam 		     WHILE posn>0 DO *q++=SP; posn--; OD
4426421Ssam 		     *q++=d;
4526421Ssam 		FI
4626421Ssam 	     OD
4726421Ssam 	     *q++=EOR;
4826421Ssam #ifdef EDDT
4926421Ssam 		printptr=printbuf; do putchar(*printptr++); while (printptr<q);
5026421Ssam #else
5126421Ssam 	     write(outfile,printbuf,q-printbuf);
5226421Ssam #endif
5326421Ssam 	     printptr=printbuf;
5426421Ssam 	ELIF c==TB
5526421Ssam 	THEN *printptr++=SP;
5626421Ssam 	     WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
5726421Ssam 	ELIF c
5826421Ssam 	THEN printptr++;
5926421Ssam 	FI
6026421Ssam 	IF printptr >= &printbuf[MAXLIN-9] THEN
6126421Ssam 		write(outfile, printbuf, printptr - printbuf);
6226421Ssam 		printptr = printbuf;
6326421Ssam 	FI
6426421Ssam }
6526421Ssam 
charpos()6626421Ssam charpos()
6726421Ssam {	return(printptr-printbuf);
6826421Ssam }
6926421Ssam 
flushbuf()7026421Ssam flushbuf()
7126421Ssam {	IF printptr!=printbuf
7226421Ssam 	THEN printc(EOR);
7326421Ssam 	FI
7426421Ssam }
7526421Ssam 
7626421Ssam /* VARARGS1 */
printf(fmat,a1)7726421Ssam printf(fmat,a1)
7826421Ssam 	STRING		fmat;
7926421Ssam 	STRING		a1;
8026421Ssam {
8126421Ssam 	STRING	fptr;
8226421Ssam 	REG	STRING	s;
8326421Ssam 	REG	L_INT	*dptr;
8426421Ssam 	L_REAL		*rptr;
8526421Ssam 	REG		width, prec;
8626421Ssam 	CHAR		c, adj;
8726421Ssam 	INT		x, n;
8826421Ssam 	REG	L_INT	lx;
8926421Ssam 	CHAR		digits[64];
9026421Ssam 
9126421Ssam 	fptr = fmat; dptr = (L_INT *)&a1;
9226421Ssam 
9326421Ssam 	WHILE c = *fptr++
9426421Ssam 	DO  IF c!='%'
9526421Ssam 	    THEN printc(c);
9626421Ssam 	    ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
9726421Ssam 		 width=convert(&fptr);
9826421Ssam 		 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
9926421Ssam 		 digitptr=digits;
10026421Ssam 		 rptr=(L_REAL *)dptr; x = lx = *dptr++;
10126421Ssam 		 s=0;
10226421Ssam 		 switch (c = *fptr++) {
10326421Ssam 
10426421Ssam 		    case 'd':
10526421Ssam 			printnum(x, -10); break;
10626421Ssam 		    case 'u':
10726421Ssam 			printnum((unsigned short)x, 10); break;
10826421Ssam 		    case 'o':
10926421Ssam 			printnum((unsigned short)x, 8); break;
11026421Ssam 		    case 'q':
11126421Ssam 			printnum(x, -8); break;
11226421Ssam 		    case 'x':
11326421Ssam 			printnum((unsigned short)x, 16); break;
11426421Ssam 		    case 'z':
11526421Ssam 			printnum((unsigned short)x, -16); break;
11626421Ssam 		    case 'R':
11726421Ssam 			printnum(lx, radix); break;
11826421Ssam 		    case 'Y':
11926421Ssam 			printdate(lx); break;
12026421Ssam 		    case 'D':
12126421Ssam 			printnum(lx, -10); break;
12226421Ssam 		    case 'U':
12326421Ssam 			printnum(lx, 10); break;
12426421Ssam 		    case 'O':
12526421Ssam 			printnum(lx, 8); break;
12626421Ssam 		    case 'Q':
12726421Ssam 			printnum(lx, -8); break;
12826421Ssam 		    case 'X':
12926421Ssam 			printnum(lx, 16); break;
13026421Ssam 		    case 'Z':
13126421Ssam 			printnum(lx, -16); break;
13226421Ssam 		    case 'c':
13326421Ssam 			printc(x); break;
13426421Ssam 		    case 's':
13526421Ssam 			s=(STRING)lx; break;
13626421Ssam #ifndef EDDT
13726421Ssam 		    case 'f':
13826421Ssam 		    case 'F':
13926421Ssam 			dptr++;
140*32423Sbostic 			(void)sprintf(s=digits, "%*.*f", width, prec, *rptr); prec= -1; break;
14126421Ssam #endif
14226421Ssam 		    case 'm':
14326421Ssam 			break;
14426421Ssam 		    case 'M':
14526421Ssam 			width=x; break;
14626421Ssam 		    case 'T':
14726421Ssam 		    case 't':
14826421Ssam 			IF c=='T'
14926421Ssam 			THEN width=x;
15026421Ssam 			ELSE dptr--;
15126421Ssam 			FI
15226421Ssam 			IF width
15326421Ssam 			THEN width -= charpos()%width;
15426421Ssam 			FI
15526421Ssam 			break;
15626421Ssam 		    default:
15726421Ssam 			printc(c); dptr--;
15826421Ssam 		}
15926421Ssam 
16026421Ssam 		IF s==0
16126421Ssam 		THEN *digitptr=0; s=digits;
16226421Ssam 		FI
16326421Ssam 		n=strlen(s);
16426421Ssam 		n=(prec<n ANDF prec>=0 ? prec : n);
16526421Ssam 		width -= n;
16626421Ssam 		IF adj=='r'
16726421Ssam 		THEN WHILE width-- > 0
16826421Ssam 		     DO printc(SP); OD
16926421Ssam 		FI
17026421Ssam 		WHILE n-- DO printc(*s++); OD
17126421Ssam 		WHILE width-- > 0 DO printc(SP); OD
17226421Ssam 		digitptr=digits;
17326421Ssam 	    FI
17426421Ssam 	OD
17526421Ssam }
17626421Ssam 
printdate(tvec)17726421Ssam printdate(tvec)
17826421Ssam 	L_INT		tvec;
17926421Ssam {
18026421Ssam 	REG		i;
18126421Ssam 	REG STRING	timeptr;
18226421Ssam 	STRING		ctime();
18326421Ssam 
18426421Ssam #ifndef EDDT
18526421Ssam 	timeptr = ctime(&tvec);
18626421Ssam #else
18726421Ssam 	timeptr="????????????????????????";
18826421Ssam #endif
18926421Ssam 	FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
19026421Ssam 	FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
19126421Ssam } /*printdate*/
19226421Ssam 
convert(cp)19326421Ssam convert(cp)
19426421Ssam REG STRING	*cp;
19526421Ssam {
19626421Ssam 	REG CHAR	c;
19726421Ssam 	INT		n;
19826421Ssam 	n=0;
19926421Ssam 	WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
20026421Ssam 	(*cp)--;
20126421Ssam 	return(n);
20226421Ssam }
20326421Ssam 
printnum(n,base)20426421Ssam printnum(n, base)
20526421Ssam 	REG POS		n;
20626421Ssam {
20726421Ssam 	REG CHAR	*dptr;
20826421Ssam 	CHAR		digs[15];
20926421Ssam 	dptr=digs;
21026421Ssam 	IF base<0 THEN base = -base;
21126421Ssam 		IF (L_INT)n<0 THEN n = -n; *digitptr++ = '-'; FI
21226421Ssam 	FI
21326421Ssam 	WHILE n
21426421Ssam 	DO  *dptr++ = n%base;
21526421Ssam 	    n /= base;
21626421Ssam 	OD
21726421Ssam 	IF dptr==digs THEN *dptr++=0; FI
21826421Ssam 	WHILE dptr!=digs
21926421Ssam 	DO  n = *--dptr;
22026421Ssam 	    *digitptr++ = (n+(n<=9 ? '0' : 'a'-10));
22126421Ssam 	OD
22226421Ssam }
22326421Ssam 
22426421Ssam #define	MAXIFD	5
22526421Ssam struct {
22626421Ssam 	int	fd;
22726421Ssam 	int	r9;
22826421Ssam } istack[MAXIFD];
22926421Ssam int	ifiledepth;
23026421Ssam 
iclose(stack,err)23126421Ssam iclose(stack, err)
23226421Ssam {
23326421Ssam 	IF err
23426421Ssam 	THEN	IF infile
23526421Ssam 		THEN	close(infile); infile=0;
23626421Ssam 		FI
23726421Ssam 		WHILE --ifiledepth >= 0
23826421Ssam 		DO	IF istack[ifiledepth].fd
23926421Ssam 			THEN	close(istack[ifiledepth].fd);
24026421Ssam 			FI
24126421Ssam 		OD
24226421Ssam 		ifiledepth = 0;
24326421Ssam 	ELIF stack == 0
24426421Ssam 	THEN	IF infile
24526421Ssam 		THEN	close(infile); infile=0;
24626421Ssam 		FI
24726421Ssam 	ELIF stack > 0
24826421Ssam 	THEN	IF ifiledepth >= MAXIFD
24926421Ssam 		THEN	error(TOODEEP);
25026421Ssam 		FI
25126421Ssam 		istack[ifiledepth].fd = infile;
25226421Ssam 		istack[ifiledepth].r9 = var[9];
25326421Ssam 		ifiledepth++;
25426421Ssam 		infile = 0;
25526421Ssam 	ELSE	IF infile
25626421Ssam 		THEN	close(infile); infile=0;
25726421Ssam 		FI
25826421Ssam 		IF ifiledepth > 0
25926421Ssam 		THEN	infile = istack[--ifiledepth].fd;
26026421Ssam 			var[9] = istack[ifiledepth].r9;
26126421Ssam 		FI
26226421Ssam 	FI
26326421Ssam }
26426421Ssam 
oclose()26526421Ssam oclose()
26626421Ssam {
26726421Ssam 	IF outfile!=1
26826421Ssam 	THEN	flushbuf(); close(outfile); outfile=1;
26926421Ssam 	FI
27026421Ssam }
27126421Ssam 
endline()27226421Ssam endline()
27326421Ssam {
27426421Ssam 
27526421Ssam 	if (maxpos <= charpos())
27626421Ssam 		printf("\n");
27726421Ssam }
278