Annotation of 40BSD/cmd/adb/command.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  *
                      4:  *     UNIX debugger
                      5:  *
                      6:  */
                      7: 
                      8: #include "defs.h"
                      9: static char sccsid[] = "%Z%%M% %I% %G%";
                     10: 
                     11: MSG            BADEQ;
                     12: MSG            NOMATCH;
                     13: MSG            BADVAR;
                     14: MSG            BADCOM;
                     15: 
                     16: MAP            txtmap;
                     17: MAP            datmap;
                     18: INT            executing;
                     19: CHAR           *lp;
                     20: INT            fcor;
                     21: INT            fsym;
                     22: INT            mkfault;
                     23: STRING         errflg;
                     24: 
                     25: CHAR           lastc;
                     26: CHAR           eqformat[128] = "z";
                     27: CHAR           stformat[128] = "X\"= \"^i";
                     28: 
                     29: L_INT          dot;
                     30: L_INT          ditto;
                     31: INT            dotinc;
                     32: INT            lastcom = '=';
                     33: L_INT          var[];
                     34: L_INT          locval;
                     35: L_INT          locmsk;
                     36: INT            pid;
                     37: L_INT          expv;
                     38: L_INT          adrval;
                     39: INT            adrflg;
                     40: L_INT          cntval;
                     41: INT            cntflg;
                     42: 
                     43: 
                     44: 
                     45: 
                     46: /* command decoding */
                     47: 
                     48: command(buf,defcom)
                     49: STRING         buf;
                     50: CHAR           defcom;
                     51: {
                     52:        INT             itype, ptype, modifier, regptr;
                     53:        BOOL            longpr, eqcom;
                     54:        CHAR            wformat[1];
                     55:        CHAR            savc;
                     56:        L_INT           w, savdot;
                     57:        STRING          savlp=lp;
                     58:        IF buf
                     59:        THEN IF *buf==EOR
                     60:             THEN return(FALSE);
                     61:             ELSE lp=buf;
                     62:             FI
                     63:        FI
                     64: 
                     65:        REP
                     66:        IF adrflg=expr(0)
                     67:        THEN dot=expv; ditto=dot;
                     68:        FI
                     69:        adrval=dot;
                     70:        IF rdc()==',' ANDF expr(0)
                     71:        THEN cntflg=TRUE; cntval=expv;
                     72:        ELSE cntflg=FALSE; cntval=1; lp--;
                     73:        FI
                     74: 
                     75:        IF !eol(rdc())
                     76:        THEN lastcom=lastc;
                     77:        ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
                     78:             lp--; lastcom=defcom;
                     79:        FI
                     80: 
                     81:        switch(lastcom&STRIP) {
                     82: 
                     83:            case '/':
                     84:                itype=DSP; ptype=DSYM;
                     85:                goto trystar;
                     86: 
                     87:            case '=':
                     88:                itype=NSP; ptype=0;
                     89:                goto trypr;
                     90: 
                     91:            case '?':
                     92:                itype=ISP; ptype=ISYM;
                     93:                goto trystar;
                     94: 
                     95:            trystar:
                     96:                IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
                     97:                IF lastcom&QUOTE
                     98:                THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
                     99:                FI
                    100: 
                    101:            trypr:
                    102:                longpr=FALSE; eqcom=lastcom=='=';
                    103:                switch (rdc()) {
                    104: 
                    105:                        case 'm':
                    106:                            {/*reset map data*/
                    107:                            INT         fcount;
                    108:                            MAP         *smap;
                    109:                            UNION{MAP *m; L_INT *mp;}amap;
                    110: 
                    111:                            IF eqcom THEN error(BADEQ); FI
                    112:                            smap=(itype&DSP?&datmap:&txtmap);
                    113:                            amap.m=smap; fcount=3;
                    114:                            IF itype&STAR
                    115:                            THEN amap.mp += 3;
                    116:                            FI
                    117:                            WHILE fcount-- ANDF expr(0)
                    118:                            DO *(amap.mp)++ = expv; OD
                    119:                            IF rdc()=='?' THEN smap->ufd=fsym;
                    120:                            ELIF lastc == '/' THEN smap->ufd=fcor;
                    121:                            ELSE lp--;
                    122:                            FI
                    123:                            }
                    124:                            break;
                    125: 
                    126:                        case 'L':
                    127:                            longpr=TRUE;
                    128:                        case 'l':
                    129:                            /*search for exp*/
                    130:                            IF eqcom THEN error(BADEQ); FI
                    131:                            dotinc=(longpr?4:2); savdot=dot;
                    132:                            expr(1); locval=expv;
                    133:                            IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
                    134:                                IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
                    135:                            LOOP w=get(dot,itype);
                    136:                                 IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
                    137:                                 dot=inkdot(dotinc);
                    138:                            POOL
                    139:                            IF errflg
                    140:                            THEN dot=savdot; errflg=NOMATCH;
                    141:                            FI
                    142:                            psymoff(dot,ptype,"");
                    143:                            break;
                    144: 
                    145:                        case 'W':
                    146:                            longpr=TRUE;
                    147:                        case 'w':
                    148:                            IF eqcom THEN error(BADEQ); FI
                    149:                            wformat[0]=lastc; expr(1);
                    150:                            REP  savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
                    151:                                 errflg=0; dot=savdot;
                    152:                                 IF longpr
                    153:                                 THEN put(dot,itype,expv);
                    154:                                 ELSE put(dot,itype,itol(get(dot+2,itype),expv));
                    155:                                 FI
                    156:                                 savdot=dot;
                    157:                                 printf("=%8t"); exform(1,wformat,itype,ptype);
                    158:                                 newline();
                    159:                            PER  expr(0) ANDF errflg==0 DONE
                    160:                            dot=savdot;
                    161:                            chkerr();
                    162:                            break;
                    163: 
                    164:                        default:
                    165:                            lp--;
                    166:                            getformat(eqcom ? eqformat : stformat);
                    167:                            IF !eqcom
                    168:                            THEN psymoff(dot,ptype,":%16t");
                    169:                            FI
                    170:                            scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
                    171:                }
                    172:                break;
                    173: 
                    174:            case '>':
                    175:                lastcom=0; savc=rdc();
                    176:                IF regptr=getreg(savc)
                    177:                THEN * (ADDR *) (((ADDR)&u)+regptr)=dot;
                    178:                     ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr));
                    179:                ELIF (modifier=varchk(savc)) != -1
                    180:                THEN    var[modifier]=dot;
                    181:                ELSE    error(BADVAR);
                    182:                FI
                    183:                break;
                    184: 
                    185:            case '!':
                    186:                lastcom=0;
                    187:                shell(); break;
                    188: 
                    189:            case '$':
                    190:                lastcom=0;
                    191:                printtrace(nextchar()); break;
                    192: 
                    193:            case ':':
                    194:                IF !executing
                    195:                THEN executing=TRUE;
                    196:                     subpcs(nextchar());
                    197:                     executing=FALSE;
                    198:                     lastcom=0;
                    199:                FI
                    200:                break;
                    201: 
                    202:            case 0:
                    203:                prints(DBNAME);
                    204:                break;
                    205: 
                    206:            default: error(BADCOM);
                    207:        }
                    208: 
                    209:        flushbuf();
                    210:        PER rdc()==';' DONE
                    211:        IF buf THEN lp=savlp; ELSE lp--; FI
                    212:        return(adrflg ANDF dot!=0);
                    213: }
                    214: 

unix.superglobalmegacorp.com

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