Annotation of researchv10no/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 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: }

unix.superglobalmegacorp.com

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