Commit | Line | Data |
---|---|---|
d94e2462 M |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | ||
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[128] "o"; | |
27 | CHAR stformat[128] "o\"= \"^i"; | |
28 | POS *endhdr; | |
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=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"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=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 |