Blame


1 84114f06 2004-04-19 devnull /*
2 84114f06 2004-04-19 devnull *
3 84114f06 2004-04-19 devnull * debugger
4 84114f06 2004-04-19 devnull *
5 84114f06 2004-04-19 devnull */
6 84114f06 2004-04-19 devnull
7 84114f06 2004-04-19 devnull #include "defs.h"
8 84114f06 2004-04-19 devnull #include "fns.h"
9 84114f06 2004-04-19 devnull
10 84114f06 2004-04-19 devnull static long dbround(long, long);
11 84114f06 2004-04-19 devnull
12 84114f06 2004-04-19 devnull extern ADDR ditto;
13 84114f06 2004-04-19 devnull vlong expv;
14 84114f06 2004-04-19 devnull
15 84114f06 2004-04-19 devnull static WORD
16 84114f06 2004-04-19 devnull ascval(void)
17 84114f06 2004-04-19 devnull {
18 84114f06 2004-04-19 devnull Rune r;
19 84114f06 2004-04-19 devnull
20 84114f06 2004-04-19 devnull if (readchar() == 0)
21 84114f06 2004-04-19 devnull return (0);
22 84114f06 2004-04-19 devnull r = lastc;
23 84114f06 2004-04-19 devnull while(quotchar()) /*discard chars to ending quote */
24 84114f06 2004-04-19 devnull ;
25 84114f06 2004-04-19 devnull return((WORD) r);
26 84114f06 2004-04-19 devnull }
27 84114f06 2004-04-19 devnull
28 84114f06 2004-04-19 devnull /*
29 84114f06 2004-04-19 devnull * read a floating point number
30 84114f06 2004-04-19 devnull * the result must fit in a WORD
31 84114f06 2004-04-19 devnull */
32 84114f06 2004-04-19 devnull
33 84114f06 2004-04-19 devnull static WORD
34 84114f06 2004-04-19 devnull fpin(char *buf)
35 84114f06 2004-04-19 devnull {
36 84114f06 2004-04-19 devnull union {
37 84114f06 2004-04-19 devnull WORD w;
38 84114f06 2004-04-19 devnull float f;
39 84114f06 2004-04-19 devnull } x;
40 84114f06 2004-04-19 devnull
41 84114f06 2004-04-19 devnull x.f = atof(buf);
42 84114f06 2004-04-19 devnull return (x.w);
43 84114f06 2004-04-19 devnull }
44 84114f06 2004-04-19 devnull
45 84114f06 2004-04-19 devnull WORD
46 84114f06 2004-04-19 devnull defval(WORD w)
47 84114f06 2004-04-19 devnull {
48 84114f06 2004-04-19 devnull if (expr(0))
49 84114f06 2004-04-19 devnull return (expv);
50 84114f06 2004-04-19 devnull else
51 84114f06 2004-04-19 devnull return (w);
52 84114f06 2004-04-19 devnull }
53 84114f06 2004-04-19 devnull
54 84114f06 2004-04-19 devnull int
55 84114f06 2004-04-19 devnull expr(int a)
56 84114f06 2004-04-19 devnull { /* term | term dyadic expr | */
57 84114f06 2004-04-19 devnull int rc;
58 84114f06 2004-04-19 devnull WORD lhs;
59 84114f06 2004-04-19 devnull
60 84114f06 2004-04-19 devnull rdc();
61 84114f06 2004-04-19 devnull reread();
62 84114f06 2004-04-19 devnull rc=term(a);
63 84114f06 2004-04-19 devnull while (rc) {
64 84114f06 2004-04-19 devnull lhs = expv;
65 84114f06 2004-04-19 devnull switch ((int)readchar()) {
66 84114f06 2004-04-19 devnull
67 84114f06 2004-04-19 devnull case '+':
68 84114f06 2004-04-19 devnull term(a|1);
69 84114f06 2004-04-19 devnull expv += lhs;
70 84114f06 2004-04-19 devnull break;
71 84114f06 2004-04-19 devnull
72 84114f06 2004-04-19 devnull case '-':
73 84114f06 2004-04-19 devnull term(a|1);
74 84114f06 2004-04-19 devnull expv = lhs - expv;
75 84114f06 2004-04-19 devnull break;
76 84114f06 2004-04-19 devnull
77 84114f06 2004-04-19 devnull case '#':
78 84114f06 2004-04-19 devnull term(a|1);
79 84114f06 2004-04-19 devnull expv = dbround(lhs,expv);
80 84114f06 2004-04-19 devnull break;
81 84114f06 2004-04-19 devnull
82 84114f06 2004-04-19 devnull case '*':
83 84114f06 2004-04-19 devnull term(a|1);
84 84114f06 2004-04-19 devnull expv *= lhs;
85 84114f06 2004-04-19 devnull break;
86 84114f06 2004-04-19 devnull
87 84114f06 2004-04-19 devnull case '%':
88 84114f06 2004-04-19 devnull term(a|1);
89 84114f06 2004-04-19 devnull if(expv != 0)
90 84114f06 2004-04-19 devnull expv = lhs/expv;
91 84114f06 2004-04-19 devnull else{
92 84114f06 2004-04-19 devnull if(lhs)
93 84114f06 2004-04-19 devnull expv = 1;
94 84114f06 2004-04-19 devnull else
95 84114f06 2004-04-19 devnull expv = 0;
96 84114f06 2004-04-19 devnull }
97 84114f06 2004-04-19 devnull break;
98 84114f06 2004-04-19 devnull
99 84114f06 2004-04-19 devnull case '&':
100 84114f06 2004-04-19 devnull term(a|1);
101 84114f06 2004-04-19 devnull expv &= lhs;
102 84114f06 2004-04-19 devnull break;
103 84114f06 2004-04-19 devnull
104 84114f06 2004-04-19 devnull case '|':
105 84114f06 2004-04-19 devnull term(a|1);
106 84114f06 2004-04-19 devnull expv |= lhs;
107 84114f06 2004-04-19 devnull break;
108 84114f06 2004-04-19 devnull
109 84114f06 2004-04-19 devnull case ')':
110 84114f06 2004-04-19 devnull if ((a&2)==0)
111 84114f06 2004-04-19 devnull error("unexpected `)'");
112 84114f06 2004-04-19 devnull
113 84114f06 2004-04-19 devnull default:
114 84114f06 2004-04-19 devnull reread();
115 84114f06 2004-04-19 devnull return(rc);
116 84114f06 2004-04-19 devnull }
117 84114f06 2004-04-19 devnull }
118 84114f06 2004-04-19 devnull return(rc);
119 84114f06 2004-04-19 devnull }
120 84114f06 2004-04-19 devnull
121 84114f06 2004-04-19 devnull int
122 84114f06 2004-04-19 devnull term(int a)
123 84114f06 2004-04-19 devnull { /* item | monadic item | (expr) | */
124 84114f06 2004-04-19 devnull u32int u;
125 84114f06 2004-04-19 devnull
126 84114f06 2004-04-19 devnull switch ((int)readchar()) {
127 84114f06 2004-04-19 devnull
128 84114f06 2004-04-19 devnull case '*':
129 84114f06 2004-04-19 devnull term(a|1);
130 84114f06 2004-04-19 devnull if (get4(cormap, (ADDR)expv, &u) < 0)
131 84114f06 2004-04-19 devnull error("%r");
132 84114f06 2004-04-19 devnull expv = u;
133 84114f06 2004-04-19 devnull return(1);
134 84114f06 2004-04-19 devnull
135 84114f06 2004-04-19 devnull case '@':
136 84114f06 2004-04-19 devnull term(a|1);
137 84114f06 2004-04-19 devnull if (get4(symmap, (ADDR)expv, &u) < 0)
138 84114f06 2004-04-19 devnull error("%r");
139 84114f06 2004-04-19 devnull expv = u;
140 84114f06 2004-04-19 devnull return(1);
141 84114f06 2004-04-19 devnull
142 84114f06 2004-04-19 devnull case '-':
143 84114f06 2004-04-19 devnull term(a|1);
144 84114f06 2004-04-19 devnull expv = -expv;
145 84114f06 2004-04-19 devnull return(1);
146 84114f06 2004-04-19 devnull
147 84114f06 2004-04-19 devnull case '~':
148 84114f06 2004-04-19 devnull term(a|1);
149 84114f06 2004-04-19 devnull expv = ~expv;
150 84114f06 2004-04-19 devnull return(1);
151 84114f06 2004-04-19 devnull
152 84114f06 2004-04-19 devnull case '(':
153 84114f06 2004-04-19 devnull expr(2);
154 84114f06 2004-04-19 devnull if (readchar()!=')')
155 84114f06 2004-04-19 devnull error("syntax error: `)' expected");
156 84114f06 2004-04-19 devnull return(1);
157 84114f06 2004-04-19 devnull
158 84114f06 2004-04-19 devnull default:
159 84114f06 2004-04-19 devnull reread();
160 84114f06 2004-04-19 devnull return(item(a));
161 84114f06 2004-04-19 devnull }
162 84114f06 2004-04-19 devnull }
163 84114f06 2004-04-19 devnull
164 84114f06 2004-04-19 devnull int
165 84114f06 2004-04-19 devnull item(int a)
166 84114f06 2004-04-19 devnull { /* name [ . local ] | number | . | ^ | <register | 'x | | */
167 84114f06 2004-04-19 devnull char *base;
168 84114f06 2004-04-19 devnull char savc;
169 84114f06 2004-04-19 devnull ulong u;
170 84114f06 2004-04-19 devnull Symbol s;
171 84114f06 2004-04-19 devnull char gsym[MAXSYM], lsym[MAXSYM];
172 84114f06 2004-04-19 devnull
173 84114f06 2004-04-19 devnull readchar();
174 84114f06 2004-04-19 devnull if (isfileref()) {
175 84114f06 2004-04-19 devnull readfname(gsym);
176 84114f06 2004-04-19 devnull rdc(); /* skip white space */
177 84114f06 2004-04-19 devnull if (lastc == ':') { /* it better be */
178 84114f06 2004-04-19 devnull rdc(); /* skip white space */
179 84114f06 2004-04-19 devnull if (!getnum(readchar))
180 84114f06 2004-04-19 devnull error("bad number");
181 84114f06 2004-04-19 devnull if (expv == 0)
182 84114f06 2004-04-19 devnull expv = 1; /* file begins at line 1 */
183 84114f06 2004-04-19 devnull if(file2pc(gsym, expv, &u) < 0)
184 84114f06 2004-04-19 devnull error("%r");
185 84114f06 2004-04-19 devnull expv = u;
186 84114f06 2004-04-19 devnull return 1;
187 84114f06 2004-04-19 devnull }
188 84114f06 2004-04-19 devnull error("bad file location");
189 84114f06 2004-04-19 devnull } else if (symchar(0)) {
190 84114f06 2004-04-19 devnull readsym(gsym);
191 84114f06 2004-04-19 devnull if (lastc=='.') {
192 84114f06 2004-04-19 devnull readchar(); /* ugh */
193 84114f06 2004-04-19 devnull if (lastc == '.') {
194 84114f06 2004-04-19 devnull lsym[0] = '.';
195 84114f06 2004-04-19 devnull readchar();
196 84114f06 2004-04-19 devnull readsym(lsym+1);
197 84114f06 2004-04-19 devnull } else if (symchar(0)) {
198 84114f06 2004-04-19 devnull readsym(lsym);
199 84114f06 2004-04-19 devnull } else
200 84114f06 2004-04-19 devnull lsym[0] = 0;
201 84114f06 2004-04-19 devnull if (localaddr(cormap, correg, gsym, lsym, &u) < 0)
202 84114f06 2004-04-19 devnull error("%r");
203 84114f06 2004-04-19 devnull expv = u;
204 84114f06 2004-04-19 devnull }
205 84114f06 2004-04-19 devnull else {
206 84114f06 2004-04-19 devnull if (lookupsym(0, gsym, &s) < 0)
207 84114f06 2004-04-19 devnull error("symbol not found");
208 84114f06 2004-04-19 devnull if (s.loc.type != LADDR)
209 84114f06 2004-04-19 devnull error("symbol not kept in memory");
210 84114f06 2004-04-19 devnull expv = s.loc.addr;
211 84114f06 2004-04-19 devnull }
212 84114f06 2004-04-19 devnull reread();
213 84114f06 2004-04-19 devnull } else if (getnum(readchar)) {
214 84114f06 2004-04-19 devnull ;
215 84114f06 2004-04-19 devnull } else if (lastc=='.') {
216 84114f06 2004-04-19 devnull readchar();
217 84114f06 2004-04-19 devnull if (!symchar(0) && lastc != '.') {
218 84114f06 2004-04-19 devnull expv = dot;
219 84114f06 2004-04-19 devnull } else {
220 84114f06 2004-04-19 devnull if (findsym(locaddr(dbrget(cormap, mach->pc)), CTEXT, &s) < 0)
221 84114f06 2004-04-19 devnull error("no current function");
222 84114f06 2004-04-19 devnull if (lastc == '.') {
223 84114f06 2004-04-19 devnull lsym[0] = '.';
224 84114f06 2004-04-19 devnull readchar();
225 84114f06 2004-04-19 devnull readsym(lsym+1);
226 84114f06 2004-04-19 devnull } else
227 84114f06 2004-04-19 devnull readsym(lsym);
228 84114f06 2004-04-19 devnull if (localaddr(cormap, correg, s.name, lsym, &u) < 0)
229 84114f06 2004-04-19 devnull error("%r");
230 84114f06 2004-04-19 devnull expv = u;
231 84114f06 2004-04-19 devnull }
232 84114f06 2004-04-19 devnull reread();
233 84114f06 2004-04-19 devnull } else if (lastc=='"') {
234 84114f06 2004-04-19 devnull expv=ditto;
235 84114f06 2004-04-19 devnull } else if (lastc=='+') {
236 84114f06 2004-04-19 devnull expv=inkdot(dotinc);
237 84114f06 2004-04-19 devnull } else if (lastc=='^') {
238 84114f06 2004-04-19 devnull expv=inkdot(-dotinc);
239 84114f06 2004-04-19 devnull } else if (lastc=='<') {
240 84114f06 2004-04-19 devnull savc=rdc();
241 84114f06 2004-04-19 devnull base = regname(savc);
242 84114f06 2004-04-19 devnull expv = dbrget(cormap, base);
243 84114f06 2004-04-19 devnull }
244 84114f06 2004-04-19 devnull else if (lastc=='\'')
245 84114f06 2004-04-19 devnull expv = ascval();
246 84114f06 2004-04-19 devnull else if (a)
247 84114f06 2004-04-19 devnull error("address expected");
248 84114f06 2004-04-19 devnull else {
249 84114f06 2004-04-19 devnull reread();
250 84114f06 2004-04-19 devnull return(0);
251 84114f06 2004-04-19 devnull }
252 84114f06 2004-04-19 devnull return(1);
253 84114f06 2004-04-19 devnull }
254 84114f06 2004-04-19 devnull
255 84114f06 2004-04-19 devnull #define MAXBASE 16
256 84114f06 2004-04-19 devnull
257 84114f06 2004-04-19 devnull /* service routines for expression reading */
258 84114f06 2004-04-19 devnull int
259 84114f06 2004-04-19 devnull getnum(int (*rdf)(void))
260 84114f06 2004-04-19 devnull {
261 84114f06 2004-04-19 devnull char *cp;
262 84114f06 2004-04-19 devnull int base, d;
263 84114f06 2004-04-19 devnull BOOL fpnum;
264 84114f06 2004-04-19 devnull char num[MAXLIN];
265 84114f06 2004-04-19 devnull
266 84114f06 2004-04-19 devnull base = 0;
267 84114f06 2004-04-19 devnull fpnum = FALSE;
268 84114f06 2004-04-19 devnull if (lastc == '#') {
269 84114f06 2004-04-19 devnull base = 16;
270 84114f06 2004-04-19 devnull (*rdf)();
271 84114f06 2004-04-19 devnull }
272 84114f06 2004-04-19 devnull if (convdig(lastc) >= MAXBASE)
273 84114f06 2004-04-19 devnull return (0);
274 84114f06 2004-04-19 devnull if (lastc == '0')
275 84114f06 2004-04-19 devnull switch ((*rdf)()) {
276 84114f06 2004-04-19 devnull case 'x':
277 84114f06 2004-04-19 devnull case 'X':
278 84114f06 2004-04-19 devnull base = 16;
279 84114f06 2004-04-19 devnull (*rdf)();
280 84114f06 2004-04-19 devnull break;
281 84114f06 2004-04-19 devnull
282 84114f06 2004-04-19 devnull case 't':
283 84114f06 2004-04-19 devnull case 'T':
284 84114f06 2004-04-19 devnull base = 10;
285 84114f06 2004-04-19 devnull (*rdf)();
286 84114f06 2004-04-19 devnull break;
287 84114f06 2004-04-19 devnull
288 84114f06 2004-04-19 devnull case 'o':
289 84114f06 2004-04-19 devnull case 'O':
290 84114f06 2004-04-19 devnull base = 8;
291 84114f06 2004-04-19 devnull (*rdf)();
292 84114f06 2004-04-19 devnull break;
293 84114f06 2004-04-19 devnull default:
294 84114f06 2004-04-19 devnull if (base == 0)
295 84114f06 2004-04-19 devnull base = 8;
296 84114f06 2004-04-19 devnull break;
297 84114f06 2004-04-19 devnull }
298 84114f06 2004-04-19 devnull if (base == 0)
299 84114f06 2004-04-19 devnull base = 10;
300 84114f06 2004-04-19 devnull expv = 0;
301 84114f06 2004-04-19 devnull for (cp = num, *cp = lastc; ;(*rdf)()) {
302 84114f06 2004-04-19 devnull if ((d = convdig(lastc)) < base) {
303 84114f06 2004-04-19 devnull expv *= base;
304 84114f06 2004-04-19 devnull expv += d;
305 84114f06 2004-04-19 devnull *cp++ = lastc;
306 84114f06 2004-04-19 devnull }
307 84114f06 2004-04-19 devnull else if (lastc == '.') {
308 84114f06 2004-04-19 devnull fpnum = TRUE;
309 84114f06 2004-04-19 devnull *cp++ = lastc;
310 84114f06 2004-04-19 devnull } else {
311 84114f06 2004-04-19 devnull reread();
312 84114f06 2004-04-19 devnull break;
313 84114f06 2004-04-19 devnull }
314 84114f06 2004-04-19 devnull }
315 84114f06 2004-04-19 devnull if (fpnum)
316 84114f06 2004-04-19 devnull expv = fpin(num);
317 84114f06 2004-04-19 devnull return (1);
318 84114f06 2004-04-19 devnull }
319 84114f06 2004-04-19 devnull
320 84114f06 2004-04-19 devnull void
321 84114f06 2004-04-19 devnull readsym(char *isymbol)
322 84114f06 2004-04-19 devnull {
323 84114f06 2004-04-19 devnull char *p;
324 84114f06 2004-04-19 devnull Rune r;
325 84114f06 2004-04-19 devnull
326 84114f06 2004-04-19 devnull p = isymbol;
327 84114f06 2004-04-19 devnull do {
328 84114f06 2004-04-19 devnull if (p < &isymbol[MAXSYM-UTFmax-1]){
329 84114f06 2004-04-19 devnull r = lastc;
330 84114f06 2004-04-19 devnull p += runetochar(p, &r);
331 84114f06 2004-04-19 devnull }
332 84114f06 2004-04-19 devnull readchar();
333 84114f06 2004-04-19 devnull } while (symchar(1));
334 84114f06 2004-04-19 devnull *p = 0;
335 84114f06 2004-04-19 devnull }
336 84114f06 2004-04-19 devnull
337 84114f06 2004-04-19 devnull void
338 84114f06 2004-04-19 devnull readfname(char *filename)
339 84114f06 2004-04-19 devnull {
340 84114f06 2004-04-19 devnull char *p;
341 84114f06 2004-04-19 devnull Rune c;
342 84114f06 2004-04-19 devnull
343 84114f06 2004-04-19 devnull /* snarf chars until un-escaped char in terminal char set */
344 84114f06 2004-04-19 devnull p = filename;
345 84114f06 2004-04-19 devnull do {
346 84114f06 2004-04-19 devnull if ((c = lastc) != '\\' && p < &filename[MAXSYM-UTFmax-1])
347 84114f06 2004-04-19 devnull p += runetochar(p, &c);
348 84114f06 2004-04-19 devnull readchar();
349 84114f06 2004-04-19 devnull } while (c == '\\' || strchr(CMD_VERBS, lastc) == 0);
350 84114f06 2004-04-19 devnull *p = 0;
351 84114f06 2004-04-19 devnull reread();
352 84114f06 2004-04-19 devnull }
353 84114f06 2004-04-19 devnull
354 84114f06 2004-04-19 devnull int
355 84114f06 2004-04-19 devnull convdig(int c)
356 84114f06 2004-04-19 devnull {
357 84114f06 2004-04-19 devnull if (isdigit(c))
358 84114f06 2004-04-19 devnull return(c-'0');
359 84114f06 2004-04-19 devnull else if (!isxdigit(c))
360 84114f06 2004-04-19 devnull return(MAXBASE);
361 84114f06 2004-04-19 devnull else if (isupper(c))
362 84114f06 2004-04-19 devnull return(c-'A'+10);
363 84114f06 2004-04-19 devnull else
364 84114f06 2004-04-19 devnull return(c-'a'+10);
365 84114f06 2004-04-19 devnull }
366 84114f06 2004-04-19 devnull
367 84114f06 2004-04-19 devnull int
368 84114f06 2004-04-19 devnull symchar(int dig)
369 84114f06 2004-04-19 devnull {
370 84114f06 2004-04-19 devnull if (lastc=='\\') {
371 84114f06 2004-04-19 devnull readchar();
372 84114f06 2004-04-19 devnull return(TRUE);
373 84114f06 2004-04-19 devnull }
374 84114f06 2004-04-19 devnull return(isalpha(lastc) || lastc>0x80 || lastc=='_' || dig && isdigit(lastc));
375 84114f06 2004-04-19 devnull }
376 84114f06 2004-04-19 devnull
377 84114f06 2004-04-19 devnull static long
378 84114f06 2004-04-19 devnull dbround(long a, long b)
379 84114f06 2004-04-19 devnull {
380 84114f06 2004-04-19 devnull long w;
381 84114f06 2004-04-19 devnull
382 84114f06 2004-04-19 devnull w = (a/b)*b;
383 84114f06 2004-04-19 devnull if (a!=w)
384 84114f06 2004-04-19 devnull w += b;
385 84114f06 2004-04-19 devnull return(w);
386 84114f06 2004-04-19 devnull }
387 84114f06 2004-04-19 devnull
388 84114f06 2004-04-19 devnull ulong
389 84114f06 2004-04-19 devnull dbrget(Map *map, char *name)
390 84114f06 2004-04-19 devnull {
391 84114f06 2004-04-19 devnull ulong u;
392 84114f06 2004-04-19 devnull
393 84114f06 2004-04-19 devnull USED(map);
394 84114f06 2004-04-19 devnull if(rget(correg, name, &u) < 0)
395 84114f06 2004-04-19 devnull return ~(ulong)0;
396 84114f06 2004-04-19 devnull return u;
397 84114f06 2004-04-19 devnull }