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