xref: /csrg-svn/old/adb/adb.vax/command.c (revision 14468)
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&QUOTE
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