Annotation of Net2/ddb/db_output.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie the
                     24:  * rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  * HISTORY
                     28:  * $Log: db_output.c,v $
                     29:  * Revision 1.1  1992/03/25  21:45:18  pace
                     30:  * Initial revision
                     31:  *
                     32:  * Revision 2.3  91/02/05  17:06:45  mrt
                     33:  *     Changed to new Mach copyright
                     34:  *     [91/01/31  16:18:41  mrt]
                     35:  * 
                     36:  * Revision 2.2  90/08/27  21:51:25  dbg
                     37:  *     Put extra features of db_doprnt in _doprnt.
                     38:  *     [90/08/20            dbg]
                     39:  *     Reduce lint.
                     40:  *     [90/08/07            dbg]
                     41:  *     Created.
                     42:  *     [90/07/25            dbg]
                     43:  * 
                     44:  */
                     45: /*
                     46:  *     Author: David B. Golub, Carnegie Mellon University
                     47:  *     Date:   7/90
                     48:  */
                     49: 
                     50: /*
                     51:  * Printf and character output for debugger.
                     52:  */
                     53: 
                     54: #include "param.h"
                     55: #include <machine/stdarg.h>
                     56: 
                     57: /*
                     58:  *     Character output - tracks position in line.
                     59:  *     To do this correctly, we should know how wide
                     60:  *     the output device is - then we could zero
                     61:  *     the line position when the output device wraps
                     62:  *     around to the start of the next line.
                     63:  *
                     64:  *     Instead, we count the number of spaces printed
                     65:  *     since the last printing character so that we
                     66:  *     don't print trailing spaces.  This avoids most
                     67:  *     of the wraparounds.
                     68:  */
                     69: int    db_output_position = 0;         /* output column */
                     70: int    db_last_non_space = 0;          /* last non-space character */
                     71: int    db_tab_stop_width = 8;          /* how wide are tab stops? */
                     72: #define        NEXT_TAB(i) \
                     73:        ((((i) + db_tab_stop_width) / db_tab_stop_width) * db_tab_stop_width)
                     74: int    db_max_width = 80;              /* output line width */
                     75: 
                     76: extern void    db_check_interrupt();
                     77: 
                     78: /*
                     79:  * Force pending whitespace.
                     80:  */
                     81: void
                     82: db_force_whitespace()
                     83: {
                     84:        register int last_print, next_tab;
                     85: 
                     86:        last_print = db_last_non_space;
                     87:        while (last_print < db_output_position) {
                     88:            next_tab = NEXT_TAB(last_print);
                     89:            if (next_tab <= db_output_position) {
                     90:                cnputc('\t');
                     91:                last_print = next_tab;
                     92:            }
                     93:            else {
                     94:                cnputc(' ');
                     95:                last_print++;
                     96:            }
                     97:        }
                     98:        db_last_non_space = db_output_position;
                     99: }
                    100: 
                    101: /*
                    102:  * Output character.  Buffer whitespace.
                    103:  */
                    104: db_putchar(c)
                    105:        int     c;              /* character to output */
                    106: {
                    107:        if (c > ' ' && c <= '~') {
                    108:            /*
                    109:             * Printing character.
                    110:             * If we have spaces to print, print them first.
                    111:             * Use tabs if possible.
                    112:             */
                    113:            db_force_whitespace();
                    114:            cnputc(c);
                    115:            db_output_position++;
                    116:            db_last_non_space = db_output_position;
                    117:        }
                    118:        else if (c == '\n') {
                    119:            /* Return */
                    120:            cnputc(c);
                    121:            db_output_position = 0;
                    122:            db_last_non_space = 0;
                    123:            db_check_interrupt();
                    124:        }
                    125:        else if (c == '\t') {
                    126:            /* assume tabs every 8 positions */
                    127:            db_output_position = NEXT_TAB(db_output_position);
                    128:        }
                    129:        else if (c == ' ') {
                    130:            /* space */
                    131:            db_output_position++;
                    132:        }
                    133:        else if (c == '\007') {
                    134:            /* bell */
                    135:            cnputc(c);
                    136:        }
                    137:        /* other characters are assumed non-printing */
                    138: }
                    139: 
                    140: /*
                    141:  * Return output position
                    142:  */
                    143: int
                    144: db_print_position()
                    145: {
                    146:        return (db_output_position);
                    147: }
                    148: 
                    149: /*
                    150:  * End line if too long.
                    151:  */
                    152: void
                    153: db_end_line()
                    154: {
                    155:        if (db_output_position >= db_max_width)
                    156:            db_printf("\n");
                    157: }
                    158: 
                    159: /*
                    160:  * Printing
                    161:  */
                    162: extern int     db_radix;
                    163: 
                    164: /*VARARGS1*/
                    165: db_printf(char *fmt, ...)
                    166: {
                    167:        va_list listp;
                    168:        va_start(listp, fmt);
                    169:        db_printf_guts (fmt, listp);
                    170:        va_end(listp);
                    171: }
                    172: 
                    173: /* alternate name */
                    174: 
                    175: /*VARARGS1*/
                    176: kdbprintf(char *fmt, ...)
                    177: {
                    178:        va_list listp;
                    179:        va_start(listp, fmt);
                    180:        db_printf_guts (fmt, listp);
                    181:        va_end(listp);
                    182: }
                    183: 
                    184: /*
                    185:  * Put a number (base <= 16) in a buffer in reverse order; return an
                    186:  * optional length and a pointer to the NULL terminated (preceded?)
                    187:  * buffer.
                    188:  */
                    189: static char *
                    190: db_ksprintn(ul, base, lenp)
                    191:        register u_long ul;
                    192:        register int base, *lenp;
                    193: {                                      /* A long in base 8, plus NULL. */
                    194:        static char buf[sizeof(long) * NBBY / 3 + 2];
                    195:        register char *p;
                    196: 
                    197:        p = buf;
                    198:        do {
                    199:                *++p = "0123456789abcdef"[ul % base];
                    200:        } while (ul /= base);
                    201:        if (lenp)
                    202:                *lenp = p - buf;
                    203:        return (p);
                    204: }
                    205: 
                    206: db_printf_guts(fmt, ap)
                    207:        register const char *fmt;
                    208:        va_list ap;
                    209: {
                    210:        register char *p;
                    211:        register int ch, n;
                    212:        u_long ul;
                    213:        int base, lflag, tmp, width;
                    214:        char padc;
                    215:        int ladjust;
                    216:        int sharpflag;
                    217:        int neg;
                    218: 
                    219:        for (;;) {
                    220:                padc = ' ';
                    221:                width = 0;
                    222:                while ((ch = *(u_char *)fmt++) != '%') {
                    223:                        if (ch == '\0')
                    224:                                return;
                    225:                        db_putchar(ch);
                    226:                }
                    227:                lflag = 0;
                    228:                ladjust = 0;
                    229:                sharpflag = 0;
                    230:                neg = 0;
                    231: reswitch:      switch (ch = *(u_char *)fmt++) {
                    232:                case '0':
                    233:                        padc = '0';
                    234:                        goto reswitch;
                    235:                case '1': case '2': case '3': case '4':
                    236:                case '5': case '6': case '7': case '8': case '9':
                    237:                        for (width = 0;; ++fmt) {
                    238:                                width = width * 10 + ch - '0';
                    239:                                ch = *fmt;
                    240:                                if (ch < '0' || ch > '9')
                    241:                                        break;
                    242:                        }
                    243:                        goto reswitch;
                    244:                case 'l':
                    245:                        lflag = 1;
                    246:                        goto reswitch;
                    247:                case '-':
                    248:                        ladjust = 1;
                    249:                        goto reswitch;
                    250:                case '#':
                    251:                        sharpflag = 1;
                    252:                        goto reswitch;
                    253:                case 'b':
                    254:                        ul = va_arg(ap, int);
                    255:                        p = va_arg(ap, char *);
                    256:                        for (p = db_ksprintn(ul, *p++, NULL); ch = *p--;)
                    257:                                db_putchar(ch);
                    258: 
                    259:                        if (!ul)
                    260:                                break;
                    261: 
                    262:                        for (tmp = 0; n = *p++;) {
                    263:                                if (ul & (1 << (n - 1))) {
                    264:                                        db_putchar(tmp ? ',' : '<');
                    265:                                        for (; (n = *p) > ' '; ++p)
                    266:                                                db_putchar(n);
                    267:                                        tmp = 1;
                    268:                                } else
                    269:                                        for (; *p > ' '; ++p);
                    270:                        }
                    271:                        if (tmp)
                    272:                                db_putchar('>');
                    273:                        break;
                    274:                case '*':
                    275:                        width = va_arg (ap, int);
                    276:                        if (width < 0) {
                    277:                                ladjust = !ladjust;
                    278:                                width = -width;
                    279:                        }
                    280:                        goto reswitch;
                    281:                case 'c':
                    282:                        db_putchar(va_arg(ap, int));
                    283:                        break;
                    284:                case 's':
                    285:                        p = va_arg(ap, char *);
                    286:                        width -= strlen (p);
                    287:                        if (!ladjust && width > 0)
                    288:                                while (width--)
                    289:                                        db_putchar (padc);
                    290:                        while (ch = *p++)
                    291:                                db_putchar(ch);
                    292:                        if (ladjust && width > 0)
                    293:                                while (width--)
                    294:                                        db_putchar (padc);
                    295:                        break;
                    296:                case 'r':
                    297:                        ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
                    298:                        if ((long)ul < 0) {
                    299:                                neg = 1;
                    300:                                ul = -(long)ul;
                    301:                        }
                    302:                        base = db_radix;
                    303:                        if (base < 8 || base > 16)
                    304:                                base = 10;
                    305:                        goto number;
                    306:                case 'n':
                    307:                        ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
                    308:                        base = db_radix;
                    309:                        if (base < 8 || base > 16)
                    310:                                base = 10;
                    311:                        goto number;
                    312:                case 'd':
                    313:                        ul = lflag ? va_arg(ap, long) : va_arg(ap, int);
                    314:                        if ((long)ul < 0) {
                    315:                                neg = 1;
                    316:                                ul = -(long)ul;
                    317:                        }
                    318:                        base = 10;
                    319:                        goto number;
                    320:                case 'o':
                    321:                        ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
                    322:                        base = 8;
                    323:                        goto number;
                    324:                case 'u':
                    325:                        ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
                    326:                        base = 10;
                    327:                        goto number;
                    328:                case 'z':
                    329:                        ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
                    330:                        if ((long)ul < 0) {
                    331:                                neg = 1;
                    332:                                ul = -(long)ul;
                    333:                        }
                    334:                        base = 16;
                    335:                        goto number;
                    336:                case 'x':
                    337:                        ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
                    338:                        base = 16;
                    339: number:                        p = (char *)db_ksprintn(ul, base, &tmp);
                    340:                        if (sharpflag && ul != 0) {
                    341:                                if (base == 8)
                    342:                                        tmp++;
                    343:                                else if (base == 16)
                    344:                                        tmp += 2;
                    345:                        }
                    346:                        if (neg)
                    347:                                tmp++;
                    348: 
                    349:                        if (!ladjust && width && (width -= tmp) > 0)
                    350:                                while (width--)
                    351:                                        db_putchar(padc);
                    352:                        if (neg)
                    353:                                db_putchar ('-');
                    354:                        if (sharpflag && ul != 0) {
                    355:                                if (base == 8) {
                    356:                                        db_putchar ('0');
                    357:                                } else if (base == 16) {
                    358:                                        db_putchar ('0');
                    359:                                        db_putchar ('x');
                    360:                                }
                    361:                        }
                    362:                        if (ladjust && width && (width -= tmp) > 0)
                    363:                                while (width--)
                    364:                                        db_putchar(padc);
                    365: 
                    366:                        while (ch = *p--)
                    367:                                db_putchar(ch);
                    368:                        break;
                    369:                default:
                    370:                        db_putchar('%');
                    371:                        if (lflag)
                    372:                                db_putchar('l');
                    373:                        /* FALLTHROUGH */
                    374:                case '%':
                    375:                        db_putchar(ch);
                    376:                }
                    377:        }
                    378: }
                    379: 

unix.superglobalmegacorp.com

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