|
|
1.1 ! root 1: /* ! 2: * ! 3: * UNIX debugger ! 4: * ! 5: */ ! 6: ! 7: #include "defs.h" ! 8: ! 9: INT mkfault; ! 10: INT infile; ! 11: INT outfile = 1; ! 12: L_INT maxpos; ! 13: L_INT maxoff; ! 14: INT radix = 16; ! 15: ! 16: CHAR printbuf[MAXLIN]; ! 17: CHAR *printptr = printbuf; ! 18: CHAR *digitptr; ! 19: ! 20: printc(c) ! 21: CHAR c; ! 22: { ! 23: CHAR d; ! 24: REG STRING q; ! 25: REG posn, tabs, p; ! 26: ! 27: IF mkfault ! 28: THEN return; ! 29: ELIF (*printptr=c)==EOR ! 30: THEN tabs=0; posn=0; q=printbuf; ! 31: FOR p=0; p<printptr-printbuf; p++ ! 32: DO d=printbuf[p]; ! 33: IF (p&7)==0 ANDF posn ! 34: THEN tabs++; posn=0; ! 35: FI ! 36: IF d==SP ! 37: THEN posn++; ! 38: ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD ! 39: WHILE posn>0 DO *q++=SP; posn--; OD ! 40: *q++=d; ! 41: FI ! 42: OD ! 43: *q++=EOR; ! 44: #ifdef EDDT ! 45: printptr=printbuf; do putchar(*printptr++); while (printptr<q); ! 46: #else ! 47: write(outfile,printbuf,q-printbuf); ! 48: #endif ! 49: printptr=printbuf; ! 50: ELIF c==TB ! 51: THEN *printptr++=SP; ! 52: WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD ! 53: ELIF c ! 54: THEN printptr++; ! 55: FI ! 56: } ! 57: ! 58: charpos() ! 59: { return(printptr-printbuf); ! 60: } ! 61: ! 62: flushbuf() ! 63: { IF printptr!=printbuf ! 64: THEN printc(EOR); ! 65: FI ! 66: } ! 67: ! 68: /* VARARGS1 */ ! 69: printf(fmat,a1) ! 70: STRING fmat; ! 71: STRING a1; ! 72: { ! 73: STRING fptr; ! 74: REG STRING s; ! 75: REG L_INT *dptr; ! 76: L_REAL *rptr; ! 77: REG width, prec; ! 78: CHAR c, adj; ! 79: INT x, n; ! 80: REG L_INT lx; ! 81: CHAR digits[64]; ! 82: ! 83: fptr = fmat; dptr = (L_INT *)&a1; ! 84: ! 85: WHILE c = *fptr++ ! 86: DO IF c!='%' ! 87: THEN printc(c); ! 88: ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI ! 89: width=convert(&fptr); ! 90: IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI ! 91: digitptr=digits; ! 92: rptr=(L_REAL *)dptr; x = lx = *dptr++; ! 93: s=0; ! 94: switch (c = *fptr++) { ! 95: ! 96: case 'd': ! 97: printnum(x, -10); break; ! 98: case 'u': ! 99: printnum((unsigned short)x, 10); break; ! 100: case 'o': ! 101: printnum((unsigned short)x, 8); break; ! 102: case 'q': ! 103: printnum(x, -8); break; ! 104: case 'x': ! 105: printnum((unsigned short)x, 16); break; ! 106: case 'z': ! 107: printnum((unsigned short)x, -16); break; ! 108: case 'R': ! 109: printnum(lx, radix); break; ! 110: case 'Y': ! 111: printdate(lx); break; ! 112: case 'D': ! 113: printnum(lx, -10); break; ! 114: case 'U': ! 115: printnum(lx, 10); break; ! 116: case 'O': ! 117: printnum(lx, 8); break; ! 118: case 'Q': ! 119: printnum(lx, -8); break; ! 120: case 'X': ! 121: printnum(lx, 16); break; ! 122: case 'Z': ! 123: printnum(lx, -16); break; ! 124: case 'c': ! 125: printc(x); break; ! 126: case 's': ! 127: s=(STRING)lx; break; ! 128: #ifndef EDDT ! 129: case 'f': ! 130: case 'F': ! 131: dptr++; ! 132: sprintf(s=digits, "%*.*f", width, prec, *rptr); prec= -1; break; ! 133: #endif ! 134: case 'm': ! 135: break; ! 136: case 'M': ! 137: width=x; break; ! 138: case 'T': ! 139: case 't': ! 140: IF c=='T' ! 141: THEN width=x; ! 142: ELSE dptr--; ! 143: FI ! 144: IF width ! 145: THEN width -= charpos()%width; ! 146: FI ! 147: break; ! 148: default: ! 149: printc(c); dptr--; ! 150: } ! 151: ! 152: IF s==0 ! 153: THEN *digitptr=0; s=digits; ! 154: FI ! 155: n=strlen(s); ! 156: n=(prec<n ANDF prec>=0 ? prec : n); ! 157: width -= n; ! 158: IF adj=='r' ! 159: THEN WHILE width-- > 0 ! 160: DO printc(SP); OD ! 161: FI ! 162: WHILE n-- DO printc(*s++); OD ! 163: WHILE width-- > 0 DO printc(SP); OD ! 164: digitptr=digits; ! 165: FI ! 166: OD ! 167: } ! 168: ! 169: printdate(tvec) ! 170: L_INT tvec; ! 171: { ! 172: REG i; ! 173: REG STRING timeptr; ! 174: STRING ctime(); ! 175: ! 176: #ifndef EDDT ! 177: timeptr = ctime(&tvec); ! 178: #else ! 179: timeptr="????????????????????????"; ! 180: #endif ! 181: FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD ! 182: FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD ! 183: } /*printdate*/ ! 184: ! 185: convert(cp) ! 186: REG STRING *cp; ! 187: { ! 188: REG CHAR c; ! 189: INT n; ! 190: n=0; ! 191: WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD ! 192: (*cp)--; ! 193: return(n); ! 194: } ! 195: ! 196: printnum(n, base) ! 197: REG POS n; ! 198: { ! 199: REG CHAR *dptr; ! 200: CHAR digs[15]; ! 201: dptr=digs; ! 202: IF base<0 THEN base = -base; ! 203: IF (L_INT)n<0 THEN n = -n; *digitptr++ = '-'; FI ! 204: FI ! 205: WHILE n ! 206: DO *dptr++ = n%base; ! 207: n /= base; ! 208: OD ! 209: IF dptr==digs THEN *dptr++=0; FI ! 210: WHILE dptr!=digs ! 211: DO n = *--dptr; ! 212: *digitptr++ = (n+(n<=9 ? '0' : 'a'-10)); ! 213: OD ! 214: } ! 215: ! 216: iclose() ! 217: { ! 218: IF infile ! 219: THEN close(infile); infile=0; ! 220: FI ! 221: } ! 222: ! 223: oclose() ! 224: { ! 225: IF outfile!=1 ! 226: THEN flushbuf(); close(outfile); outfile=1; ! 227: FI ! 228: } ! 229: ! 230: endline() ! 231: { ! 232: ! 233: if (maxpos <= charpos()) ! 234: printf("\n"); ! 235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.