|
|
1.1 root 1: /*
2: *
3: * UNIX debugger
4: *
5: */
6:
7: #include "defs.h"
8:
9: MSG BADMOD;
10: MSG NOFORK;
11: MSG ADWRAP;
12:
13: INT mkfault;
14: CHAR *lp;
15: L_INT maxoff;
16: SIG sigint;
17: SIG sigqit;
18: STRING errflg;
19: CHAR lastc,peekc;
20: L_INT dot;
21: INT dotinc;
22: L_INT expv;
23: L_INT var[];
24:
25: scanform(icount,ifp,itype,ptype)
26: L_INT icount;
27: STRING ifp;
28: {
29: REG STRING fp;
30: CHAR modifier;
31: REG fcount, init=1;
32: L_INT savdot;
33: BOOL exact;
34:
35: WHILE icount
36: DO fp=ifp;
37: savdot=dot; init=0;
38:
39: IF init==0 ANDF (exact=(findsym(dot,ptype)==0)) ANDF maxoff
40: THEN printf("\n%s:%16t",cursym->n_un.n_name);
41: FI
42:
43: /*now loop over format*/
44: WHILE *fp ANDF errflg==0
45: DO IF isdigit(modifier = *fp)
46: THEN fcount = 0;
47: WHILE isdigit(modifier = *fp++)
48: DO fcount *= 10;
49: fcount += modifier-'0';
50: OD
51: fp--;
52: ELSE fcount = 1;
53: FI
54:
55: IF *fp==0 THEN break; FI
56: IF exact ANDF dot==savdot ANDF itype==ISP ANDF
57: (cursym->n_type&N_TYPE)==N_TEXT ANDF cursym->n_un.n_name[0]=='_' ANDF *fp=='i'
58: THEN exform(1,"x",itype,ptype); fp++; printc(EOR); /* entry mask */
59: ELSE fp=exform(fcount,fp,itype,ptype);
60: FI
61: OD
62: dotinc=dot-savdot;
63: dot=savdot;
64:
65: IF errflg
66: THEN IF icount<0
67: THEN errflg=0; break;
68: ELSE error(errflg);
69: FI
70: FI
71: IF --icount
72: THEN dot=inkdot(dotinc);
73: FI
74: IF mkfault THEN error(0); FI
75: OD
76: }
77:
78: STRING
79: exform(fcount,ifp,itype,ptype)
80: INT fcount;
81: STRING ifp;
82: {
83: /* execute single format item `fcount' times
84: * sets `dotinc' and moves `dot'
85: * returns address of next format item
86: */
87: REG POS w;
88: REG L_INT savdot, wx;
89: REG STRING fp;
90: CHAR c, modifier, longpr;
91: union{ /* compatible with both VAX and TAHOE */
92: L_REAL d;
93: INT s[4];
94: }fw;
95:
96: WHILE fcount>0
97: DO fp = ifp; c = *fp;
98: longpr=(c>='A')&&(c<='Z')||(c=='f')||(c=='4')||(c=='p');
99: IF itype==NSP ORF *fp=='a'
100: THEN wx=dot; w=dot;
101: ELSE wx=get(dot,itype);
102: w=shorten(wx);
103: FI
104: IF errflg THEN return(fp); FI
105: IF mkfault THEN error(0); FI
106: var[0]=wx;
107: modifier = *fp++;
108: dotinc=(longpr?4:2);
109:
110: IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI
111:
112: switch(modifier) {
113:
114: case SP: case TB:
115: break;
116:
117: case 't': case 'T':
118: printf("%T",fcount); return(fp);
119:
120: case 'r': case 'R':
121: printf("%M",fcount); return(fp);
122:
123: case 'a':
124: psymoff(dot,ptype,":%16t"); dotinc=0; break;
125:
126: case 'p':
127: psymoff(var[0],ptype,"%16t"); break;
128:
129: case 'u':
130: printf("%-8u",w); break;
131:
132: case 'U':
133: printf("%-16U",wx); break;
134:
135: case 'c': case 'C':
136: IF modifier=='C'
137: THEN printesc(byte(wx));
138: ELSE printc(byte(wx));
139: FI
140: dotinc=1; break;
141:
142: case 'b': case 'B':
143: printf("%-8o", byte(wx)); dotinc=1; break;
144:
145: case '1':
146: printf("%-8R", byte(wx)); dotinc=1; break;
147:
148: case '2':
149: case 'w':
150: printf("%-8R", w); break;
151:
152: case '4':
153: case 'W':
154: printf("%-16R", wx); break;
155:
156: case 's': case 'S':
157: savdot=dot; dotinc=1;
158: WHILE (c=byte(get(dot,itype))) ANDF errflg==0
159: DO dot=inkdot(1);
160: IF modifier == 'S'
161: THEN printesc(c);
162: ELSE printc(c);
163: FI
164: endline();
165: OD
166: dotinc=dot-savdot+1; dot=savdot; break;
167:
168: case 'x':
169: printf("%-8x",w); break;
170:
171: case 'X':
172: printf("%-16X", wx); break;
173:
174: case 'z':
175: printf("%-8z",w); break;
176:
177: case 'Z':
178: printf("%-16Z", wx); break;
179:
180: case 'Y':
181: printf("%-24Y", wx); break;
182:
183: case 'q':
184: printf("%-8q", w); break;
185:
186: case 'Q':
187: printf("%-16Q", wx); break;
188:
189: case 'o':
190: printf("%-8o", w); break;
191:
192: case 'O':
193: printf("%-16O", wx); break;
194:
195: case 'i':
196: case 'I':
197: printins(itype,wx); printc(EOR); break;
198:
199: case 'd':
200: printf("%-8d", w); break;
201:
202: case 'D':
203: printf("%-16D", wx); break;
204:
205: case 'f':
206: fw.d = 0;
207: fw.s[0] = w;
208: fw.s[1] = wx&0xffff;
209: printf("%-16.9f", fw.d);
210: dotinc=4; break;
211:
212: case 'F': /* may be done with one get call on TAHOE */
213: fw.s[0] = w;
214: fw.s[1] = wx&0xffff;
215: fw.s[2]=shorten(get(inkdot(4),itype));
216: fw.s[3]=shorten(get(inkdot(6),itype));
217: IF errflg THEN return(fp); FI
218: printf("%-32.18F", fw.d);
219: dotinc=8; break;
220:
221: case 'n': case 'N':
222: printc('\n'); dotinc=0; break;
223:
224: case '"':
225: dotinc=0;
226: WHILE *fp != '"' ANDF *fp
227: DO printc(*fp++); OD
228: IF *fp THEN fp++; FI
229: break;
230:
231: case '^':
232: dot=inkdot(-dotinc*fcount); return(fp);
233:
234: case '+':
235: dot=inkdot(fcount); return(fp);
236:
237: case '-':
238: dot=inkdot(-fcount); return(fp);
239:
240: default: error(BADMOD);
241: }
242: IF itype!=NSP
243: THEN dot=inkdot(dotinc);
244: FI
245: fcount--; endline();
246: OD
247:
248: return(fp);
249: }
250:
251: shell()
252: {
253: #ifndef EDDT
254: REG rc, unixpid;
255: int status;
256: REG STRING argp = lp;
257: STRING getenv(), shell = getenv("SHELL");
258: #ifdef VFORK
259: char oldstlp;
260: #endif
261:
262: if (shell == 0)
263: shell = "/bin/sh";
264: WHILE lastc!=EOR DO rdc(); OD
265: #ifndef VFORK
266: IF (unixpid=fork())==0
267: #else
268: oldstlp = *lp;
269: IF (unixpid=vfork())==0
270: #endif
271: THEN signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
272: *lp=0; execl(shell, "sh", "-c", argp, 0);
273: _exit(16);
274: #ifndef VFORK
275: ELIF unixpid == -1
276: #else
277: ELIF *lp = oldstlp, unixpid == -1
278: #endif
279: THEN error(NOFORK);
280: ELSE signal(SIGINT,1);
281: WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE
282: signal(SIGINT,sigint);
283: printc('!'); lp--;
284: FI
285: #endif
286: }
287:
288:
289: printesc(c)
290: REG c;
291: {
292: c &= STRIP;
293: IF c==0177 ORF c<SP
294: THEN printf("^%c", c ^ 0100);
295: ELSE printc(c);
296: FI
297: }
298:
299: L_INT inkdot(incr)
300: {
301: REG L_INT newdot;
302:
303: newdot=dot+incr;
304: IF (dot ^ newdot) >> 24 THEN error(ADWRAP); FI
305: return(newdot);
306: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.