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