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