1 /*
2  * Copyright (c) 1986 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)kdb_command.c	7.4 (Berkeley) 05/03/90
7  */
8 
9 #include "../kdb/defs.h"
10 
11 char	*kdbBADEQ;
12 char	*kdbNOMATCH;
13 char	*kdbBADVAR;
14 char	*kdbBADCOM;
15 
16 int	kdbexecuting;
17 char	*kdblp;
18 
19 char	kdblastc;
20 char	kdbeqformat[512] = "z";
21 char	kdbstformat[512] = "X\"= \"^i";
22 
23 long	kdbditto;
24 int	kdblastcom = '=';
25 long	kdblocval;
26 long	kdblocmsk;
27 long	kdbexpv;
28 
29 /* command decoding */
30 
31 kdbcommand(buf, defcom)
32 	char *buf, defcom;
33 {
34 	register itype, ptype, modifier, regptr;
35 	int longpr, eqcom;
36 	char wformat[1], savc;
37 	register long w, savdot;
38 	char *savlp=kdblp;
39 
40 	if (buf) {
41 		if (*buf==EOR)
42 			return (0);
43 		kdblp=buf;
44 	}
45 
46 	do {
47 		if (kdbadrflg=kdbexpr(0)) {
48 			kdbdot=kdbexpv;
49 			kdbditto=kdbdot;
50 		}
51 		kdbadrval=kdbdot;
52 		kdbcntflg = (kdbrdc() == ',' && kdbexpr(0));
53 		if (kdbcntflg)
54 			kdbcntval=kdbexpv;
55 		else
56 			kdbcntval=1, kdblp--;
57 		if (kdbeol(kdbrdc())) {
58 			if (!kdbadrflg)
59 				kdbdot=kdbinkdot(kdbdotinc);
60 			kdblp--; kdblastcom=defcom;
61 		} else
62 			kdblastcom=kdblastc;
63 		switch (kdblastcom&STRIP) {
64 
65 		case '/':
66 			itype=DSP; ptype=DSYM;
67 			goto trystar;
68 
69 		case '=':
70 			itype=NSP; ptype=0;
71 			goto trypr;
72 
73 		case '?':
74 			itype=ISP; ptype=ISYM;
75 			goto trystar;
76 
77 		trystar:
78 			if (kdbrdc()=='*')
79 				kdblastcom |= QUOTE;
80 			else
81 				kdblp--;
82 			if (kdblastcom&QUOTE) {
83 				itype |= STAR;
84 				ptype = (DSYM+ISYM)-ptype;
85 			}
86 
87 		trypr:
88 			longpr=0; eqcom=kdblastcom=='=';
89 			switch (kdbrdc()) {
90 
91 			case 'L':
92 				longpr=1;
93 			case 'l':
94 				/*search for exp*/
95 				if (eqcom)
96 					kdberror(kdbBADEQ);
97 				kdbdotinc=(longpr?4:2); savdot=kdbdot;
98 				(void) kdbexpr(1); kdblocval=kdbexpv;
99 				if (kdbexpr(0))
100 					kdblocmsk=kdbexpv;
101 				else
102 					kdblocmsk = -1L;
103 				if (!longpr) {
104 					kdblocmsk &= 0xFFFF;
105 					kdblocval &= 0xFFFF;
106 				}
107 				for (;;) {
108 					w=kdbget(kdbdot,itype);
109 					if (kdberrflg || kdbmkfault ||
110 					    (w&kdblocmsk)==kdblocval)
111 						break;
112 					 kdbdot=kdbinkdot(kdbdotinc);
113 				}
114 				if (kdberrflg) {
115 					kdbdot=savdot;
116 					kdberrflg=kdbNOMATCH;
117 				}
118 				kdbpsymoff(kdbdot,ptype,"");
119 				break;
120 
121 			case 'W':
122 				longpr=1;
123 			case 'w':
124 				if (eqcom)
125 					kdberror(kdbBADEQ);
126 				wformat[0]=kdblastc; (void) kdbexpr(1);
127 				do {
128 					savdot=kdbdot;
129 					kdbpsymoff(kdbdot,ptype,":%16t");
130 					(void) kdbexform(1,wformat,itype,ptype);
131 					kdberrflg=0; kdbdot=savdot;
132 					if (longpr)
133 						kdbput(kdbdot,itype,kdbexpv);
134 					else
135 						kdbput(kdbdot,itype,
136 						    itol(kdbexpv,kdbget(kdbdot,itype)));
137 					savdot=kdbdot;
138 					kdbprintf("=%8t");
139 					(void) kdbexform(1,wformat,itype,ptype);
140 					kdbprintc(EOR);
141 				} while (kdbexpr(0) && kdberrflg==0);
142 				kdbdot=savdot;
143 				kdbchkerr();
144 				break;
145 
146 			default:
147 				kdblp--;
148 				kdbgetformat(eqcom ? kdbeqformat : kdbstformat);
149 				if (!eqcom)
150 					kdbpsymoff(kdbdot,ptype,":%16t");
151 				kdbscanform(kdbcntval,
152 				    (eqcom?kdbeqformat:kdbstformat),itype,ptype);
153 			}
154 			break;
155 
156 		case '>':
157 			kdblastcom=0; savc=kdbrdc();
158 			if ((regptr=kdbgetreg(savc)) != -1)
159 				*(int *)regptr = kdbdot;
160 			else if ((modifier=kdbvarchk(savc)) != -1)
161 				kdbvar[modifier]=kdbdot;
162 			else
163 				kdberror(kdbBADVAR);
164 			break;
165 
166 		case '$':
167 			kdblastcom=0;
168 			kdbprinttrace(kdbnextchar());
169 			break;
170 
171 		case ':':
172 			if (kdbexecuting)
173 				break;
174 			kdbexecuting=1; kdbsubpcs(kdbnextchar()); kdbexecuting=0;
175 			kdblastcom=0;
176 			break;
177 
178 		case '\0':
179 			break;
180 
181 		default:
182 			kdberror(kdbBADCOM);
183 		}
184 		kdbflushbuf();
185 	} while (kdbrdc()==';');
186 	if (buf)
187 		kdblp=savlp;
188 	else
189 		kdblp--;
190 	return (kdbadrflg && kdbdot!=0);
191 }
192