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