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
command(buf,defcom)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"E
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