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