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