xref: /csrg-svn/old/adb/adb.tahoe/command.c (revision 26416)
1*26416Ssam #ifndef lint
2*26416Ssam static	char sccsid[] = "@(#)command.c	1.1 (Berkeley) 02/25/86";
3*26416Ssam #endif
4*26416Ssam /*
5*26416Ssam  *
6*26416Ssam  *	UNIX debugger
7*26416Ssam  *
8*26416Ssam  */
9*26416Ssam 
10*26416Ssam #include "defs.h"
11*26416Ssam 
12*26416Ssam MSG		BADEQ;
13*26416Ssam MSG		NOMATCH;
14*26416Ssam MSG		BADVAR;
15*26416Ssam MSG		BADCOM;
16*26416Ssam 
17*26416Ssam MAP		txtmap;
18*26416Ssam MAP		datmap;
19*26416Ssam INT		executing;
20*26416Ssam CHAR		*lp;
21*26416Ssam INT		fcor;
22*26416Ssam INT		fsym;
23*26416Ssam INT		mkfault;
24*26416Ssam STRING		errflg;
25*26416Ssam 
26*26416Ssam CHAR		lastc;
27*26416Ssam CHAR		eqformat[512] = "z";
28*26416Ssam CHAR		stformat[512] = "X\"= \"^i";
29*26416Ssam 
30*26416Ssam L_INT		dot;
31*26416Ssam L_INT		ditto;
32*26416Ssam INT		dotinc;
33*26416Ssam INT		lastcom = '=';
34*26416Ssam L_INT		var[];
35*26416Ssam L_INT		locval;
36*26416Ssam L_INT		locmsk;
37*26416Ssam L_INT		pid;
38*26416Ssam L_INT		expv;
39*26416Ssam L_INT		adrval;
40*26416Ssam INT		adrflg;
41*26416Ssam L_INT		cntval;
42*26416Ssam INT		cntflg;
43*26416Ssam 
44*26416Ssam 
45*26416Ssam 
46*26416Ssam 
47*26416Ssam /* command decoding */
48*26416Ssam 
49*26416Ssam command(buf,defcom)
50*26416Ssam STRING		buf;
51*26416Ssam CHAR		defcom;
52*26416Ssam {
53*26416Ssam 	REG		itype, ptype, modifier, regptr;
54*26416Ssam 	BOOL		longpr, eqcom;
55*26416Ssam 	CHAR		wformat[1];
56*26416Ssam 	CHAR		savc;
57*26416Ssam 	REG	L_INT		w, savdot;
58*26416Ssam 	STRING		savlp=lp;
59*26416Ssam 	IF buf
60*26416Ssam 	THEN IF *buf==EOR
61*26416Ssam 	     THEN return(FALSE);
62*26416Ssam 	     ELSE lp=buf;
63*26416Ssam 	     FI
64*26416Ssam 	FI
65*26416Ssam 
66*26416Ssam 	REP
67*26416Ssam 	IF adrflg=expr(0)
68*26416Ssam 	THEN dot=expv; ditto=dot;
69*26416Ssam 	FI
70*26416Ssam 	adrval=dot;
71*26416Ssam 	IF rdc()==',' ANDF expr(0)
72*26416Ssam 	THEN cntflg=TRUE; cntval=expv;
73*26416Ssam 	ELSE cntflg=FALSE; cntval=1; lp--;
74*26416Ssam 	FI
75*26416Ssam 
76*26416Ssam 	IF !eol(rdc())
77*26416Ssam 	THEN lastcom=lastc;
78*26416Ssam 	ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
79*26416Ssam 	     lp--; lastcom=defcom;
80*26416Ssam 	FI
81*26416Ssam 
82*26416Ssam 	switch(lastcom&STRIP) {
83*26416Ssam 
84*26416Ssam 	    case '/':
85*26416Ssam 		itype=DSP; ptype=DSYM;
86*26416Ssam 		goto trystar;
87*26416Ssam 
88*26416Ssam 	    case '=':
89*26416Ssam 		itype=NSP; ptype=0;
90*26416Ssam 		goto trypr;
91*26416Ssam 
92*26416Ssam 	    case '?':
93*26416Ssam 		itype=ISP; ptype=ISYM;
94*26416Ssam 		goto trystar;
95*26416Ssam 
96*26416Ssam 	    trystar:
97*26416Ssam 		IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
98*26416Ssam 		IF lastcom&QUOTE
99*26416Ssam 		THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
100*26416Ssam 		FI
101*26416Ssam 
102*26416Ssam 	    trypr:
103*26416Ssam 		longpr=FALSE; eqcom=lastcom=='=';
104*26416Ssam 		switch (rdc()) {
105*26416Ssam 
106*26416Ssam 			case 'm':
107*26416Ssam 			    {/*reset map data*/
108*26416Ssam 			    INT		fcount;
109*26416Ssam 			    MAP		*smap;
110*26416Ssam 			    UNION{MAP *m; L_INT *mp;}amap;
111*26416Ssam 
112*26416Ssam 			    IF eqcom THEN error(BADEQ); FI
113*26416Ssam 			    smap=(itype&DSP?&datmap:&txtmap);
114*26416Ssam 			    amap.m=smap; fcount=3;
115*26416Ssam 			    IF itype&STAR
116*26416Ssam 			    THEN amap.mp += 3;
117*26416Ssam 			    FI
118*26416Ssam 			    WHILE fcount-- ANDF expr(0)
119*26416Ssam 			    DO *(amap.mp)++ = expv; OD
120*26416Ssam 			    IF rdc()=='?' THEN smap->ufd=fsym;
121*26416Ssam 			    ELIF lastc == '/' THEN smap->ufd=fcor;
122*26416Ssam 			    ELSE lp--;
123*26416Ssam 			    FI
124*26416Ssam 			    }
125*26416Ssam 			    break;
126*26416Ssam 
127*26416Ssam 			case 'L':
128*26416Ssam 			    longpr=TRUE;
129*26416Ssam 			case 'l':
130*26416Ssam 			    /*search for exp*/
131*26416Ssam 			    IF eqcom THEN error(BADEQ); FI
132*26416Ssam 			    dotinc=(longpr?4:2); savdot=dot;
133*26416Ssam 			    expr(1); locval=expv;
134*26416Ssam 			    IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
135*26416Ssam 				IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
136*26416Ssam 			    LOOP w=get(dot,itype);
137*26416Ssam 				 IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
138*26416Ssam 				 dot=inkdot(dotinc);
139*26416Ssam 			    POOL
140*26416Ssam 			    IF errflg
141*26416Ssam 			    THEN dot=savdot; errflg=NOMATCH;
142*26416Ssam 			    FI
143*26416Ssam 			    psymoff(dot,ptype,"");
144*26416Ssam 			    break;
145*26416Ssam 
146*26416Ssam 			case 'W':
147*26416Ssam 			    longpr=TRUE;
148*26416Ssam 			case 'w':
149*26416Ssam 			    IF eqcom THEN error(BADEQ); FI
150*26416Ssam 			    wformat[0]=lastc; expr(1);
151*26416Ssam 			    REP  savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
152*26416Ssam 				 errflg=0; dot=savdot;
153*26416Ssam 				 IF longpr
154*26416Ssam 				 THEN put(dot,itype,expv);
155*26416Ssam 				 ELSE put(dot,itype,itol(expv,get(dot,itype)));
156*26416Ssam 				 FI
157*26416Ssam 				 savdot=dot;
158*26416Ssam 				 printf("=%8t"); exform(1,wformat,itype,ptype);
159*26416Ssam 				 printc(EOR);
160*26416Ssam 			    PER  expr(0) ANDF errflg==0 DONE
161*26416Ssam 			    dot=savdot;
162*26416Ssam 			    chkerr();
163*26416Ssam 			    break;
164*26416Ssam 
165*26416Ssam 			default:
166*26416Ssam 			    lp--;
167*26416Ssam 			    getformat(eqcom ? eqformat : stformat);
168*26416Ssam 			    IF !eqcom
169*26416Ssam 			    THEN psymoff(dot,ptype,":%16t");
170*26416Ssam 			    FI
171*26416Ssam 			    scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
172*26416Ssam 		}
173*26416Ssam 		break;
174*26416Ssam 
175*26416Ssam 	    case '>':
176*26416Ssam 		lastcom=0; savc=rdc();
177*26416Ssam 		IF regptr=getreg(savc)
178*26416Ssam 		THEN IF kcore THEN *(int *)regptr = dot; ELSE
179*26416Ssam 		     *(ADDR *)(((ADDR)(&u))+regptr)=dot;
180*26416Ssam 		     ptrace(WUREGS, pid, regptr*NBPW,
181*26416Ssam 			 *(ADDR *)(((ADDR)(&u))+regptr));
182*26416Ssam 		     FI
183*26416Ssam 		ELIF (modifier=varchk(savc)) != -1
184*26416Ssam 		THEN	var[modifier]=dot;
185*26416Ssam 		ELSE	error(BADVAR);
186*26416Ssam 		FI
187*26416Ssam 		break;
188*26416Ssam 
189*26416Ssam 	    case '!':
190*26416Ssam 		lastcom=0;
191*26416Ssam 		shell(); break;
192*26416Ssam 
193*26416Ssam 	    case '$':
194*26416Ssam 		lastcom=0;
195*26416Ssam 		printtrace(nextchar()); break;
196*26416Ssam 
197*26416Ssam 	    case ':':
198*26416Ssam 		IF !executing
199*26416Ssam 		THEN executing=TRUE;
200*26416Ssam 		     subpcs(nextchar());
201*26416Ssam 		     executing=FALSE;
202*26416Ssam 		     lastcom=0;
203*26416Ssam 		FI
204*26416Ssam 		break;
205*26416Ssam 
206*26416Ssam 	    case 0:
207*26416Ssam 		printf(DBNAME);
208*26416Ssam 		break;
209*26416Ssam 
210*26416Ssam 	    default: error(BADCOM);
211*26416Ssam 	}
212*26416Ssam 
213*26416Ssam 	flushbuf();
214*26416Ssam 	PER rdc()==';' DONE
215*26416Ssam 	IF buf THEN lp=savlp; ELSE lp--; FI
216*26416Ssam 	return(adrflg ANDF dot!=0);
217*26416Ssam }
218*26416Ssam 
219