|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: SCCSID(@(#)command.c 2.4);
10:
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[128] = "z";
28: CHAR stformat[128] = "X\"= \"^i";
29: struct user u;
30:
31: L_INT dot;
32: L_INT ditto;
33: INT dotinc;
34: INT lastcom = '=';
35: L_INT var[];
36: L_INT locval;
37: L_INT locmsk;
38: INT pid;
39: L_INT expv;
40: L_INT adrval;
41: INT adrflg;
42: L_INT cntval;
43: INT cntflg;
44:
45:
46:
47:
48: /* command decoding */
49:
50: command(buf,defcom)
51: STRING buf;
52: CHAR defcom;
53: {
54: INT itype, ptype, modifier, regptr;
55: BOOL longpr, eqcom;
56: CHAR wformat[1];
57: CHAR savc;
58: L_INT w, savdot;
59: STRING savlp=lp;
60: IF buf
61: THEN IF *buf==EOR
62: THEN return(FALSE);
63: ELSE lp=buf;
64: FI
65: FI
66:
67: REP
68: IF adrflg=expr(0)
69: THEN dot=expv; ditto=dot;
70: FI
71: adrval=dot;
72: IF rdc()==',' ANDF expr(0)
73: THEN cntflg=TRUE; cntval=expv;
74: ELSE cntflg=FALSE; cntval=1; lp--;
75: FI
76:
77: IF !eol(rdc())
78: THEN lastcom=lastc;
79: ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
80: lp--; lastcom=defcom;
81: FI
82:
83: switch(lastcom&STRIP) {
84:
85: case '/':
86: itype=DSP; ptype=DSYM;
87: goto trystar;
88:
89: case '=':
90: itype=NSP; ptype=0;
91: goto trypr;
92:
93: case '?':
94: itype=ISP; ptype=ISYM;
95: goto trystar;
96:
97: trystar:
98: IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
99: IF lastcom"E
100: THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
101: FI
102:
103: trypr:
104: longpr=FALSE; eqcom=lastcom=='=';
105: switch (rdc()) {
106:
107: case 'm':
108: {/*reset map data*/
109: INT fcount;
110: MAP *smap;
111: UNION{MAP *m; L_INT *mp;}amap;
112:
113: IF eqcom THEN error(BADEQ); FI
114: smap=(itype&DSP?&datmap:&txtmap);
115: amap.m=smap; fcount=3;
116: IF itype&STAR
117: THEN amap.mp += 3;
118: FI
119: WHILE fcount-- ANDF expr(0)
120: DO *(amap.mp)++ = expv; OD
121: IF rdc()=='?' THEN smap->ufd=fsym;
122: ELIF lastc == '/' THEN smap->ufd=fcor;
123: ELSE lp--;
124: FI
125: }
126: break;
127:
128: case 'L':
129: longpr=TRUE;
130: case 'l':
131: /*search for exp*/
132: IF eqcom THEN error(BADEQ); FI
133: dotinc=(longpr?4:2); savdot=dot;
134: expr(1); locval=expv;
135: IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
136: IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
137: LOOP w=get(dot,itype);
138: IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
139: dot=inkdot(dotinc);
140: POOL
141: IF errflg
142: THEN dot=savdot; errflg=NOMATCH;
143: FI
144: psymoff(dot,ptype,"");
145: break;
146:
147: case 'W':
148: longpr=TRUE;
149: case 'w':
150: IF eqcom THEN error(BADEQ); FI
151: wformat[0]=lastc; expr(1);
152: REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
153: errflg=0; dot=savdot;
154: IF longpr
155: THEN put(dot,itype,expv);
156: ELSE put(dot,itype,itol(get(dot+2,itype),expv));
157: FI
158: savdot=dot;
159: printf("=%8t"); exform(1,wformat,itype,ptype);
160: newline();
161: PER expr(0) ANDF errflg==0 DONE
162: dot=savdot;
163: chkerr();
164: break;
165:
166: default:
167: lp--;
168: getformat(eqcom ? eqformat : stformat);
169: IF !eqcom
170: THEN psymoff(dot,ptype,":%16t");
171: FI
172: scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
173: }
174: break;
175:
176: case '>':
177: lastcom=0; savc=rdc();
178: IF regptr=getreg(savc)
179: THEN * (ADDR *) (((ADDR)&u)+regptr)=dot;
180: ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr));
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.