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