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