xref: /csrg-svn/old/adb/adb.vax/output.c (revision 34595)
114470Ssam #ifndef lint
2*34595Sbostic static	char sccsid[] = "@(#)output.c	4.7 06/01/88";
314470Ssam #endif
43762Sroot /*
53762Sroot  *
63762Sroot  *	UNIX debugger
73762Sroot  *
83762Sroot  */
93762Sroot 
103762Sroot #include "defs.h"
113762Sroot #include <stdio.h>
123762Sroot 
133762Sroot 
143762Sroot INT		mkfault;
153762Sroot INT		infile;
163762Sroot INT		outfile = 1;
173762Sroot L_INT		maxpos;
183762Sroot L_INT		maxoff;
193762Sroot INT		radix = 16;
203762Sroot 
213762Sroot CHAR		printbuf[MAXLIN];
223762Sroot CHAR		*printptr = printbuf;
233762Sroot CHAR		*digitptr;
243762Sroot MSG		TOODEEP;
253762Sroot 
263762Sroot 
eqstr(s1,s2)273762Sroot eqstr(s1, s2)
283762Sroot 	REG STRING	s1, s2;
293762Sroot {
303762Sroot 	REG STRING	 es1;
313762Sroot 	WHILE *s1++ == *s2
323762Sroot 	DO IF *s2++ == 0
333762Sroot 	   THEN return(1);
343762Sroot 	   FI
353762Sroot 	OD
363762Sroot 	return(0);
373762Sroot }
383762Sroot 
length(s)393762Sroot length(s)
403762Sroot 	REG STRING		s;
413762Sroot {
423762Sroot 	INT		n = 0;
433762Sroot 	WHILE *s++ DO n++; OD
443762Sroot 	return(n);
453762Sroot }
463762Sroot 
printc(c)473762Sroot printc(c)
483762Sroot 	CHAR		c;
493762Sroot {
503762Sroot 	CHAR		d;
513762Sroot 	STRING		q;
523762Sroot 	INT		posn, tabs, p;
533762Sroot 
543762Sroot 	IF mkfault
553762Sroot 	THEN	return;
563762Sroot 	ELIF (*printptr=c)==EOR
573762Sroot 	THEN tabs=0; posn=0; q=printbuf;
583762Sroot 	     FOR p=0; p<printptr-printbuf; p++
593762Sroot 	     DO d=printbuf[p];
603762Sroot 		IF (p&7)==0 ANDF posn
613762Sroot 		THEN tabs++; posn=0;
623762Sroot 		FI
633762Sroot 		IF d==SP
643762Sroot 		THEN posn++;
653762Sroot 		ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
663762Sroot 		     WHILE posn>0 DO *q++=SP; posn--; OD
673762Sroot 		     *q++=d;
683762Sroot 		FI
693762Sroot 	     OD
703762Sroot 	     *q++=EOR;
713762Sroot #ifdef EDDT
723762Sroot 		printptr=printbuf; do putchar(*printptr++); while (printptr<q);
733762Sroot #else
743762Sroot 	     write(outfile,printbuf,q-printbuf);
753762Sroot #endif
763762Sroot 	     printptr=printbuf;
773762Sroot 	ELIF c==TB
783762Sroot 	THEN *printptr++=SP;
793762Sroot 	     WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
803762Sroot 	ELIF c
813762Sroot 	THEN printptr++;
823762Sroot 	FI
836416Sroot 	IF printptr >= &printbuf[MAXLIN-9] THEN
846416Sroot 		write(outfile, printbuf, printptr - printbuf);
856416Sroot 		printptr = printbuf;
866416Sroot 	FI
873762Sroot }
883762Sroot 
charpos()893762Sroot charpos()
903762Sroot {	return(printptr-printbuf);
913762Sroot }
923762Sroot 
flushbuf()933762Sroot flushbuf()
943762Sroot {	IF printptr!=printbuf
953762Sroot 	THEN printc(EOR);
963762Sroot 	FI
973762Sroot }
983762Sroot 
printf(fmat,a1)993762Sroot printf(fmat,a1)
1003762Sroot 	STRING		fmat;
1013762Sroot 	STRING		*a1;
1023762Sroot {
1033762Sroot 	STRING		fptr, s;
1043762Sroot 	INT		*vptr;
1053762Sroot 	L_INT		*dptr;
1063762Sroot 	L_REAL		*rptr;
1073762Sroot 	INT		width, prec;
1083762Sroot 	CHAR		c, adj;
1093762Sroot 	INT		x, decpt, n;
1103762Sroot 	L_INT		lx;
1113762Sroot 	CHAR		digits[64];
1123762Sroot 
1133762Sroot 	fptr = fmat; dptr = vptr = &a1;
1143762Sroot 
1153762Sroot 	WHILE c = *fptr++
1163762Sroot 	DO  IF c!='%'
1173762Sroot 	    THEN printc(c);
1183762Sroot 	    ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
1193762Sroot 		 width=convert(&fptr);
1203762Sroot 		 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
1213762Sroot 		 digitptr=digits;
1223762Sroot #ifndef vax
1233762Sroot 		 dptr=rptr=vptr; lx = *dptr; x = *vptr++;
1243762Sroot #else
1253762Sroot 		 rptr=dptr; x = shorten(lx = *dptr++);
1263762Sroot #endif
1273762Sroot 		 s=0;
1283762Sroot 		 switch (c = *fptr++) {
1293762Sroot 
1303762Sroot 		    case 'd':
1313762Sroot 		    case 'u':
1323762Sroot 			printnum(x,c,10); break;
1333762Sroot 		    case 'o':
1343762Sroot #ifndef vax
1353762Sroot 			printoct(0,x,0); break;
1363762Sroot #else
1373762Sroot 			printoct(itol(0,x),0); break;
1383762Sroot #endif
1393762Sroot 		    case 'q':
1403762Sroot 			lx=x; printoct(lx,-1); break;
1413762Sroot 		    case 'x':
1423762Sroot #ifndef vax
1433762Sroot 			printdbl(0,x,c,16); break;
1443762Sroot #else
1453762Sroot 			printdbl(itol(0,x),c,16); break;
1463762Sroot #endif
1473762Sroot 			case 'r':
1483762Sroot 			printdbl(lx=x,c,radix); break;
1493762Sroot 			case 'R':
1503762Sroot 			printdbl(lx,c,radix); vptr++; break;
1513762Sroot 		    case 'Y':
1523762Sroot 			printdate(lx); vptr++; break;
1533762Sroot 		    case 'D':
1543762Sroot 		    case 'U':
1553762Sroot 			printdbl(lx,c,10); vptr++; break;
1563762Sroot 		    case 'O':
1573762Sroot 			printoct(lx,0); vptr++; break;
1583762Sroot 		    case 'Q':
1593762Sroot 			printoct(lx,-1); vptr++; break;
1603762Sroot 		    case 'X':
1613762Sroot 			printdbl(lx,'x',16); vptr++; break;
1623762Sroot 		    case 'c':
1633762Sroot 			printc(x); break;
1643762Sroot 		    case 's':
1653762Sroot #ifndef vax
1663762Sroot 			s=x; break;
1673762Sroot #else
1683762Sroot 			s=lx; break;
1693762Sroot #endif
1703762Sroot #ifndef EDDT
1713762Sroot 		    case 'f':
1723762Sroot 		    case 'F':
1733762Sroot #ifdef vax
1743762Sroot 			dptr++;
17532422Sbostic 			(void)sprintf(s=digits,"%+.16e",*rptr); prec= -1; break;
1763762Sroot #else
1773762Sroot 			vptr += 7;
1783762Sroot 			s=ecvt(*rptr, prec, &decpt, &n);
1793762Sroot 			*digitptr++=(n?'-':'+');
1803762Sroot 			*digitptr++ = (decpt<=0 ? '0' : *s++);
1813762Sroot 			IF decpt>0 THEN decpt--; FI
1823762Sroot 			*digitptr++ = '.';
1833762Sroot 			WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD
1843762Sroot 			WHILE *--digitptr=='0' DONE
1853762Sroot 			digitptr += (digitptr-digits>=3 ? 1 : 2);
1863762Sroot 			IF decpt
1873762Sroot 			THEN *digitptr++ = 'e'; printnum(decpt,'d',10);
1883762Sroot 			FI
1893762Sroot 			s=0; prec = -1; break;
1903762Sroot #endif
1913762Sroot #endif
1923762Sroot 		    case 'm':
1933762Sroot 			vptr--; break;
1943762Sroot 		    case 'M':
1953762Sroot 			width=x; break;
1963762Sroot 		    case 'T':
1973762Sroot 		    case 't':
1983762Sroot 			IF c=='T'
1993762Sroot 			THEN width=x;
2003762Sroot #ifndef vax
2013762Sroot 			ELSE vptr--;
2023762Sroot #else
2033762Sroot 			ELSE dptr--;
2043762Sroot #endif
2053762Sroot 			FI
2063762Sroot 			IF width
2073762Sroot 			THEN width -= charpos()%width;
2083762Sroot 			FI
2093762Sroot 			break;
2103762Sroot 		    default:
2113762Sroot #ifndef vax
2123762Sroot 			printc(c); vptr--;
2133762Sroot #else
2143762Sroot 			printc(c); dptr--;
2153762Sroot #endif
2163762Sroot 		}
2173762Sroot 
2183762Sroot 		IF s==0
2193762Sroot 		THEN *digitptr=0; s=digits;
2203762Sroot 		FI
2213762Sroot 		n=length(s);
2223762Sroot 		n=(prec<n ANDF prec>=0 ? prec : n);
2233762Sroot 		width -= n;
2243762Sroot 		IF adj=='r'
2253762Sroot 		THEN WHILE width-- > 0
2263762Sroot 		     DO printc(SP); OD
2273762Sroot 		FI
2283762Sroot 		WHILE n-- DO printc(*s++); OD
2293762Sroot 		WHILE width-- > 0 DO printc(SP); OD
2303762Sroot 		digitptr=digits;
2313762Sroot 	    FI
2323762Sroot 	OD
2333762Sroot }
2343762Sroot 
printdate(tvec)2353762Sroot printdate(tvec)
2363762Sroot 	L_INT		tvec;
2373762Sroot {
2383762Sroot 	REG INT		i;
2393762Sroot 	REG STRING	timeptr;
2403762Sroot #ifndef EDDT
2413762Sroot 	timeptr = ctime(&tvec);
2423762Sroot #else
2433762Sroot 	timeptr="????????????????????????";
2443762Sroot #endif
2453762Sroot 	FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
2463762Sroot 	FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
2473762Sroot } /*printdate*/
2483762Sroot 
prints(s)2493762Sroot prints(s)
2503762Sroot char *s;
2513762Sroot {	printf("%s",s);
2523762Sroot }
2533762Sroot 
newline()2543762Sroot newline()
2553762Sroot {
2563762Sroot 	printc(EOR);
2573762Sroot }
2583762Sroot 
convert(cp)2593762Sroot convert(cp)
2603762Sroot REG STRING	*cp;
2613762Sroot {
2623762Sroot 	REG CHAR	c;
2633762Sroot 	INT		n;
2643762Sroot 	n=0;
2653762Sroot 	WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
2663762Sroot 	(*cp)--;
2673762Sroot 	return(n);
2683762Sroot }
2693762Sroot 
printnum(n,fmat,base)2703762Sroot printnum(n,fmat,base)
2713762Sroot 	REG INT		n;
2723762Sroot {
2733762Sroot 	REG CHAR	k;
2743762Sroot 	REG INT		*dptr;
2753762Sroot 	INT		digs[15];
2763762Sroot 	dptr=digs;
2773762Sroot 	IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI
2783762Sroot 	n &= 0xffff;
2793762Sroot 	WHILE n
2803762Sroot 	DO  *dptr++ = ((POS)(n&0xffff))%base;
2813762Sroot 	    n=((POS)(n&0xffff))/base;
2823762Sroot 	OD
2833762Sroot 	IF dptr==digs THEN *dptr++=0; FI
2843762Sroot 	WHILE dptr!=digs
2853762Sroot 	DO  k = *--dptr;
2863762Sroot 	    *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
2873762Sroot 	OD
2883762Sroot }
2893762Sroot 
printoct(o,s)2903762Sroot printoct(o,s)
2913762Sroot 	L_INT		o;
2923762Sroot 	INT		s;
2933762Sroot {
2943762Sroot 	INT		i;
2953762Sroot 	L_INT		po = o;
2963762Sroot 	CHAR		digs[12];
2973762Sroot 
2983762Sroot 	IF s
2993762Sroot 	THEN IF po<0
3003762Sroot 	     THEN po = -po; *digitptr++='-';
3013762Sroot 	     ELSE IF s>0 THEN *digitptr++='+'; FI
3023762Sroot 	     FI
3033762Sroot 	FI
3043762Sroot 	FOR i=0;i<=11;i++
3053762Sroot 	DO digs[i] = po&7; po >>= 3; OD
3063762Sroot 	digs[10] &= 03; digs[11]=0;
3073762Sroot 	FOR i=11;i>=0;i--
3083762Sroot 	DO IF digs[i] THEN break; FI OD
3093762Sroot 	FOR i++;i>=0;i--
3103762Sroot 	DO *digitptr++=digs[i]+'0'; OD
3113762Sroot }
3123762Sroot 
3133762Sroot #ifndef vax
printdbl(lx,ly,fmat,base)3143762Sroot printdbl(lx,ly,fmat,base)
3153762Sroot INT lx, ly; char fmat; int base;
3163762Sroot #else
3173762Sroot printdbl(lxy,fmat,base)
3183762Sroot L_INT lxy; char fmat; int base;
3193762Sroot #endif
3203762Sroot {	int digs[20]; int *dptr; char k;
3213762Sroot #ifndef MULD2
3223762Sroot 	register char *cp1;
3233762Sroot 	cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;}
324*34595Sbostic 	(void)sprintf(cp1,base==16 ? "%x" : "%ld",lxy);
3253762Sroot 	cp1=digs; while (*digitptr++= *cp1++); --digitptr;
3263762Sroot #else
3273762Sroot 	L_REAL f ,g; long q;
3283762Sroot #ifdef vax
3293762Sroot 	INT lx,ly;
3303762Sroot 	ly=lxy; lx=(lxy>>16)&0xFFFF;
3313762Sroot #endif
3323762Sroot 	dptr=digs;
3333762Sroot 	IF fmat=='D' ORF fmat=='r'
3343762Sroot 	THEN	f=itol(lx,ly);
3353762Sroot 		IF f<0 THEN *digitptr++='-'; f = -f; FI
3363762Sroot 	ELSE
3373762Sroot 		IF lx==-1
3383762Sroot 		THEN *digitptr++='-'; f=leng(-ly);
3393762Sroot 		ELSE f=leng(lx); f *= itol(1,0); f += leng(ly);
3403762Sroot 		FI
3413762Sroot 		IF fmat=='x' THEN *digitptr++='#'; FI
3423762Sroot 	FI
3433762Sroot 	WHILE f
3443762Sroot 	DO  q=f/base; g=q;
3453762Sroot 	    *dptr++ = f-g*base;
3463762Sroot 	    f=q;
3473762Sroot 	OD
3483762Sroot 	IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI
3493762Sroot 	WHILE dptr!=digs
3503762Sroot 	DO  k = *--dptr;
3513762Sroot 	    *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
3523762Sroot 	OD
3533762Sroot #endif
3543762Sroot }
3553762Sroot 
3563762Sroot #define	MAXIFD	5
3573762Sroot struct {
3583762Sroot 	int	fd;
3593762Sroot 	int	r9;
3603762Sroot } istack[MAXIFD];
3613762Sroot int	ifiledepth;
3623762Sroot 
iclose(stack,err)3633762Sroot iclose(stack, err)
3643762Sroot {
3653762Sroot 	IF err
3663762Sroot 	THEN	IF infile
3673762Sroot 		THEN	close(infile); infile=0;
3683762Sroot 		FI
3693762Sroot 		WHILE --ifiledepth >= 0
3703762Sroot 		DO	IF istack[ifiledepth].fd
3713762Sroot 			THEN	close(istack[ifiledepth].fd);
3723762Sroot 			FI
3733762Sroot 		OD
3743762Sroot 		ifiledepth = 0;
3753762Sroot 	ELIF stack == 0
3763762Sroot 	THEN	IF infile
3773762Sroot 		THEN	close(infile); infile=0;
3783762Sroot 		FI
3793762Sroot 	ELIF stack > 0
3803762Sroot 	THEN	IF ifiledepth >= MAXIFD
3813762Sroot 		THEN	error(TOODEEP);
3823762Sroot 		FI
3833762Sroot 		istack[ifiledepth].fd = infile;
3843762Sroot 		istack[ifiledepth].r9 = var[9];
3853762Sroot 		ifiledepth++;
3863762Sroot 		infile = 0;
3873762Sroot 	ELSE	IF infile
3883762Sroot 		THEN	close(infile); infile=0;
3893762Sroot 		FI
3903762Sroot 		IF ifiledepth > 0
3913762Sroot 		THEN	infile = istack[--ifiledepth].fd;
3923762Sroot 			var[9] = istack[ifiledepth].r9;
3933762Sroot 		FI
3943762Sroot 	FI
3953762Sroot }
3963762Sroot 
oclose()3973762Sroot oclose()
3983762Sroot {
3993762Sroot 	IF outfile!=1
4003762Sroot 	THEN	flushbuf(); close(outfile); outfile=1;
4013762Sroot 	FI
4023762Sroot }
4033762Sroot 
endline()4043762Sroot endline()
4053762Sroot {
4063762Sroot 
4073762Sroot 	if (maxpos <= charpos())
4083762Sroot 		printf("\n");
4093762Sroot }
410