Ultrix-3.1/src/cmd/adb/output.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/
#
static char *sccsid = "@(#)output.c 3.0 4/21/86";
/*
 *
 *	UNIX debugger
 *
 */

#include "defs.h"

int 	mkfault;
int 	infile;
int 	outfile = 1;
int 	maxpos;
char 	printbuf[MAXLIN];
char 	*printptr = printbuf;
char 	*digitptr;

eqstr(s1, s2)
register char *s1, *s2;
{
	register char *es1;
	es1 = s1+8;
	while(*s1++ == *s2){
		if(*s2++ == 0 || s1>=es1)
		{
			return(1);
		}
	}
	return(0);
}

length(s)
char *s;
{
	int 	n = 0;
	while(*s++){
		n++; 
	}
	return(n);
}

printc(c)
char 	c;
{
	char 	d;
	char *q;
	int 	posn, tabs, p;

	if(mkfault)
	{
		return;
	}
	else if((*printptr=c)=='\n')
	{
		tabs=0; 
		posn=0; 
		q=printbuf;
		for(p=0; p<printptr-printbuf; p++){
			d=printbuf[p];
			if((p&7)==0 && posn)
			{
				tabs++; 
				posn=0;
			}
			if(d==SP)
			{
				posn++;
			}
			else{
				WHILE tabs>0){
					*q++=TB; 
					tabs--; 
				}
				while(posn>0){
					*q++=SP; 
					posn--; 
				}
				*q++=d;
			}
		}
		*q++='\n';
		write(outfile,printbuf,q-printbuf);
		printptr=printbuf;
	}
	else if(c==TB)
	{
		*printptr++=SP;
		while((printptr-printbuf)&7){
			*printptr++=SP; 
		}
	}
	else if(c)
	{
		printptr++;
	}
}

charpos()
{	
	return(printptr-printbuf);
}

flushbuf()
{	
	if(printptr!=printbuf)
	{
		printc('\n');
	}
}

printf(fmat,a1)
char *fmat;
char **a1;
{
	char *fptr, *s;
	int 	*vptr;
	long 	*dptr;
	double 	*rptr;
	int 	width, prec;
	char 	c, adj;
	int 	x, decpt, n;
	long 	lx;
	char 	digits[64];

	fptr = fmat; 
	vptr = &a1;

	while(c = *fptr++){
		if(c!='%')
		{
			printc(c);
		}
		else{
			if(*fptr=='-')
			{
				adj='l'; 
				fptr++; 
			}
			else{
				adj='r';
			}
			width=convert(&fptr);
			if(*fptr=='.')
			{
				fptr++; 
				prec=convert(&fptr); 
			}
			else{
				prec = -1;
			}
			digitptr=digits;
			dptr=rptr=vptr; 
			lx = *dptr; 
			x = *vptr++;
			s=0;
			switch (c = *fptr++){

			case 'd':
			case 'u':
				printnum(x,c,10); 
				break;
			case 'o':
				printoct(0,x,0); 
				break;
			case 'q':
				lx=x; 
				printoct(lx,-1); 
				break;
			case 'x':
				printdbl(0,x,c,16); 
				break;
			case 'Y':
				printdate(lx); 
				vptr++; 
				break;
			case 'D':
			case 'U':
				printdbl(lx,c,10); 
				vptr++; 
				break;
			case 'O':
				printoct(lx,0); 
				vptr++; 
				break;
			case 'Q':
				printoct(lx,-1); 
				vptr++; 
				break;
			case 'X':
				printdbl(lx,'x',16); 
				vptr++; 
				break;
			case 'c':
				printc(x); 
				break;
			case 's':
				s=x; 
				break;
			case 'f':
			case 'F':
				vptr += 7;
				s=ecvt(*rptr, prec, &decpt, &n);
				*digitptr++=(n?'-':'+');
				*digitptr++ = (decpt<=0 ? '0' : *s++);
				if(decpt>0)
				{
					decpt--;
				}
				*digitptr++ = '.';
				while(*s && prec--){
					*digitptr++ = *s++; 
				}
				while(*--digitptr=='0');

				digitptr += (digitptr-digits>=3 ? 1 : 2);
				if(decpt)
				{
					*digitptr++ = 'e'; 
					printnum(decpt,'d',10);
				}
				s=0; 
				prec = -1; 
				break;
			case 'm':
				vptr--; 
				break;
			case 'M':
				width=x; 
				break;
			case 'T':
			case 't':
				if(c=='T')
				{
					width=x;
				}
				else{
					vptr--;
				}
				if(width)
				{
					width -= charpos()%width;
				}
				break;
			default:
				printc(c); 
				vptr--;
			}
			if(s==0)
			{
				*digitptr=0; 
				s=digits;
			}
			n=length(s);
			n=(prec<n && prec>=0 ? prec : n);
			width -= n;
			if(adj=='r')
			{
				while(width-- > 0){
					printc(SP); 
				}
			}
			while(n--){
				printc(*s++); 
			}
			while(width-- > 0){
				printc(SP); 
			}
			digitptr=digits;
		}
	}
}

