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