|
|
1.1 root 1: /*
2: *
3: * UNIX debugger
4: *
5: */
6:
7: #include "defs.h"
8: #include "regs.h"
9: #include "sym.h"
10: #include "space.h"
11:
12: WORD var[NVARS];
13:
14: extern int radix;
15:
16: extern char lastc, peekc;
17:
18: extern ADDR ditto;
19: extern int ditsp;
20: extern int dotsp;
21: WORD expv;
22: int expsp;
23:
24: WORD
25: defval(w)
26: WORD w;
27: {
28: if (expr(0))
29: return (expv);
30: else
31: return (w);
32: }
33:
34: expr(a)
35: register int a;
36: { /* term | term dyadic expr | */
37: register int rc;
38: register WORD lhs;
39:
40: rdc();
41: reread();
42: expsp = NOSP;
43: rc=term(a);
44: while (rc) {
45: lhs = expv;
46: switch ((int)readchar()) {
47:
48: case '+':
49: term(a|1);
50: expv += lhs;
51: break;
52:
53: case '-':
54: term(a|1);
55: expv = lhs - expv;
56: break;
57:
58: case '#':
59: term(a|1);
60: expv = round(lhs,expv);
61: break;
62:
63: case '*':
64: term(a|1);
65: expv *= lhs;
66: break;
67:
68: case '%':
69: term(a|1);
70: expv = lhs/expv;
71: break;
72:
73: case '&':
74: term(a|1);
75: expv &= lhs;
76: break;
77:
78: case '|':
79: term(a|1);
80: expv |= lhs;
81: break;
82:
83: case ')':
84: if ((a&2)==0)
85: error("unexpected `)'");
86:
87: default:
88: reread();
89: return(rc);
90: }
91: }
92: return(rc);
93: }
94:
95: term(a)
96: register int a;
97: { /* item | monadic item | (expr) | */
98:
99: switch ((int)readchar()) {
100:
101: case '*':
102: term(a|1);
103: expv=atow(aget((ADDR)expv, CORF|DATASP));
104: expsp = NOSP;
105: chkerr();
106: return(1);
107:
108: case '@':
109: term(a|1);
110: expv=atow(aget((ADDR)expv, SYMF|INSTSP));
111: expsp = NOSP;
112: return(1);
113:
114: case '-':
115: term(a|1);
116: expv = -expv;
117: return(1);
118:
119: case '~':
120: term(a|1);
121: expv = ~expv;
122: return(1);
123:
124: case '(':
125: expr(2);
126: if (readchar()!=')')
127: error("syntax error: `)' expected");
128: return(1);
129:
130: case '%':
131: term(a|1);
132: expsp = REGSP;
133: return(1);
134:
135: default:
136: reread();
137: return(item(a));
138: }
139: }
140:
141: item(a)
142: register int a;
143: { /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
144: int base;
145: char savc;
146: register struct sym *symp;
147: char gsym[MAXSYM], lsym[MAXSYM];
148: WORD ascval();
149:
150: readchar();
151: if (symchar(0)) {
152: readsym(gsym);
153: if (lastc=='.') {
154: readchar(); /* ugh */
155: if (!symchar(0))
156: localaddr(gsym, (char *)NULL);
157: else {
158: readsym(lsym);
159: localaddr(gsym, lsym);
160: }
161: }
162: else {
163: if ((symp = lookup(gsym)) == NULL)
164: error("symbol not found");
165: expv = symp->y_value;
166: }
167: reread();
168: } else if (getnum(readchar)) {
169: ;
170: } else if (lastc=='.') {
171: readchar();
172: if (!symchar(0)) {
173: expv = dot;
174: expsp = dotsp;
175: } else {
176: readsym(lsym);
177: localaddr((char *)NULL, lsym);
178: }
179: reread();
180: } else if (lastc=='"') {
181: expv=ditto;
182: expsp = ditsp;
183: } else if (lastc=='+') {
184: expv=inkdot(dotinc);
185: expsp = ditsp;
186: } else if (lastc=='^') {
187: expv=inkdot(-dotinc);
188: expsp = ditsp;
189: } else if (lastc=='<') {
190: savc=rdc();
191: base = getreg(savc);
192: if (base != BADREG)
193: expv = rtow(rget(base));
194: else if ((base = varchk(savc)) != -1)
195: expv = var[base];
196: else
197: error("bad variable");
198: }
199: else if (lastc=='\'')
200: expv = ascval();
201: else if (a)
202: error("address expected");
203: else {
204: reread();
205: return(0);
206: }
207: return(1);
208: }
209:
210: #define MAXBASE 16
211:
212: /* service routines for expression reading */
213: getnum(rdf)
214: int (*rdf)();
215: {
216: register char *cp;
217: register int base, d;
218: BOOL fpnum;
219: char num[MAXLIN];
220: WORD fpin();
221:
222: base = radix;
223: fpnum = FALSE;
224: if (lastc == '#') {
225: base = 16;
226: (*rdf)();
227: }
228: if (convdig(lastc) >= MAXBASE)
229: return (0);
230: if (lastc == '0')
231: switch ((*rdf)()) {
232: case 'x':
233: case 'X':
234: base = 16;
235: (*rdf)();
236: break;
237:
238: case 't':
239: case 'T':
240: base = 10;
241: (*rdf)();
242: break;
243:
244: case 'o':
245: case 'O':
246: base = 8;
247: (*rdf)();
248: break;
249: default:
250: if (base == 0)
251: base = 8;
252: break;
253: }
254: if (base == 0)
255: base = 10;
256: expv = 0;
257: for (cp = num, *cp++ = lastc; ;(*rdf)()) {
258: if ((d = convdig(lastc)) < base) {
259: expv *= base;
260: expv += d;
261: *cp++ = lastc;
262: }
263: else if (lastc == '.') {
264: fpnum = TRUE;
265: *cp++ = lastc;
266: }
267: else {
268: reread();
269: break;
270: }
271: }
272: if (fpnum)
273: expv = fpin(num);
274: return (1);
275: }
276:
277: readsym(isymbol)
278: register char *isymbol;
279: {
280: register char *p;
281:
282: p = isymbol;
283: do {
284: if (p < &isymbol[MAXSYM-1])
285: *p++ = lastc;
286: readchar();
287: } while (symchar(1));
288: *p = 0;
289: }
290:
291: convdig(c)
292: register char c;
293: {
294: if (isdigit(c))
295: return(c-'0');
296: else if (!isxdigit(c))
297: return(MAXBASE);
298: else if (isupper(c))
299: return(c-'A'+10);
300: else
301: return(c-'a'+10);
302: }
303:
304: symchar(dig)
305: {
306: if (lastc=='\\') {
307: readchar();
308: return(TRUE);
309: }
310: return(isalpha(lastc) || lastc=='_' || dig && isdigit(lastc));
311: }
312:
313: varchk(name)
314: {
315: if (isdigit(name))
316: return(name-'0');
317: if (isalpha(name))
318: return((name&037)-1+10);
319: return(-1);
320: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.