Annotation of 43BSDTahoe/sys/kdb/kdb_output.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.