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