Annotation of researchv8dc/cmd/trace/trace.expr.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.