xref: /original-bsd/old/adb/adb.vax/command.c (revision c374ae69)
1 #ifndef lint
2 static	char sccsid[] = "@(#)command.c	4.6 10/13/84";
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 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 	INT		itype, ptype, modifier, regptr;
54 	BOOL		longpr, eqcom;
55 	CHAR		wformat[1];
56 	CHAR		savc;
57 	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(get(dot+2,itype),expv));
156 				 FI
157 				 savdot=dot;
158 				 printf("=%8t"); exform(1,wformat,itype,ptype);
159 				 newline();
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)
178 		THEN IF kcore THEN
179 			*(int *)regptr = dot;
180 		     ELSE
181 		        *(ADDR *)(((ADDR)&u)+regptr) = dot;
182 		        ptrace(PT_WRITE_U, pid, regptr,
183 			     *(ADDR *)(((ADDR)&u)+regptr));
184 		     FI
185 		ELIF (modifier=varchk(savc)) != -1
186 		THEN	var[modifier]=dot;
187 		ELSE	error(BADVAR);
188 		FI
189 		break;
190 
191 	    case '!':
192 		lastcom=0;
193 		shell(); break;
194 
195 	    case '$':
196 		lastcom=0;
197 		printtrace(nextchar()); break;
198 
199 	    case ':':
200 		IF !executing
201 		THEN executing=TRUE;
202 		     subpcs(nextchar());
203 		     executing=FALSE;
204 		     lastcom=0;
205 		FI
206 		break;
207 
208 	    case 0:
209 		prints(DBNAME);
210 		break;
211 
212 	    default: error(BADCOM);
213 	}
214 
215 	flushbuf();
216 	PER rdc()==';' DONE
217 	IF buf THEN lp=savlp; ELSE lp--; FI
218 	return(adrflg ANDF dot!=0);
219 }
220 
221