Research V7 development
[unix-history] / usr / src / cmd / adb / command.c
CommitLineData
d94e2462
M
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9
10
11MSG BADEQ;
12MSG NOMATCH;
13MSG BADVAR;
14MSG BADCOM;
15
16MAP txtmap;
17MAP datmap;
18INT executing;
19CHAR *lp;
20INT fcor;
21INT fsym;
22INT mkfault;
23STRING errflg;
24
25CHAR lastc;
26CHAR eqformat[128] "o";
27CHAR stformat[128] "o\"= \"^i";
28POS *endhdr;
29
30L_INT dot;
31L_INT ditto;
32INT dotinc;
33INT lastcom '=';
34L_INT var[];
35L_INT locval;
36L_INT locmsk;
37INT pid;
38L_INT expv;
39L_INT adrval;
40INT adrflg;
41L_INT cntval;
42INT cntflg;
43
44
45
46
47/* command decoding */
48
49command(buf,defcom)
50STRING buf;
51CHAR defcom;
52{
53 INT itype, ptype, modifier, regptr;
54 BOOL longpr, eqcom;
55 CHAR wformat[1];
56 CHAR savc;
57 L_INT w, savdot;
58 STRING savlp=lp;
59 IF buf
60 THEN IF *buf==EOR
61 THEN return(FALSE);
62 ELSE lp=buf;
63 FI
64 FI
65
66 REP
67 IF adrflg=expr(0)
68 THEN dot=expv; ditto=dot;
69 FI
70 adrval=dot;
71 IF rdc()==',' ANDF expr(0)
72 THEN cntflg=TRUE; cntval=expv;
73 ELSE cntflg=FALSE; cntval=1; lp--;
74 FI
75
76 IF !eol(rdc())
77 THEN lastcom=lastc;
78 ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
79 lp--; lastcom=defcom;
80 FI
81
82 switch(lastcom&STRIP) {
83
84 case '/':
85 itype=DSP; ptype=DSYM;
86 goto trystar;
87
88 case '=':
89 itype=NSP; ptype=ASYM;
90 goto trypr;
91
92 case '?':
93 itype=ISP; ptype=ISYM;
94 goto trystar;
95
96 trystar:
97 IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
98 IF lastcom&QUOTE
99 THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
100 FI
101
102 trypr:
103 longpr=FALSE; eqcom=lastcom=='=';
104 switch (rdc()) {
105
106 case 'm':
107 {/*reset map data*/
108 INT fcount;
109 MAP *smap;
110 UNION{MAP *m; L_INT *mp;}amap;
111
112 IF eqcom THEN error(BADEQ); FI
113 smap=(itype&DSP?&datmap:&txtmap);
114 amap.m=smap; fcount=3;
115 IF itype&STAR
116 THEN amap.mp += 3;
117 FI
118 WHILE fcount-- ANDF expr(0)
119 DO *(amap.mp)++ = expv; OD
120 IF rdc()=='?' THEN smap->ufd=fsym;
121 ELIF lastc == '/' THEN smap->ufd=fcor;
122 ELSE lp--;
123 FI
124 }
125 break;
126
127 case 'L':
128 longpr=TRUE;
129 case 'l':
130 /*search for exp*/
131 IF eqcom THEN error(BADEQ); FI
132 dotinc=2; savdot=dot;
133 expr(1); locval=expv;
134 IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
135 LOOP w=leng(get(dot,itype));
136 IF longpr
137 THEN w=itol(w,get(inkdot(2),itype));
138 FI
139 IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
140 dot=inkdot(dotinc);
141 POOL
142 IF errflg
143 THEN dot=savdot; errflg=NOMATCH;
144 FI
145 psymoff(dot,ptype,"");
146 break;
147
148 case 'W':
149 longpr=TRUE;
150 case 'w':
151 IF eqcom THEN error(BADEQ); FI
152 wformat[0]=lastc; expr(1);
153 REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
154 errflg=0; dot=savdot;
155 IF longpr
156 THEN put(dot,itype,expv);
157 FI
158 put((longpr?inkdot(2):dot),itype,shorten(expv));
159 savdot=dot;
160 printf("=%8t"); exform(1,wformat,itype,ptype);
161 newline();
162 PER expr(0) ANDF errflg==0 DONE
163 dot=savdot;
164 chkerr();
165 break;
166
167 default:
168 lp--;
169 getformat(eqcom ? eqformat : stformat);
170 IF !eqcom
171 THEN psymoff(dot,ptype,":%16t");
172 FI
173 scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
174 }
175 break;
176
177 case '>':
178 lastcom=0; savc=rdc();
179 IF regptr=getreg(savc)
180 THEN endhdr[regptr]=shorten(dot);
181 ptrace(WUREGS,pid,2*(512+regptr),endhdr[regptr]);
182 ELIF (modifier=varchk(savc)) != -1
183 THEN var[modifier]=dot;
184 ELSE error(BADVAR);
185 FI
186 break;
187
188 case '!':
189 lastcom=0;
190 unox(); break;
191
192 case '$':
193 lastcom=0;
194 printtrace(nextchar()); break;
195
196 case ':':
197 IF !executing
198 THEN executing=TRUE;
199 subpcs(nextchar());
200 executing=FALSE;
201 lastcom=0;
202 FI
203 break;
204
205 case 0:
206 prints(DBNAME);
207 break;
208
209 default: error(BADCOM);
210 }
211
212 flushbuf();
213 PER rdc()==';' DONE
214 IF buf THEN lp=savlp; ELSE lp--; FI
215 return(adrflg ANDF dot!=0);
216}
217