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