130296Ssam /*
230296Ssam  * Copyright (c) 1986 Regents of the University of California.
330296Ssam  * All rights reserved.  The Berkeley software License Agreement
430296Ssam  * specifies the terms and conditions for redistribution.
530296Ssam  *
6*41351Ssklower  *	@(#)kdb_format.c	7.5 (Berkeley) 05/03/90
730296Ssam  */
830108Ssam 
930108Ssam #include "../kdb/defs.h"
1030108Ssam 
11*41351Ssklower char	*kdbBADMOD;
12*41351Ssklower char	*kdbADWRAP;
1330108Ssam 
14*41351Ssklower char	*kdblp;
15*41351Ssklower char	kdblastc,kdbpeekc;
16*41351Ssklower long	kdbexpv;
1730108Ssam 
kdbscanform(icount,ifp,itype,ptype)18*41351Ssklower kdbscanform(icount,ifp,itype,ptype)
1930108Ssam 	long icount;
2030108Ssam 	char *ifp;
2130108Ssam {
2230108Ssam 	register char *fp;
2330108Ssam 	char modifier;
2430108Ssam 	register fcount, init=1;
2530108Ssam 	long savdot;
2630108Ssam 	int exact;
2730108Ssam 
2830108Ssam 	while (icount) {
2930108Ssam 		fp=ifp;
30*41351Ssklower 		savdot=kdbdot; init=0;
31*41351Ssklower 		if (!init && (exact=(kdbfindsym(kdbdot,ptype)==0)) && kdbmaxoff)
32*41351Ssklower 			kdbprintf("\n%s:%16t",kdbcursym->n_un.n_name);
3330108Ssam 		/*now loop over format*/
34*41351Ssklower 		while (*fp && kdberrflg==0) {
3530108Ssam 			if (isdigit(modifier = *fp)) {
3630108Ssam 				fcount = 0;
3730108Ssam 				while (isdigit(modifier = *fp++)) {
3830108Ssam 				   fcount *= 10;
3930108Ssam 				   fcount += modifier-'0';
4030108Ssam 				}
4130108Ssam 				fp--;
4230108Ssam 			} else
4330108Ssam 				fcount = 1;
4430108Ssam 			if (*fp==0)
4530108Ssam 				break;
4630136Ssam #ifdef	ENTRYMASK
4730108Ssam 			/* check for entry mask */
48*41351Ssklower 			if (exact && kdbdot==savdot &&
49*41351Ssklower 			   (kdbcursym->n_type&N_TYPE)==N_TEXT &&
50*41351Ssklower 			   kdbcursym->n_un.n_name[0]=='_' && *fp=='i') {
51*41351Ssklower 				(void) kdbexform(1,"x",itype,ptype);
5230108Ssam 				fp++;
53*41351Ssklower 				kdbprintc(EOR);
5430108Ssam 			} else
5530136Ssam #endif
56*41351Ssklower 				fp = kdbexform(fcount,fp,itype,ptype);
5730108Ssam 		}
58*41351Ssklower 		kdbdotinc=kdbdot-savdot;
59*41351Ssklower 		kdbdot=savdot;
6030108Ssam 
61*41351Ssklower 		if (kdberrflg) {
6230108Ssam 			if (icount<0) {
63*41351Ssklower 				 kdberrflg=0;
6430108Ssam 				 break;
6530108Ssam 			}
66*41351Ssklower 			kdberror(kdberrflg);
6730108Ssam 		}
6830108Ssam 		if (--icount)
69*41351Ssklower 			kdbdot=kdbinkdot(kdbdotinc);
70*41351Ssklower 		if (kdbmkfault)
71*41351Ssklower 			kdberror((char *)0);
7230108Ssam 	}
7330108Ssam }
7430108Ssam 
7530108Ssam /*
7630108Ssam  * Execute single format item `fcount' times
7730108Ssam  * sets `dotinc' and moves `dot'
7830108Ssam  * returns address of next format item
7930108Ssam  */
8030108Ssam char *
kdbexform(fcount,ifp,itype,ptype)81*41351Ssklower kdbexform(fcount,ifp,itype,ptype)
8230108Ssam 	int fcount;
8330108Ssam 	char *ifp;
8430108Ssam {
8530108Ssam 	register POS w;
8630108Ssam 	register long savdot, wx;
8730108Ssam 	register char *fp;
8830108Ssam 	char c, modifier, longpr;
8930108Ssam 
9030108Ssam 	while (fcount>0) {
9130108Ssam 	  	fp = ifp; c = *fp;
9230119Ssam 		longpr = (isupper(c) || c=='f' || c=='4' || c=='p');
9330119Ssam 		if (itype != NSP && *fp != 'a') {
94*41351Ssklower 			wx = kdbget(kdbdot, itype);
9530119Ssam 			w = shorten(wx);
9630108Ssam 		} else {
97*41351Ssklower 			wx = w = kdbdot;
9830119Ssam 			if (itype == NSP &&
9930119Ssam 			    (c == 'b' || c == 'B' ||
10030119Ssam 			     c == 'c' || c == 'C' || c == '1'))
10130119Ssam 				w = btol(wx);
10230108Ssam 		}
103*41351Ssklower 		if (kdberrflg)
10430108Ssam 			return (fp);
105*41351Ssklower 		if (kdbmkfault)
106*41351Ssklower 			kdberror((char *)0);
107*41351Ssklower 		kdbvar[0] = wx;
10830108Ssam 		modifier = *fp++;
109*41351Ssklower 		kdbdotinc = (longpr ? sizeof (long):sizeof (short));
11030108Ssam 
111*41351Ssklower 		if (kdbcharpos()==0 && modifier!='a')
112*41351Ssklower 			kdbprintf("%16m");
11330108Ssam 		switch (modifier) {
11430108Ssam 
11530108Ssam 		case SP: case TB:
11630108Ssam 			break;
11730108Ssam 
11830108Ssam 		case 't': case 'T':
119*41351Ssklower 			kdbprintf("%T",fcount); return (fp);
12030108Ssam 
12130108Ssam 		case 'r': case 'R':
122*41351Ssklower 			kdbprintf("%M",fcount); return (fp);
12330108Ssam 
12430108Ssam 		case 'a':
125*41351Ssklower 			kdbpsymoff(kdbdot,ptype,":%16t"); kdbdotinc=0; break;
12630108Ssam 
12730108Ssam 		case 'p':
128*41351Ssklower 			kdbpsymoff(kdbvar[0],ptype,"%16t"); break;
12930108Ssam 
13030108Ssam 		case 'u':
131*41351Ssklower 			kdbprintf("%-8u",w); break;
13230108Ssam 
13330108Ssam 		case 'U':
134*41351Ssklower 			kdbprintf("%-16U",wx); break;
13530108Ssam 
13630108Ssam 		case 'c': case 'C':
13730119Ssam 			if (modifier == 'C')
138*41351Ssklower 				kdbprintesc((int)byte(w));
13930108Ssam 			else
140*41351Ssklower 				kdbprintc((char)byte(w));
141*41351Ssklower 			kdbdotinc=1; break;
14230108Ssam 
14330108Ssam 		case 'b': case 'B':
144*41351Ssklower 			kdbprintf("%-8o", byte(w)); kdbdotinc=1; break;
14530108Ssam 
14630108Ssam 		case '1':
147*41351Ssklower 			kdbprintf("%-8R", byte(w)); kdbdotinc=1; break;
14830108Ssam 
14930108Ssam 		case 'w': case '2':
150*41351Ssklower 			kdbprintf("%-8R", w); break;
15130108Ssam 
15230108Ssam 		case 'W': case '4':
153*41351Ssklower 			kdbprintf("%-16R", wx); break;
15430108Ssam 
15530108Ssam 		case 's': case 'S':
156*41351Ssklower 			savdot=kdbdot; kdbdotinc=1;
157*41351Ssklower 			while ((c=byte(kdbget(kdbdot,itype))) && kdberrflg==0) {
158*41351Ssklower 				kdbdot=kdbinkdot(1);
15930108Ssam 				if (modifier == 'S')
160*41351Ssklower 					kdbprintesc((int)c);
16130108Ssam 				else
162*41351Ssklower 					kdbprintc(c);
163*41351Ssklower 				kdbendline();
16430108Ssam 			}
165*41351Ssklower 			kdbdotinc=kdbdot-savdot+1; kdbdot=savdot; break;
16630108Ssam 
16730108Ssam 		case 'x':
168*41351Ssklower 			kdbprintf("%-8x",w); break;
16930108Ssam 
17030108Ssam 		case 'X':
171*41351Ssklower 			kdbprintf("%-16X", wx); break;
17230108Ssam 
17330108Ssam 		case 'z':
174*41351Ssklower 			kdbprintf("%-8z",w); break;
17530108Ssam 
17630108Ssam 		case 'Z':
177*41351Ssklower 			kdbprintf("%-16Z", wx); break;
17830108Ssam 
17930108Ssam 		case 'Y':
180*41351Ssklower 			kdbprintf("%-24Y", wx); break;
18130108Ssam 
18230108Ssam 		case 'q':
183*41351Ssklower 			kdbprintf("%-8q", w); break;
18430108Ssam 
18530108Ssam 		case 'Q':
186*41351Ssklower 			kdbprintf("%-16Q", wx); break;
18730108Ssam 
18830108Ssam 		case 'o':
189*41351Ssklower 			kdbprintf("%-8o", w); break;
19030108Ssam 
19130108Ssam 		case 'O':
192*41351Ssklower 			kdbprintf("%-16O", wx); break;
19330108Ssam 
19430108Ssam 		case 'i': case 'I':
195*41351Ssklower 			kdbprintins(itype,wx); kdbprintc(EOR); break;
19630108Ssam 
19730108Ssam 		case 'd':
198*41351Ssklower 			kdbprintf("%-8d", w); break;
19930108Ssam 
20030108Ssam 		case 'D':
201*41351Ssklower 			kdbprintf("%-16D", wx); break;
20230108Ssam 
20330108Ssam 		case 'n': case 'N':
204*41351Ssklower 			kdbprintc('\n'); kdbdotinc=0; break;
20530108Ssam 
20630108Ssam 		case '"':
207*41351Ssklower 			kdbdotinc=0;
20830108Ssam 			while (*fp != '"' && *fp)
209*41351Ssklower 				kdbprintc(*fp++);
21030108Ssam 			if (*fp)
21130108Ssam 				fp++;
21230108Ssam 			break;
21330108Ssam 
21430108Ssam 		case '^':
215*41351Ssklower 			kdbdot=kdbinkdot(-kdbdotinc*fcount); return (fp);
21630108Ssam 
21730108Ssam 		case '+':
218*41351Ssklower 			kdbdot=kdbinkdot(fcount); return (fp);
21930108Ssam 
22030108Ssam 		case '-':
221*41351Ssklower 			kdbdot=kdbinkdot(-fcount); return (fp);
22230108Ssam 
22330108Ssam 		default:
224*41351Ssklower 			kdberror(kdbBADMOD);
22530108Ssam 		}
22630108Ssam 		if (itype!=NSP)
227*41351Ssklower 			kdbdot=kdbinkdot(kdbdotinc);
228*41351Ssklower 		fcount--; kdbendline();
22930108Ssam 	}
23030108Ssam 	return (fp);
23130108Ssam }
23230108Ssam 
23330108Ssam static
kdbprintesc(c)234*41351Ssklower kdbprintesc(c)
23530296Ssam 	register int c;
23630108Ssam {
23730108Ssam 
23830108Ssam 	c &= STRIP;
23930108Ssam 	if (c==0177 || c<SP)
240*41351Ssklower 		kdbprintf("^%c", c ^ 0100);
24130108Ssam 	else
242*41351Ssklower 		kdbprintc(c);
24330108Ssam }
24430108Ssam 
24530108Ssam long
kdbinkdot(incr)246*41351Ssklower kdbinkdot(incr)
24730108Ssam {
24830108Ssam 	register long newdot;
24930108Ssam 
250*41351Ssklower 	newdot=kdbdot+incr;
251*41351Ssklower 	if (addrwrap(kdbdot, newdot))
252*41351Ssklower 		kdberror(kdbADWRAP);
25330108Ssam 	return (newdot);
25430108Ssam }
255