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&QUOTE) {
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