Annotation of cci/usr/src/bin/adb/command.c, revision 1.1.1.2

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