fix to do writes in memory properly
[unix-history] / usr / src / old / adb / adb.vax / command.c
CommitLineData
89f636ff
BJ
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
52bff713 9static char sccsid[] = "@(#)command.c 4.4 %G%";
89f636ff
BJ
10
11MSG BADEQ;
12MSG NOMATCH;
13MSG BADVAR;
14MSG BADCOM;
15
16MAP txtmap;
17MAP datmap;
18INT executing;
19CHAR *lp;
20INT fcor;
21INT fsym;
22INT mkfault;
23STRING errflg;
24
25CHAR lastc;
26CHAR eqformat[512] = "z";
27CHAR stformat[512] = "X\"= \"^i";
28
29L_INT dot;
30L_INT ditto;
31INT dotinc;
32INT lastcom = '=';
33L_INT var[];
34L_INT locval;
35L_INT locmsk;
36INT pid;
37L_INT expv;
38L_INT adrval;
39INT adrflg;
40L_INT cntval;
41INT cntflg;
42
43
44
45
46/* command decoding */
47
48command(buf,defcom)
49STRING buf;
50CHAR 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)
52bff713
BJ
177 THEN IF kcore THEN *(int *)regptr = dot; ELSE
178 * (ADDR *) (((ADDR)&u)+regptr)=dot;
89f636ff 179 ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr));
52bff713 180 FI
89f636ff
BJ
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