1*30110Ssam /* kdb_output.c 7.1 86/11/20 */ 2*30110Ssam 3*30110Ssam #include "../kdb/defs.h" 4*30110Ssam 5*30110Ssam long maxpos; 6*30110Ssam int radix = 16; 7*30110Ssam 8*30110Ssam char printbuf[MAXLIN]; 9*30110Ssam char *printptr = printbuf; 10*30110Ssam char *digitptr; 11*30110Ssam 12*30110Ssam printc(c) 13*30110Ssam char c; 14*30110Ssam { 15*30110Ssam char d; 16*30110Ssam register char *q; 17*30110Ssam register posn, tabs, p; 18*30110Ssam 19*30110Ssam if (mkfault) 20*30110Ssam return; 21*30110Ssam if ((*printptr=c)==EOR) { 22*30110Ssam tabs=0; posn=0; q=printbuf; 23*30110Ssam for (p=0; p<printptr-printbuf; p++) { 24*30110Ssam d=printbuf[p]; 25*30110Ssam if ((p&7)==0 && posn) { 26*30110Ssam tabs++; 27*30110Ssam posn=0; 28*30110Ssam } 29*30110Ssam if (d!=SP) { 30*30110Ssam while (tabs>0) 31*30110Ssam *q++=TB, tabs--; 32*30110Ssam while (posn>0) 33*30110Ssam *q++=SP, posn--; 34*30110Ssam *q++=d; 35*30110Ssam } else 36*30110Ssam posn++; 37*30110Ssam } 38*30110Ssam *q++=EOR; 39*30110Ssam kdbwrite(printbuf,q-printbuf); 40*30110Ssam printptr=printbuf; 41*30110Ssam } else if (c==TB) { 42*30110Ssam *printptr++=SP; 43*30110Ssam while ((printptr-printbuf)&7) 44*30110Ssam *printptr++=SP; 45*30110Ssam } else if (c) 46*30110Ssam printptr++; 47*30110Ssam if (printptr >= &printbuf[MAXLIN-9]) { 48*30110Ssam kdbwrite(printbuf, printptr - printbuf); 49*30110Ssam printptr = printbuf; 50*30110Ssam } 51*30110Ssam } 52*30110Ssam 53*30110Ssam charpos() 54*30110Ssam { 55*30110Ssam 56*30110Ssam return (printptr-printbuf); 57*30110Ssam } 58*30110Ssam 59*30110Ssam flushbuf() 60*30110Ssam { 61*30110Ssam 62*30110Ssam if (printptr!=printbuf) 63*30110Ssam printc(EOR); 64*30110Ssam } 65*30110Ssam 66*30110Ssam /* VARARGS1 */ 67*30110Ssam printf(fmat,a1) 68*30110Ssam char *fmat, *a1; 69*30110Ssam { 70*30110Ssam char *fptr; 71*30110Ssam register char *s; 72*30110Ssam register long *dptr; 73*30110Ssam double *rptr; 74*30110Ssam register width, prec; 75*30110Ssam char c, adj; 76*30110Ssam int x, n; 77*30110Ssam register long lx; 78*30110Ssam char digits[64]; 79*30110Ssam 80*30110Ssam fptr = fmat; dptr = (long *)&a1; 81*30110Ssam while (c = *fptr++) { 82*30110Ssam if (c!='%') { 83*30110Ssam printc(c); 84*30110Ssam continue; 85*30110Ssam } 86*30110Ssam if (*fptr=='-') { 87*30110Ssam adj='l'; fptr++; 88*30110Ssam } else 89*30110Ssam adj='r'; 90*30110Ssam width=convert(&fptr); 91*30110Ssam if (*fptr=='.') { 92*30110Ssam fptr++; prec=convert(&fptr); 93*30110Ssam } else 94*30110Ssam prec = -1; 95*30110Ssam digitptr=digits; 96*30110Ssam rptr=(double *)dptr; x = lx = *dptr++; 97*30110Ssam s=0; 98*30110Ssam switch (c = *fptr++) { 99*30110Ssam case 'd': 100*30110Ssam printnum(x, -10); break; 101*30110Ssam case 'u': 102*30110Ssam printnum((unsigned short)x, 10); break; 103*30110Ssam case 'o': 104*30110Ssam printnum((unsigned short)x, 8); break; 105*30110Ssam case 'q': 106*30110Ssam printnum(x, -8); break; 107*30110Ssam case 'x': 108*30110Ssam printnum((unsigned short)x, 16); break; 109*30110Ssam case 'z': 110*30110Ssam printnum((unsigned short)x, -16); break; 111*30110Ssam case 'R': 112*30110Ssam printnum(lx, radix); break; 113*30110Ssam case 'D': 114*30110Ssam printnum(lx, -10); break; 115*30110Ssam case 'U': 116*30110Ssam printnum(lx, 10); break; 117*30110Ssam case 'O': 118*30110Ssam printnum(lx, 8); break; 119*30110Ssam case 'Q': 120*30110Ssam printnum(lx, -8); break; 121*30110Ssam case 'X': 122*30110Ssam printnum(lx, 16); break; 123*30110Ssam case 'Z': 124*30110Ssam printnum(lx, -16); break; 125*30110Ssam case 'c': 126*30110Ssam printc(x); break; 127*30110Ssam case 's': 128*30110Ssam s=(char *)lx; break; 129*30110Ssam case 'm': 130*30110Ssam break; 131*30110Ssam case 'M': 132*30110Ssam width=x; break; 133*30110Ssam case 'T': case 't': 134*30110Ssam if (c=='T') 135*30110Ssam width=x; 136*30110Ssam else 137*30110Ssam dptr--; 138*30110Ssam if (width) 139*30110Ssam width -= charpos()%width; 140*30110Ssam break; 141*30110Ssam default: 142*30110Ssam printc(c); dptr--; 143*30110Ssam break; 144*30110Ssam } 145*30110Ssam if (s==0) { 146*30110Ssam *digitptr=0; s=digits; 147*30110Ssam } 148*30110Ssam n=strlen(s); 149*30110Ssam n=(prec<n && prec>=0 ? prec : n); 150*30110Ssam width -= n; 151*30110Ssam if (adj=='r') 152*30110Ssam while (width-- > 0) 153*30110Ssam printc(SP); 154*30110Ssam while (n--) 155*30110Ssam printc(*s++); 156*30110Ssam while (width-- > 0) 157*30110Ssam printc(SP); 158*30110Ssam digitptr=digits; 159*30110Ssam } 160*30110Ssam } 161*30110Ssam 162*30110Ssam static 163*30110Ssam convert(cp) 164*30110Ssam register char **cp; 165*30110Ssam { 166*30110Ssam register char c; 167*30110Ssam int n; 168*30110Ssam 169*30110Ssam n=0; 170*30110Ssam while (((c = *(*cp)++)>='0') && c<='9') 171*30110Ssam n=n*10+c-'0'; 172*30110Ssam (*cp)--; 173*30110Ssam return (n); 174*30110Ssam } 175*30110Ssam 176*30110Ssam static 177*30110Ssam printnum(n, base) 178*30110Ssam register POS n; 179*30110Ssam { 180*30110Ssam register char *dptr; 181*30110Ssam char digs[15]; 182*30110Ssam 183*30110Ssam dptr=digs; 184*30110Ssam if (base<0) { 185*30110Ssam base = -base; 186*30110Ssam if ((long)n<0) { 187*30110Ssam n = -n; 188*30110Ssam *digitptr++ = '-'; 189*30110Ssam } 190*30110Ssam } 191*30110Ssam while (n) { 192*30110Ssam *dptr++ = n%base; 193*30110Ssam n /= base; 194*30110Ssam } 195*30110Ssam if (dptr==digs) 196*30110Ssam *dptr++=0; 197*30110Ssam while (dptr!=digs) { 198*30110Ssam n = *--dptr; 199*30110Ssam *digitptr++ = (n+(n<=9 ? '0' : 'a'-10)); 200*30110Ssam } 201*30110Ssam } 202*30110Ssam 203*30110Ssam endline() 204*30110Ssam { 205*30110Ssam 206*30110Ssam if (maxpos <= charpos()) 207*30110Ssam printf("\n"); 208*30110Ssam } 209