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