|
|
BSD 4.3reno
/*
* 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);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.