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