|
|
1.1 root 1: /*
2: *
3: * UNIX debugger
4: *
5: */
6:
7: #include "defs.h"
8: #include "space.h"
9:
10: extern char lastc, peekc;
11:
12: scanform(icount,ifp,itype,ptype)
13: WORD icount;
14: char *ifp;
15: {
16: register char *fp;
17: register char c;
18: register int fcount;
19: ADDR savdot;
20:
21: while (icount) {
22: fp=ifp;
23: savdot=dot;
24: /*now loop over format*/
25: while (*fp && errflg==0) {
26: if (!isdigit(*fp))
27: fcount = 1;
28: else {
29: fcount = 0;
30: while (isdigit(c = *fp++)) {
31: fcount *= 10;
32: fcount += c-'0';
33: }
34: fp--;
35: }
36: if (*fp==0)
37: break;
38: fp=exform(fcount,fp,itype,ptype);
39: }
40: dotinc=dot-savdot;
41: dot=savdot;
42: if (errflg) {
43: if (icount<0) {
44: errflg=0;
45: break;
46: }
47: else
48: error(errflg);
49: }
50: if (--icount)
51: dot=inkdot(dotinc);
52: if (mkfault)
53: error(NULL);
54: }
55: }
56:
57: char *
58: exform(fcount,ifp,itype,ptype)
59: int fcount;
60: char *ifp;
61: {
62: /* execute single format item `fcount' times
63: * sets `dotinc' and moves `dot'
64: * returns address of next format item
65: */
66: register WORD w;
67: ADDR savdot;
68: register char *fp;
69: register char c, modifier;
70: union {
71: TFLOAT s;
72: TDOUBLE d;
73: } fl;
74:
75: while (fcount > 0) {
76: fp = ifp;
77: c = *fp;
78: modifier = *fp++;
79: if (charpos()==0 && modifier!='a')
80: printf("%16m");
81: switch(modifier) {
82:
83: case SPC:
84: case TB:
85: break;
86:
87: case 't':
88: case 'T':
89: printf("%T", fcount);
90: return(fp);
91:
92: case 'a':
93: psymoff((WORD)dot, ptype, itype & SYMF ?"?%16t":"/%16t");
94: dotinc = 0;
95: break;
96:
97: case 'p':
98: w = atow(aget(dot, itype));
99: if (errflg)
100: return (fp);
101: if (mkfault)
102: return (0);
103: psymoff(w, ptype, "%16t");
104: dotinc = SZADDR;
105: break;
106:
107: case 'u':
108: case 'r':
109: case 'd':
110: case 'x':
111: case 'o':
112: case 'q':
113: w = stow(sget(dot, itype));
114: if (errflg)
115: return (fp);
116: if (mkfault)
117: return (0);
118: dotinc = SZSHORT;
119: if (c == 'u')
120: printf("%-8U", w);
121: else if (c == 'r')
122: printf("%-8R", w);
123: else if (c == 'd')
124: printf("%-8D", w);
125: else if (c == 'x')
126: printf("%-8X", w);
127: else if (c == 'o')
128: printf("%-8O", w);
129: else if (c == 'q')
130: printf("%-8Q", w);
131: break;
132:
133: case 'U':
134: case 'R':
135: case 'D':
136: case 'X':
137: case 'O':
138: case 'Q':
139: w = ltow(lget(dot, itype));
140: if (errflg)
141: return (fp);
142: if (mkfault)
143: return (0);
144: dotinc = SZLONG;
145: if (c == 'U')
146: printf("%-16U", w);
147: else if (c == 'R')
148: printf("%-16R", w);
149: else if (c == 'D')
150: printf("%-16D", w);
151: else if (c == 'X')
152: printf("%-16X", w);
153: else if (c == 'O')
154: printf("%-16O", w);
155: else if (c == 'Q')
156: printf("%-16Q", w);
157: break;
158:
159: case 'b':
160: case 'B':
161: case 'c':
162: case 'C':
163: w = ctow(cget(dot, itype));
164: if (errflg)
165: return (fp);
166: if (mkfault)
167: return (0);
168: if (modifier == 'C')
169: printesc((char)w);
170: else if (modifier == 'B' || modifier == 'b')
171: printf("%-8O", w);
172: else
173: printc((char)w);
174: dotinc = SZCHAR;
175: break;
176:
177: case 's':
178: case 'S':
179: savdot=dot;
180: dotinc=SZCHAR;
181: while ((w=ctow(cget(dot,itype))) && errflg==0) {
182: dot=inkdot((WORD)SZCHAR);
183: if (modifier == 'S')
184: printesc((char)w);
185: else
186: printc((char)w);
187: endline();
188: }
189: dotinc=(dot-savdot+1) * SZCHAR;
190: dot=savdot;
191: break;
192:
193: case 'Y':
194: printdate((long)ltow(lget(dot, itype)));
195: dotinc = SZLONG;
196: break;
197:
198: case 'i':
199: printins(itype);
200: printc(EOR);
201: break;
202:
203: case 'f':
204: if (fget(dot, itype, (char *)&fl.s, SZFLOAT) == 0)
205: return (fp);
206: if (mkfault)
207: return (0);
208: dotinc = SZFLOAT;
209: fpout('f', (char *)&fl.s);
210: break;
211:
212: case 'F':
213: if (fget(dot, itype, (char *)&fl.d, SZDOUBLE) == 0)
214: return (fp);
215: if (mkfault)
216: return (0);
217: dotinc = SZDOUBLE;
218: fpout('F', (char *)&fl.d);
219: break;
220:
221: case 'n':
222: case 'N':
223: printc('\n');
224: dotinc=0;
225: break;
226:
227: case '"':
228: dotinc=0;
229: while (*fp != '"' && *fp)
230: printc(*fp++);
231: if (*fp)
232: fp++;
233: break;
234:
235: case '^':
236: dot=inkdot(-dotinc*fcount);
237: return(fp);
238:
239: case '+':
240: dot=inkdot((WORD)fcount);
241: return(fp);
242:
243: case '-':
244: dot=inkdot(-(WORD)fcount);
245: return(fp);
246:
247: default:
248: error("bad modifier");
249: }
250: if ((itype & SPTYPE) != NOSP)
251: dot=inkdot(dotinc);
252: fcount--;
253: endline();
254: }
255:
256: return(fp);
257: }
258:
259: printesc(c)
260: {
261: c &= STRIP;
262: if (c == 0177)
263: printf("^?");
264: else if (c < SPC)
265: printf("^%c", c + '@');
266: else
267: printc(c);
268: }
269:
270: ADDR
271: inkdot(incr)
272: WORD incr;
273: {
274: ADDR newdot;
275:
276: newdot=dot+incr;
277: if ((incr >= 0 && newdot < dot)
278: || (incr < 0 && newdot > dot))
279: error("address wraparound");
280: return(newdot);
281: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.