114470Ssam #ifndef lint
2*34595Sbostic static char sccsid[] = "@(#)output.c 4.7 06/01/88";
314470Ssam #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
eqstr(s1,s2)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
length(s)393762Sroot length(s)
403762Sroot REG STRING s;
413762Sroot {
423762Sroot INT n = 0;
433762Sroot WHILE *s++ DO n++; OD
443762Sroot return(n);
453762Sroot }
463762Sroot
printc(c)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
charpos()893762Sroot charpos()
903762Sroot { return(printptr-printbuf);
913762Sroot }
923762Sroot
flushbuf()933762Sroot flushbuf()
943762Sroot { IF printptr!=printbuf
953762Sroot THEN printc(EOR);
963762Sroot FI
973762Sroot }
983762Sroot
printf(fmat,a1)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++;
17532422Sbostic (void)sprintf(s=digits,"%+.16e",*rptr); 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
printdate(tvec)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
prints(s)2493762Sroot prints(s)
2503762Sroot char *s;
2513762Sroot { printf("%s",s);
2523762Sroot }
2533762Sroot
newline()2543762Sroot newline()
2553762Sroot {
2563762Sroot printc(EOR);
2573762Sroot }
2583762Sroot
convert(cp)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
printnum(n,fmat,base)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
printoct(o,s)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
printdbl(lx,ly,fmat,base)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;}
324*34595Sbostic (void)sprintf(cp1,base==16 ? "%x" : "%ld",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
iclose(stack,err)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
oclose()3973762Sroot oclose()
3983762Sroot {
3993762Sroot IF outfile!=1
4003762Sroot THEN flushbuf(); close(outfile); outfile=1;
4013762Sroot FI
4023762Sroot }
4033762Sroot
endline()4043762Sroot endline()
4053762Sroot {
4063762Sroot
4073762Sroot if (maxpos <= charpos())
4083762Sroot printf("\n");
4093762Sroot }
410