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