1*30296Ssam /* 2*30296Ssam * Copyright (c) 1986 Regents of the University of California. 3*30296Ssam * All rights reserved. The Berkeley software License Agreement 4*30296Ssam * specifies the terms and conditions for redistribution. 5*30296Ssam * 6*30296Ssam * @(#)kdb_output.c 7.2 (Berkeley) 12/15/86 7*30296Ssam */ 830110Ssam 930110Ssam #include "../kdb/defs.h" 1030110Ssam 1130110Ssam long maxpos; 1230110Ssam int radix = 16; 1330110Ssam 1430110Ssam char printbuf[MAXLIN]; 1530110Ssam char *printptr = printbuf; 1630110Ssam char *digitptr; 1730110Ssam 1830110Ssam printc(c) 1930110Ssam char c; 2030110Ssam { 2130110Ssam char d; 2230110Ssam register char *q; 2330110Ssam register posn, tabs, p; 2430110Ssam 2530110Ssam if (mkfault) 2630110Ssam return; 2730110Ssam if ((*printptr=c)==EOR) { 2830110Ssam tabs=0; posn=0; q=printbuf; 2930110Ssam for (p=0; p<printptr-printbuf; p++) { 3030110Ssam d=printbuf[p]; 3130110Ssam if ((p&7)==0 && posn) { 3230110Ssam tabs++; 3330110Ssam posn=0; 3430110Ssam } 3530110Ssam if (d!=SP) { 3630110Ssam while (tabs>0) 3730110Ssam *q++=TB, tabs--; 3830110Ssam while (posn>0) 3930110Ssam *q++=SP, posn--; 4030110Ssam *q++=d; 4130110Ssam } else 4230110Ssam posn++; 4330110Ssam } 4430110Ssam *q++=EOR; 4530110Ssam kdbwrite(printbuf,q-printbuf); 4630110Ssam printptr=printbuf; 4730110Ssam } else if (c==TB) { 4830110Ssam *printptr++=SP; 4930110Ssam while ((printptr-printbuf)&7) 5030110Ssam *printptr++=SP; 5130110Ssam } else if (c) 5230110Ssam printptr++; 5330110Ssam if (printptr >= &printbuf[MAXLIN-9]) { 5430110Ssam kdbwrite(printbuf, printptr - printbuf); 5530110Ssam printptr = printbuf; 5630110Ssam } 5730110Ssam } 5830110Ssam 5930110Ssam charpos() 6030110Ssam { 6130110Ssam 6230110Ssam return (printptr-printbuf); 6330110Ssam } 6430110Ssam 6530110Ssam flushbuf() 6630110Ssam { 6730110Ssam 6830110Ssam if (printptr!=printbuf) 6930110Ssam printc(EOR); 7030110Ssam } 7130110Ssam 7230110Ssam /* VARARGS1 */ 7330110Ssam printf(fmat,a1) 7430110Ssam char *fmat, *a1; 7530110Ssam { 7630110Ssam char *fptr; 7730110Ssam register char *s; 7830110Ssam register long *dptr; 7930110Ssam register width, prec; 8030110Ssam char c, adj; 8130110Ssam int x, n; 8230110Ssam register long lx; 8330110Ssam char digits[64]; 8430110Ssam 8530110Ssam fptr = fmat; dptr = (long *)&a1; 8630110Ssam while (c = *fptr++) { 8730110Ssam if (c!='%') { 8830110Ssam printc(c); 8930110Ssam continue; 9030110Ssam } 9130110Ssam if (*fptr=='-') { 9230110Ssam adj='l'; fptr++; 9330110Ssam } else 9430110Ssam adj='r'; 9530110Ssam width=convert(&fptr); 9630110Ssam if (*fptr=='.') { 9730110Ssam fptr++; prec=convert(&fptr); 9830110Ssam } else 9930110Ssam prec = -1; 10030110Ssam digitptr=digits; 101*30296Ssam x = lx = *dptr++; 10230110Ssam s=0; 10330110Ssam switch (c = *fptr++) { 10430110Ssam case 'd': 105*30296Ssam printnum((u_long)x, -10); break; 10630110Ssam case 'u': 107*30296Ssam printnum((u_long)x, 10); break; 10830110Ssam case 'o': 109*30296Ssam printnum((u_long)x, 8); break; 11030110Ssam case 'q': 111*30296Ssam printnum((u_long)x, -8); break; 11230110Ssam case 'x': 113*30296Ssam printnum((u_long)x, 16); break; 11430110Ssam case 'z': 115*30296Ssam printnum((u_long)x, -16); break; 11630110Ssam case 'R': 117*30296Ssam printnum((u_long)lx, radix); break; 11830110Ssam case 'D': 119*30296Ssam printnum((u_long)lx, -10); break; 12030110Ssam case 'U': 121*30296Ssam printnum((u_long)lx, 10); break; 12230110Ssam case 'O': 123*30296Ssam printnum((u_long)lx, 8); break; 12430110Ssam case 'Q': 125*30296Ssam printnum((u_long)lx, -8); break; 12630110Ssam case 'X': 127*30296Ssam printnum((u_long)lx, 16); break; 12830110Ssam case 'Z': 129*30296Ssam printnum((u_long)lx, -16); break; 13030110Ssam case 'c': 13130110Ssam printc(x); break; 13230110Ssam case 's': 13330110Ssam s=(char *)lx; break; 13430110Ssam case 'm': 13530110Ssam break; 13630110Ssam case 'M': 13730110Ssam width=x; break; 13830110Ssam case 'T': case 't': 13930110Ssam if (c=='T') 14030110Ssam width=x; 14130110Ssam else 14230110Ssam dptr--; 14330110Ssam if (width) 14430110Ssam width -= charpos()%width; 14530110Ssam break; 14630110Ssam default: 14730110Ssam printc(c); dptr--; 14830110Ssam break; 14930110Ssam } 15030110Ssam if (s==0) { 15130110Ssam *digitptr=0; s=digits; 15230110Ssam } 15330110Ssam n=strlen(s); 15430110Ssam n=(prec<n && prec>=0 ? prec : n); 15530110Ssam width -= n; 15630110Ssam if (adj=='r') 15730110Ssam while (width-- > 0) 15830110Ssam printc(SP); 15930110Ssam while (n--) 16030110Ssam printc(*s++); 16130110Ssam while (width-- > 0) 16230110Ssam printc(SP); 16330110Ssam digitptr=digits; 16430110Ssam } 16530110Ssam } 16630110Ssam 16730110Ssam static 16830110Ssam convert(cp) 16930110Ssam register char **cp; 17030110Ssam { 17130110Ssam register char c; 17230110Ssam int n; 17330110Ssam 17430110Ssam n=0; 17530110Ssam while (((c = *(*cp)++)>='0') && c<='9') 17630110Ssam n=n*10+c-'0'; 17730110Ssam (*cp)--; 17830110Ssam return (n); 17930110Ssam } 18030110Ssam 18130110Ssam static 18230110Ssam printnum(n, base) 183*30296Ssam register u_long n; 18430110Ssam { 18530110Ssam register char *dptr; 18630110Ssam char digs[15]; 18730110Ssam 18830110Ssam dptr=digs; 18930110Ssam if (base<0) { 19030110Ssam base = -base; 19130110Ssam if ((long)n<0) { 19230110Ssam n = -n; 19330110Ssam *digitptr++ = '-'; 19430110Ssam } 19530110Ssam } 19630110Ssam while (n) { 19730110Ssam *dptr++ = n%base; 19830110Ssam n /= base; 19930110Ssam } 20030110Ssam if (dptr==digs) 20130110Ssam *dptr++=0; 20230110Ssam while (dptr!=digs) { 20330110Ssam n = *--dptr; 20430110Ssam *digitptr++ = (n+(n<=9 ? '0' : 'a'-10)); 20530110Ssam } 20630110Ssam } 20730110Ssam 20830110Ssam endline() 20930110Ssam { 21030110Ssam 21130110Ssam if (maxpos <= charpos()) 21230110Ssam printf("\n"); 21330110Ssam } 214