Annotation of Net2/ddb/db_output.c, revision 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.