Commit | Line | Data |
---|---|---|
78b8d996 TL |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | SCCSID(@(#)command.c 2.4); | |
10 | ||
11 | ||
12 | MSG BADEQ; | |
13 | MSG NOMATCH; | |
14 | MSG BADVAR; | |
15 | MSG BADCOM; | |
16 | ||
17 | MAP txtmap; | |
18 | MAP datmap; | |
19 | INT executing; | |
20 | CHAR *lp; | |
21 | INT fcor; | |
22 | INT fsym; | |
23 | INT mkfault; | |
24 | STRING errflg; | |
25 | ||
26 | CHAR lastc; | |
27 | CHAR eqformat[128] = "z"; | |
28 | CHAR stformat[128] = "X\"= \"^i"; | |
29 | struct user u; | |
30 | ||
31 | L_INT dot; | |
32 | L_INT ditto; | |
33 | INT dotinc; | |
34 | INT lastcom = '='; | |
35 | L_INT var[]; | |
36 | L_INT locval; | |
37 | L_INT locmsk; | |
38 | INT pid; | |
39 | L_INT expv; | |
40 | L_INT adrval; | |
41 | INT adrflg; | |
42 | L_INT cntval; | |
43 | INT cntflg; | |
44 | ||
45 | ||
46 | ||
47 | ||
48 | /* command decoding */ | |
49 | ||
50 | command(buf,defcom) | |
51 | STRING buf; | |
52 | CHAR 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"E | |
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 |