1*3762Sroot # 2*3762Sroot /* 3*3762Sroot * 4*3762Sroot * UNIX debugger 5*3762Sroot * 6*3762Sroot */ 7*3762Sroot 8*3762Sroot #include "defs.h" 9*3762Sroot static char sccsid[] = "@(#)output.c 4.1 05/14/81"; 10*3762Sroot #include <stdio.h> 11*3762Sroot 12*3762Sroot 13*3762Sroot INT mkfault; 14*3762Sroot INT infile; 15*3762Sroot INT outfile = 1; 16*3762Sroot L_INT maxpos; 17*3762Sroot L_INT maxoff; 18*3762Sroot INT radix = 16; 19*3762Sroot 20*3762Sroot CHAR printbuf[MAXLIN]; 21*3762Sroot CHAR *printptr = printbuf; 22*3762Sroot CHAR *digitptr; 23*3762Sroot MSG TOODEEP; 24*3762Sroot 25*3762Sroot 26*3762Sroot eqstr(s1, s2) 27*3762Sroot REG STRING s1, s2; 28*3762Sroot { 29*3762Sroot REG STRING es1; 30*3762Sroot WHILE *s1++ == *s2 31*3762Sroot DO IF *s2++ == 0 32*3762Sroot THEN return(1); 33*3762Sroot FI 34*3762Sroot OD 35*3762Sroot return(0); 36*3762Sroot } 37*3762Sroot 38*3762Sroot length(s) 39*3762Sroot REG STRING s; 40*3762Sroot { 41*3762Sroot INT n = 0; 42*3762Sroot WHILE *s++ DO n++; OD 43*3762Sroot return(n); 44*3762Sroot } 45*3762Sroot 46*3762Sroot printc(c) 47*3762Sroot CHAR c; 48*3762Sroot { 49*3762Sroot CHAR d; 50*3762Sroot STRING q; 51*3762Sroot INT posn, tabs, p; 52*3762Sroot 53*3762Sroot IF mkfault 54*3762Sroot THEN return; 55*3762Sroot ELIF (*printptr=c)==EOR 56*3762Sroot THEN tabs=0; posn=0; q=printbuf; 57*3762Sroot FOR p=0; p<printptr-printbuf; p++ 58*3762Sroot DO d=printbuf[p]; 59*3762Sroot IF (p&7)==0 ANDF posn 60*3762Sroot THEN tabs++; posn=0; 61*3762Sroot FI 62*3762Sroot IF d==SP 63*3762Sroot THEN posn++; 64*3762Sroot ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD 65*3762Sroot WHILE posn>0 DO *q++=SP; posn--; OD 66*3762Sroot *q++=d; 67*3762Sroot FI 68*3762Sroot OD 69*3762Sroot *q++=EOR; 70*3762Sroot #ifdef EDDT 71*3762Sroot printptr=printbuf; do putchar(*printptr++); while (printptr<q); 72*3762Sroot #else 73*3762Sroot write(outfile,printbuf,q-printbuf); 74*3762Sroot #endif 75*3762Sroot printptr=printbuf; 76*3762Sroot ELIF c==TB 77*3762Sroot THEN *printptr++=SP; 78*3762Sroot WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD 79*3762Sroot ELIF c 80*3762Sroot THEN printptr++; 81*3762Sroot FI 82*3762Sroot } 83*3762Sroot 84*3762Sroot charpos() 85*3762Sroot { return(printptr-printbuf); 86*3762Sroot } 87*3762Sroot 88*3762Sroot flushbuf() 89*3762Sroot { IF printptr!=printbuf 90*3762Sroot THEN printc(EOR); 91*3762Sroot FI 92*3762Sroot } 93*3762Sroot 94*3762Sroot printf(fmat,a1) 95*3762Sroot STRING fmat; 96*3762Sroot STRING *a1; 97*3762Sroot { 98*3762Sroot STRING fptr, s; 99*3762Sroot INT *vptr; 100*3762Sroot L_INT *dptr; 101*3762Sroot L_REAL *rptr; 102*3762Sroot INT width, prec; 103*3762Sroot CHAR c, adj; 104*3762Sroot INT x, decpt, n; 105*3762Sroot L_INT lx; 106*3762Sroot CHAR digits[64]; 107*3762Sroot 108*3762Sroot fptr = fmat; dptr = vptr = &a1; 109*3762Sroot 110*3762Sroot WHILE c = *fptr++ 111*3762Sroot DO IF c!='%' 112*3762Sroot THEN printc(c); 113*3762Sroot ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI 114*3762Sroot width=convert(&fptr); 115*3762Sroot IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI 116*3762Sroot digitptr=digits; 117*3762Sroot #ifndef vax 118*3762Sroot dptr=rptr=vptr; lx = *dptr; x = *vptr++; 119*3762Sroot #else 120*3762Sroot rptr=dptr; x = shorten(lx = *dptr++); 121*3762Sroot #endif 122*3762Sroot s=0; 123*3762Sroot switch (c = *fptr++) { 124*3762Sroot 125*3762Sroot case 'd': 126*3762Sroot case 'u': 127*3762Sroot printnum(x,c,10); break; 128*3762Sroot case 'o': 129*3762Sroot #ifndef vax 130*3762Sroot printoct(0,x,0); break; 131*3762Sroot #else 132*3762Sroot printoct(itol(0,x),0); break; 133*3762Sroot #endif 134*3762Sroot case 'q': 135*3762Sroot lx=x; printoct(lx,-1); break; 136*3762Sroot case 'x': 137*3762Sroot #ifndef vax 138*3762Sroot printdbl(0,x,c,16); break; 139*3762Sroot #else 140*3762Sroot printdbl(itol(0,x),c,16); break; 141*3762Sroot #endif 142*3762Sroot case 'r': 143*3762Sroot printdbl(lx=x,c,radix); break; 144*3762Sroot case 'R': 145*3762Sroot printdbl(lx,c,radix); vptr++; break; 146*3762Sroot case 'Y': 147*3762Sroot printdate(lx); vptr++; break; 148*3762Sroot case 'D': 149*3762Sroot case 'U': 150*3762Sroot printdbl(lx,c,10); vptr++; break; 151*3762Sroot case 'O': 152*3762Sroot printoct(lx,0); vptr++; break; 153*3762Sroot case 'Q': 154*3762Sroot printoct(lx,-1); vptr++; break; 155*3762Sroot case 'X': 156*3762Sroot printdbl(lx,'x',16); vptr++; break; 157*3762Sroot case 'c': 158*3762Sroot printc(x); break; 159*3762Sroot case 's': 160*3762Sroot #ifndef vax 161*3762Sroot s=x; break; 162*3762Sroot #else 163*3762Sroot s=lx; break; 164*3762Sroot #endif 165*3762Sroot #ifndef EDDT 166*3762Sroot case 'f': 167*3762Sroot case 'F': 168*3762Sroot #ifdef vax 169*3762Sroot dptr++; 170*3762Sroot sprintf(s=digits,"%+.16e",*rptr,*(rptr+4)); prec= -1; break; 171*3762Sroot #else 172*3762Sroot vptr += 7; 173*3762Sroot s=ecvt(*rptr, prec, &decpt, &n); 174*3762Sroot *digitptr++=(n?'-':'+'); 175*3762Sroot *digitptr++ = (decpt<=0 ? '0' : *s++); 176*3762Sroot IF decpt>0 THEN decpt--; FI 177*3762Sroot *digitptr++ = '.'; 178*3762Sroot WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD 179*3762Sroot WHILE *--digitptr=='0' DONE 180*3762Sroot digitptr += (digitptr-digits>=3 ? 1 : 2); 181*3762Sroot IF decpt 182*3762Sroot THEN *digitptr++ = 'e'; printnum(decpt,'d',10); 183*3762Sroot FI 184*3762Sroot s=0; prec = -1; break; 185*3762Sroot #endif 186*3762Sroot #endif 187*3762Sroot case 'm': 188*3762Sroot vptr--; break; 189*3762Sroot case 'M': 190*3762Sroot width=x; break; 191*3762Sroot case 'T': 192*3762Sroot case 't': 193*3762Sroot IF c=='T' 194*3762Sroot THEN width=x; 195*3762Sroot #ifndef vax 196*3762Sroot ELSE vptr--; 197*3762Sroot #else 198*3762Sroot ELSE dptr--; 199*3762Sroot #endif 200*3762Sroot FI 201*3762Sroot IF width 202*3762Sroot THEN width -= charpos()%width; 203*3762Sroot FI 204*3762Sroot break; 205*3762Sroot default: 206*3762Sroot #ifndef vax 207*3762Sroot printc(c); vptr--; 208*3762Sroot #else 209*3762Sroot printc(c); dptr--; 210*3762Sroot #endif 211*3762Sroot } 212*3762Sroot 213*3762Sroot IF s==0 214*3762Sroot THEN *digitptr=0; s=digits; 215*3762Sroot FI 216*3762Sroot n=length(s); 217*3762Sroot n=(prec<n ANDF prec>=0 ? prec : n); 218*3762Sroot width -= n; 219*3762Sroot IF adj=='r' 220*3762Sroot THEN WHILE width-- > 0 221*3762Sroot DO printc(SP); OD 222*3762Sroot FI 223*3762Sroot WHILE n-- DO printc(*s++); OD 224*3762Sroot WHILE width-- > 0 DO printc(SP); OD 225*3762Sroot digitptr=digits; 226*3762Sroot FI 227*3762Sroot OD 228*3762Sroot } 229*3762Sroot 230*3762Sroot printdate(tvec) 231*3762Sroot L_INT tvec; 232*3762Sroot { 233*3762Sroot REG INT i; 234*3762Sroot REG STRING timeptr; 235*3762Sroot #ifndef EDDT 236*3762Sroot timeptr = ctime(&tvec); 237*3762Sroot #else 238*3762Sroot timeptr="????????????????????????"; 239*3762Sroot #endif 240*3762Sroot FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD 241*3762Sroot FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD 242*3762Sroot } /*printdate*/ 243*3762Sroot 244*3762Sroot prints(s) 245*3762Sroot char *s; 246*3762Sroot { printf("%s",s); 247*3762Sroot } 248*3762Sroot 249*3762Sroot newline() 250*3762Sroot { 251*3762Sroot printc(EOR); 252*3762Sroot } 253*3762Sroot 254*3762Sroot convert(cp) 255*3762Sroot REG STRING *cp; 256*3762Sroot { 257*3762Sroot REG CHAR c; 258*3762Sroot INT n; 259*3762Sroot n=0; 260*3762Sroot WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD 261*3762Sroot (*cp)--; 262*3762Sroot return(n); 263*3762Sroot } 264*3762Sroot 265*3762Sroot printnum(n,fmat,base) 266*3762Sroot REG INT n; 267*3762Sroot { 268*3762Sroot REG CHAR k; 269*3762Sroot REG INT *dptr; 270*3762Sroot INT digs[15]; 271*3762Sroot dptr=digs; 272*3762Sroot IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI 273*3762Sroot n &= 0xffff; 274*3762Sroot WHILE n 275*3762Sroot DO *dptr++ = ((POS)(n&0xffff))%base; 276*3762Sroot n=((POS)(n&0xffff))/base; 277*3762Sroot OD 278*3762Sroot IF dptr==digs THEN *dptr++=0; FI 279*3762Sroot WHILE dptr!=digs 280*3762Sroot DO k = *--dptr; 281*3762Sroot *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 282*3762Sroot OD 283*3762Sroot } 284*3762Sroot 285*3762Sroot printoct(o,s) 286*3762Sroot L_INT o; 287*3762Sroot INT s; 288*3762Sroot { 289*3762Sroot INT i; 290*3762Sroot L_INT po = o; 291*3762Sroot CHAR digs[12]; 292*3762Sroot 293*3762Sroot IF s 294*3762Sroot THEN IF po<0 295*3762Sroot THEN po = -po; *digitptr++='-'; 296*3762Sroot ELSE IF s>0 THEN *digitptr++='+'; FI 297*3762Sroot FI 298*3762Sroot FI 299*3762Sroot FOR i=0;i<=11;i++ 300*3762Sroot DO digs[i] = po&7; po >>= 3; OD 301*3762Sroot digs[10] &= 03; digs[11]=0; 302*3762Sroot FOR i=11;i>=0;i-- 303*3762Sroot DO IF digs[i] THEN break; FI OD 304*3762Sroot FOR i++;i>=0;i-- 305*3762Sroot DO *digitptr++=digs[i]+'0'; OD 306*3762Sroot } 307*3762Sroot 308*3762Sroot #ifndef vax 309*3762Sroot printdbl(lx,ly,fmat,base) 310*3762Sroot INT lx, ly; char fmat; int base; 311*3762Sroot #else 312*3762Sroot printdbl(lxy,fmat,base) 313*3762Sroot L_INT lxy; char fmat; int base; 314*3762Sroot #endif 315*3762Sroot { int digs[20]; int *dptr; char k; 316*3762Sroot #ifndef MULD2 317*3762Sroot register char *cp1; 318*3762Sroot cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;} 319*3762Sroot sprintf(cp1,base==16 ? "%X" : "%D",lxy); 320*3762Sroot cp1=digs; while (*digitptr++= *cp1++); --digitptr; 321*3762Sroot #else 322*3762Sroot L_REAL f ,g; long q; 323*3762Sroot #ifdef vax 324*3762Sroot INT lx,ly; 325*3762Sroot ly=lxy; lx=(lxy>>16)&0xFFFF; 326*3762Sroot #endif 327*3762Sroot dptr=digs; 328*3762Sroot IF fmat=='D' ORF fmat=='r' 329*3762Sroot THEN f=itol(lx,ly); 330*3762Sroot IF f<0 THEN *digitptr++='-'; f = -f; FI 331*3762Sroot ELSE 332*3762Sroot IF lx==-1 333*3762Sroot THEN *digitptr++='-'; f=leng(-ly); 334*3762Sroot ELSE f=leng(lx); f *= itol(1,0); f += leng(ly); 335*3762Sroot FI 336*3762Sroot IF fmat=='x' THEN *digitptr++='#'; FI 337*3762Sroot FI 338*3762Sroot WHILE f 339*3762Sroot DO q=f/base; g=q; 340*3762Sroot *dptr++ = f-g*base; 341*3762Sroot f=q; 342*3762Sroot OD 343*3762Sroot IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI 344*3762Sroot WHILE dptr!=digs 345*3762Sroot DO k = *--dptr; 346*3762Sroot *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 347*3762Sroot OD 348*3762Sroot #endif 349*3762Sroot } 350*3762Sroot 351*3762Sroot #define MAXIFD 5 352*3762Sroot struct { 353*3762Sroot int fd; 354*3762Sroot int r9; 355*3762Sroot } istack[MAXIFD]; 356*3762Sroot int ifiledepth; 357*3762Sroot 358*3762Sroot iclose(stack, err) 359*3762Sroot { 360*3762Sroot IF err 361*3762Sroot THEN IF infile 362*3762Sroot THEN close(infile); infile=0; 363*3762Sroot FI 364*3762Sroot WHILE --ifiledepth >= 0 365*3762Sroot DO IF istack[ifiledepth].fd 366*3762Sroot THEN close(istack[ifiledepth].fd); 367*3762Sroot FI 368*3762Sroot OD 369*3762Sroot ifiledepth = 0; 370*3762Sroot ELIF stack == 0 371*3762Sroot THEN IF infile 372*3762Sroot THEN close(infile); infile=0; 373*3762Sroot FI 374*3762Sroot ELIF stack > 0 375*3762Sroot THEN IF ifiledepth >= MAXIFD 376*3762Sroot THEN error(TOODEEP); 377*3762Sroot FI 378*3762Sroot istack[ifiledepth].fd = infile; 379*3762Sroot istack[ifiledepth].r9 = var[9]; 380*3762Sroot ifiledepth++; 381*3762Sroot infile = 0; 382*3762Sroot ELSE IF infile 383*3762Sroot THEN close(infile); infile=0; 384*3762Sroot FI 385*3762Sroot IF ifiledepth > 0 386*3762Sroot THEN infile = istack[--ifiledepth].fd; 387*3762Sroot var[9] = istack[ifiledepth].r9; 388*3762Sroot FI 389*3762Sroot FI 390*3762Sroot } 391*3762Sroot 392*3762Sroot oclose() 393*3762Sroot { 394*3762Sroot IF outfile!=1 395*3762Sroot THEN flushbuf(); close(outfile); outfile=1; 396*3762Sroot FI 397*3762Sroot } 398*3762Sroot 399*3762Sroot endline() 400*3762Sroot { 401*3762Sroot 402*3762Sroot if (maxpos <= charpos()) 403*3762Sroot printf("\n"); 404*3762Sroot } 405