Annotation of 43BSD/bin/adb/command.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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