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