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
kdbcommand(buf,defcom)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"E) {
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