|
|
1.1 root 1: /*
2: *
3: * UNIX debugger
4: *
5: */
6:
7: #include "defs.h"
8:
9: INT mkfault;
10: INT infile;
11: INT outfile = 1;
12: L_INT maxpos;
13: L_INT maxoff;
14: INT radix = 16;
15:
16: CHAR printbuf[MAXLIN];
17: CHAR *printptr = printbuf;
18: CHAR *digitptr;
19:
20: printc(c)
21: CHAR c;
22: {
23: CHAR d;
24: REG STRING q;
25: REG posn, tabs, p;
26:
27: IF mkfault
28: THEN return;
29: ELIF (*printptr=c)==EOR
30: THEN tabs=0; posn=0; q=printbuf;
31: FOR p=0; p<printptr-printbuf; p++
32: DO d=printbuf[p];
33: IF (p&7)==0 ANDF posn
34: THEN tabs++; posn=0;
35: FI
36: IF d==SP
37: THEN posn++;
38: ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
39: WHILE posn>0 DO *q++=SP; posn--; OD
40: *q++=d;
41: FI
42: OD
43: *q++=EOR;
44: #ifdef EDDT
45: printptr=printbuf; do putchar(*printptr++); while (printptr<q);
46: #else
47: write(outfile,printbuf,q-printbuf);
48: #endif
49: printptr=printbuf;
50: ELIF c==TB
51: THEN *printptr++=SP;
52: WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
53: ELIF c
54: THEN printptr++;
55: FI
56: }
57:
58: charpos()
59: { return(printptr-printbuf);
60: }
61:
62: flushbuf()
63: { IF printptr!=printbuf
64: THEN printc(EOR);
65: FI
66: }
67:
68: /* VARARGS1 */
69: printf(fmat,a1)
70: STRING fmat;
71: STRING a1;
72: {
73: STRING fptr;
74: REG STRING s;
75: REG L_INT *dptr;
76: L_REAL *rptr;
77: REG width, prec;
78: CHAR c, adj;
79: INT x, n;
80: REG L_INT lx;
81: CHAR digits[64];
82:
83: fptr = fmat; dptr = (L_INT *)&a1;
84:
85: WHILE c = *fptr++
86: DO IF c!='%'
87: THEN printc(c);
88: ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
89: width=convert(&fptr);
90: IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
91: digitptr=digits;
92: rptr=(L_REAL *)dptr; x = lx = *dptr++;
93: s=0;
94: switch (c = *fptr++) {
95:
96: case 'd':
97: printnum(x, -10); break;
98: case 'u':
99: printnum((unsigned short)x, 10); break;
100: case 'o':
101: printnum((unsigned short)x, 8); break;
102: case 'q':
103: printnum(x, -8); break;
104: case 'x':
105: printnum((unsigned short)x, 16); break;
106: case 'z':
107: printnum((unsigned short)x, -16); break;
108: case 'R':
109: printnum(lx, radix); break;
110: case 'Y':
111: printdate(lx); break;
112: case 'D':
113: printnum(lx, -10); break;
114: case 'U':
115: printnum(lx, 10); break;
116: case 'O':
117: printnum(lx, 8); break;
118: case 'Q':
119: printnum(lx, -8); break;
120: case 'X':
121: printnum(lx, 16); break;
122: case 'Z':
123: printnum(lx, -16); break;
124: case 'c':
125: printc(x); break;
126: case 's':
127: s=(STRING)lx; break;
128: #ifndef EDDT
129: case 'f':
130: case 'F':
131: dptr++;
132: sprintf(s=digits, "%*.*f", width, prec, *rptr); prec= -1; break;
133: #endif
134: case 'm':
135: break;
136: case 'M':
137: width=x; break;
138: case 'T':
139: case 't':
140: IF c=='T'
141: THEN width=x;
142: ELSE dptr--;
143: FI
144: IF width
145: THEN width -= charpos()%width;
146: FI
147: break;
148: default:
149: printc(c); dptr--;
150: }
151:
152: IF s==0
153: THEN *digitptr=0; s=digits;
154: FI
155: n=strlen(s);
156: n=(prec<n ANDF prec>=0 ? prec : n);
157: width -= n;
158: IF adj=='r'
159: THEN WHILE width-- > 0
160: DO printc(SP); OD
161: FI
162: WHILE n-- DO printc(*s++); OD
163: WHILE width-- > 0 DO printc(SP); OD
164: digitptr=digits;
165: FI
166: OD
167: }
168:
169: printdate(tvec)
170: L_INT tvec;
171: {
172: REG i;
173: REG STRING timeptr;
174: STRING ctime();
175:
176: #ifndef EDDT
177: timeptr = ctime(&tvec);
178: #else
179: timeptr="????????????????????????";
180: #endif
181: FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
182: FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
183: } /*printdate*/
184:
185: convert(cp)
186: REG STRING *cp;
187: {
188: REG CHAR c;
189: INT n;
190: n=0;
191: WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
192: (*cp)--;
193: return(n);
194: }
195:
196: printnum(n, base)
197: REG POS n;
198: {
199: REG CHAR *dptr;
200: CHAR digs[15];
201: dptr=digs;
202: IF base<0 THEN base = -base;
203: IF (L_INT)n<0 THEN n = -n; *digitptr++ = '-'; FI
204: FI
205: WHILE n
206: DO *dptr++ = n%base;
207: n /= base;
208: OD
209: IF dptr==digs THEN *dptr++=0; FI
210: WHILE dptr!=digs
211: DO n = *--dptr;
212: *digitptr++ = (n+(n<=9 ? '0' : 'a'-10));
213: OD
214: }
215:
216: iclose()
217: {
218: IF infile
219: THEN close(infile); infile=0;
220: FI
221: }
222:
223: oclose()
224: {
225: IF outfile!=1
226: THEN flushbuf(); close(outfile); outfile=1;
227: FI
228: }
229:
230: endline()
231: {
232:
233: if (maxpos <= charpos())
234: printf("\n");
235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.