|
|
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 'Y':
190: printdate((long)*lp++);
191: ap = (int *)lp;
192: break;
193:
194: case 'c':
195: printc((char)*ap++);
196: break;
197:
198: case 's':
199: s = *sp++;
200: ap = (int *)sp;
201: break;
202:
203: /* m is for `move' */
204: case 'm':
205: break;
206:
207: case 'M':
208: width = *ap++;
209: break;
210:
211: case 'T':
212: width = *ap++;
213: /* fall in */
214: case 't':
215: if (width)
216: width -= charpos()%width;
217: break;
218:
219: default:
220: printc(c);
221: break;
222: }
223: if (s == NULL) {
224: *digitptr = 0;
225: s = digits;
226: }
227: n = strlen(s);
228: if (prec >= 0 && prec < n)
229: n = prec;
230: width -= n;
231: if (adj=='r')
232: while (width-- > 0)
233: printc(SPC);
234: while (n--)
235: printc(*s++);
236: while (width-- > 0)
237: printc(SPC);
238: digitptr=digits;
239: }
240: }
241:
242: printdate(tvec)
243: long tvec;
244: {
245: char *ctime();
246:
247: strcpy(digitptr, ctime(&tvec));
248: digitptr += strlen(digitptr) - 1; /* chop the newline */
249: }
250:
251: prints(s)
252: char *s;
253: {
254: printf("%s",s);
255: }
256:
257: newline()
258: {
259: printc(EOR);
260: }
261:
262: convert(cp)
263: register char **cp;
264: {
265: register char c;
266: register int n;
267:
268: n=0;
269: while (isdigit(c = *(*cp)++))
270: n=n*10+c-'0';
271: (*cp)--;
272: return(n);
273: }
274:
275: printmaybe(n, base)
276: WORD n;
277: {
278: if (REALLYNEG(n))
279: printsigned(n, base);
280: else
281: printus(n, base);
282: }
283:
284: printsigned(n, base)
285: WORD n;
286: int base;
287: {
288:
289: if (n < 0) {
290: n = -n;
291: /* if (n < 0) what? */
292: *digitptr++ = '-';
293: }
294: printnum((unsigned long)n, base);
295: }
296:
297: printus(n, base)
298: WORD n;
299: int base;
300: {
301:
302: printnum((unsigned long)n, base);
303: }
304:
305: printnum(n, base)
306: unsigned long n;
307: int base;
308: {
309: unsigned long d;
310: register int r;
311: static char digits[] = "0123456789abcdef";
312:
313: if ((d = n / base) != 0) {
314: printnum(d, base);
315: r = n - (d * base);
316: }
317: else { /* hack for first digit */
318: r = n;
319: if (base == radix) {
320: if (r >= 10)
321: *digitptr++ = '0';
322: }
323: else if (radix == 0)
324: switch (base) {
325: case 16:
326: *digitptr++ = '#';
327: break;
328:
329: case 8:
330: if (r)
331: *digitptr++ = '0';
332: break;
333: }
334: }
335: if (r < sizeof(digits) - 1)
336: *digitptr++ = digits[r];
337: else
338: *digitptr++ = '?';
339: }
340:
341: #define MAXIFD 5
342: struct {
343: int fd;
344: int r9;
345: } istack[MAXIFD];
346: int ifiledepth;
347:
348: iclose(stack, err)
349: {
350: if (err) {
351: if (infile) {
352: close(infile);
353: infile=STDIN;
354: }
355: while (--ifiledepth >= 0)
356: if (istack[ifiledepth].fd)
357: close(istack[ifiledepth].fd);
358: ifiledepth = 0;
359: } else if (stack == 0) {
360: if (infile) {
361: close(infile);
362: infile=STDIN;
363: }
364: } else if (stack > 0) {
365: if (ifiledepth >= MAXIFD)
366: error("$<< nested too deeply");
367: istack[ifiledepth].fd = infile;
368: istack[ifiledepth].r9 = var[9];
369: ifiledepth++;
370: infile = STDIN;
371: } else {
372: if (infile) {
373: close(infile);
374: infile=STDIN;
375: }
376: if (ifiledepth > 0) {
377: infile = istack[--ifiledepth].fd;
378: var[9] = istack[ifiledepth].r9;
379: }
380: }
381: }
382:
383: oclose()
384: {
385: if (outfile!=1) {
386: flushbuf();
387: close(outfile);
388: outfile=STDOUT;
389: }
390: }
391:
392: endline()
393: {
394:
395: if (maxpos <= charpos())
396: newline();
397: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.