|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.