1*30106Ssam /*	kdb_command.c	7.1	86/11/20	*/
2*30106Ssam 
3*30106Ssam #include "../kdb/defs.h"
4*30106Ssam 
5*30106Ssam char	*BADEQ;
6*30106Ssam char	*NOMATCH;
7*30106Ssam char	*BADVAR;
8*30106Ssam char	*BADCOM;
9*30106Ssam 
10*30106Ssam int	executing;
11*30106Ssam char	*lp;
12*30106Ssam 
13*30106Ssam char	lastc;
14*30106Ssam char	eqformat[512] = "z";
15*30106Ssam char	stformat[512] = "X\"= \"^i";
16*30106Ssam 
17*30106Ssam long	ditto;
18*30106Ssam int	lastcom = '=';
19*30106Ssam long	locval;
20*30106Ssam long	locmsk;
21*30106Ssam long	expv;
22*30106Ssam 
23*30106Ssam /* command decoding */
24*30106Ssam 
25*30106Ssam command(buf, defcom)
26*30106Ssam 	char *buf, defcom;
27*30106Ssam {
28*30106Ssam 	register itype, ptype, modifier, regptr;
29*30106Ssam 	int longpr, eqcom;
30*30106Ssam 	char wformat[1], savc;
31*30106Ssam 	register long w, savdot;
32*30106Ssam 	char *savlp=lp;
33*30106Ssam 
34*30106Ssam 	if (buf) {
35*30106Ssam 		if (*buf==EOR)
36*30106Ssam 			return (FALSE);
37*30106Ssam 		lp=buf;
38*30106Ssam 	}
39*30106Ssam 
40*30106Ssam 	do {
41*30106Ssam 		if (adrflg=expr(0)) {
42*30106Ssam 			dot=expv;
43*30106Ssam 			ditto=dot;
44*30106Ssam 		}
45*30106Ssam 		adrval=dot;
46*30106Ssam 		if (rdc()==',' && expr(0))
47*30106Ssam 			cntflg=TRUE, cntval=expv;
48*30106Ssam 		else
49*30106Ssam 			cntflg=FALSE, cntval=1, lp--;
50*30106Ssam 		if (eol(rdc())) {
51*30106Ssam 			if (!adrflg)
52*30106Ssam 				dot=inkdot(dotinc);
53*30106Ssam 			lp--; lastcom=defcom;
54*30106Ssam 		} else
55*30106Ssam 			lastcom=lastc;
56*30106Ssam 		switch (lastcom&STRIP) {
57*30106Ssam 
58*30106Ssam 		case '/':
59*30106Ssam 			itype=DSP; ptype=DSYM;
60*30106Ssam 			goto trystar;
61*30106Ssam 
62*30106Ssam 		case '=':
63*30106Ssam 			itype=NSP; ptype=0;
64*30106Ssam 			goto trypr;
65*30106Ssam 
66*30106Ssam 		case '?':
67*30106Ssam 			itype=ISP; ptype=ISYM;
68*30106Ssam 			goto trystar;
69*30106Ssam 
70*30106Ssam 		trystar:
71*30106Ssam 			if (rdc()=='*')
72*30106Ssam 				lastcom |= QUOTE;
73*30106Ssam 			else
74*30106Ssam 				lp--;
75*30106Ssam 			if (lastcom&QUOTE) {
76*30106Ssam 				itype |= STAR;
77*30106Ssam 				ptype = (DSYM+ISYM)-ptype;
78*30106Ssam 			}
79*30106Ssam 
80*30106Ssam 		trypr:
81*30106Ssam 			longpr=FALSE; eqcom=lastcom=='=';
82*30106Ssam 			switch (rdc()) {
83*30106Ssam 
84*30106Ssam 			case 'L':
85*30106Ssam 				longpr=TRUE;
86*30106Ssam 			case 'l':
87*30106Ssam 				/*search for exp*/
88*30106Ssam 				if (eqcom)
89*30106Ssam 					error(BADEQ);
90*30106Ssam 				dotinc=(longpr?4:2); savdot=dot;
91*30106Ssam 				expr(1); locval=expv;
92*30106Ssam 				if (expr(0))
93*30106Ssam 					locmsk=expv;
94*30106Ssam 				else
95*30106Ssam 					locmsk = -1L;
96*30106Ssam 				if (!longpr) {
97*30106Ssam 					locmsk &= 0xFFFF;
98*30106Ssam 					locval &= 0xFFFF;
99*30106Ssam 				}
100*30106Ssam 				for (;;) {
101*30106Ssam 					w=get(dot,itype);
102*30106Ssam 					if (errflg || mkfault ||
103*30106Ssam 					    (w&locmsk)==locval)
104*30106Ssam 						break;
105*30106Ssam 					 dot=inkdot(dotinc);
106*30106Ssam 				}
107*30106Ssam 				if (errflg) {
108*30106Ssam 					dot=savdot;
109*30106Ssam 					errflg=NOMATCH;
110*30106Ssam 				}
111*30106Ssam 				psymoff(dot,ptype,"");
112*30106Ssam 				break;
113*30106Ssam 
114*30106Ssam 			case 'W':
115*30106Ssam 				longpr=TRUE;
116*30106Ssam 			case 'w':
117*30106Ssam 				if (eqcom)
118*30106Ssam 					error(BADEQ);
119*30106Ssam 				wformat[0]=lastc; expr(1);
120*30106Ssam 				do {
121*30106Ssam 					savdot=dot;
122*30106Ssam 					psymoff(dot,ptype,":%16t");
123*30106Ssam 					exform(1,wformat,itype,ptype);
124*30106Ssam 					errflg=0; dot=savdot;
125*30106Ssam 					if (longpr)
126*30106Ssam 						put(dot,itype,expv);
127*30106Ssam 					else
128*30106Ssam 						put(dot,itype,
129*30106Ssam 						    itol(expv,get(dot,itype)));
130*30106Ssam 					savdot=dot;
131*30106Ssam 					printf("=%8t");
132*30106Ssam 					exform(1,wformat,itype,ptype);
133*30106Ssam 					printc(EOR);
134*30106Ssam 				} while (expr(0) && errflg==0);
135*30106Ssam 				dot=savdot;
136*30106Ssam 				chkerr();
137*30106Ssam 				break;
138*30106Ssam 
139*30106Ssam 			default:
140*30106Ssam 				lp--;
141*30106Ssam 				getformat(eqcom ? eqformat : stformat);
142*30106Ssam 				if (!eqcom)
143*30106Ssam 					psymoff(dot,ptype,":%16t");
144*30106Ssam 				scanform(cntval,
145*30106Ssam 				    (eqcom?eqformat:stformat),itype,ptype);
146*30106Ssam 			}
147*30106Ssam 			break;
148*30106Ssam 
149*30106Ssam 		case '>':
150*30106Ssam 			lastcom=0; savc=rdc();
151*30106Ssam 			if ((regptr=getreg(savc)) != -1)
152*30106Ssam 				*(int *)regptr = dot;
153*30106Ssam 			else if ((modifier=varchk(savc)) != -1)
154*30106Ssam 				var[modifier]=dot;
155*30106Ssam 			else
156*30106Ssam 				error(BADVAR);
157*30106Ssam 			break;
158*30106Ssam 
159*30106Ssam 		case '$':
160*30106Ssam 			lastcom=0;
161*30106Ssam 			printtrace(nextchar());
162*30106Ssam 			break;
163*30106Ssam 
164*30106Ssam 		case ':':
165*30106Ssam 			if (!executing) {
166*30106Ssam 				executing=TRUE;
167*30106Ssam 				subpcs(nextchar());
168*30106Ssam 				executing=FALSE;
169*30106Ssam 				lastcom=0;
170*30106Ssam 			}
171*30106Ssam 			break;
172*30106Ssam 
173*30106Ssam 		case 0:
174*30106Ssam 			printf(DBNAME);
175*30106Ssam 			break;
176*30106Ssam 
177*30106Ssam 		default:
178*30106Ssam 			error(BADCOM);
179*30106Ssam 		}
180*30106Ssam 		flushbuf();
181*30106Ssam 	} while (rdc()==';');
182*30106Ssam 	if (buf)
183*30106Ssam 		lp=savlp;
184*30106Ssam 	else
185*30106Ssam 		lp--;
186*30106Ssam 	return (adrflg && dot!=0);
187*30106Ssam }
188