|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9:
10:
11: int infile = STDIN;
12: int outfile = STDOUT;
13: int maxpos = MAXPOS;
14: int radix = 0; /* magic multi-radix */
15:
16: static char printbuf[MAXLIN];
17: static char *printptr = printbuf;
18: static char *digitptr;
19:
20: printc(c)
21: char c;
22: {
23: char d;
24: register char *q;
25: register int p;
26: int posn, tabs;
27:
28: if (mkfault)
29: return;
30: else if ((*printptr=c)==EOR) {
31: tabs=0;
32: posn=0;
33: q=printbuf;
34: for (p=0; p<printptr-printbuf; p++) {
35: d=printbuf[p];
36: if ((p&7)==0 && posn) {
37: tabs++;
38: posn=0;
39: }
40: if (d==SPC)
41: posn++;
42: else {
43: while (tabs>0) {
44: *q++=TB;
45: tabs--;
46: }
47: while (posn>0) {
48: *q++=SPC;
49: posn--;
50: }
51: *q++=d;
52: }
53: }
54: *q++=EOR;
55: write(outfile,printbuf,q-printbuf);
56: printptr=printbuf;
57: } else if (c==TB) {
58: *printptr++=SPC;
59: while ((printptr-printbuf)&7)
60: *printptr++=SPC;
61: } else if (c)
62: printptr++;
63: if (printptr >= &printbuf[MAXLIN-9]) {
64: write(outfile, printbuf, printptr - printbuf);
65: printptr = printbuf;
66: }
67: }
68:
69: charpos()
70: {
71: return(printptr-printbuf);
72: }
73:
74: flushbuf()
75: {
76: if (printptr!=printbuf)
77: printc(EOR);
78: }
79:
80: /*
81: * our very own printf. yes.
82: * `int' things (like %d) expect ints
83: * `long' things (like %D) expect WORDs
84: * there is no %f, for reasons to horrible to explain here
85: *
86: * declare lots of silly arguments because of the cray's calling sequence
87: */
88:
89: printf(fmat, a1, a2, a3, a4, a5, a6, a7, a8, a9)
90: char *fmat;
91: int a1;
92: {
93: register int *ap;
94: register char *s;
95: register int n, width;
96: int prec;
97: char *fptr;
98: int *ip;
99: WORD *lp;
100: char **sp;
101: char c, adj;
102: char digits[64];
103:
104: fptr = fmat;
105: ap = &a1; /* hack */
106: while (c = *fptr++) {
107: if (c!='%') {
108: printc(c);
109: continue;
110: }
111: adj = 'r';
112: if (*fptr=='-') {
113: adj = 'l';
114: fptr++;
115: }
116: width=convert(&fptr);
117: prec = -1;
118: if (*fptr=='.') {
119: fptr++;
120: prec=convert(&fptr);
121: }
122: digitptr=digits;
123: s = NULL;
124: ip = (int *)ap;
125: lp = (long *)ap;
126: sp = (char **)ap;
127: switch (c = *fptr++) {
128:
129: case 'd':
130: printsigned((WORD)*ip++, 10);
131: ap = (int *)ip;
132: break;
133:
134: case 'D':
135: printsigned((WORD)*lp++, 10);
136: ap = (int *)lp;
137: break;
138:
139: case 'u':
140: printus((WORD)*ip++, 10);
141: ap = (int *)ip;
142: break;
143:
144: case 'U':
145: printus((WORD)*lp++, 10);
146: ap = (int *)lp;
147: break;
148:
149: case 'o':
150: printus((WORD)*ip++, 8);
151: ap = (int *)ip;
152: break;
153:
154: case 'O':
155: printus((WORD)*lp++, 8);
156: ap = (int *)lp;
157: break;
158:
159: case 'q':
160: printsigned((WORD)*ip++, 8);
161: ap = (int *)ip;
162: break;
163:
164: case 'Q':
165: printsigned((WORD)*lp++, 8);
166: ap = (int *)lp;
167: break;
168:
169: case 'x':
170: printus((WORD)*ip++, 16);
171: ap = (int *)ip;
172: break;
173:
174: case 'X':
175: printus((WORD)*lp++, 16);
176: ap = (int *)lp;
177: break;
178:
179: case 'r':
180: printmaybe((WORD)*ip++, radix == 0 ? DEFRADIX : radix);
181: ap = (int *)ip;
182: break;
183:
184: case 'R':
185: printmaybe((WORD)*lp++, radix == 0 ? DEFRADIX : radix);
186: ap = (int *)lp;
187: break;
188:
189: case 'c':
190: printc((char)*ap++);
191: break;
192:
193: case 's':
194: s = *sp++;
195: ap = (int *)sp;
196: break;
197:
198: /* m is for `move' */
199: case 'm':
200: break;
201:
202: case 'M':
203: width = *ap++;
204: break;
205:
206: case 'T':
207: width = *ap++;
208: /* fall in */
209: case 't':
210: if (width)
211: width -= charpos()%width;
212: break;
213:
214: default:
215: printc(c);
216: break;
217: }
218: if (s == NULL) {
219: *digitptr = 0;
220: s = digits;
221: }
222: n = strlen(s);
223: if (prec >= 0 && prec < n)
224: n = prec;
225: width -= n;
226: if (adj=='r')
227: while (width-- > 0)
228: printc(SPC);
229: while (n--)
230: printc(*s++);
231: while (width-- > 0)
232: printc(SPC);
233: digitptr=digits;
234: }
235: }
236:
237: prints(s)
238: char *s;
239: {
240: printf("%s",s);
241: }
242:
243: newline()
244: {
245: printc(EOR);
246: }
247:
248: convert(cp)
249: register char **cp;
250: {
251: register char c;
252: register int n;
253:
254: n=0;
255: while (isdigit(c = *(*cp)++))
256: n=n*10+c-'0';
257: (*cp)--;
258: return(n);
259: }
260:
261: printmaybe(n, base)
262: WORD n;
263: {
264: if (REALLYNEG(n))
265: printsigned(n, base);
266: else
267: printus(n, base);
268: }
269:
270: printsigned(n, base)
271: WORD n;
272: int base;
273: {
274:
275: if (n < 0) {
276: n = -n;
277: /* if (n < 0) what? */
278: *digitptr++ = '-';
279: }
280: printnum((unsigned long)n, base);
281: }
282:
283: printus(n, base)
284: WORD n;
285: int base;
286: {
287:
288: printnum((unsigned long)n, base);
289: }
290:
291: printnum(n, base)
292: unsigned long n;
293: int base;
294: {
295: unsigned long d;
296: register int r;
297: static char digits[] = "0123456789abcdef";
298:
299: if ((d = n / base) != 0) {
300: printnum(d, base);
301: r = n - (d * base);
302: }
303: else { /* hack for first digit */
304: r = n;
305: if (base == radix) {
306: if (r >= 10)
307: *digitptr++ = '0';
308: }
309: else if (radix == 0)
310: switch (base) {
311: case 16:
312: *digitptr++ = '#';
313: break;
314:
315: case 8:
316: if (r)
317: *digitptr++ = '0';
318: break;
319: }
320: }
321: if (r < sizeof(digits) - 1)
322: *digitptr++ = digits[r];
323: else
324: *digitptr++ = '?';
325: }
326:
327: #define MAXIFD 5
328: struct {
329: int fd;
330: int r9;
331: } istack[MAXIFD];
332: int ifiledepth;
333:
334: iclose(stack, err)
335: {
336: if (err) {
337: if (infile) {
338: close(infile);
339: infile=STDIN;
340: }
341: while (--ifiledepth >= 0)
342: if (istack[ifiledepth].fd)
343: close(istack[ifiledepth].fd);
344: ifiledepth = 0;
345: } else if (stack == 0) {
346: if (infile) {
347: close(infile);
348: infile=STDIN;
349: }
350: } else if (stack > 0) {
351: if (ifiledepth >= MAXIFD)
352: error("$<< nested too deeply");
353: istack[ifiledepth].fd = infile;
354: istack[ifiledepth].r9 = var[9];
355: ifiledepth++;
356: infile = STDIN;
357: } else {
358: if (infile) {
359: close(infile);
360: infile=STDIN;
361: }
362: if (ifiledepth > 0) {
363: infile = istack[--ifiledepth].fd;
364: var[9] = istack[ifiledepth].r9;
365: }
366: }
367: }
368:
369: oclose()
370: {
371: if (outfile!=1) {
372: flushbuf();
373: close(outfile);
374: outfile=STDOUT;
375: }
376: }
377:
378: endline()
379: {
380:
381: if (maxpos <= charpos())
382: newline();
383: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.