Annotation of 43BSDReno/sys/kdb/kdb_expr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1986 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)kdb_expr.c  7.6 (Berkeley) 5/3/90
                      7:  */
                      8: 
                      9: #include "../kdb/defs.h"
                     10: 
                     11: char   *kdbBADSYM;
                     12: char   *kdbBADVAR;
                     13: char   *kdbBADKET;
                     14: char   *kdbBADSYN;
                     15: char   *kdbNOCFN;
                     16: char   *kdbNOADR;
                     17: char   *kdbBADLOC;
                     18: 
                     19: ADDR   kdblastframe;
                     20: ADDR   kdbsavlastf;
                     21: ADDR   kdbsavframe;
                     22: ADDR   kdbsavpc;
                     23: ADDR   kdbcallpc;
                     24: 
                     25: char   *kdblp;
                     26: int    kdbradix;
                     27: char   kdbisymbol[1024];
                     28: 
                     29: char   kdblastc, kdbpeekc;
                     30: 
                     31: long   kdbditto;
                     32: long   kdbexpv;
                     33: 
                     34: static long
                     35: kdbround(a,b)
                     36:        register long a, b;
                     37: {
                     38:        register long w;
                     39: 
                     40:        w = (a/b)*b;
                     41:        if (a!=w)
                     42:                w += b;
                     43:        return (w);
                     44: }
                     45: 
                     46: /* term | term dyadic expr |  */
                     47: kdbexpr(a)
                     48: {
                     49:        register rc;
                     50:        register long lhs;
                     51: 
                     52:        (void) kdbrdc(); kdblp--; rc=kdbterm(a);
                     53: 
                     54:        while (rc) {
                     55:                lhs = kdbexpv;
                     56:                switch ((int)kdbreadchar()) {
                     57:                case '+':
                     58:                        (void) kdbterm(a|1); kdbexpv += lhs; break;
                     59:                case '-':
                     60:                        (void) kdbterm(a|1); kdbexpv = lhs - kdbexpv; break;
                     61:                case '#':
                     62:                        (void) kdbterm(a|1); kdbexpv = kdbround(lhs,kdbexpv); break;
                     63:                case '*':
                     64:                        (void) kdbterm(a|1); kdbexpv *= lhs; break;
                     65:                case '%':
                     66:                        (void) kdbterm(a|1); kdbexpv = lhs/kdbexpv; break;
                     67:                case '&':
                     68:                        (void) kdbterm(a|1); kdbexpv &= lhs; break;
                     69:                case '|':
                     70:                        (void) kdbterm(a|1); kdbexpv |= lhs; break;
                     71:                case ')':
                     72:                        if ((a&2)==0)
                     73:                                kdberror(kdbBADKET);
                     74:                default:
                     75:                        kdblp--;
                     76:                        return (rc);
                     77:                }
                     78:        }
                     79:        return (rc);
                     80: }
                     81: 
                     82: /* item | monadic item | (expr) | */
                     83: static
                     84: kdbterm(a)
                     85: {
                     86: 
                     87:        switch ((int)kdbreadchar()) {
                     88:        case '*':
                     89:                (void) kdbterm(a|1); kdbexpv=kdbchkget(kdbexpv,DSP);
                     90:                return(1);
                     91:        case '@':
                     92:                (void) kdbterm(a|1); kdbexpv=kdbchkget(kdbexpv,ISP);
                     93:                return(1);
                     94:        case '-':
                     95:                (void) kdbterm(a|1); kdbexpv = -kdbexpv;
                     96:                return(1);
                     97:        case '~':
                     98:                (void) kdbterm(a|1); kdbexpv = ~kdbexpv;
                     99:                return(1);
                    100:        case '#':
                    101:                (void) kdbterm(a|1); kdbexpv = !kdbexpv;
                    102:                return(1);
                    103:        case '(':
                    104:                (void) kdbexpr(2);
                    105:                if (*kdblp!=')')
                    106:                        kdberror(kdbBADSYN);
                    107:                kdblp++;
                    108:                return(1);
                    109:        }
                    110:        kdblp--;
                    111:        return (kdbitem(a));
                    112: }
                    113: 
                    114: /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
                    115: static
                    116: kdbitem(a)
                    117: {
                    118:        register base, d, regptr;
                    119:        char savc;
                    120:        register long frame;
                    121:        register struct nlist *symp;
                    122: 
                    123:        (void) kdbreadchar();
                    124:        if (kdbsymchar(0)) {
                    125:                kdbreadsym();
                    126:                if (kdblastc=='.') {
                    127:                        frame = kdbpcb.pcb_fp; kdblastframe = 0;
                    128:                        kdbcallpc = kdbpcb.pcb_pc;
                    129:                        while (!kdberrflg) {
                    130:                                kdbsavpc = kdbcallpc;
                    131:                                (void) kdbfindsym((long)kdbcallpc,ISYM);
                    132:                                if (kdbeqsym(kdbcursym->n_un.n_name,kdbisymbol,'~'))
                    133:                                        break;
                    134:                                kdbcallpc = getprevpc(frame);
                    135:                                kdblastframe = frame;
                    136:                                frame = getprevframe(frame);
                    137:                                if (frame == NOFRAME)
                    138:                                        kdberror(kdbNOCFN);
                    139:                        }
                    140:                        kdbsavlastf = kdblastframe; kdbsavframe = frame;
                    141:                        (void) kdbreadchar();
                    142:                        if (kdbsymchar(0))
                    143:                                kdbchkloc(kdbexpv=frame);
                    144:                } else if ((symp=kdblookup(kdbisymbol))==0)
                    145:                        kdberror(kdbBADSYM);
                    146:                else
                    147:                        kdbexpv = symp->n_value;
                    148:                kdblp--;
                    149:                return (1);
                    150:        }
                    151:        if (kdbgetnum())
                    152:                return (1);
                    153:        switch (kdblastc) {
                    154:        case '.':
                    155:                (void) kdbreadchar();
                    156:                if (kdbsymchar(0)) {
                    157:                        kdblastframe=kdbsavlastf; kdbcallpc=kdbsavpc;
                    158:                        kdbchkloc((long)kdbsavframe);
                    159:                } else
                    160:                        kdbexpv=kdbdot;
                    161:                kdblp--;
                    162:                break;
                    163:        case '"':
                    164:                kdbexpv=kdbditto;
                    165:                break;
                    166:        case '+':
                    167:                kdbexpv=kdbinkdot(kdbdotinc);
                    168:                break;
                    169:        case '^':
                    170:                kdbexpv=kdbinkdot(-kdbdotinc);
                    171:                break;
                    172:        case '<':
                    173:                savc=kdbrdc();
                    174:                if ((regptr=kdbgetreg(savc)) != -1)
                    175:                        kdbexpv = *(int *)regptr;
                    176:                else if ((base=kdbvarchk(savc)) != -1)
                    177:                        kdbexpv=kdbvar[base];
                    178:                else
                    179:                        kdberror(kdbBADVAR);
                    180:                break;
                    181:        case '\'':
                    182:                d=4; kdbexpv=0;
                    183:                while (kdbquotchar()) {
                    184:                    if (d--) {
                    185:                         kdbexpv <<= 8;
                    186:                         kdbexpv |= kdblastc;
                    187:                    } else
                    188:                        kdberror(kdbBADSYN);
                    189:                }
                    190:                break;
                    191:        default:
                    192:                if (a)
                    193:                        kdberror(kdbNOADR);
                    194:                kdblp--;
                    195:                return(0);
                    196:        }
                    197:        return (1);
                    198: }
                    199: 
                    200: /* service routines for expression reading */
                    201: static
                    202: kdbgetnum()
                    203: {
                    204:        register base,d,frpt;
                    205: 
                    206:        if (!isdigit(kdblastc))
                    207:                return (0);
                    208:        if ((base = kdbradix) < 0)
                    209:                base = -base;
                    210:        kdbexpv = 0;
                    211:        while (base>10 ? isxdigit(kdblastc) : isdigit(kdblastc)) {
                    212:                register m = MAXINT/base;
                    213: 
                    214:                if (kdbexpv>m)          /* avoid overflow */
                    215:                        kdbexpv = (kdbexpv-m)*base+m*base;
                    216:                else
                    217:                        kdbexpv *= base;
                    218:                if ((d=kdbconvdig(kdblastc))>=base || d<0)
                    219:                        kdberror(kdbBADSYN);
                    220:                kdbexpv += d; (void) kdbreadchar();
                    221:                if (kdbexpv==0) {
                    222:                        if (kdblastc=='x' || kdblastc=='X') {
                    223:                                 base=16; (void) kdbreadchar();
                    224:                        } else if (kdblastc=='t' || kdblastc=='T') {
                    225:                                 base=10; (void) kdbreadchar();
                    226:                        } else if (kdblastc=='o' || kdblastc=='O') {
                    227:                                 base=8; (void) kdbreadchar();
                    228:                        }
                    229:                }
                    230:        }
                    231:        if (kdblastc=='.' && (base==10 || kdbexpv==0)) {
                    232:                frpt=0; base=10;
                    233:                while (isdigit(kdbreadchar())) {
                    234:                        if (frpt)
                    235:                                continue;
                    236:                        frpt++;
                    237:                        if (kdblastc - '0' >= 5)
                    238:                                kdbexpv++;
                    239:                }
                    240:        }
                    241:        kdbpeekc=kdblastc;
                    242:        return (1);
                    243: }
                    244: 
                    245: static
                    246: kdbreadsym()
                    247: {
                    248:        register char *p;
                    249: 
                    250:        p = kdbisymbol;
                    251:        do {
                    252:                if (p < &kdbisymbol[sizeof(kdbisymbol)-1])
                    253:                        *p++ = kdblastc;
                    254:                (void) kdbreadchar();
                    255:        } while (kdbsymchar(1));
                    256:        *p++ = 0;
                    257: }
                    258: 
                    259: static
                    260: kdbconvdig(c)
                    261:        char c;
                    262: {
                    263:        if (isdigit(c))
                    264:                return (c-'0');
                    265:        if (isxdigit(c))
                    266:                return (c-'a'+10);
                    267:        return (-1);
                    268: }
                    269: 
                    270: static
                    271: kdbsymchar(dig)
                    272: {
                    273: 
                    274:        if (kdblastc=='\\') {
                    275:                (void) kdbreadchar();
                    276:                return (1);
                    277:        }
                    278:        return (isalpha(kdblastc) || kdblastc=='_' || dig && isdigit(kdblastc));
                    279: }
                    280: 
                    281: kdbvarchk(name)
                    282:        register name;
                    283: {
                    284:        if (isdigit(name))
                    285:                return (name-'0');
                    286:        if (isalpha(name))
                    287:                return ((name&037)-1+10);
                    288:        return (-1);
                    289: }
                    290: 
                    291: static
                    292: kdbchkloc(frame)
                    293:        long frame;
                    294: {
                    295: 
                    296:        kdbreadsym();
                    297:        do {
                    298:                if (kdblocalsym(frame)==0)
                    299:                        kdberror(kdbBADLOC);
                    300:                kdbexpv=kdblocalval;
                    301:        } while (!kdbeqsym(kdbcursym->n_un.n_name,kdbisymbol,'~'));
                    302: }
                    303: 
                    304: kdbeqsym(s1, s2, c)
                    305:        register char *s1, *s2;
                    306: {
                    307: 
                    308:        if (kdbstreq(s1,s2))
                    309:                return (1);
                    310:        if (*s1 == c && kdbstreq(s1+1, s2))
                    311:                return (1);
                    312:        return (0);
                    313: }
                    314: 
                    315: static
                    316: kdbstreq(s1, s2)
                    317:        char *s1, *s2;
                    318: {
                    319: 
                    320:        while (*s1 == *s2++)
                    321:                if (*s1++ == '\0')
                    322:                        return (1);
                    323:        return (0);
                    324: }

unix.superglobalmegacorp.com

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