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