114468Ssam #ifndef lint
2*17254Ssam static char sccsid[] = "@(#)command.c 4.6 10/13/84";
314468Ssam #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
command(buf,defcom)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)
178*17254Ssam THEN IF kcore THEN
179*17254Ssam *(int *)regptr = dot;
180*17254Ssam ELSE
181*17254Ssam *(ADDR *)(((ADDR)&u)+regptr) = dot;
182*17254Ssam ptrace(PT_WRITE_U, pid, regptr,
183*17254Ssam *(ADDR *)(((ADDR)&u)+regptr));
1846416Sroot FI
1853754Sroot ELIF (modifier=varchk(savc)) != -1
1863754Sroot THEN var[modifier]=dot;
1873754Sroot ELSE error(BADVAR);
1883754Sroot FI
1893754Sroot break;
1903754Sroot
1913754Sroot case '!':
1923754Sroot lastcom=0;
1933754Sroot shell(); break;
1943754Sroot
1953754Sroot case '$':
1963754Sroot lastcom=0;
1973754Sroot printtrace(nextchar()); break;
1983754Sroot
1993754Sroot case ':':
2003754Sroot IF !executing
2013754Sroot THEN executing=TRUE;
2023754Sroot subpcs(nextchar());
2033754Sroot executing=FALSE;
2043754Sroot lastcom=0;
2053754Sroot FI
2063754Sroot break;
2073754Sroot
2083754Sroot case 0:
2093754Sroot prints(DBNAME);
2103754Sroot break;
2113754Sroot
2123754Sroot default: error(BADCOM);
2133754Sroot }
2143754Sroot
2153754Sroot flushbuf();
2163754Sroot PER rdc()==';' DONE
2173754Sroot IF buf THEN lp=savlp; ELSE lp--; FI
2183754Sroot return(adrflg ANDF dot!=0);
2193754Sroot }
2203754Sroot
221