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