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