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