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

unix.superglobalmegacorp.com

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