13754Sroot # 23754Sroot /* 33754Sroot * 43754Sroot * UNIX debugger 53754Sroot * 63754Sroot */ 73754Sroot 83754Sroot #include "defs.h" 9*6416Sroot static char sccsid[] = "@(#)command.c 4.4 04/01/82"; 103754Sroot 113754Sroot MSG BADEQ; 123754Sroot MSG NOMATCH; 133754Sroot MSG BADVAR; 143754Sroot MSG BADCOM; 153754Sroot 163754Sroot MAP txtmap; 173754Sroot MAP datmap; 183754Sroot INT executing; 193754Sroot CHAR *lp; 203754Sroot INT fcor; 213754Sroot INT fsym; 223754Sroot INT mkfault; 233754Sroot STRING errflg; 243754Sroot 253754Sroot CHAR lastc; 263754Sroot CHAR eqformat[512] = "z"; 273754Sroot CHAR stformat[512] = "X\"= \"^i"; 283754Sroot 293754Sroot L_INT dot; 303754Sroot L_INT ditto; 313754Sroot INT dotinc; 323754Sroot INT lastcom = '='; 333754Sroot L_INT var[]; 343754Sroot L_INT locval; 353754Sroot L_INT locmsk; 363754Sroot INT pid; 373754Sroot L_INT expv; 383754Sroot L_INT adrval; 393754Sroot INT adrflg; 403754Sroot L_INT cntval; 413754Sroot INT cntflg; 423754Sroot 433754Sroot 443754Sroot 453754Sroot 463754Sroot /* command decoding */ 473754Sroot 483754Sroot command(buf,defcom) 493754Sroot STRING buf; 503754Sroot CHAR defcom; 513754Sroot { 523754Sroot INT itype, ptype, modifier, regptr; 533754Sroot BOOL longpr, eqcom; 543754Sroot CHAR wformat[1]; 553754Sroot CHAR savc; 563754Sroot L_INT w, savdot; 573754Sroot STRING savlp=lp; 583754Sroot IF buf 593754Sroot THEN IF *buf==EOR 603754Sroot THEN return(FALSE); 613754Sroot ELSE lp=buf; 623754Sroot FI 633754Sroot FI 643754Sroot 653754Sroot REP 663754Sroot IF adrflg=expr(0) 673754Sroot THEN dot=expv; ditto=dot; 683754Sroot FI 693754Sroot adrval=dot; 703754Sroot IF rdc()==',' ANDF expr(0) 713754Sroot THEN cntflg=TRUE; cntval=expv; 723754Sroot ELSE cntflg=FALSE; cntval=1; lp--; 733754Sroot FI 743754Sroot 753754Sroot IF !eol(rdc()) 763754Sroot THEN lastcom=lastc; 773754Sroot ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI 783754Sroot lp--; lastcom=defcom; 793754Sroot FI 803754Sroot 813754Sroot switch(lastcom&STRIP) { 823754Sroot 833754Sroot case '/': 843754Sroot itype=DSP; ptype=DSYM; 853754Sroot goto trystar; 863754Sroot 873754Sroot case '=': 883754Sroot itype=NSP; ptype=0; 893754Sroot goto trypr; 903754Sroot 913754Sroot case '?': 923754Sroot itype=ISP; ptype=ISYM; 933754Sroot goto trystar; 943754Sroot 953754Sroot trystar: 963754Sroot IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI 973754Sroot IF lastcom"E 983754Sroot THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype; 993754Sroot FI 1003754Sroot 1013754Sroot trypr: 1023754Sroot longpr=FALSE; eqcom=lastcom=='='; 1033754Sroot switch (rdc()) { 1043754Sroot 1053754Sroot case 'm': 1063754Sroot {/*reset map data*/ 1073754Sroot INT fcount; 1083754Sroot MAP *smap; 1093754Sroot UNION{MAP *m; L_INT *mp;}amap; 1103754Sroot 1113754Sroot IF eqcom THEN error(BADEQ); FI 1123754Sroot smap=(itype&DSP?&datmap:&txtmap); 1133754Sroot amap.m=smap; fcount=3; 1143754Sroot IF itype&STAR 1153754Sroot THEN amap.mp += 3; 1163754Sroot FI 1173754Sroot WHILE fcount-- ANDF expr(0) 1183754Sroot DO *(amap.mp)++ = expv; OD 1193754Sroot IF rdc()=='?' THEN smap->ufd=fsym; 1203754Sroot ELIF lastc == '/' THEN smap->ufd=fcor; 1213754Sroot ELSE lp--; 1223754Sroot FI 1233754Sroot } 1243754Sroot break; 1253754Sroot 1263754Sroot case 'L': 1273754Sroot longpr=TRUE; 1283754Sroot case 'l': 1293754Sroot /*search for exp*/ 1303754Sroot IF eqcom THEN error(BADEQ); FI 1313754Sroot dotinc=(longpr?4:2); savdot=dot; 1323754Sroot expr(1); locval=expv; 1333754Sroot IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI 1343754Sroot IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI 1353754Sroot LOOP w=get(dot,itype); 1363754Sroot IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI 1373754Sroot dot=inkdot(dotinc); 1383754Sroot POOL 1393754Sroot IF errflg 1403754Sroot THEN dot=savdot; errflg=NOMATCH; 1413754Sroot FI 1423754Sroot psymoff(dot,ptype,""); 1433754Sroot break; 1443754Sroot 1453754Sroot case 'W': 1463754Sroot longpr=TRUE; 1473754Sroot case 'w': 1483754Sroot IF eqcom THEN error(BADEQ); FI 1493754Sroot wformat[0]=lastc; expr(1); 1503754Sroot REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype); 1513754Sroot errflg=0; dot=savdot; 1523754Sroot IF longpr 1533754Sroot THEN put(dot,itype,expv); 1543754Sroot ELSE put(dot,itype,itol(get(dot+2,itype),expv)); 1553754Sroot FI 1563754Sroot savdot=dot; 1573754Sroot printf("=%8t"); exform(1,wformat,itype,ptype); 1583754Sroot newline(); 1593754Sroot PER expr(0) ANDF errflg==0 DONE 1603754Sroot dot=savdot; 1613754Sroot chkerr(); 1623754Sroot break; 1633754Sroot 1643754Sroot default: 1653754Sroot lp--; 1663754Sroot getformat(eqcom ? eqformat : stformat); 1673754Sroot IF !eqcom 1683754Sroot THEN psymoff(dot,ptype,":%16t"); 1693754Sroot FI 1703754Sroot scanform(cntval,(eqcom?eqformat:stformat),itype,ptype); 1713754Sroot } 1723754Sroot break; 1733754Sroot 1743754Sroot case '>': 1753754Sroot lastcom=0; savc=rdc(); 1763754Sroot IF regptr=getreg(savc) 177*6416Sroot THEN IF kcore THEN *(int *)regptr = dot; ELSE 178*6416Sroot * (ADDR *) (((ADDR)&u)+regptr)=dot; 1793754Sroot ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr)); 180*6416Sroot FI 1813754Sroot ELIF (modifier=varchk(savc)) != -1 1823754Sroot THEN var[modifier]=dot; 1833754Sroot ELSE error(BADVAR); 1843754Sroot FI 1853754Sroot break; 1863754Sroot 1873754Sroot case '!': 1883754Sroot lastcom=0; 1893754Sroot shell(); break; 1903754Sroot 1913754Sroot case '$': 1923754Sroot lastcom=0; 1933754Sroot printtrace(nextchar()); break; 1943754Sroot 1953754Sroot case ':': 1963754Sroot IF !executing 1973754Sroot THEN executing=TRUE; 1983754Sroot subpcs(nextchar()); 1993754Sroot executing=FALSE; 2003754Sroot lastcom=0; 2013754Sroot FI 2023754Sroot break; 2033754Sroot 2043754Sroot case 0: 2053754Sroot prints(DBNAME); 2063754Sroot break; 2073754Sroot 2083754Sroot default: error(BADCOM); 2093754Sroot } 2103754Sroot 2113754Sroot flushbuf(); 2123754Sroot PER rdc()==';' DONE 2133754Sroot IF buf THEN lp=savlp; ELSE lp--; FI 2143754Sroot return(adrflg ANDF dot!=0); 2153754Sroot } 2163754Sroot 217