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