4.3BSD-Reno/src/sys/kdb/kdb_format.c

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

/*
 * Copyright (c) 1986 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 *
 *	@(#)kdb_format.c	7.5 (Berkeley) 5/3/90
 */

#include "../kdb/defs.h"

char	*kdbBADMOD;
char	*kdbADWRAP;

char	*kdblp;
char	kdblastc,kdbpeekc;
long	kdbexpv;

kdbscanform(icount,ifp,itype,ptype)
	long icount;
	char *ifp;
{
	register char *fp;
	char modifier;
	register fcount, init=1;
	long savdot;
	int exact;

	while (icount) {
		fp=ifp;
		savdot=kdbdot; init=0;
		if (!init && (exact=(kdbfindsym(kdbdot,ptype)==0)) && kdbmaxoff)
			kdbprintf("\n%s:%16t",kdbcursym->n_un.n_name);
		/*now loop over format*/
		while (*fp && kdberrflg==0) {
			if (isdigit(modifier = *fp)) {
				fcount = 0;
				while (isdigit(modifier = *fp++)) {
				   fcount *= 10;
				   fcount += modifier-'0';
				}
				fp--;
			} else
				fcount = 1;
			if (*fp==0)
				break;
#ifdef	ENTRYMASK
			/* check for entry mask */
			if (exact && kdbdot==savdot && 
			   (kdbcursym->n_type&N_TYPE)==N_TEXT &&
			   kdbcursym->n_un.n_name[0]=='_' && *fp=='i') {
				(void) kdbexform(1,"x",itype,ptype);
				fp++;
				kdbprintc(EOR);
			} else
#endif
				fp = kdbexform(fcount,fp,itype,ptype);
		}
		kdbdotinc=kdbdot-savdot;
		kdbdot=savdot;

		if (kdberrflg) {
			if (icount<0) {
				 kdberrflg=0;
				 break;
			}
			kdberror(kdberrflg);
		}
		if (--icount)
			kdbdot=kdbinkdot(kdbdotinc);
		if (kdbmkfault)
			kdberror((char *)0);
	}
}

/*
 * Execute single format item `fcount' times
 * sets `dotinc' and moves `dot'
 * returns address of next format item
 */
char *
kdbexform(fcount,ifp,itype,ptype)
	int fcount;
	char *ifp;
{
	register POS w;
	register long savdot, wx;
	register char *fp;
	char c, modifier, longpr;

	while (fcount>0) {
	  	fp = ifp; c = *fp;
		longpr = (isupper(c) || c=='f' || c=='4' || c=='p');
		if (itype != NSP && *fp != 'a') {
			wx = kdbget(kdbdot, itype);
			w = shorten(wx);
		} else {
			wx = w = kdbdot;
			if (itype == NSP &&
			    (c == 'b' || c == 'B' ||
			     c == 'c' || c == 'C' || c == '1'))
				w = btol(wx);
		}
		if (kdberrflg)
			return (fp);
		if (kdbmkfault)
			kdberror((char *)0);
		kdbvar[0] = wx;
		modifier = *fp++;
		kdbdotinc = (longpr ? sizeof (long):sizeof (short));

		if (kdbcharpos()==0 && modifier!='a')
			kdbprintf("%16m");
		switch (modifier) {

		case SP: case TB:
			break;

		case 't': case 'T':
			kdbprintf("%T",fcount); return (fp);

		case 'r': case 'R':
			kdbprintf("%M",fcount); return (fp);

		case 'a':
			kdbpsymoff(kdbdot,ptype,":%16t"); kdbdotinc=0; break;

		case 'p':
			kdbpsymoff(kdbvar[0],ptype,"%16t"); break;

		case 'u':
			kdbprintf("%-8u",w); break;

		case 'U':
			kdbprintf("%-16U",wx); break;

		case 'c': case 'C':
			if (modifier == 'C')
				kdbprintesc((int)byte(w));
			else
				kdbprintc((char)byte(w));
			kdbdotinc=1; break;

		case 'b': case 'B':
			kdbprintf("%-8o", byte(w)); kdbdotinc=1; break;

		case '1':
			kdbprintf("%-8R", byte(w)); kdbdotinc=1; break;

		case 'w': case '2':
			kdbprintf("%-8R", w); break;

		case 'W': case '4':
			kdbprintf("%-16R", wx); break;

		case 's': case 'S':
			savdot=kdbdot; kdbdotinc=1;
			while ((c=byte(kdbget(kdbdot,itype))) && kdberrflg==0) {
				kdbdot=kdbinkdot(1);
				if (modifier == 'S')
					kdbprintesc((int)c);
				else
					kdbprintc(c);
				kdbendline();
			}
			kdbdotinc=kdbdot-savdot+1; kdbdot=savdot; break;

		case 'x':
			kdbprintf("%-8x",w); break;

		case 'X':
			kdbprintf("%-16X", wx); break;

		case 'z':
			kdbprintf("%-8z",w); break;

		case 'Z':
			kdbprintf("%-16Z", wx); break;

		case 'Y':
			kdbprintf("%-24Y", wx); break;

		case 'q':
			kdbprintf("%-8q", w); break;

		case 'Q':
			kdbprintf("%-16Q", wx); break;

		case 'o':
			kdbprintf("%-8o", w); break;

		case 'O':
			kdbprintf("%-16O", wx); break;

		case 'i': case 'I':
			kdbprintins(itype,wx); kdbprintc(EOR); break;

		case 'd':
			kdbprintf("%-8d", w); break;

		case 'D':
			kdbprintf("%-16D", wx); break;

		case 'n': case 'N':
			kdbprintc('\n'); kdbdotinc=0; break;

		case '"':
			kdbdotinc=0;
			while (*fp != '"' && *fp)
				kdbprintc(*fp++);
			if (*fp)
				fp++;
			break;

		case '^':
			kdbdot=kdbinkdot(-kdbdotinc*fcount); return (fp);

		case '+':
			kdbdot=kdbinkdot(fcount); return (fp);

		case '-':
			kdbdot=kdbinkdot(-fcount); return (fp);

		default:
			kdberror(kdbBADMOD);
		}
		if (itype!=NSP)
			kdbdot=kdbinkdot(kdbdotinc);
		fcount--; kdbendline();
	}
	return (fp);
}

static
kdbprintesc(c)
	register int c;
{

	c &= STRIP;
	if (c==0177 || c<SP)
		kdbprintf("^%c", c ^ 0100);
	else
		kdbprintc(c);
}

long
kdbinkdot(incr)
{
	register long newdot;

	newdot=kdbdot+incr;
	if (addrwrap(kdbdot, newdot))
		kdberror(kdbADWRAP);
	return (newdot);
}