126421Ssam #ifndef lint
2*32423Sbostic static char sccsid[] = "@(#)output.c 1.2 (Berkeley) 10/22/87";
326421Ssam #endif
426421Ssam /*
526421Ssam *
626421Ssam * UNIX debugger
726421Ssam *
826421Ssam */
926421Ssam
1026421Ssam #include "defs.h"
1126421Ssam
1226421Ssam INT mkfault;
1326421Ssam INT infile;
1426421Ssam INT outfile = 1;
1526421Ssam L_INT maxpos;
1626421Ssam ADDR maxoff;
1726421Ssam INT radix = 16;
1826421Ssam
1926421Ssam CHAR printbuf[MAXLIN];
2026421Ssam CHAR *printptr = printbuf;
2126421Ssam CHAR *digitptr;
2226421Ssam MSG TOODEEP;
2326421Ssam
printc(c)2426421Ssam printc(c)
2526421Ssam CHAR c;
2626421Ssam {
2726421Ssam CHAR d;
2826421Ssam REG STRING q;
2926421Ssam REG posn, tabs, p;
3026421Ssam
3126421Ssam IF mkfault
3226421Ssam THEN return;
3326421Ssam ELIF (*printptr=c)==EOR
3426421Ssam THEN tabs=0; posn=0; q=printbuf;
3526421Ssam FOR p=0; p<printptr-printbuf; p++
3626421Ssam DO d=printbuf[p];
3726421Ssam IF (p&7)==0 ANDF posn
3826421Ssam THEN tabs++; posn=0;
3926421Ssam FI
4026421Ssam IF d==SP
4126421Ssam THEN posn++;
4226421Ssam ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
4326421Ssam WHILE posn>0 DO *q++=SP; posn--; OD
4426421Ssam *q++=d;
4526421Ssam FI
4626421Ssam OD
4726421Ssam *q++=EOR;
4826421Ssam #ifdef EDDT
4926421Ssam printptr=printbuf; do putchar(*printptr++); while (printptr<q);
5026421Ssam #else
5126421Ssam write(outfile,printbuf,q-printbuf);
5226421Ssam #endif
5326421Ssam printptr=printbuf;
5426421Ssam ELIF c==TB
5526421Ssam THEN *printptr++=SP;
5626421Ssam WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
5726421Ssam ELIF c
5826421Ssam THEN printptr++;
5926421Ssam FI
6026421Ssam IF printptr >= &printbuf[MAXLIN-9] THEN
6126421Ssam write(outfile, printbuf, printptr - printbuf);
6226421Ssam printptr = printbuf;
6326421Ssam FI
6426421Ssam }
6526421Ssam
charpos()6626421Ssam charpos()
6726421Ssam { return(printptr-printbuf);
6826421Ssam }
6926421Ssam
flushbuf()7026421Ssam flushbuf()
7126421Ssam { IF printptr!=printbuf
7226421Ssam THEN printc(EOR);
7326421Ssam FI
7426421Ssam }
7526421Ssam
7626421Ssam /* VARARGS1 */
printf(fmat,a1)7726421Ssam printf(fmat,a1)
7826421Ssam STRING fmat;
7926421Ssam STRING a1;
8026421Ssam {
8126421Ssam STRING fptr;
8226421Ssam REG STRING s;
8326421Ssam REG L_INT *dptr;
8426421Ssam L_REAL *rptr;
8526421Ssam REG width, prec;
8626421Ssam CHAR c, adj;
8726421Ssam INT x, n;
8826421Ssam REG L_INT lx;
8926421Ssam CHAR digits[64];
9026421Ssam
9126421Ssam fptr = fmat; dptr = (L_INT *)&a1;
9226421Ssam
9326421Ssam WHILE c = *fptr++
9426421Ssam DO IF c!='%'
9526421Ssam THEN printc(c);
9626421Ssam ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
9726421Ssam width=convert(&fptr);
9826421Ssam IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
9926421Ssam digitptr=digits;
10026421Ssam rptr=(L_REAL *)dptr; x = lx = *dptr++;
10126421Ssam s=0;
10226421Ssam switch (c = *fptr++) {
10326421Ssam
10426421Ssam case 'd':
10526421Ssam printnum(x, -10); break;
10626421Ssam case 'u':
10726421Ssam printnum((unsigned short)x, 10); break;
10826421Ssam case 'o':
10926421Ssam printnum((unsigned short)x, 8); break;
11026421Ssam case 'q':
11126421Ssam printnum(x, -8); break;
11226421Ssam case 'x':
11326421Ssam printnum((unsigned short)x, 16); break;
11426421Ssam case 'z':
11526421Ssam printnum((unsigned short)x, -16); break;
11626421Ssam case 'R':
11726421Ssam printnum(lx, radix); break;
11826421Ssam case 'Y':
11926421Ssam printdate(lx); break;
12026421Ssam case 'D':
12126421Ssam printnum(lx, -10); break;
12226421Ssam case 'U':
12326421Ssam printnum(lx, 10); break;
12426421Ssam case 'O':
12526421Ssam printnum(lx, 8); break;
12626421Ssam case 'Q':
12726421Ssam printnum(lx, -8); break;
12826421Ssam case 'X':
12926421Ssam printnum(lx, 16); break;
13026421Ssam case 'Z':
13126421Ssam printnum(lx, -16); break;
13226421Ssam case 'c':
13326421Ssam printc(x); break;
13426421Ssam case 's':
13526421Ssam s=(STRING)lx; break;
13626421Ssam #ifndef EDDT
13726421Ssam case 'f':
13826421Ssam case 'F':
13926421Ssam dptr++;
140*32423Sbostic (void)sprintf(s=digits, "%*.*f", width, prec, *rptr); prec= -1; break;
14126421Ssam #endif
14226421Ssam case 'm':
14326421Ssam break;
14426421Ssam case 'M':
14526421Ssam width=x; break;
14626421Ssam case 'T':
14726421Ssam case 't':
14826421Ssam IF c=='T'
14926421Ssam THEN width=x;
15026421Ssam ELSE dptr--;
15126421Ssam FI
15226421Ssam IF width
15326421Ssam THEN width -= charpos()%width;
15426421Ssam FI
15526421Ssam break;
15626421Ssam default:
15726421Ssam printc(c); dptr--;
15826421Ssam }
15926421Ssam
16026421Ssam IF s==0
16126421Ssam THEN *digitptr=0; s=digits;
16226421Ssam FI
16326421Ssam n=strlen(s);
16426421Ssam n=(prec<n ANDF prec>=0 ? prec : n);
16526421Ssam width -= n;
16626421Ssam IF adj=='r'
16726421Ssam THEN WHILE width-- > 0
16826421Ssam DO printc(SP); OD
16926421Ssam FI
17026421Ssam WHILE n-- DO printc(*s++); OD
17126421Ssam WHILE width-- > 0 DO printc(SP); OD
17226421Ssam digitptr=digits;
17326421Ssam FI
17426421Ssam OD
17526421Ssam }
17626421Ssam
printdate(tvec)17726421Ssam printdate(tvec)
17826421Ssam L_INT tvec;
17926421Ssam {
18026421Ssam REG i;
18126421Ssam REG STRING timeptr;
18226421Ssam STRING ctime();
18326421Ssam
18426421Ssam #ifndef EDDT
18526421Ssam timeptr = ctime(&tvec);
18626421Ssam #else
18726421Ssam timeptr="????????????????????????";
18826421Ssam #endif
18926421Ssam FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
19026421Ssam FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
19126421Ssam } /*printdate*/
19226421Ssam
convert(cp)19326421Ssam convert(cp)
19426421Ssam REG STRING *cp;
19526421Ssam {
19626421Ssam REG CHAR c;
19726421Ssam INT n;
19826421Ssam n=0;
19926421Ssam WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
20026421Ssam (*cp)--;
20126421Ssam return(n);
20226421Ssam }
20326421Ssam
printnum(n,base)20426421Ssam printnum(n, base)
20526421Ssam REG POS n;
20626421Ssam {
20726421Ssam REG CHAR *dptr;
20826421Ssam CHAR digs[15];
20926421Ssam dptr=digs;
21026421Ssam IF base<0 THEN base = -base;
21126421Ssam IF (L_INT)n<0 THEN n = -n; *digitptr++ = '-'; FI
21226421Ssam FI
21326421Ssam WHILE n
21426421Ssam DO *dptr++ = n%base;
21526421Ssam n /= base;
21626421Ssam OD
21726421Ssam IF dptr==digs THEN *dptr++=0; FI
21826421Ssam WHILE dptr!=digs
21926421Ssam DO n = *--dptr;
22026421Ssam *digitptr++ = (n+(n<=9 ? '0' : 'a'-10));
22126421Ssam OD
22226421Ssam }
22326421Ssam
22426421Ssam #define MAXIFD 5
22526421Ssam struct {
22626421Ssam int fd;
22726421Ssam int r9;
22826421Ssam } istack[MAXIFD];
22926421Ssam int ifiledepth;
23026421Ssam
iclose(stack,err)23126421Ssam iclose(stack, err)
23226421Ssam {
23326421Ssam IF err
23426421Ssam THEN IF infile
23526421Ssam THEN close(infile); infile=0;
23626421Ssam FI
23726421Ssam WHILE --ifiledepth >= 0
23826421Ssam DO IF istack[ifiledepth].fd
23926421Ssam THEN close(istack[ifiledepth].fd);
24026421Ssam FI
24126421Ssam OD
24226421Ssam ifiledepth = 0;
24326421Ssam ELIF stack == 0
24426421Ssam THEN IF infile
24526421Ssam THEN close(infile); infile=0;
24626421Ssam FI
24726421Ssam ELIF stack > 0
24826421Ssam THEN IF ifiledepth >= MAXIFD
24926421Ssam THEN error(TOODEEP);
25026421Ssam FI
25126421Ssam istack[ifiledepth].fd = infile;
25226421Ssam istack[ifiledepth].r9 = var[9];
25326421Ssam ifiledepth++;
25426421Ssam infile = 0;
25526421Ssam ELSE IF infile
25626421Ssam THEN close(infile); infile=0;
25726421Ssam FI
25826421Ssam IF ifiledepth > 0
25926421Ssam THEN infile = istack[--ifiledepth].fd;
26026421Ssam var[9] = istack[ifiledepth].r9;
26126421Ssam FI
26226421Ssam FI
26326421Ssam }
26426421Ssam
oclose()26526421Ssam oclose()
26626421Ssam {
26726421Ssam IF outfile!=1
26826421Ssam THEN flushbuf(); close(outfile); outfile=1;
26926421Ssam FI
27026421Ssam }
27126421Ssam
endline()27226421Ssam endline()
27326421Ssam {
27426421Ssam
27526421Ssam if (maxpos <= charpos())
27626421Ssam printf("\n");
27726421Ssam }
278