Annotation of researchv10no/cmd/adb/comm/expr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *
                      3:  *     UNIX debugger
                      4:  *
                      5:  */
                      6: 
                      7: #include "defs.h"
                      8: #include "regs.h"
                      9: #include "sym.h"
                     10: #include "space.h"
                     11: 
                     12: WORD   var[NVARS];
                     13: 
                     14: extern int     radix;
                     15: 
                     16: extern char    lastc, peekc;
                     17: 
                     18: extern ADDR    ditto;
                     19: extern int     ditsp;
                     20: extern int     dotsp;
                     21: WORD   expv;
                     22: int    expsp;
                     23: 
                     24: WORD
                     25: defval(w)
                     26: WORD w;
                     27: {
                     28:        if (expr(0))
                     29:                return (expv);
                     30:        else
                     31:                return (w);
                     32: }
                     33: 
                     34: expr(a)
                     35: register int a;
                     36: {      /* term | term dyadic expr |  */
                     37:        register int    rc;
                     38:        register WORD   lhs;
                     39: 
                     40:        rdc();
                     41:        reread();
                     42:        expsp = NOSP;
                     43:        rc=term(a);
                     44:        while (rc) {
                     45:                lhs = expv;
                     46:                switch ((int)readchar()) {
                     47: 
                     48:                case '+':
                     49:                        term(a|1);
                     50:                        expv += lhs;
                     51:                        break;
                     52: 
                     53:                case '-':
                     54:                        term(a|1);
                     55:                        expv = lhs - expv;
                     56:                        break;
                     57: 
                     58:                case '#':
                     59:                        term(a|1);
                     60:                        expv = round(lhs,expv);
                     61:                        break;
                     62: 
                     63:                case '*':
                     64:                        term(a|1);
                     65:                        expv *= lhs;
                     66:                        break;
                     67: 
                     68:                case '%':
                     69:                        term(a|1);
                     70:                        expv = lhs/expv;
                     71:                        break;
                     72: 
                     73:                case '&':
                     74:                        term(a|1);
                     75:                        expv &= lhs;
                     76:                        break;
                     77: 
                     78:                case '|':
                     79:                        term(a|1);
                     80:                        expv |= lhs;
                     81:                        break;
                     82: 
                     83:                case ')':
                     84:                        if ((a&2)==0)
                     85:                                error("unexpected `)'");
                     86: 
                     87:                default:
                     88:                        reread();
                     89:                        return(rc);
                     90:                }
                     91:        }
                     92:        return(rc);
                     93: }
                     94: 
                     95: term(a)
                     96: register int a;
                     97: {      /* item | monadic item | (expr) | */
                     98: 
                     99:        switch ((int)readchar()) {
                    100: 
                    101:        case '*':
                    102:                term(a|1);
                    103:                expv=atow(aget((ADDR)expv, CORF|DATASP));
                    104:                expsp = NOSP;
                    105:                chkerr();
                    106:                return(1);
                    107: 
                    108:        case '@':
                    109:                term(a|1);
                    110:                expv=atow(aget((ADDR)expv, SYMF|INSTSP));
                    111:                expsp = NOSP;
                    112:                return(1);
                    113: 
                    114:        case '-':
                    115:                term(a|1);
                    116:                expv = -expv;
                    117:                return(1);
                    118: 
                    119:        case '~':
                    120:                term(a|1);
                    121:                expv = ~expv;
                    122:                return(1);
                    123: 
                    124:        case '(':
                    125:                expr(2);
                    126:                if (readchar()!=')')
                    127:                        error("syntax error: `)' expected");
                    128:                return(1);
                    129: 
                    130:        case '%':
                    131:                term(a|1);
                    132:                expsp = REGSP;
                    133:                return(1);
                    134: 
                    135:        default:
                    136:                reread();
                    137:                return(item(a));
                    138:        }
                    139: }
                    140: 
                    141: item(a)
                    142: register int a;
                    143: {      /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
                    144:        int     base;
                    145:        char    savc;
                    146:        register struct sym *symp;
                    147:        char gsym[MAXSYM], lsym[MAXSYM];
                    148:        WORD ascval();
                    149: 
                    150:        readchar();
                    151:        if (symchar(0)) {       
                    152:                readsym(gsym);
                    153:                if (lastc=='.') {
                    154:                        readchar();     /* ugh */
                    155:                        if (!symchar(0))
                    156:                                localaddr(gsym, (char *)NULL);
                    157:                        else {
                    158:                                readsym(lsym);
                    159:                                localaddr(gsym, lsym);
                    160:                        }
                    161:                }
                    162:                else {
                    163:                        if ((symp = lookup(gsym)) == NULL)
                    164:                                error("symbol not found");
                    165:                        expv = symp->y_value;
                    166:                }
                    167:                reread();
                    168:        } else if (getnum(readchar)) {
                    169:                ;
                    170:        } else if (lastc=='.') {        
                    171:                readchar();
                    172:                if (!symchar(0)) {
                    173:                        expv = dot;
                    174:                        expsp = dotsp;
                    175:                } else {
                    176:                        readsym(lsym);
                    177:                        localaddr((char *)NULL, lsym);
                    178:                }       
                    179:                reread();
                    180:        } else if (lastc=='"') {
                    181:                expv=ditto;
                    182:                expsp = ditsp;
                    183:        } else if (lastc=='+') {
                    184:                expv=inkdot(dotinc);
                    185:                expsp = ditsp;
                    186:        } else if (lastc=='^') {
                    187:                expv=inkdot(-dotinc);
                    188:                expsp = ditsp;
                    189:        } else if (lastc=='<') {
                    190:                savc=rdc();
                    191:                base = getreg(savc);
                    192:                if (base != BADREG)
                    193:                        expv = rtow(rget(base));
                    194:                else if ((base = varchk(savc)) != -1)
                    195:                        expv = var[base];
                    196:                else
                    197:                        error("bad variable");
                    198:        }
                    199:        else if (lastc=='\'')
                    200:                expv = ascval();
                    201:        else if (a)
                    202:                error("address expected");
                    203:        else {  
                    204:                reread();
                    205:                return(0);
                    206:        }
                    207:        return(1);
                    208: }
                    209: 
                    210: #define        MAXBASE 16
                    211: 
                    212: /* service routines for expression reading */
                    213: getnum(rdf)
                    214: int (*rdf)();
                    215: {
                    216:        register char *cp;
                    217:        register int base, d;
                    218:        BOOL fpnum;
                    219:        char num[MAXLIN];
                    220:        WORD fpin();
                    221: 
                    222:        base = radix;
                    223:        fpnum = FALSE;
                    224:        if (lastc == '#') {
                    225:                base = 16;
                    226:                (*rdf)();
                    227:        }
                    228:        if (convdig(lastc) >= MAXBASE)
                    229:                return (0);
                    230:        if (lastc == '0')
                    231:                switch ((*rdf)()) {
                    232:                case 'x':
                    233:                case 'X':
                    234:                        base = 16;
                    235:                        (*rdf)();
                    236:                        break;
                    237: 
                    238:                case 't':
                    239:                case 'T':
                    240:                        base = 10;
                    241:                        (*rdf)();
                    242:                        break;
                    243: 
                    244:                case 'o':
                    245:                case 'O':
                    246:                        base = 8;
                    247:                        (*rdf)();
                    248:                        break;
                    249:                default:
                    250:                        if (base == 0)
                    251:                                base = 8;
                    252:                        break;
                    253:                }
                    254:        if (base == 0)
                    255:                base = 10;
                    256:        expv = 0;
                    257:        for (cp = num, *cp++ = lastc; ;(*rdf)()) {
                    258:                if ((d = convdig(lastc)) < base) {
                    259:                        expv *= base;
                    260:                        expv += d;
                    261:                        *cp++ = lastc;
                    262:                }
                    263:                else if (lastc == '.') {
                    264:                        fpnum = TRUE;
                    265:                        *cp++ = lastc;
                    266:                }
                    267:                else {
                    268:                        reread();
                    269:                        break;
                    270:                }
                    271:        }
                    272:        if (fpnum)
                    273:                expv = fpin(num);
                    274:        return (1);
                    275: }
                    276: 
                    277: readsym(isymbol)
                    278: register char *isymbol;
                    279: {
                    280:        register char   *p;
                    281: 
                    282:        p = isymbol;
                    283:        do {
                    284:                if (p < &isymbol[MAXSYM-1])
                    285:                        *p++ = lastc;
                    286:                readchar();
                    287:        } while (symchar(1));
                    288:        *p = 0;
                    289: }
                    290: 
                    291: convdig(c)
                    292: register char c;
                    293: {
                    294:        if (isdigit(c))
                    295:                return(c-'0');
                    296:        else if (!isxdigit(c))
                    297:                return(MAXBASE);
                    298:        else if (isupper(c))
                    299:                return(c-'A'+10);
                    300:        else
                    301:                return(c-'a'+10);
                    302: }
                    303: 
                    304: symchar(dig)
                    305: {
                    306:        if (lastc=='\\') {
                    307:                readchar();
                    308:                return(TRUE);
                    309:        }
                    310:        return(isalpha(lastc) || lastc=='_' || dig && isdigit(lastc));
                    311: }
                    312: 
                    313: varchk(name)
                    314: {
                    315:        if (isdigit(name))
                    316:                return(name-'0');
                    317:        if (isalpha(name))
                    318:                return((name&037)-1+10);
                    319:        return(-1);
                    320: }

unix.superglobalmegacorp.com

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