Annotation of coherent/a/usr/bob/korn/expr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Korn expression evaluation
                      3:  */
                      4: 
                      5: static char *RCSid = "$Header: expr.c,v 3.1 88/11/03 09:15:55 egisin Exp $";
                      6: 
                      7: #include <stddef.h>
                      8: #include <errno.h>
                      9: #include <setjmp.h>
                     10: #include "sh.h"
                     11: #include "table.h"
                     12: 
                     13: #define        ef      else if         /* fashion statement */
                     14: 
                     15: #define        VAR     0x01
                     16: #define        LIT     0x02
                     17: #define        LEQ     0x03
                     18: #define        LNE     0x04
                     19: #define        LLE     0x05
                     20: #define        LGE     0x06
                     21: 
                     22: static void token();           /* read next token */
                     23: static Const char *expression; /* expression being evaluated */
                     24: static Const char *tokp;       /* lexical position */
                     25: static int tok;                        /* token from token() */
                     26: static struct tbl *val;                /* value from token() */
                     27: 
                     28: static struct tbl *tempvar(), *intvar();
                     29: static struct tbl *asn(), *e6(), *e5(), *e3(), *e2(), *e0();
                     30: 
                     31: /*
                     32:  * parse and evalute expression
                     33:  */
                     34: void
                     35: evalerr(err)
                     36:        char *err;
                     37: {
                     38:        errorf("%s: %s\n", expression, err);
                     39: }
                     40: 
                     41: long
                     42: evaluate(expr)
                     43:        Const char *expr;
                     44: {
                     45:        struct tbl *v;
                     46: 
                     47:        expression = tokp = expr;
                     48:        token();
                     49:        v = intvar(asn());
                     50:        if (!(tok == 0))
                     51:                evalerr("bad expression");
                     52:        return v->val.i;
                     53: }
                     54: 
                     55: static struct tbl *
                     56: asn()
                     57: {
                     58:        register struct tbl *vl, *vr;
                     59: 
                     60:        vr = vl = e6();
                     61:        if ((tok == '=')) {
                     62:                Area * olastarea = lastarea;
                     63:                token();
                     64:                if ((vl->flag&RDONLY)) /* assign to rvalue */
                     65:                        evalerr("bad assignment");
                     66:                vr = intvar(asn());
                     67:                lastarea = olastarea;
                     68:                setint(vl, vr->val.i);
                     69:                if ((vl->flag&INTEGER) && vl->type == 0) /* default base? */
                     70:                        vl->type = vr->type;
                     71:        }
                     72:        return vr;
                     73: }
                     74: 
                     75: static struct tbl *
                     76: e6()
                     77: {
                     78:        register struct tbl *vl, *vr;
                     79: 
                     80:        vl = e5();
                     81:        while ((tok == LEQ) || (tok == LNE)) {
                     82:                int op = tok;
                     83:                token();
                     84:                vl = intvar(vl);
                     85:                vr = intvar(e5());
                     86:                vl->val.i = vl->val.i == vr->val.i;
                     87:                if (op == LNE)
                     88:                        vl->val.i = ! vl->val.i;
                     89:        }
                     90:        return vl;
                     91: }
                     92: 
                     93: static struct tbl *
                     94: e5()
                     95: {
                     96:        register struct tbl *vl, *vr;
                     97: 
                     98:        vl = e3();
                     99:        while ((tok == LLE) || (tok == '<') || (tok == '>') || (tok == LGE)) {
                    100:                int op = tok;
                    101:                token();
                    102:                vl = intvar(vl);
                    103:                vr = intvar(e3());
                    104:                if (op == LLE)
                    105:                        vl->val.i = vl->val.i <= vr->val.i;
                    106:                ef (op == '<')
                    107:                        vl->val.i = vl->val.i < vr->val.i;
                    108:                ef (op == LGE)
                    109:                        vl->val.i = vl->val.i >= vr->val.i;
                    110:                ef (op == '>')
                    111:                        vl->val.i = vl->val.i > vr->val.i;
                    112:        }
                    113:        return vl;
                    114: }
                    115: 
                    116: static struct tbl *
                    117: e3()
                    118: {
                    119:        register struct tbl *vl, *vr;
                    120: 
                    121:        vl = e2();
                    122:        while ((tok == '+') || (tok == '-')) {
                    123:                int op = tok;
                    124:                token();
                    125:                vl = intvar(vl);
                    126:                vr = intvar(e2());
                    127:                if (op == '+')
                    128:                        vl->val.i += vr->val.i;
                    129:                ef (op == '-')
                    130:                        vl->val.i -= vr->val.i;
                    131:        }
                    132:        return vl;
                    133: }
                    134: 
                    135: static struct tbl *
                    136: e2()
                    137: {
                    138:        register struct tbl *vl, *vr;
                    139: 
                    140:        vl = e0();
                    141:        while ((tok == '*') || (tok == '/') || (tok == '%')) {
                    142:                int op = tok;
                    143:                token();
                    144:                vl = intvar(vl);
                    145:                vr = intvar(e0());
                    146:                if (op != '*' && vr->val.i == 0)
                    147:                        evalerr("zero divisor");
                    148:                if (op == '*')
                    149:                        vl->val.i *= vr->val.i;
                    150:                ef (op == '/')
                    151:                        vl->val.i /= vr->val.i;
                    152:                ef (op == '%')
                    153:                        vl->val.i %= vr->val.i;
                    154:        }
                    155:        return vl;
                    156: }
                    157: 
                    158: static struct tbl *
                    159: e0()
                    160: {
                    161:        register struct tbl *v;
                    162: 
                    163:        if ((tok == '!') || (tok == '-')) {
                    164:                int op = tok;
                    165:                token();
                    166:                v = intvar(e0());
                    167:                if (op == '!')
                    168:                        v->val.i = !v->val.i;
                    169:                ef (op == '-')
                    170:                        v->val.i = -v->val.i;
                    171:        } else
                    172:        if ((tok == '(')) {
                    173:                token();
                    174:                v = asn();
                    175:                if (!(tok == ')'))
                    176:                        evalerr("missing )");
                    177:                token();
                    178:        } else
                    179:        if ((tok == VAR) || (tok == LIT)) {
                    180:                v = val;
                    181:                token();
                    182:        } else
                    183:                evalerr("bad expression");
                    184:        return v;
                    185: }
                    186: 
                    187: static void
                    188: token()
                    189: {
                    190:        register char *cp = (char *) tokp;
                    191:        register int c, c2;
                    192: 
                    193:        /* skip white space */
                    194:        do c = *cp++;   while (c != '\0' && (c == ' ' || c == '\t'));
                    195:        tokp = cp-1;
                    196: 
                    197:        if (letter(c)) {
                    198:                for (; letnum(c); c = *cp++)
                    199:                        ;
                    200:                c = *--cp;
                    201:                *cp = 0;
                    202:                val = global(tokp);
                    203:                *cp = c;
                    204:                tok = VAR;
                    205:        } else
                    206:        if (digit(c)) {
                    207:                for (; letnum(c) || c == '#'; c = *cp++)
                    208:                        ;
                    209:                c = *--cp;
                    210:                *cp = 0;
                    211:                val = tempvar();
                    212:                setstr(val, tokp);
                    213:                val->flag |= RDONLY;
                    214:                *cp = c;
                    215:                tok = LIT;
                    216:        } else {
                    217:                c2 = *cp++;
                    218:                if (c == '=' && c2 == '=')
                    219:                        c = LEQ;
                    220:                ef (c == '!' && c2 == '=')
                    221:                        c = LNE;
                    222:                ef (c == '<' && c2 == '=')
                    223:                                c = LLE;
                    224:                ef (c == '>' && c2 == '=')
                    225:                                c = LGE;
                    226:                else
                    227:                        cp--;
                    228:                tok = c;
                    229:        }
                    230:        tokp = cp;
                    231: }
                    232: 
                    233: static struct tbl *
                    234: tempvar()
                    235: {
                    236:        register struct tbl *vp;
                    237: 
                    238:        vp = alloc(sizeof(struct tbl), ATEMP);
                    239:        lastarea = ATEMP;
                    240:        vp->flag = ISSET|INTEGER;
                    241:        vp->type = 0;
                    242:        vp->name[0] = '\0';
                    243:        return vp;
                    244: }
                    245: 
                    246: /* cast (string) variable to temporary integer variable */
                    247: static struct tbl *
                    248: intvar(vp)
                    249:        register struct tbl *vp;
                    250: {
                    251:        register struct tbl *vq;
                    252: 
                    253:        vq = tempvar();
                    254:        vq->type = 10;
                    255:        return strint(vq, vp);
                    256: }
                    257: 

unix.superglobalmegacorp.com

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