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