1 # 2 /* 3 * 4 * UNIX debugger 5 * 6 */ 7 8 #include "defs.h" 9 static char sccsid[] = "@(#)output.c 4.1 05/14/81"; 10 #include <stdio.h> 11 12 13 INT mkfault; 14 INT infile; 15 INT outfile = 1; 16 L_INT maxpos; 17 L_INT maxoff; 18 INT radix = 16; 19 20 CHAR printbuf[MAXLIN]; 21 CHAR *printptr = printbuf; 22 CHAR *digitptr; 23 MSG TOODEEP; 24 25 26 eqstr(s1, s2) 27 REG STRING s1, s2; 28 { 29 REG STRING es1; 30 WHILE *s1++ == *s2 31 DO IF *s2++ == 0 32 THEN return(1); 33 FI 34 OD 35 return(0); 36 } 37 38 length(s) 39 REG STRING s; 40 { 41 INT n = 0; 42 WHILE *s++ DO n++; OD 43 return(n); 44 } 45 46 printc(c) 47 CHAR c; 48 { 49 CHAR d; 50 STRING q; 51 INT posn, tabs, p; 52 53 IF mkfault 54 THEN return; 55 ELIF (*printptr=c)==EOR 56 THEN tabs=0; posn=0; q=printbuf; 57 FOR p=0; p<printptr-printbuf; p++ 58 DO d=printbuf[p]; 59 IF (p&7)==0 ANDF posn 60 THEN tabs++; posn=0; 61 FI 62 IF d==SP 63 THEN posn++; 64 ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD 65 WHILE posn>0 DO *q++=SP; posn--; OD 66 *q++=d; 67 FI 68 OD 69 *q++=EOR; 70 #ifdef EDDT 71 printptr=printbuf; do putchar(*printptr++); while (printptr<q); 72 #else 73 write(outfile,printbuf,q-printbuf); 74 #endif 75 printptr=printbuf; 76 ELIF c==TB 77 THEN *printptr++=SP; 78 WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD 79 ELIF c 80 THEN printptr++; 81 FI 82 } 83 84 charpos() 85 { return(printptr-printbuf); 86 } 87 88 flushbuf() 89 { IF printptr!=printbuf 90 THEN printc(EOR); 91 FI 92 } 93 94 printf(fmat,a1) 95 STRING fmat; 96 STRING *a1; 97 { 98 STRING fptr, s; 99 INT *vptr; 100 L_INT *dptr; 101 L_REAL *rptr; 102 INT width, prec; 103 CHAR c, adj; 104 INT x, decpt, n; 105 L_INT lx; 106 CHAR digits[64]; 107 108 fptr = fmat; dptr = vptr = &a1; 109 110 WHILE c = *fptr++ 111 DO IF c!='%' 112 THEN printc(c); 113 ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI 114 width=convert(&fptr); 115 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI 116 digitptr=digits; 117 #ifndef vax 118 dptr=rptr=vptr; lx = *dptr; x = *vptr++; 119 #else 120 rptr=dptr; x = shorten(lx = *dptr++); 121 #endif 122 s=0; 123 switch (c = *fptr++) { 124 125 case 'd': 126 case 'u': 127 printnum(x,c,10); break; 128 case 'o': 129 #ifndef vax 130 printoct(0,x,0); break; 131 #else 132 printoct(itol(0,x),0); break; 133 #endif 134 case 'q': 135 lx=x; printoct(lx,-1); break; 136 case 'x': 137 #ifndef vax 138 printdbl(0,x,c,16); break; 139 #else 140 printdbl(itol(0,x),c,16); break; 141 #endif 142 case 'r': 143 printdbl(lx=x,c,radix); break; 144 case 'R': 145 printdbl(lx,c,radix); vptr++; break; 146 case 'Y': 147 printdate(lx); vptr++; break; 148 case 'D': 149 case 'U': 150 printdbl(lx,c,10); vptr++; break; 151 case 'O': 152 printoct(lx,0); vptr++; break; 153 case 'Q': 154 printoct(lx,-1); vptr++; break; 155 case 'X': 156 printdbl(lx,'x',16); vptr++; break; 157 case 'c': 158 printc(x); break; 159 case 's': 160 #ifndef vax 161 s=x; break; 162 #else 163 s=lx; break; 164 #endif 165 #ifndef EDDT 166 case 'f': 167 case 'F': 168 #ifdef vax 169 dptr++; 170 sprintf(s=digits,"%+.16e",*rptr,*(rptr+4)); prec= -1; break; 171 #else 172 vptr += 7; 173 s=ecvt(*rptr, prec, &decpt, &n); 174 *digitptr++=(n?'-':'+'); 175 *digitptr++ = (decpt<=0 ? '0' : *s++); 176 IF decpt>0 THEN decpt--; FI 177 *digitptr++ = '.'; 178 WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD 179 WHILE *--digitptr=='0' DONE 180 digitptr += (digitptr-digits>=3 ? 1 : 2); 181 IF decpt 182 THEN *digitptr++ = 'e'; printnum(decpt,'d',10); 183 FI 184 s=0; prec = -1; break; 185 #endif 186 #endif 187 case 'm': 188 vptr--; break; 189 case 'M': 190 width=x; break; 191 case 'T': 192 case 't': 193 IF c=='T' 194 THEN width=x; 195 #ifndef vax 196 ELSE vptr--; 197 #else 198 ELSE dptr--; 199 #endif 200 FI 201 IF width 202 THEN width -= charpos()%width; 203 FI 204 break; 205 default: 206 #ifndef vax 207 printc(c); vptr--; 208 #else 209 printc(c); dptr--; 210 #endif 211 } 212 213 IF s==0 214 THEN *digitptr=0; s=digits; 215 FI 216 n=length(s); 217 n=(prec<n ANDF prec>=0 ? prec : n); 218 width -= n; 219 IF adj=='r' 220 THEN WHILE width-- > 0 221 DO printc(SP); OD 222 FI 223 WHILE n-- DO printc(*s++); OD 224 WHILE width-- > 0 DO printc(SP); OD 225 digitptr=digits; 226 FI 227 OD 228 } 229 230 printdate(tvec) 231 L_INT tvec; 232 { 233 REG INT i; 234 REG STRING timeptr; 235 #ifndef EDDT 236 timeptr = ctime(&tvec); 237 #else 238 timeptr="????????????????????????"; 239 #endif 240 FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD 241 FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD 242 } /*printdate*/ 243 244 prints(s) 245 char *s; 246 { printf("%s",s); 247 } 248 249 newline() 250 { 251 printc(EOR); 252 } 253 254 convert(cp) 255 REG STRING *cp; 256 { 257 REG CHAR c; 258 INT n; 259 n=0; 260 WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD 261 (*cp)--; 262 return(n); 263 } 264 265 printnum(n,fmat,base) 266 REG INT n; 267 { 268 REG CHAR k; 269 REG INT *dptr; 270 INT digs[15]; 271 dptr=digs; 272 IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI 273 n &= 0xffff; 274 WHILE n 275 DO *dptr++ = ((POS)(n&0xffff))%base; 276 n=((POS)(n&0xffff))/base; 277 OD 278 IF dptr==digs THEN *dptr++=0; FI 279 WHILE dptr!=digs 280 DO k = *--dptr; 281 *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 282 OD 283 } 284 285 printoct(o,s) 286 L_INT o; 287 INT s; 288 { 289 INT i; 290 L_INT po = o; 291 CHAR digs[12]; 292 293 IF s 294 THEN IF po<0 295 THEN po = -po; *digitptr++='-'; 296 ELSE IF s>0 THEN *digitptr++='+'; FI 297 FI 298 FI 299 FOR i=0;i<=11;i++ 300 DO digs[i] = po&7; po >>= 3; OD 301 digs[10] &= 03; digs[11]=0; 302 FOR i=11;i>=0;i-- 303 DO IF digs[i] THEN break; FI OD 304 FOR i++;i>=0;i-- 305 DO *digitptr++=digs[i]+'0'; OD 306 } 307 308 #ifndef vax 309 printdbl(lx,ly,fmat,base) 310 INT lx, ly; char fmat; int base; 311 #else 312 printdbl(lxy,fmat,base) 313 L_INT lxy; char fmat; int base; 314 #endif 315 { int digs[20]; int *dptr; char k; 316 #ifndef MULD2 317 register char *cp1; 318 cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;} 319 sprintf(cp1,base==16 ? "%X" : "%D",lxy); 320 cp1=digs; while (*digitptr++= *cp1++); --digitptr; 321 #else 322 L_REAL f ,g; long q; 323 #ifdef vax 324 INT lx,ly; 325 ly=lxy; lx=(lxy>>16)&0xFFFF; 326 #endif 327 dptr=digs; 328 IF fmat=='D' ORF fmat=='r' 329 THEN f=itol(lx,ly); 330 IF f<0 THEN *digitptr++='-'; f = -f; FI 331 ELSE 332 IF lx==-1 333 THEN *digitptr++='-'; f=leng(-ly); 334 ELSE f=leng(lx); f *= itol(1,0); f += leng(ly); 335 FI 336 IF fmat=='x' THEN *digitptr++='#'; FI 337 FI 338 WHILE f 339 DO q=f/base; g=q; 340 *dptr++ = f-g*base; 341 f=q; 342 OD 343 IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI 344 WHILE dptr!=digs 345 DO k = *--dptr; 346 *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 347 OD 348 #endif 349 } 350 351 #define MAXIFD 5 352 struct { 353 int fd; 354 int r9; 355 } istack[MAXIFD]; 356 int ifiledepth; 357 358 iclose(stack, err) 359 { 360 IF err 361 THEN IF infile 362 THEN close(infile); infile=0; 363 FI 364 WHILE --ifiledepth >= 0 365 DO IF istack[ifiledepth].fd 366 THEN close(istack[ifiledepth].fd); 367 FI 368 OD 369 ifiledepth = 0; 370 ELIF stack == 0 371 THEN IF infile 372 THEN close(infile); infile=0; 373 FI 374 ELIF stack > 0 375 THEN IF ifiledepth >= MAXIFD 376 THEN error(TOODEEP); 377 FI 378 istack[ifiledepth].fd = infile; 379 istack[ifiledepth].r9 = var[9]; 380 ifiledepth++; 381 infile = 0; 382 ELSE IF infile 383 THEN close(infile); infile=0; 384 FI 385 IF ifiledepth > 0 386 THEN infile = istack[--ifiledepth].fd; 387 var[9] = istack[ifiledepth].r9; 388 FI 389 FI 390 } 391 392 oclose() 393 { 394 IF outfile!=1 395 THEN flushbuf(); close(outfile); outfile=1; 396 FI 397 } 398 399 endline() 400 { 401 402 if (maxpos <= charpos()) 403 printf("\n"); 404 } 405