3 84114f06 2004-04-19 devnull * debugger
7 84114f06 2004-04-19 devnull #include "defs.h"
8 84114f06 2004-04-19 devnull #include "fns.h"
10 84114f06 2004-04-19 devnull static long dbround(long, long);
12 84114f06 2004-04-19 devnull extern ADDR ditto;
13 84114f06 2004-04-19 devnull vlong expv;
15 84114f06 2004-04-19 devnull static WORD
16 84114f06 2004-04-19 devnull ascval(void)
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 */
25 84114f06 2004-04-19 devnull return((WORD) r);
29 84114f06 2004-04-19 devnull * read a floating point number
30 84114f06 2004-04-19 devnull * the result must fit in a WORD
33 84114f06 2004-04-19 devnull static WORD
34 84114f06 2004-04-19 devnull fpin(char *buf)
41 84114f06 2004-04-19 devnull x.f = atof(buf);
42 84114f06 2004-04-19 devnull return (x.w);
46 84114f06 2004-04-19 devnull defval(WORD w)
48 84114f06 2004-04-19 devnull if (expr(0))
49 84114f06 2004-04-19 devnull return (expv);
51 84114f06 2004-04-19 devnull return (w);
55 84114f06 2004-04-19 devnull expr(int a)
56 84114f06 2004-04-19 devnull { /* term | term dyadic expr | */
58 84114f06 2004-04-19 devnull WORD lhs;
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()) {
67 84114f06 2004-04-19 devnull case '+':
68 84114f06 2004-04-19 devnull term(a|1);
69 84114f06 2004-04-19 devnull expv += lhs;
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;
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);
82 84114f06 2004-04-19 devnull case '*':
83 84114f06 2004-04-19 devnull term(a|1);
84 84114f06 2004-04-19 devnull expv *= lhs;
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;
93 84114f06 2004-04-19 devnull expv = 1;
95 84114f06 2004-04-19 devnull expv = 0;
99 84114f06 2004-04-19 devnull case '&':
100 84114f06 2004-04-19 devnull term(a|1);
101 84114f06 2004-04-19 devnull expv &= lhs;
104 84114f06 2004-04-19 devnull case '|':
105 84114f06 2004-04-19 devnull term(a|1);
106 84114f06 2004-04-19 devnull expv |= lhs;
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 `)'");
113 84114f06 2004-04-19 devnull default:
114 84114f06 2004-04-19 devnull reread();
115 84114f06 2004-04-19 devnull return(rc);
118 84114f06 2004-04-19 devnull return(rc);
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;
126 84114f06 2004-04-19 devnull switch ((int)readchar()) {
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);
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);
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);
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);
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);
158 84114f06 2004-04-19 devnull default:
159 84114f06 2004-04-19 devnull reread();
160 84114f06 2004-04-19 devnull return(item(a));
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];
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;
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);
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;
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;
212 84114f06 2004-04-19 devnull reread();
213 84114f06 2004-04-19 devnull } else if (getnum(readchar)) {
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);
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;
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);
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");
249 84114f06 2004-04-19 devnull reread();
250 84114f06 2004-04-19 devnull return(0);
252 84114f06 2004-04-19 devnull return(1);
255 84114f06 2004-04-19 devnull #define MAXBASE 16
257 84114f06 2004-04-19 devnull /* service routines for expression reading */
259 84114f06 2004-04-19 devnull getnum(int (*rdf)(void))
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];
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)();
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)();
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)();
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)();
293 84114f06 2004-04-19 devnull default:
294 84114f06 2004-04-19 devnull if (base == 0)
295 84114f06 2004-04-19 devnull base = 8;
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;
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();
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);
321 84114f06 2004-04-19 devnull readsym(char *isymbol)
323 84114f06 2004-04-19 devnull char *p;
326 84114f06 2004-04-19 devnull p = isymbol;
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);
332 84114f06 2004-04-19 devnull readchar();
333 84114f06 2004-04-19 devnull } while (symchar(1));
338 84114f06 2004-04-19 devnull readfname(char *filename)
340 84114f06 2004-04-19 devnull char *p;
343 84114f06 2004-04-19 devnull /* snarf chars until un-escaped char in terminal char set */
344 84114f06 2004-04-19 devnull p = filename;
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);
351 84114f06 2004-04-19 devnull reread();
355 84114f06 2004-04-19 devnull convdig(int c)
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);
364 84114f06 2004-04-19 devnull return(c-'a'+10);
368 84114f06 2004-04-19 devnull symchar(int dig)
370 84114f06 2004-04-19 devnull if (lastc=='\\') {
371 84114f06 2004-04-19 devnull readchar();
372 84114f06 2004-04-19 devnull return(TRUE);
374 84114f06 2004-04-19 devnull return(isalpha(lastc) || lastc>0x80 || lastc=='_' || dig && isdigit(lastc));
377 84114f06 2004-04-19 devnull static long
378 84114f06 2004-04-19 devnull dbround(long a, long b)
382 84114f06 2004-04-19 devnull w = (a/b)*b;
383 84114f06 2004-04-19 devnull if (a!=w)
385 84114f06 2004-04-19 devnull return(w);
389 84114f06 2004-04-19 devnull dbrget(Map *map, char *name)
391 84114f06 2004-04-19 devnull ulong u;
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;