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