Annotation of researchv8dc/cmd/trace/trace.expr.c, revision 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.