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