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*41354Ssklower * @(#)kdb_command.c 7.4 (Berkeley) 05/03/90
730296Ssam */
830106Ssam
930106Ssam #include "../kdb/defs.h"
1030106Ssam
11*41354Ssklower char *kdbBADEQ;
12*41354Ssklower char *kdbNOMATCH;
13*41354Ssklower char *kdbBADVAR;
14*41354Ssklower char *kdbBADCOM;
1530106Ssam
16*41354Ssklower int kdbexecuting;
17*41354Ssklower char *kdblp;
1830106Ssam
19*41354Ssklower char kdblastc;
20*41354Ssklower char kdbeqformat[512] = "z";
21*41354Ssklower char kdbstformat[512] = "X\"= \"^i";
2230106Ssam
23*41354Ssklower long kdbditto;
24*41354Ssklower int kdblastcom = '=';
25*41354Ssklower long kdblocval;
26*41354Ssklower long kdblocmsk;
27*41354Ssklower long kdbexpv;
2830106Ssam
2930106Ssam /* command decoding */
3030106Ssam
kdbcommand(buf,defcom)31*41354Ssklower kdbcommand(buf, defcom)
3230106Ssam char *buf, defcom;
3330106Ssam {
3430106Ssam register itype, ptype, modifier, regptr;
3530106Ssam int longpr, eqcom;
3630106Ssam char wformat[1], savc;
3730106Ssam register long w, savdot;
38*41354Ssklower char *savlp=kdblp;
3930106Ssam
4030106Ssam if (buf) {
4130106Ssam if (*buf==EOR)
4230117Ssam return (0);
43*41354Ssklower kdblp=buf;
4430106Ssam }
4530106Ssam
4630106Ssam do {
47*41354Ssklower if (kdbadrflg=kdbexpr(0)) {
48*41354Ssklower kdbdot=kdbexpv;
49*41354Ssklower kdbditto=kdbdot;
5030106Ssam }
51*41354Ssklower kdbadrval=kdbdot;
52*41354Ssklower kdbcntflg = (kdbrdc() == ',' && kdbexpr(0));
53*41354Ssklower if (kdbcntflg)
54*41354Ssklower kdbcntval=kdbexpv;
5530106Ssam else
56*41354Ssklower kdbcntval=1, kdblp--;
57*41354Ssklower if (kdbeol(kdbrdc())) {
58*41354Ssklower if (!kdbadrflg)
59*41354Ssklower kdbdot=kdbinkdot(kdbdotinc);
60*41354Ssklower kdblp--; kdblastcom=defcom;
6130106Ssam } else
62*41354Ssklower kdblastcom=kdblastc;
63*41354Ssklower switch (kdblastcom&STRIP) {
6430106Ssam
6530106Ssam case '/':
6630106Ssam itype=DSP; ptype=DSYM;
6730106Ssam goto trystar;
6830106Ssam
6930106Ssam case '=':
7030106Ssam itype=NSP; ptype=0;
7130106Ssam goto trypr;
7230106Ssam
7330106Ssam case '?':
7430106Ssam itype=ISP; ptype=ISYM;
7530106Ssam goto trystar;
7630106Ssam
7730106Ssam trystar:
78*41354Ssklower if (kdbrdc()=='*')
79*41354Ssklower kdblastcom |= QUOTE;
8030106Ssam else
81*41354Ssklower kdblp--;
82*41354Ssklower if (kdblastcom"E) {
8330106Ssam itype |= STAR;
8430106Ssam ptype = (DSYM+ISYM)-ptype;
8530106Ssam }
8630106Ssam
8730106Ssam trypr:
88*41354Ssklower longpr=0; eqcom=kdblastcom=='=';
89*41354Ssklower switch (kdbrdc()) {
9030106Ssam
9130106Ssam case 'L':
9230117Ssam longpr=1;
9330106Ssam case 'l':
9430106Ssam /*search for exp*/
9530106Ssam if (eqcom)
96*41354Ssklower kdberror(kdbBADEQ);
97*41354Ssklower kdbdotinc=(longpr?4:2); savdot=kdbdot;
98*41354Ssklower (void) kdbexpr(1); kdblocval=kdbexpv;
99*41354Ssklower if (kdbexpr(0))
100*41354Ssklower kdblocmsk=kdbexpv;
10130106Ssam else
102*41354Ssklower kdblocmsk = -1L;
10330106Ssam if (!longpr) {
104*41354Ssklower kdblocmsk &= 0xFFFF;
105*41354Ssklower kdblocval &= 0xFFFF;
10630106Ssam }
10730106Ssam for (;;) {
108*41354Ssklower w=kdbget(kdbdot,itype);
109*41354Ssklower if (kdberrflg || kdbmkfault ||
110*41354Ssklower (w&kdblocmsk)==kdblocval)
11130106Ssam break;
112*41354Ssklower kdbdot=kdbinkdot(kdbdotinc);
11330106Ssam }
114*41354Ssklower if (kdberrflg) {
115*41354Ssklower kdbdot=savdot;
116*41354Ssklower kdberrflg=kdbNOMATCH;
11730106Ssam }
118*41354Ssklower kdbpsymoff(kdbdot,ptype,"");
11930106Ssam break;
12030106Ssam
12130106Ssam case 'W':
12230117Ssam longpr=1;
12330106Ssam case 'w':
12430106Ssam if (eqcom)
125*41354Ssklower kdberror(kdbBADEQ);
126*41354Ssklower wformat[0]=kdblastc; (void) kdbexpr(1);
12730106Ssam do {
128*41354Ssklower savdot=kdbdot;
129*41354Ssklower kdbpsymoff(kdbdot,ptype,":%16t");
130*41354Ssklower (void) kdbexform(1,wformat,itype,ptype);
131*41354Ssklower kdberrflg=0; kdbdot=savdot;
13230106Ssam if (longpr)
133*41354Ssklower kdbput(kdbdot,itype,kdbexpv);
13430106Ssam else
135*41354Ssklower kdbput(kdbdot,itype,
136*41354Ssklower itol(kdbexpv,kdbget(kdbdot,itype)));
137*41354Ssklower savdot=kdbdot;
138*41354Ssklower kdbprintf("=%8t");
139*41354Ssklower (void) kdbexform(1,wformat,itype,ptype);
140*41354Ssklower kdbprintc(EOR);
141*41354Ssklower } while (kdbexpr(0) && kdberrflg==0);
142*41354Ssklower kdbdot=savdot;
143*41354Ssklower kdbchkerr();
14430106Ssam break;
14530106Ssam
14630106Ssam default:
147*41354Ssklower kdblp--;
148*41354Ssklower kdbgetformat(eqcom ? kdbeqformat : kdbstformat);
14930106Ssam if (!eqcom)
150*41354Ssklower kdbpsymoff(kdbdot,ptype,":%16t");
151*41354Ssklower kdbscanform(kdbcntval,
152*41354Ssklower (eqcom?kdbeqformat:kdbstformat),itype,ptype);
15330106Ssam }
15430106Ssam break;
15530106Ssam
15630106Ssam case '>':
157*41354Ssklower kdblastcom=0; savc=kdbrdc();
158*41354Ssklower if ((regptr=kdbgetreg(savc)) != -1)
159*41354Ssklower *(int *)regptr = kdbdot;
160*41354Ssklower else if ((modifier=kdbvarchk(savc)) != -1)
161*41354Ssklower kdbvar[modifier]=kdbdot;
16230106Ssam else
163*41354Ssklower kdberror(kdbBADVAR);
16430106Ssam break;
16530106Ssam
16630106Ssam case '$':
167*41354Ssklower kdblastcom=0;
168*41354Ssklower kdbprinttrace(kdbnextchar());
16930106Ssam break;
17030106Ssam
17130106Ssam case ':':
172*41354Ssklower if (kdbexecuting)
17330117Ssam break;
174*41354Ssklower kdbexecuting=1; kdbsubpcs(kdbnextchar()); kdbexecuting=0;
175*41354Ssklower kdblastcom=0;
17630106Ssam break;
17730106Ssam
17830117Ssam case '\0':
17930106Ssam break;
18030106Ssam
18130106Ssam default:
182*41354Ssklower kdberror(kdbBADCOM);
18330106Ssam }
184*41354Ssklower kdbflushbuf();
185*41354Ssklower } while (kdbrdc()==';');
18630106Ssam if (buf)
187*41354Ssklower kdblp=savlp;
18830106Ssam else
189*41354Ssklower kdblp--;
190*41354Ssklower return (kdbadrflg && kdbdot!=0);
19130106Ssam }
192