|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: static char sccsid[] = "%Z%%M% %I% %G%";
10:
11: MSG BADSYM;
12: MSG BADVAR;
13: MSG BADKET;
14: MSG BADSYN;
15: MSG NOCFN;
16: MSG NOADR;
17: MSG BADLOC;
18:
19: ADDR lastframe;
20: ADDR savlastf;
21: ADDR savframe;
22: ADDR savpc;
23: ADDR callpc;
24:
25:
26:
27: CHAR *lp;
28: INT radix;
29: STRING errflg;
30: L_INT localval;
31: CHAR isymbol[BSIZE];
32:
33: CHAR lastc,peekc;
34:
35: L_INT dot;
36: L_INT ditto;
37: INT dotinc;
38: L_INT var[];
39: L_INT expv;
40:
41:
42:
43:
44: expr(a)
45: { /* term | term dyadic expr | */
46: INT rc;
47: L_INT lhs;
48:
49: rdc(); lp--; rc=term(a);
50:
51: WHILE rc
52: DO lhs = expv;
53:
54: switch ((int)readchar()) {
55:
56: case '+':
57: term(a|1); expv += lhs; break;
58:
59: case '-':
60: term(a|1); expv = lhs - expv; break;
61:
62: case '#':
63: term(a|1); expv = round(lhs,expv); break;
64:
65: case '*':
66: term(a|1); expv *= lhs; break;
67:
68: case '%':
69: term(a|1); expv = lhs/expv; break;
70:
71: case '&':
72: term(a|1); expv &= lhs; break;
73:
74: case '|':
75: term(a|1); expv |= lhs; break;
76:
77: case ')':
78: IF (a&2)==0 THEN error(BADKET); FI
79:
80: default:
81: lp--;
82: return(rc);
83: }
84: OD
85: return(rc);
86: }
87:
88: term(a)
89: { /* item | monadic item | (expr) | */
90:
91: switch ((int)readchar()) {
92:
93: case '*':
94: term(a|1); expv=chkget(expv,DSP); return(1);
95:
96: case '@':
97: term(a|1); expv=chkget(expv,ISP); return(1);
98:
99: case '-':
100: term(a|1); expv = -expv; return(1);
101:
102: case '~':
103: term(a|1); expv = ~expv; return(1);
104:
105: case '(':
106: expr(2);
107: IF *lp!=')'
108: THEN error(BADSYN);
109: ELSE lp++; return(1);
110: FI
111:
112: default:
113: lp--;
114: return(item(a));
115: }
116: }
117:
118: item(a)
119: { /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
120: INT base, d, regptr;
121: CHAR savc;
122: BOOL hex;
123: L_INT frame;
124: register struct nlist *symp;
125:
126: hex=FALSE;
127:
128: readchar();
129: IF symchar(0)
130: THEN readsym();
131: IF lastc=='.'
132: THEN frame= *(ADDR *)(((ADDR)&u)+FP); lastframe=0;
133: callpc= *(ADDR *)(((ADDR)&u)+PC);
134: WHILE errflg==0
135: DO savpc=callpc;
136: findsym(callpc,ISYM);
137: IF eqsym(cursym->n_un.n_name,isymbol,'~')
138: THEN break;
139: FI
140: callpc=get(frame+16, DSP);
141: lastframe=frame;
142: frame=get(frame+12,DSP)&EVEN;
143: IF frame==0
144: THEN error(NOCFN);
145: FI
146: OD
147: savlastf=lastframe; savframe=frame;
148: readchar();
149: IF symchar(0)
150: THEN chkloc(expv=frame);
151: FI
152: ELIF (symp=lookup(isymbol))==0 THEN error(BADSYM);
153: ELSE expv = symp->n_value;
154: FI
155: lp--;
156:
157:
158: ELIF getnum(readchar)
159: THEN ;
160: ELIF lastc=='.'
161: THEN readchar();
162: IF symchar(0)
163: THEN lastframe=savlastf; callpc=savpc;
164: chkloc(savframe);
165: ELSE expv=dot;
166: FI
167: lp--;
168:
169: ELIF lastc=='"'
170: THEN expv=ditto;
171:
172: ELIF lastc=='+'
173: THEN expv=inkdot(dotinc);
174:
175: ELIF lastc=='^'
176: THEN expv=inkdot(-dotinc);
177:
178: ELIF lastc=='<'
179: THEN savc=rdc();
180: IF regptr=getreg(savc)
181: THEN expv= * (ADDR *)(((ADDR)&u)+regptr);
182: ELIF (base=varchk(savc)) != -1
183: THEN expv=var[base];
184: ELSE error(BADVAR);
185: FI
186:
187: ELIF lastc=='\''
188: THEN d=4; expv=0;
189: WHILE quotchar()
190: DO IF d--
191: THEN IF d==1 THEN expv <<=16; FI
192: expv |= ((d&1)?lastc:lastc<<8);
193: ELSE error(BADSYN);
194: FI
195: OD
196:
197: ELIF a
198: THEN error(NOADR);
199: ELSE lp--; return(0);
200: FI
201: return(1);
202: }
203:
204: /* service routines for expression reading */
205: getnum(rdf) int (*rdf)();
206: {
207: INT base,d,frpt;
208: BOOL hex;
209: UNION{REAL r; L_INT i;} real;
210: IF isdigit(lastc) ORF (hex=TRUE, lastc=='#' ANDF isxdigit((*rdf)()))
211: THEN expv = 0;
212: base = (hex ? 16 : radix);
213: WHILE (base>10 ? isxdigit(lastc) : isdigit(lastc))
214: DO expv = (base==16 ? expv<<4 : expv*base);
215: IF (d=convdig(lastc))>=base THEN error(BADSYN); FI
216: expv += d; (*rdf)();
217: IF expv==0
218: THEN IF (lastc=='x' ORF lastc=='X')
219: THEN hex=TRUE; base=16; (*rdf)();
220: ELIF (lastc=='t' ORF lastc=='T')
221: THEN hex=FALSE; base=10; (*rdf)();
222: ELIF (lastc=='o' ORF lastc=='O')
223: THEN hex=FALSE; base=8; (*rdf)();
224: FI
225: FI
226: OD
227: IF lastc=='.' ANDF (base==10 ORF expv==0) ANDF !hex
228: THEN real.r=expv; frpt=0; base=10;
229: WHILE isdigit((*rdf)())
230: DO real.r *= base; frpt++;
231: real.r += lastc-'0';
232: OD
233: WHILE frpt--
234: DO real.r /= base; OD
235: expv = real.i;
236: FI
237: peekc=lastc;
238: /* lp--; */
239: return(1);
240: ELSE return(0);
241: FI
242: }
243:
244: readsym()
245: {
246: REG char *p;
247:
248: p = isymbol;
249: REP IF p < &isymbol[sizeof(isymbol)-1]
250: THEN *p++ = lastc;
251: FI
252: readchar();
253: PER symchar(1) DONE
254: *p++ = 0;
255: }
256:
257: convdig(c)
258: CHAR c;
259: {
260: IF isdigit(c)
261: THEN return(c-'0');
262: ELIF isxdigit(c)
263: THEN return(c-'a'+10);
264: ELSE return(17);
265: FI
266: }
267:
268: symchar(dig)
269: {
270: IF lastc=='\\' THEN readchar(); return(TRUE); FI
271: return( isalpha(lastc) ORF lastc=='_' ORF dig ANDF isdigit(lastc) );
272: }
273:
274: varchk(name)
275: {
276: IF isdigit(name) THEN return(name-'0'); FI
277: IF isalpha(name) THEN return((name&037)-1+10); FI
278: return(-1);
279: }
280:
281: chkloc(frame)
282: L_INT frame;
283: {
284: readsym();
285: REP IF localsym(frame)==0 THEN error(BADLOC); FI
286: expv=localval;
287: PER !eqsym(cursym->n_un.n_name,isymbol,'~') DONE
288: }
289:
290: eqsym(s1, s2, c)
291: register char *s1, *s2;
292: {
293:
294: if (!strcmp(s1,s2))
295: return (1);
296: if (*s1 == c && !strcmp(s1+1, s2))
297: return (1);
298: return (0);
299: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.