Commit | Line | Data |
---|---|---|
a1dada70 | 1 | #ifndef lint |
0f4556f1 | 2 | static char sccsid[] = "@(#)command.c 4.5 8/11/83"; |
a1dada70 | 3 | #endif |
89f636ff BJ |
4 | /* |
5 | * | |
6 | * UNIX debugger | |
7 | * | |
8 | */ | |
9 | ||
10 | #include "defs.h" | |
89f636ff BJ |
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[512] = "z"; | |
28 | CHAR stformat[512] = "X\"= \"^i"; | |
29 | ||
30 | L_INT dot; | |
31 | L_INT ditto; | |
32 | INT dotinc; | |
33 | INT lastcom = '='; | |
34 | L_INT var[]; | |
35 | L_INT locval; | |
36 | L_INT locmsk; | |
37 | INT pid; | |
38 | L_INT expv; | |
39 | L_INT adrval; | |
40 | INT adrflg; | |
41 | L_INT cntval; | |
42 | INT cntflg; | |
43 | ||
44 | ||
45 | ||
46 | ||
47 | /* command decoding */ | |
48 | ||
49 | command(buf,defcom) | |
50 | STRING buf; | |
51 | CHAR 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=0; | |
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"E | |
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=(longpr?4:2); savdot=dot; | |
133 | expr(1); locval=expv; | |
134 | IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI | |
135 | IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI | |
136 | LOOP w=get(dot,itype); | |
137 | IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI | |
138 | dot=inkdot(dotinc); | |
139 | POOL | |
140 | IF errflg | |
141 | THEN dot=savdot; errflg=NOMATCH; | |
142 | FI | |
143 | psymoff(dot,ptype,""); | |
144 | break; | |
145 | ||
146 | case 'W': | |
147 | longpr=TRUE; | |
148 | case 'w': | |
149 | IF eqcom THEN error(BADEQ); FI | |
150 | wformat[0]=lastc; expr(1); | |
151 | REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype); | |
152 | errflg=0; dot=savdot; | |
153 | IF longpr | |
154 | THEN put(dot,itype,expv); | |
155 | ELSE put(dot,itype,itol(get(dot+2,itype),expv)); | |
156 | FI | |
157 | savdot=dot; | |
158 | printf("=%8t"); exform(1,wformat,itype,ptype); | |
159 | newline(); | |
160 | PER expr(0) ANDF errflg==0 DONE | |
161 | dot=savdot; | |
162 | chkerr(); | |
163 | break; | |
164 | ||
165 | default: | |
166 | lp--; | |
167 | getformat(eqcom ? eqformat : stformat); | |
168 | IF !eqcom | |
169 | THEN psymoff(dot,ptype,":%16t"); | |
170 | FI | |
171 | scanform(cntval,(eqcom?eqformat:stformat),itype,ptype); | |
172 | } | |
173 | break; | |
174 | ||
175 | case '>': | |
176 | lastcom=0; savc=rdc(); | |
177 | IF regptr=getreg(savc) | |
52bff713 BJ |
178 | THEN IF kcore THEN *(int *)regptr = dot; ELSE |
179 | * (ADDR *) (((ADDR)&u)+regptr)=dot; | |
89f636ff | 180 | ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr)); |
52bff713 | 181 | FI |
89f636ff BJ |
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 | shell(); 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 |