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