xref: /csrg-svn/old/adb/adb.tahoe/command.c (revision 29663)
126416Ssam #ifndef lint
2*29663Ssam static	char sccsid[] = "@(#)command.c	1.2 (Berkeley) 07/25/86";
326416Ssam #endif
426416Ssam /*
526416Ssam  *
626416Ssam  *	UNIX debugger
726416Ssam  *
826416Ssam  */
926416Ssam 
1026416Ssam #include "defs.h"
1126416Ssam 
1226416Ssam MSG		BADEQ;
1326416Ssam MSG		NOMATCH;
1426416Ssam MSG		BADVAR;
1526416Ssam MSG		BADCOM;
1626416Ssam 
1726416Ssam MAP		txtmap;
1826416Ssam MAP		datmap;
1926416Ssam INT		executing;
2026416Ssam CHAR		*lp;
2126416Ssam INT		fcor;
2226416Ssam INT		fsym;
2326416Ssam INT		mkfault;
2426416Ssam STRING		errflg;
2526416Ssam 
2626416Ssam CHAR		lastc;
2726416Ssam CHAR		eqformat[512] = "z";
2826416Ssam CHAR		stformat[512] = "X\"= \"^i";
2926416Ssam 
3026416Ssam L_INT		dot;
3126416Ssam L_INT		ditto;
3226416Ssam INT		dotinc;
3326416Ssam INT		lastcom = '=';
3426416Ssam L_INT		var[];
3526416Ssam L_INT		locval;
3626416Ssam L_INT		locmsk;
3726416Ssam L_INT		pid;
3826416Ssam L_INT		expv;
3926416Ssam L_INT		adrval;
4026416Ssam INT		adrflg;
4126416Ssam L_INT		cntval;
4226416Ssam INT		cntflg;
4326416Ssam 
4426416Ssam 
4526416Ssam 
4626416Ssam 
4726416Ssam /* command decoding */
4826416Ssam 
command(buf,defcom)4926416Ssam command(buf,defcom)
5026416Ssam STRING		buf;
5126416Ssam CHAR		defcom;
5226416Ssam {
5326416Ssam 	REG		itype, ptype, modifier, regptr;
5426416Ssam 	BOOL		longpr, eqcom;
5526416Ssam 	CHAR		wformat[1];
5626416Ssam 	CHAR		savc;
5726416Ssam 	REG	L_INT		w, savdot;
5826416Ssam 	STRING		savlp=lp;
5926416Ssam 	IF buf
6026416Ssam 	THEN IF *buf==EOR
6126416Ssam 	     THEN return(FALSE);
6226416Ssam 	     ELSE lp=buf;
6326416Ssam 	     FI
6426416Ssam 	FI
6526416Ssam 
6626416Ssam 	REP
6726416Ssam 	IF adrflg=expr(0)
6826416Ssam 	THEN dot=expv; ditto=dot;
6926416Ssam 	FI
7026416Ssam 	adrval=dot;
7126416Ssam 	IF rdc()==',' ANDF expr(0)
7226416Ssam 	THEN cntflg=TRUE; cntval=expv;
7326416Ssam 	ELSE cntflg=FALSE; cntval=1; lp--;
7426416Ssam 	FI
7526416Ssam 
7626416Ssam 	IF !eol(rdc())
7726416Ssam 	THEN lastcom=lastc;
7826416Ssam 	ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
7926416Ssam 	     lp--; lastcom=defcom;
8026416Ssam 	FI
8126416Ssam 
8226416Ssam 	switch(lastcom&STRIP) {
8326416Ssam 
8426416Ssam 	    case '/':
8526416Ssam 		itype=DSP; ptype=DSYM;
8626416Ssam 		goto trystar;
8726416Ssam 
8826416Ssam 	    case '=':
8926416Ssam 		itype=NSP; ptype=0;
9026416Ssam 		goto trypr;
9126416Ssam 
9226416Ssam 	    case '?':
9326416Ssam 		itype=ISP; ptype=ISYM;
9426416Ssam 		goto trystar;
9526416Ssam 
9626416Ssam 	    trystar:
9726416Ssam 		IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
9826416Ssam 		IF lastcom&QUOTE
9926416Ssam 		THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
10026416Ssam 		FI
10126416Ssam 
10226416Ssam 	    trypr:
10326416Ssam 		longpr=FALSE; eqcom=lastcom=='=';
10426416Ssam 		switch (rdc()) {
10526416Ssam 
10626416Ssam 			case 'm':
10726416Ssam 			    {/*reset map data*/
10826416Ssam 			    INT		fcount;
10926416Ssam 			    MAP		*smap;
11026416Ssam 			    UNION{MAP *m; L_INT *mp;}amap;
11126416Ssam 
11226416Ssam 			    IF eqcom THEN error(BADEQ); FI
11326416Ssam 			    smap=(itype&DSP?&datmap:&txtmap);
11426416Ssam 			    amap.m=smap; fcount=3;
11526416Ssam 			    IF itype&STAR
11626416Ssam 			    THEN amap.mp += 3;
11726416Ssam 			    FI
11826416Ssam 			    WHILE fcount-- ANDF expr(0)
11926416Ssam 			    DO *(amap.mp)++ = expv; OD
12026416Ssam 			    IF rdc()=='?' THEN smap->ufd=fsym;
12126416Ssam 			    ELIF lastc == '/' THEN smap->ufd=fcor;
12226416Ssam 			    ELSE lp--;
12326416Ssam 			    FI
12426416Ssam 			    }
12526416Ssam 			    break;
12626416Ssam 
12726416Ssam 			case 'L':
12826416Ssam 			    longpr=TRUE;
12926416Ssam 			case 'l':
13026416Ssam 			    /*search for exp*/
13126416Ssam 			    IF eqcom THEN error(BADEQ); FI
13226416Ssam 			    dotinc=(longpr?4:2); savdot=dot;
13326416Ssam 			    expr(1); locval=expv;
13426416Ssam 			    IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
13526416Ssam 				IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
13626416Ssam 			    LOOP w=get(dot,itype);
13726416Ssam 				 IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
13826416Ssam 				 dot=inkdot(dotinc);
13926416Ssam 			    POOL
14026416Ssam 			    IF errflg
14126416Ssam 			    THEN dot=savdot; errflg=NOMATCH;
14226416Ssam 			    FI
14326416Ssam 			    psymoff(dot,ptype,"");
14426416Ssam 			    break;
14526416Ssam 
14626416Ssam 			case 'W':
14726416Ssam 			    longpr=TRUE;
14826416Ssam 			case 'w':
14926416Ssam 			    IF eqcom THEN error(BADEQ); FI
15026416Ssam 			    wformat[0]=lastc; expr(1);
15126416Ssam 			    REP  savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
15226416Ssam 				 errflg=0; dot=savdot;
15326416Ssam 				 IF longpr
15426416Ssam 				 THEN put(dot,itype,expv);
15526416Ssam 				 ELSE put(dot,itype,itol(expv,get(dot,itype)));
15626416Ssam 				 FI
15726416Ssam 				 savdot=dot;
15826416Ssam 				 printf("=%8t"); exform(1,wformat,itype,ptype);
15926416Ssam 				 printc(EOR);
16026416Ssam 			    PER  expr(0) ANDF errflg==0 DONE
16126416Ssam 			    dot=savdot;
16226416Ssam 			    chkerr();
16326416Ssam 			    break;
16426416Ssam 
16526416Ssam 			default:
16626416Ssam 			    lp--;
16726416Ssam 			    getformat(eqcom ? eqformat : stformat);
16826416Ssam 			    IF !eqcom
16926416Ssam 			    THEN psymoff(dot,ptype,":%16t");
17026416Ssam 			    FI
17126416Ssam 			    scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
17226416Ssam 		}
17326416Ssam 		break;
17426416Ssam 
17526416Ssam 	    case '>':
17626416Ssam 		lastcom=0; savc=rdc();
177*29663Ssam 		IF (regptr=getreg(savc)) != -1
17826416Ssam 		THEN IF kcore THEN *(int *)regptr = dot; ELSE
17926416Ssam 		     *(ADDR *)(((ADDR)(&u))+regptr)=dot;
18026416Ssam 		     ptrace(WUREGS, pid, regptr*NBPW,
18126416Ssam 			 *(ADDR *)(((ADDR)(&u))+regptr));
18226416Ssam 		     FI
18326416Ssam 		ELIF (modifier=varchk(savc)) != -1
18426416Ssam 		THEN	var[modifier]=dot;
18526416Ssam 		ELSE	error(BADVAR);
18626416Ssam 		FI
18726416Ssam 		break;
18826416Ssam 
18926416Ssam 	    case '!':
19026416Ssam 		lastcom=0;
19126416Ssam 		shell(); break;
19226416Ssam 
19326416Ssam 	    case '$':
19426416Ssam 		lastcom=0;
19526416Ssam 		printtrace(nextchar()); break;
19626416Ssam 
19726416Ssam 	    case ':':
19826416Ssam 		IF !executing
19926416Ssam 		THEN executing=TRUE;
20026416Ssam 		     subpcs(nextchar());
20126416Ssam 		     executing=FALSE;
20226416Ssam 		     lastcom=0;
20326416Ssam 		FI
20426416Ssam 		break;
20526416Ssam 
20626416Ssam 	    case 0:
20726416Ssam 		printf(DBNAME);
20826416Ssam 		break;
20926416Ssam 
21026416Ssam 	    default: error(BADCOM);
21126416Ssam 	}
21226416Ssam 
21326416Ssam 	flushbuf();
21426416Ssam 	PER rdc()==';' DONE
21526416Ssam 	IF buf THEN lp=savlp; ELSE lp--; FI
21626416Ssam 	return(adrflg ANDF dot!=0);
21726416Ssam }
21826416Ssam 
219