Annotation of coherent/b/bin/db_400/trace5.c, revision 1.1.1.1

1.1       root        1: /* $Header: /src386/bin/db/RCS/trace5.c,v 1.1 92/06/10 14:37:04 bin Exp Locker: bin $
                      2:  *
                      3:  *     The information contained herein is a trade secret of Mark Williams
                      4:  *     Company, and  is confidential information.  It is provided  under a
                      5:  *     license agreement,  and may be  copied or disclosed  only under the
                      6:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
                      7:  *     material without the express written authorization of Mark Williams
                      8:  *     Company or persuant to the license agreement is unlawful.
                      9:  *
                     10:  *     COHERENT Version 2.3.35
                     11:  *     Copyright (c) 1982, 1983, 1984.
                     12:  *     An unpublished work by Mark Williams Company, Chicago.
                     13:  *     All rights reserved.
                     14:  */
                     15: /*
                     16:  * A debugger.
                     17:  * Expression evaluator.
                     18:  *
                     19:  * $Log:       trace5.c,v $
                     20:  * Revision 1.1  92/06/10  14:37:04  bin
                     21:  * Initial revision
                     22:  * 
                     23:  * Revision 1.1        88/10/17  04:05:45      src
                     24:  * Initial revision
                     25:  * 
                     26:  * Revision: 386 version 92/05/01 
                     27:  * Bernard Wald, Wald Software Consulting, Germany
                     28:  *
                     29:  */
                     30: #include <stdio.h>
                     31: #include <ctype.h>
                     32: #include <l.out.h>
                     33: #include "trace.h"
                     34: 
                     35: #define        VALUE   (-2)            /* must be distinct from chars */
                     36: #define        VILLEGAL (-3)           /* ditto */
                     37: #define        PRCFULL (0<<8)          /* precedence wall for full expression */
                     38: #define        PRECADD (1<<8)          /* precedence of addops */
                     39: #define        PRECMUL (2<<8)          /* precedence of mulops */
                     40: #define        PRIMARY (4<<8)          /* precedence of primary expression */
                     41: #define        tk_preced(op)   ((op)&(~0<<8))
                     42: #define        tk_char(op)     ((op)&0377)
                     43: 
                     44: /*
                     45:  * Evaluate an expression list.
                     46:  */
                     47: int
                     48: explist(vlist)
                     49: VAL vlist[VALSIZE];
                     50: {
                     51:        register VAL *vp;
                     52:        register int c, n;
                     53: 
                     54:        vp = vlist;
                     55:        n = VALSIZE;
                     56:        do {
                     57:                if (expressn(vp, PRCFULL)<0)
                     58:                        return (0);
                     59:                vp++;
                     60:                --n;
                     61:        } while ((c=getn()) == ',');
                     62:        ungetn(c);
                     63:        while (n--)
                     64:                vp++->v_flag = VNULL;
                     65:        return (1);
                     66: }
                     67: 
                     68: /*
                     69:  * Recursive expression reader;
                     70:  * returns -1 for error, 0 for null expr, 1 for good expr.
                     71:  */
                     72: int
                     73: expressn(left, wall)
                     74: register VAL   *left;
                     75: int    wall;
                     76: {
                     77:        VAL     v;
                     78:        register VAL    *right = &v;
                     79:        int     token, result;
                     80: 
                     81:        token = lextoken(left);
                     82:        if (token==VALUE)
                     83:                ;
                     84:        else if (token==VILLEGAL)
                     85:                return (-1);
                     86:        else switch (tk_char(token)) {
                     87:        case '~':
                     88:                if (expressn(left, PRIMARY)<=0)
                     89:                        return (-1);
                     90:                left->v_nval = ~left->v_nval;
                     91:                break;
                     92:        case '-':
                     93:                if (expressn(left, PRIMARY)<=0)
                     94:                        return (-1);
                     95:                left->v_nval = -left->v_nval;
                     96:                break;
                     97:        case '*':
                     98:                if (expressn(left, PRIMARY)<=0)
                     99:                        return (-1);
                    100:                add = left->v_nval;
                    101:                getb(left->v_flag&VLVAL ? left->v_segn : 0,
                    102:                        &result, sizeof result);
                    103:                left->v_nval = (long)(unsigned int)result;
                    104:                left->v_flag = VLVAL;
                    105:                left->v_segn = 0;
                    106:                break;
                    107:        case '(':
                    108:                if (expressn(left, PRCFULL)<=0)
                    109:                        return (-1);
                    110:                if ((token=lextoken(NULL))==')')
                    111:                        break;
                    112:                else {
                    113:                        unlex(token);
                    114:                        printe("Missing ')'");
                    115:                        return (-1);
                    116:                }
                    117:        default:
                    118:                unlex(token);
                    119:                left->v_flag = VNULL;
                    120:                return (0);
                    121:        }
                    122:        for (;;) {
                    123:                token = lextoken(NULL);
                    124:                if (tk_preced(token) <= wall) {
                    125:                        unlex(token);
                    126:                        return (1);
                    127:                } else switch (tk_char(token)) {
                    128:                case '*':
                    129:                        if ((result=expressn(right, PRECMUL))<=0)
                    130:                                break;
                    131:                        left->v_nval *= right->v_nval;
                    132:                        continue;
                    133:                case '/':
                    134:                        if ((result=expressn(right, PRECMUL))<=0)
                    135:                                break;
                    136:                        left->v_nval /= right->v_nval;
                    137:                        continue;
                    138:                case '+':
                    139:                        if ((result=expressn(right, PRECADD))<=0)
                    140:                                break;
                    141:                        left->v_nval += right->v_nval;
                    142:                        continue;
                    143:                case '-':
                    144:                        if ((result=expressn(right, PRECADD))<=0)
                    145:                                break;
                    146:                        left->v_nval -= right->v_nval;
                    147:                        continue;
                    148:                default:
                    149:                        unlex(token);
                    150:                        printe("Unimplemented operator");
                    151:                        return (-1);
                    152:                }
                    153:                if (result==0)
                    154:                        printe("Missing operand");
                    155:                return (-1);
                    156:        }
                    157: }
                    158: 
                    159: /*
                    160:  * Lex a token. If value, store in given val ptr.
                    161:  */
                    162: int
                    163: lextoken(vp)
                    164: VAL    *vp;
                    165: {
                    166:        register int    c;
                    167: 
                    168:        for (;;) switch (c=getn()) {
                    169:        case ' ':
                    170:        case '\t':
                    171:                continue;
                    172:        case '.':
                    173:                if (vp==NULL) {
                    174:                        printe("Missing opr before '.'");
                    175:                        ungetn(c);
                    176:                        return (VILLEGAL);
                    177:                }
                    178:                vp->v_flag = VLVAL;
                    179:                vp->v_segn = cseg;
                    180:                vp->v_nval = dot;
                    181:                return (VALUE);
                    182:                /*
                    183:                 * only binary ops need be mentioned explicitly
                    184:                 * so precedences can be added
                    185:                 */
                    186:        case '*':
                    187:        case '/':
                    188:                return (c|PRECMUL);
                    189:        case '+':
                    190:        case '-':
                    191:                return (c|PRECADD);
                    192:        default:
                    193:                if ('0'<=c && c<='9')
                    194:                        return (readval(vp, c));
                    195:                else if ('a'<=c && c<='z' || 'A'<=c && c<='Z' || c=='_')
                    196:                        return (readvar(vp, c));
                    197:                else
                    198:                        return (c);
                    199:        }
                    200: }
                    201: /*
                    202:  * Push token back on input stream
                    203:  */
                    204: unlex(c)
                    205: int    c;
                    206: {
                    207:        if (c!=VILLEGAL && c!=VALUE)
                    208:                ungetn(tk_char(c));
                    209: }
                    210: 
                    211: /*
                    212:  * Read a number.
                    213:  */
                    214: readval(vp, c)
                    215: VAL    *vp;
                    216: register int   c;
                    217: {
                    218:        long    l;
                    219:        register int    i, base;
                    220: 
                    221:        if (vp==NULL) {
                    222:                printe("Missing opr before number");
                    223:                ungetn(c);
                    224:                return (VILLEGAL);
                    225:        }
                    226:        base = 10;
                    227:        if (c=='0') {
                    228:                base = 8;
                    229:                if ((c=getn())=='x') {
                    230:                        base = 16;
                    231:                } else {
                    232:                        ungetn(c);
                    233:                }
                    234:                c = '0';
                    235:        }
                    236:        if (c == '#')
                    237:                base = 16;
                    238:        else
                    239:                l = '0' - c;
                    240:        for (;;) {
                    241:                if ((10<=(i=(c=getn())-('a'-10))
                    242:                  || 10<=(i=c-('A'-10))
                    243:                  ||  0<=(i=c-'0') && i<=9
                    244:                 )&& i<base)
                    245:                        l = l*base - i;
                    246:                else
                    247:                        break;
                    248:        }
                    249:        ungetn(c);
                    250:        vp->v_flag = 0;
                    251:        vp->v_nval = -l;
                    252:        return (VALUE);
                    253: }
                    254: 
                    255: /*
                    256:  * Read symbol and place value in given val struct
                    257:  */
                    258: readvar(vp, c)
                    259: VAL    *vp;
                    260: {
                    261:        ungetn(c);
                    262:        if (vp==NULL) {
                    263:                printe("Missing opr before symbol");
                    264:                return (VILLEGAL);
                    265:        }
                    266:        return (getsval(vp) ? VALUE : VILLEGAL);
                    267: }
                    268: 
                    269: /*
                    270:  * Given a value, return it's segment.  If there is no segment associated
                    271:  * with it, return `v'.
                    272:  */
                    273: vsegno(vp, v)
                    274: register VAL *vp;
                    275: {
                    276:        if ((vp->v_flag&VLVAL) == 0)
                    277:                return (v);
                    278:        return (vp->v_segn);
                    279: }
                    280: 
                    281: /*
                    282:  * Evaluate a value as an lvalue and return it.  If the value is
                    283:  * null, return `v'.
                    284:  */
                    285: long
                    286: lvalue(vp, v)
                    287: register VAL *vp;
                    288: long v;
                    289: {
                    290:        if (vp->v_flag&VNULL)
                    291:                return (v);
                    292:        return (vp->v_nval);
                    293: }
                    294: 
                    295: /*
                    296:  * Evaluate a value as an rvalue and return it.  If the value is
                    297:  * null, return `v'.
                    298:  */
                    299: long
                    300: rvalue(vp, v)
                    301: register VAL *vp;
                    302: long v;
                    303: {
                    304:        if (vp->v_flag&VNULL)
                    305:                return (v);
                    306:        return (vp->v_nval);
                    307: }
                    308: 
                    309: /*
                    310:  * If the given value is null, return 1, else 0.
                    311:  */
                    312: nvalue(vp)
                    313: VAL *vp;
                    314: {
                    315:        return (vp->v_flag&VNULL);
                    316: }

unix.superglobalmegacorp.com

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