|
|
1.1 root 1: #include <stdio.h>
2: #include <math.h>
3: #include "trace.h"
4: #include "trace.d"
5:
6: #define setv 1
7: #define addeq 2
8: #define subeq 3
9: #define muleq 4
10: #define diveq 5
11: #define modeq 6
12: #define plus 7
13: #define minus 8
14: #define times 9
15: #define div 10
16: #define mod 11
17: #define power 12
18: #define uminus 13
19: #define gt 14
20: #define lt 15
21: #define ge 16
22: #define le 17
23: #define eq 18
24: #define ne 19
25: #define land 20
26: #define lor 21
27: #define lnot 22
28: #define princ 23
29: #define prdec 24
30: #define poinc 25
31: #define podec 26
32:
33: #define OP 0
34: #define NM 1
35:
36: #define unary(c) (c == uminus || c == lnot || c >= princ)
37: #define binary(c) !unary(c)
38:
39: extern struct REVPOL **expr;
40: extern int nexpr, nrvars, *globvars;
41: extern struct VARPARS *procpars;
42:
43: struct REVPOL *rev;
44: int curproc, revp;
45:
46: struct {
47: char how;
48: short whichvar;
49: short oldvalue;
50: } storewhere;
51:
52: evalexpr(n, pr, b)
53: struct FREEZE *b;
54: { int i;
55: if (n == NONE)
56: return 0;
57: if (n < 0 || n >= nexpr)
58: whoops("unknown expression");
59:
60: rev = expr[n];
61: revp = 0;
62: curproc = pr;
63: storewhere.how = 0;
64:
65: if ((i = getval()) < 0)
66: i += 3*MANY;
67: else
68: i -= 3*MANY; /* should return stripped constant */
69:
70: b->whichvar = storewhere.whichvar;
71: b->oldvalue = storewhere.oldvalue;
72:
73: return storewhere.how;
74: }
75:
76: evalcond(n, pr)
77: { int i;
78: if (n < 0 || n >= nexpr)
79: { fprintf(stderr, "%d\n", n);
80: whoops("unknown expression - evalcond");
81: }
82:
83: rev = expr[n];
84: revp = 0;
85: curproc = pr;
86: storewhere.how = 0;
87:
88: if ((i = getval()) < 0)
89: i += 3*MANY;
90: else
91: i -= 3*MANY; /* should return stripped constant */
92:
93: if (storewhere.how != 0)
94: whoops("illegal assignment in expression");
95:
96: return i;
97: }
98:
99: unoper(c, n)
100: { int i = convert(n, curproc);
101: switch (c)
102: { case uminus: return (-i);
103: case lnot : return (!i);
104: case princ : remem(n); setvar(n, i+1); return i;
105: case prdec : remem(n); setvar(n, i-1); return i;
106: case poinc : remem(n); return setvar(n, i+1);
107: case podec : remem(n); return setvar(n, i-1);
108: default : whoops("unknown unary operator");
109: }
110: }
111:
112: bioper(c, n, m)
113: { int i, j;
114: double a, b;
115:
116: if (c != setv)
117: i = convert(n, curproc);
118: j = convert(m, curproc);
119: switch (c)
120: { case setv: remem(n); return setvar(n, j);
121: case addeq: remem(n); return setvar(n, i+j);
122: case subeq: remem(n); return setvar(n, i-j);
123: case muleq: remem(n); return setvar(n, i*j);
124: case diveq: remem(n); return setvar(n, i/j);
125: case modeq: remem(n); return setvar(n, i%j);
126: case plus: return (i+j);
127: case minus: return (i-j);
128: case times: return (i*j);
129: case div: return (i/j);
130: case mod: return (i%j);
131: case gt : return (i>j);
132: case lt : return (i<j);
133: case ge : return (i>=j);
134: case le : return (i<=j);
135: case eq : return (i==j);
136: case ne : return (i!=j);
137: case land: return (i&&j);
138: case lor: return (i||j);
139: default: whoops("unkown binary operator");
140: }
141: }
142:
143: getval()
144: { int tok = revp++;
145: int res;
146:
147: if (rev[tok].toktyp == NM)
148: res = rev[tok].tokval;
149: else
150: { if (unary(rev[tok].tokval))
151: res = unoper(rev[tok].tokval, getval());
152: else
153: res = bioper(rev[tok].tokval, getval(), getval());
154:
155: if (res < 0)
156: res -= 3*MANY;
157: else
158: res += 3*MANY;
159: }
160:
161: return res;
162: }
163:
164: setvar(which, v)
165: { int u = wapper(which, curproc);
166: int towhat = v;
167:
168: if (u >= 2*MANY || u < 0)
169: whoops("lhs of assignment not a variable");
170:
171: if (u < MANY)
172: { if (u >= nrvars)
173: whoops("unknown global variable");
174:
175: globvars[u] = (short) towhat;
176: }
177: else
178: { u -= MANY;
179: if (u >= (int) procpars[curproc].nrlvars)
180: whoops("unknown local variable");
181: procpars[curproc].lvarvals[u] = (short) towhat;
182: }
183:
184: return towhat;
185: }
186:
187: remem(u)
188: { if (storewhere.how != 0)
189: whoops("multiple assignment in expression");
190:
191: if (u < MANY)
192: { storewhere.whichvar = (short) u;
193: storewhere.oldvalue = globvars[u];
194: storewhere.how = GV;
195: }
196: else
197: { storewhere.whichvar = (short) u;
198: u -= MANY;
199: storewhere.oldvalue = procpars[curproc].lvarvals[u];
200: storewhere.how = LV;
201: }
202: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.