printdate(tvec)
long 	tvec;
{
	register int 	i;
	register char *timeptr;
	timeptr = ctime(&tvec);
	for(i=20; i<24; i++){
		*digitptr++ = *(timeptr+i); 
	}
	for(i=3; i<19; i++){
		*digitptr++ = *(timeptr+i); 
	}
} /*printdate*/

prints(s)
char *s;
{	
	printf("%s",s);
}

newline()
{
	printc('\n');
}

convert(cp)
register char **cp;
{
	register char c;
	int 	n;
	n=0;
	while(((c = *(*cp)++)>='0') && (c<='9')){
		n=n*10+c-'0'; 
	}
	(*cp)--;
	return(n);
}

printnum(n,fmat,base)
register int 	n;
{
	register char k;
	register int 	*dptr;
	int 	digs[15];
	dptr=digs;
	if(n<0 && fmat=='d')
	{
		n = -n; 
		*digitptr++ = '-';
	}
	while(n){
		*dptr++ = ((POS)n)%base;
		n=((POS)n)/base;
	}
	if(dptr==digs)
	{
		*dptr++=0;
	}
	while(dptr!=digs){
		k = *--dptr;
		*digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
	}
}

printoct(o,s)
long 	o;
int 	s;
{
	int 	i;
	long 	po = o;
	char 	digs[12];

	if(s)
	{
		if(po<0)
		{
			po = -po; 
			*digitptr++='-';
		}
		else{
			if(s>0)
			{
				*digitptr++='+';
			}
		}
	}
	for(i=0;i<=11;i++){
		digs[i] = po&7; 
		po >>= 3; 
	}
	digs[10] &= 03; 
	digs[11]=0;
	for(i=11;i>=0;i--){
		if(digs[i])
		{
			break; 
		}
	}
	for(i++;i>=0;i--){
		*digitptr++=digs[i]+'0'; 
	}
}

printdbl(lx,ly,fmat,base)
int lx, ly; 
char fmat; 
int base;
{	
	int digs[20]; 
	int *dptr; 
	char k;
	double f ,g; 
	long q;
	dptr=digs;
	if(fmat!='D')
	{
		f=leng(lx); 
		f *= itol(1,0); 
		f += leng(ly);
		if(fmat=='x')
		{
			*digitptr++='#';
		}
	}
	else{
		f=itol(lx,ly);
		if(f<0)
		{
			*digitptr++='-'; 
			f = -f;
		}
	}
	while(f){
		q=f/base; 
		g=q;
		*dptr++ = f-g*base;
		f=q;
	}
	if(dptr==digs)
	{
		*dptr++=0;
	}
	while(dptr!=digs){
		k = *--dptr;
		*digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
	}
}

iclose()
{
	if(infile)
	{
		close(infile); 
		infile=0;
	}
}

oclose()
{
	if(outfile!=1)
	{
		flushbuf(); 
		close(outfile); 
		outfile=1;
	}
}

endline()
{
	if(charpos()>=maxpos)
	{
		printf("\n");
	}
}