1*14470Ssam #ifndef lint 2*14470Ssam static char sccsid[] = "@(#)output.c 4.3 08/11/83"; 3*14470Ssam #endif 43762Sroot /* 53762Sroot * 63762Sroot * UNIX debugger 73762Sroot * 83762Sroot */ 93762Sroot 103762Sroot #include "defs.h" 113762Sroot #include <stdio.h> 123762Sroot 133762Sroot 143762Sroot INT mkfault; 153762Sroot INT infile; 163762Sroot INT outfile = 1; 173762Sroot L_INT maxpos; 183762Sroot L_INT maxoff; 193762Sroot INT radix = 16; 203762Sroot 213762Sroot CHAR printbuf[MAXLIN]; 223762Sroot CHAR *printptr = printbuf; 233762Sroot CHAR *digitptr; 243762Sroot MSG TOODEEP; 253762Sroot 263762Sroot 273762Sroot eqstr(s1, s2) 283762Sroot REG STRING s1, s2; 293762Sroot { 303762Sroot REG STRING es1; 313762Sroot WHILE *s1++ == *s2 323762Sroot DO IF *s2++ == 0 333762Sroot THEN return(1); 343762Sroot FI 353762Sroot OD 363762Sroot return(0); 373762Sroot } 383762Sroot 393762Sroot length(s) 403762Sroot REG STRING s; 413762Sroot { 423762Sroot INT n = 0; 433762Sroot WHILE *s++ DO n++; OD 443762Sroot return(n); 453762Sroot } 463762Sroot 473762Sroot printc(c) 483762Sroot CHAR c; 493762Sroot { 503762Sroot CHAR d; 513762Sroot STRING q; 523762Sroot INT posn, tabs, p; 533762Sroot 543762Sroot IF mkfault 553762Sroot THEN return; 563762Sroot ELIF (*printptr=c)==EOR 573762Sroot THEN tabs=0; posn=0; q=printbuf; 583762Sroot FOR p=0; p<printptr-printbuf; p++ 593762Sroot DO d=printbuf[p]; 603762Sroot IF (p&7)==0 ANDF posn 613762Sroot THEN tabs++; posn=0; 623762Sroot FI 633762Sroot IF d==SP 643762Sroot THEN posn++; 653762Sroot ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD 663762Sroot WHILE posn>0 DO *q++=SP; posn--; OD 673762Sroot *q++=d; 683762Sroot FI 693762Sroot OD 703762Sroot *q++=EOR; 713762Sroot #ifdef EDDT 723762Sroot printptr=printbuf; do putchar(*printptr++); while (printptr<q); 733762Sroot #else 743762Sroot write(outfile,printbuf,q-printbuf); 753762Sroot #endif 763762Sroot printptr=printbuf; 773762Sroot ELIF c==TB 783762Sroot THEN *printptr++=SP; 793762Sroot WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD 803762Sroot ELIF c 813762Sroot THEN printptr++; 823762Sroot FI 836416Sroot IF printptr >= &printbuf[MAXLIN-9] THEN 846416Sroot write(outfile, printbuf, printptr - printbuf); 856416Sroot printptr = printbuf; 866416Sroot FI 873762Sroot } 883762Sroot 893762Sroot charpos() 903762Sroot { return(printptr-printbuf); 913762Sroot } 923762Sroot 933762Sroot flushbuf() 943762Sroot { IF printptr!=printbuf 953762Sroot THEN printc(EOR); 963762Sroot FI 973762Sroot } 983762Sroot 993762Sroot printf(fmat,a1) 1003762Sroot STRING fmat; 1013762Sroot STRING *a1; 1023762Sroot { 1033762Sroot STRING fptr, s; 1043762Sroot INT *vptr; 1053762Sroot L_INT *dptr; 1063762Sroot L_REAL *rptr; 1073762Sroot INT width, prec; 1083762Sroot CHAR c, adj; 1093762Sroot INT x, decpt, n; 1103762Sroot L_INT lx; 1113762Sroot CHAR digits[64]; 1123762Sroot 1133762Sroot fptr = fmat; dptr = vptr = &a1; 1143762Sroot 1153762Sroot WHILE c = *fptr++ 1163762Sroot DO IF c!='%' 1173762Sroot THEN printc(c); 1183762Sroot ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI 1193762Sroot width=convert(&fptr); 1203762Sroot IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI 1213762Sroot digitptr=digits; 1223762Sroot #ifndef vax 1233762Sroot dptr=rptr=vptr; lx = *dptr; x = *vptr++; 1243762Sroot #else 1253762Sroot rptr=dptr; x = shorten(lx = *dptr++); 1263762Sroot #endif 1273762Sroot s=0; 1283762Sroot switch (c = *fptr++) { 1293762Sroot 1303762Sroot case 'd': 1313762Sroot case 'u': 1323762Sroot printnum(x,c,10); break; 1333762Sroot case 'o': 1343762Sroot #ifndef vax 1353762Sroot printoct(0,x,0); break; 1363762Sroot #else 1373762Sroot printoct(itol(0,x),0); break; 1383762Sroot #endif 1393762Sroot case 'q': 1403762Sroot lx=x; printoct(lx,-1); break; 1413762Sroot case 'x': 1423762Sroot #ifndef vax 1433762Sroot printdbl(0,x,c,16); break; 1443762Sroot #else 1453762Sroot printdbl(itol(0,x),c,16); break; 1463762Sroot #endif 1473762Sroot case 'r': 1483762Sroot printdbl(lx=x,c,radix); break; 1493762Sroot case 'R': 1503762Sroot printdbl(lx,c,radix); vptr++; break; 1513762Sroot case 'Y': 1523762Sroot printdate(lx); vptr++; break; 1533762Sroot case 'D': 1543762Sroot case 'U': 1553762Sroot printdbl(lx,c,10); vptr++; break; 1563762Sroot case 'O': 1573762Sroot printoct(lx,0); vptr++; break; 1583762Sroot case 'Q': 1593762Sroot printoct(lx,-1); vptr++; break; 1603762Sroot case 'X': 1613762Sroot printdbl(lx,'x',16); vptr++; break; 1623762Sroot case 'c': 1633762Sroot printc(x); break; 1643762Sroot case 's': 1653762Sroot #ifndef vax 1663762Sroot s=x; break; 1673762Sroot #else 1683762Sroot s=lx; break; 1693762Sroot #endif 1703762Sroot #ifndef EDDT 1713762Sroot case 'f': 1723762Sroot case 'F': 1733762Sroot #ifdef vax 1743762Sroot dptr++; 1753762Sroot sprintf(s=digits,"%+.16e",*rptr,*(rptr+4)); prec= -1; break; 1763762Sroot #else 1773762Sroot vptr += 7; 1783762Sroot s=ecvt(*rptr, prec, &decpt, &n); 1793762Sroot *digitptr++=(n?'-':'+'); 1803762Sroot *digitptr++ = (decpt<=0 ? '0' : *s++); 1813762Sroot IF decpt>0 THEN decpt--; FI 1823762Sroot *digitptr++ = '.'; 1833762Sroot WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD 1843762Sroot WHILE *--digitptr=='0' DONE 1853762Sroot digitptr += (digitptr-digits>=3 ? 1 : 2); 1863762Sroot IF decpt 1873762Sroot THEN *digitptr++ = 'e'; printnum(decpt,'d',10); 1883762Sroot FI 1893762Sroot s=0; prec = -1; break; 1903762Sroot #endif 1913762Sroot #endif 1923762Sroot case 'm': 1933762Sroot vptr--; break; 1943762Sroot case 'M': 1953762Sroot width=x; break; 1963762Sroot case 'T': 1973762Sroot case 't': 1983762Sroot IF c=='T' 1993762Sroot THEN width=x; 2003762Sroot #ifndef vax 2013762Sroot ELSE vptr--; 2023762Sroot #else 2033762Sroot ELSE dptr--; 2043762Sroot #endif 2053762Sroot FI 2063762Sroot IF width 2073762Sroot THEN width -= charpos()%width; 2083762Sroot FI 2093762Sroot break; 2103762Sroot default: 2113762Sroot #ifndef vax 2123762Sroot printc(c); vptr--; 2133762Sroot #else 2143762Sroot printc(c); dptr--; 2153762Sroot #endif 2163762Sroot } 2173762Sroot 2183762Sroot IF s==0 2193762Sroot THEN *digitptr=0; s=digits; 2203762Sroot FI 2213762Sroot n=length(s); 2223762Sroot n=(prec<n ANDF prec>=0 ? prec : n); 2233762Sroot width -= n; 2243762Sroot IF adj=='r' 2253762Sroot THEN WHILE width-- > 0 2263762Sroot DO printc(SP); OD 2273762Sroot FI 2283762Sroot WHILE n-- DO printc(*s++); OD 2293762Sroot WHILE width-- > 0 DO printc(SP); OD 2303762Sroot digitptr=digits; 2313762Sroot FI 2323762Sroot OD 2333762Sroot } 2343762Sroot 2353762Sroot printdate(tvec) 2363762Sroot L_INT tvec; 2373762Sroot { 2383762Sroot REG INT i; 2393762Sroot REG STRING timeptr; 2403762Sroot #ifndef EDDT 2413762Sroot timeptr = ctime(&tvec); 2423762Sroot #else 2433762Sroot timeptr="????????????????????????"; 2443762Sroot #endif 2453762Sroot FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD 2463762Sroot FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD 2473762Sroot } /*printdate*/ 2483762Sroot 2493762Sroot prints(s) 2503762Sroot char *s; 2513762Sroot { printf("%s",s); 2523762Sroot } 2533762Sroot 2543762Sroot newline() 2553762Sroot { 2563762Sroot printc(EOR); 2573762Sroot } 2583762Sroot 2593762Sroot convert(cp) 2603762Sroot REG STRING *cp; 2613762Sroot { 2623762Sroot REG CHAR c; 2633762Sroot INT n; 2643762Sroot n=0; 2653762Sroot WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD 2663762Sroot (*cp)--; 2673762Sroot return(n); 2683762Sroot } 2693762Sroot 2703762Sroot printnum(n,fmat,base) 2713762Sroot REG INT n; 2723762Sroot { 2733762Sroot REG CHAR k; 2743762Sroot REG INT *dptr; 2753762Sroot INT digs[15]; 2763762Sroot dptr=digs; 2773762Sroot IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI 2783762Sroot n &= 0xffff; 2793762Sroot WHILE n 2803762Sroot DO *dptr++ = ((POS)(n&0xffff))%base; 2813762Sroot n=((POS)(n&0xffff))/base; 2823762Sroot OD 2833762Sroot IF dptr==digs THEN *dptr++=0; FI 2843762Sroot WHILE dptr!=digs 2853762Sroot DO k = *--dptr; 2863762Sroot *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 2873762Sroot OD 2883762Sroot } 2893762Sroot 2903762Sroot printoct(o,s) 2913762Sroot L_INT o; 2923762Sroot INT s; 2933762Sroot { 2943762Sroot INT i; 2953762Sroot L_INT po = o; 2963762Sroot CHAR digs[12]; 2973762Sroot 2983762Sroot IF s 2993762Sroot THEN IF po<0 3003762Sroot THEN po = -po; *digitptr++='-'; 3013762Sroot ELSE IF s>0 THEN *digitptr++='+'; FI 3023762Sroot FI 3033762Sroot FI 3043762Sroot FOR i=0;i<=11;i++ 3053762Sroot DO digs[i] = po&7; po >>= 3; OD 3063762Sroot digs[10] &= 03; digs[11]=0; 3073762Sroot FOR i=11;i>=0;i-- 3083762Sroot DO IF digs[i] THEN break; FI OD 3093762Sroot FOR i++;i>=0;i-- 3103762Sroot DO *digitptr++=digs[i]+'0'; OD 3113762Sroot } 3123762Sroot 3133762Sroot #ifndef vax 3143762Sroot printdbl(lx,ly,fmat,base) 3153762Sroot INT lx, ly; char fmat; int base; 3163762Sroot #else 3173762Sroot printdbl(lxy,fmat,base) 3183762Sroot L_INT lxy; char fmat; int base; 3193762Sroot #endif 3203762Sroot { int digs[20]; int *dptr; char k; 3213762Sroot #ifndef MULD2 3223762Sroot register char *cp1; 3233762Sroot cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;} 3243762Sroot sprintf(cp1,base==16 ? "%X" : "%D",lxy); 3253762Sroot cp1=digs; while (*digitptr++= *cp1++); --digitptr; 3263762Sroot #else 3273762Sroot L_REAL f ,g; long q; 3283762Sroot #ifdef vax 3293762Sroot INT lx,ly; 3303762Sroot ly=lxy; lx=(lxy>>16)&0xFFFF; 3313762Sroot #endif 3323762Sroot dptr=digs; 3333762Sroot IF fmat=='D' ORF fmat=='r' 3343762Sroot THEN f=itol(lx,ly); 3353762Sroot IF f<0 THEN *digitptr++='-'; f = -f; FI 3363762Sroot ELSE 3373762Sroot IF lx==-1 3383762Sroot THEN *digitptr++='-'; f=leng(-ly); 3393762Sroot ELSE f=leng(lx); f *= itol(1,0); f += leng(ly); 3403762Sroot FI 3413762Sroot IF fmat=='x' THEN *digitptr++='#'; FI 3423762Sroot FI 3433762Sroot WHILE f 3443762Sroot DO q=f/base; g=q; 3453762Sroot *dptr++ = f-g*base; 3463762Sroot f=q; 3473762Sroot OD 3483762Sroot IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI 3493762Sroot WHILE dptr!=digs 3503762Sroot DO k = *--dptr; 3513762Sroot *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 3523762Sroot OD 3533762Sroot #endif 3543762Sroot } 3553762Sroot 3563762Sroot #define MAXIFD 5 3573762Sroot struct { 3583762Sroot int fd; 3593762Sroot int r9; 3603762Sroot } istack[MAXIFD]; 3613762Sroot int ifiledepth; 3623762Sroot 3633762Sroot iclose(stack, err) 3643762Sroot { 3653762Sroot IF err 3663762Sroot THEN IF infile 3673762Sroot THEN close(infile); infile=0; 3683762Sroot FI 3693762Sroot WHILE --ifiledepth >= 0 3703762Sroot DO IF istack[ifiledepth].fd 3713762Sroot THEN close(istack[ifiledepth].fd); 3723762Sroot FI 3733762Sroot OD 3743762Sroot ifiledepth = 0; 3753762Sroot ELIF stack == 0 3763762Sroot THEN IF infile 3773762Sroot THEN close(infile); infile=0; 3783762Sroot FI 3793762Sroot ELIF stack > 0 3803762Sroot THEN IF ifiledepth >= MAXIFD 3813762Sroot THEN error(TOODEEP); 3823762Sroot FI 3833762Sroot istack[ifiledepth].fd = infile; 3843762Sroot istack[ifiledepth].r9 = var[9]; 3853762Sroot ifiledepth++; 3863762Sroot infile = 0; 3873762Sroot ELSE IF infile 3883762Sroot THEN close(infile); infile=0; 3893762Sroot FI 3903762Sroot IF ifiledepth > 0 3913762Sroot THEN infile = istack[--ifiledepth].fd; 3923762Sroot var[9] = istack[ifiledepth].r9; 3933762Sroot FI 3943762Sroot FI 3953762Sroot } 3963762Sroot 3973762Sroot oclose() 3983762Sroot { 3993762Sroot IF outfile!=1 4003762Sroot THEN flushbuf(); close(outfile); outfile=1; 4013762Sroot FI 4023762Sroot } 4033762Sroot 4043762Sroot endline() 4053762Sroot { 4063762Sroot 4073762Sroot if (maxpos <= charpos()) 4083762Sroot printf("\n"); 4093762Sroot } 410