|
|
1.1 ! root 1: # ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: ! 8: #include "defs.h" ! 9: SCCSID(@(#)output.c 2.3); ! 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: ! 24: ! 25: eqstr(s1, s2) ! 26: REG STRING s1, s2; ! 27: { ! 28: REG STRING es1; ! 29: es1 = s1+8; ! 30: WHILE *s1++ == *s2 ! 31: DO IF *s2++ == 0 ORF s1>=es1 ! 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: WHILE n ! 274: DO *dptr++ = ((POS)n)%base; ! 275: n=((POS)n)/base; ! 276: OD ! 277: IF dptr==digs THEN *dptr++=0; FI ! 278: WHILE dptr!=digs ! 279: DO k = *--dptr; ! 280: *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); ! 281: OD ! 282: } ! 283: ! 284: printoct(o,s) ! 285: L_INT o; ! 286: INT s; ! 287: { ! 288: INT i; ! 289: L_INT po = o; ! 290: CHAR digs[12]; ! 291: ! 292: IF s ! 293: THEN IF po<0 ! 294: THEN po = -po; *digitptr++='-'; ! 295: ELSE IF s>0 THEN *digitptr++='+'; FI ! 296: FI ! 297: FI ! 298: FOR i=0;i<=11;i++ ! 299: DO digs[i] = po&7; po >>= 3; OD ! 300: digs[10] &= 03; digs[11]=0; ! 301: FOR i=11;i>=0;i-- ! 302: DO IF digs[i] THEN break; FI OD ! 303: FOR i++;i>=0;i-- ! 304: DO *digitptr++=digs[i]+'0'; OD ! 305: } ! 306: ! 307: #ifndef vax ! 308: printdbl(lx,ly,fmat,base) ! 309: INT lx, ly; char fmat; int base; ! 310: #else ! 311: printdbl(lxy,fmat,base) ! 312: L_INT lxy; char fmat; int base; ! 313: #endif ! 314: { int digs[20]; int *dptr; char k; ! 315: #ifndef MULD2 ! 316: register char *cp1; ! 317: cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;} ! 318: sprintf(cp1,base==16 ? "%X" : "%D",lxy); ! 319: cp1=digs; while (*digitptr++= *cp1++); --digitptr; ! 320: #else ! 321: L_REAL f ,g; long q; ! 322: #ifdef vax ! 323: INT lx,ly; ! 324: ly=lxy; lx=(lxy>>16)&0xFFFF; ! 325: #endif ! 326: dptr=digs; ! 327: IF fmat=='D' ORF fmat=='r' ! 328: THEN f=itol(lx,ly); ! 329: IF f<0 THEN *digitptr++='-'; f = -f; FI ! 330: ELSE ! 331: IF lx==-1 ! 332: THEN *digitptr++='-'; f=leng(-ly); ! 333: ELSE f=leng(lx); f *= itol(1,0); f += leng(ly); ! 334: FI ! 335: IF fmat=='x' THEN *digitptr++='#'; FI ! 336: FI ! 337: WHILE f ! 338: DO q=f/base; g=q; ! 339: *dptr++ = f-g*base; ! 340: f=q; ! 341: OD ! 342: IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI ! 343: WHILE dptr!=digs ! 344: DO k = *--dptr; ! 345: *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); ! 346: OD ! 347: #endif ! 348: } ! 349: ! 350: iclose() ! 351: { ! 352: IF infile ! 353: THEN close(infile); infile=0; ! 354: FI ! 355: } ! 356: ! 357: oclose() ! 358: { ! 359: IF outfile!=1 ! 360: THEN flushbuf(); close(outfile); outfile=1; ! 361: FI ! 362: } ! 363: ! 364: endline() ! 365: { ! 366: #ifndef vax ! 367: IF charpos()>=maxpos ! 368: #else ! 369: IF maxpos<=charpos() ! 370: #endif ! 371: THEN printf("\n"); ! 372: FI ! 373: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.