|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: static char sccsid[] = "%Z%%M% %I% %G%";
10:
11: MSG BADEQ;
12: MSG NOMATCH;
13: MSG BADVAR;
14: MSG BADCOM;
15:
16: MAP txtmap;
17: MAP datmap;
18: INT executing;
19: CHAR *lp;
20: INT fcor;
21: INT fsym;
22: INT mkfault;
23: STRING errflg;
24:
25: CHAR lastc;
26: CHAR eqformat[128] = "z";
27: CHAR stformat[128] = "X\"= \"^i";
28:
29: L_INT dot;
30: L_INT ditto;
31: INT dotinc;
32: INT lastcom = '=';
33: L_INT var[];
34: L_INT locval;
35: L_INT locmsk;
36: INT pid;
37: L_INT expv;
38: L_INT adrval;
39: INT adrflg;
40: L_INT cntval;
41: INT cntflg;
42:
43:
44:
45:
46: /* command decoding */
47:
48: command(buf,defcom)
49: STRING buf;
50: CHAR 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"E
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)
177: THEN * (ADDR *) (((ADDR)&u)+regptr)=dot;
178: ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr));
179: ELIF (modifier=varchk(savc)) != -1
180: THEN var[modifier]=dot;
181: ELSE error(BADVAR);
182: FI
183: break;
184:
185: case '!':
186: lastcom=0;
187: shell(); break;
188:
189: case '$':
190: lastcom=0;
191: printtrace(nextchar()); break;
192:
193: case ':':
194: IF !executing
195: THEN executing=TRUE;
196: subpcs(nextchar());
197: executing=FALSE;
198: lastcom=0;
199: FI
200: break;
201:
202: case 0:
203: prints(DBNAME);
204: break;
205:
206: default: error(BADCOM);
207: }
208:
209: flushbuf();
210: PER rdc()==';' DONE
211: IF buf THEN lp=savlp; ELSE lp--; FI
212: return(adrflg ANDF dot!=0);
213: }
214:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.