Annotation of 43BSDReno/bin/adb/common_source/output.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)output.c   5.1 (Berkeley) 1/16/89";
                      3: #endif
                      4: 
                      5: /*
                      6:  * adb - output
                      7:  */
                      8: 
                      9: #include "defs.h"
                     10: #include <ctype.h>
                     11: #include <stdio.h>
                     12: #include <varargs.h>
                     13: 
                     14: extern char TOODEEP[];
                     15: 
                     16: int    infile;
                     17: int    outfile = 1;
                     18: 
                     19: char   printbuf[LINELEN];
                     20: char   *printptr = printbuf;
                     21: 
                     22: 
                     23: /*
                     24:  * Print the string s.
                     25:  */
                     26: prints(s)
                     27:        register char *s;
                     28: {
                     29:        register int c;
                     30: 
                     31:        while ((c = *s++) != '\0')
                     32:                printc(c);
                     33: }
                     34: 
                     35: /*
                     36:  * Print the character c.
                     37:  */
                     38: printc(c)
                     39:        int c;
                     40: {
                     41: 
                     42:        if (mkfault)
                     43:                return;
                     44:        switch (c) {
                     45: 
                     46:        case 0:
                     47:                return;
                     48: 
                     49:        case '\n':
                     50:                sendout();
                     51:                return;
                     52: 
                     53:        default:
                     54:                if (isprint(c))
                     55:                        *printptr++ = c;
                     56:                break;
                     57:        }
                     58:        if (printptr >= &printbuf[LINELEN - 1]) /* 1 == space for \n */
                     59:                sendout();
                     60: }
                     61: 
                     62: /*
                     63:  * Send (write) out the contents of the print buffer, compressing
                     64:  * spaces into tabs.
                     65:  */
                     66: static
                     67: sendout()
                     68: {
                     69:        register char *p, *q;
                     70:        register int c, off = 0, spaces = 0, s;
                     71: #define        tabsize(x) (8 - ((x) & 7))
                     72: 
                     73:        for (q = p = printbuf; p < printptr;) {
                     74:                c = *p++;
                     75:                switch (c) {
                     76: 
                     77:                case ' ':
                     78:                        spaces++;
                     79:                        break;
                     80: 
                     81:                case '\t':
                     82:                        spaces += tabsize(off + spaces);
                     83:                        break;
                     84: 
                     85:                default:
                     86:                        s = tabsize(off);
                     87:                        off += spaces + 1;
                     88:                        while (spaces >= s) {
                     89:                                *q++ = '\t';
                     90:                                spaces -= s;
                     91:                                s = 8;
                     92:                        }
                     93:                        while (--spaces >= 0)
                     94:                                *q++ = ' ';
                     95:                        spaces = 0;
                     96:                        *q++ = c;
                     97:                }
                     98:        }
                     99:        *q++ = '\n';
                    100:        (void) write(outfile, printbuf, q - printbuf);
                    101:        printptr = printbuf;
                    102: #undef tabsize
                    103: }
                    104: 
                    105: charpos()
                    106: {
                    107: 
                    108:        return (printptr - printbuf);
                    109: }
                    110: 
                    111: endline()
                    112: {
                    113: 
                    114:        if (printptr - printbuf >= maxcol)
                    115:                printc('\n');
                    116: }
                    117: 
                    118: flushbuf()
                    119: {
                    120: 
                    121:        if (printptr != printbuf)
                    122:                sendout();
                    123: }
                    124: 
                    125: /* this should not be necessary! */
                    126: #ifdef lint
                    127: #undef va_arg
                    128: #define va_arg(ap, type) (ap = ap, (type)0)
                    129: #endif
                    130: 
                    131: /*
                    132:  * Context passed between adbprintf and decodefmt.
                    133:  */
                    134: struct prf {
                    135:        char    *fmt;           /* format pointer */
                    136:        va_list ap;             /* argument pointer */
                    137:        char    *buf;           /* digit buffer, or %s string */
                    138:        int     adj;            /* 'l'eft (-) or 'r'ight adjustment */
                    139:        int     width;          /* width from format */
                    140:        int     prec;           /* precision from format */
                    141: };
                    142: 
                    143: /*
                    144:  * adb's very own version of printf() ... of course, all the format
                    145:  * escapes are different.  Noteworthy are the %<width>m and %<tabstop>t
                    146:  * formats, which move the given width, or to the given tabstop, and
                    147:  * the %?a format, which evaluates one argument, and if not zero, prints
                    148:  * according to format a.  (Note that any modifiers must appear in the 
                    149:  * `a' part, not in the %? part.)
                    150:  */
                    151: /* VARARGS1 */
                    152: adbprintf(fmt, va_alist)
                    153:        char *fmt;
                    154:        va_dcl
                    155: {
                    156:        register char *s;
                    157:        register int n, c;
                    158:        struct prf prf;
                    159:        char digits[130];       /* good to at least 128 bit expr_t */
                    160: 
                    161:        /* set up the fields adbprf needs */
                    162:        prf.fmt = fmt;
                    163:        va_start(prf.ap);
                    164:        for (;;) {
                    165:                /* look for % conversions */
                    166:                s = prf.fmt;
                    167:                while ((c = *s++) != '%') {
                    168:                        if (c == 0)
                    169:                                return;
                    170:                        printc(c);
                    171:                }
                    172:                prf.fmt = s;
                    173:                prf.buf = digits;
                    174:                dofmt(&prf);            /* format one format */
                    175:                n = strlen(s = prf.buf);
                    176:                if (prf.prec >= 0 && n > prf.prec)
                    177:                        n = prf.prec;
                    178:                c = prf.width - n;
                    179:                if (prf.adj == 'r')
                    180:                        while (--c >= 0)
                    181:                                printc(' ');
                    182:                while (--n >= 0)
                    183:                        printc(*s++);
                    184:                while (--c >= 0)
                    185:                        printc(' ');
                    186:        }
                    187:        va_end(prf.ap);
                    188: }
                    189: 
                    190: /*
                    191:  * Do a single format.
                    192:  */
                    193: static
                    194: dofmt(prf)
                    195:        register struct prf *prf;
                    196: {
                    197:        register char *s = prf->fmt;
                    198:        register va_list ap = prf->ap;
                    199:        register int c, n;
                    200:        expr_t v;
                    201:        int pluspref = 0;
                    202:        static char null[] = "";
                    203: 
                    204:        prf->adj = 'r';
                    205:        prf->width = 0;
                    206:        prf->prec = -1;
                    207: more:
                    208:        c = *s++;
                    209: sw:
                    210:        switch (c) {
                    211: 
                    212:        case '-':
                    213:                prf->adj = 'l';
                    214:                goto more;
                    215: 
                    216:        case '+':
                    217:                pluspref = 1;
                    218:                goto more;
                    219: 
                    220:        case '*':
                    221:                prf->width = va_arg(ap, int);
                    222:                goto more;
                    223: 
                    224:        case '0': case '1': case '2': case '3': case '4':
                    225:        case '5': case '6': case '7': case '8': case '9':
                    226:                for (n = c - '0'; isdigit(c = *s++);)
                    227:                        n = 10 * n + c - '0';
                    228:                prf->width = n;
                    229:                goto sw;
                    230: 
                    231:        case '.':
                    232:                c = *s++;
                    233:                if (c == '*') {
                    234:                        prf->prec = va_arg(ap, int);
                    235:                        goto more;
                    236:                }
                    237:                for (n = 0; isdigit(c); c = *s++)
                    238:                        n = 10 * n + c - '0';
                    239:                prf->prec = n;
                    240:                goto sw;
                    241: 
                    242:        case 'v': case 'V':
                    243:                /* print in signed version of current radix */
                    244:                if ((n = radix) > 0)
                    245:                        n = -n;
                    246:                goto rprint;
                    247: 
                    248:        case 'q': case 'Q': n =  -8; goto rprint; /* octal */
                    249:        case 'd': case 'D': n = -10; goto rprint; /* decimal */
                    250:        case 'z': case 'Z': n = -16; goto rprint; /* hex */
                    251:        case 'o': case 'O': n =   8; goto rprint; /* and */
                    252:        case 'u': case 'U': n =  10; goto rprint; /* unsigned */
                    253:        case 'x': case 'X': n =  16; goto rprint; /* versions */
                    254: 
                    255:        case 'r': case 'R':
                    256:                n = radix;
                    257: rprint:
                    258:                if (isupper(c))
                    259:                        v = n < 0 ? SF_ARG : UF_ARG;
                    260:                else
                    261:                        v = n < 0 ? SH_ARG : UH_ARG;
                    262:                printradix(prf->buf, v, n, pluspref);
                    263:                break;
                    264: 
                    265:        case 'Y':
                    266:                printdate(prf->buf, va_arg(ap, time_t));
                    267:                break;
                    268: 
                    269:        case 'c':
                    270:                *prf->buf = va_arg(ap, int);
                    271:                prf->buf[1] = 0;
                    272:                break;
                    273: 
                    274:        case 's':
                    275:                prf->buf = va_arg(ap, char *);
                    276:                break;
                    277: 
                    278:        case 'f':
                    279:                /* here comes stdio ... sigh */
                    280:                (void) sprintf(prf->buf, "%+*.*e", prf->width,
                    281:                    prf->prec >= 0 ? prf->prec : 16, va_arg(ap, double));
                    282:                prf->prec = -1;
                    283:                break;
                    284: 
                    285:        case 'm':
                    286:                prf->buf = null;
                    287:                break;
                    288: 
                    289:        case 't':
                    290:                if (prf->width)
                    291:                        prf->width -= charpos() % prf->width;
                    292:                prf->buf = null;
                    293:                break;
                    294: 
                    295:        case '?':
                    296:                c = va_arg(ap, int);
                    297:                prf->fmt = s;
                    298:                prf->ap = ap;
                    299:                dofmt(prf);
                    300:                if (c == 0)
                    301:                        prf->buf = null;
                    302:                return;
                    303: 
                    304:        default:
                    305:                panic("dofmt");
                    306:                /* NOTREACHED */
                    307:        }
                    308:        prf->fmt = s;
                    309:        prf->ap = ap;
                    310: }
                    311: 
                    312: /*
                    313:  * Print the date into the buffer at `p'.
                    314:  */
                    315: static
                    316: printdate(p, tm)
                    317:        register char *p;
                    318:        time_t tm;
                    319: {
                    320:        char *asc = ctime(&tm);
                    321:        char *strncpy();
                    322: 
                    323:        (void) strncpy(p, asc + 20, 4);         /* "1988" */
                    324:        (void) strncpy(p + 4, asc + 3, 16);     /* " Aug 18 03:04:49" */
                    325:        p[20] = 0;
                    326: }
                    327: 
                    328: /*
                    329:  * Print the value `val' in base `base' into the buffer at `p'.
                    330:  * If base is negative, assume the number is signed.
                    331:  */
                    332: static
                    333: printradix(p, val, base, pluspref)
                    334:        register char *p;
                    335:        register expr_t val;
                    336:        register int base;
                    337:        int pluspref;
                    338: {
                    339:        register char *d;
                    340:        register expr_t high;
                    341:        char digs[128];         /* good to 128 bits minimum */
                    342: 
                    343:        if (base < 0) {
                    344:                base = -base;
                    345:                if ((sexpr_t)val < 0) {
                    346:                        val = -val;
                    347:                        *p++ = '-';
                    348:                } else if (pluspref)
                    349:                        *p++ = '+';
                    350:        } else if (pluspref)
                    351:                *p++ = '+';
                    352: 
                    353:        d = digs;
                    354:        switch (base) {
                    355: 
                    356:        case 8:
                    357:                while (val != 0) {
                    358:                        *d++ = val & 7;
                    359:                        val >>= 3;
                    360:                }
                    361:                *d++ = 0;
                    362:                break;
                    363: 
                    364:        case 16:
                    365:                do {
                    366:                        *d++ = val & 15;
                    367:                } while ((val >>= 4) != 0);
                    368:                break;
                    369: 
                    370:        default:
                    371:                do {
                    372:                        high = val / base;
                    373:                        *d++ = val - (high * base);
                    374:                } while ((val = high) != 0);
                    375:                break;
                    376:        }
                    377:        while (d > digs)
                    378:                *p++ = "0123456789abcdef"[*--d];
                    379:        *p = 0;
                    380: }
                    381: 
                    382: /*
                    383:  * BEGIN XXX
                    384:  * THIS BELONGS ELSEWHERE
                    385:  */
                    386: #define        MAXIFD  5
                    387: struct {
                    388:        int fd;
                    389:        expr_t v9;
                    390: } istack[MAXIFD];
                    391: int ifiledepth;
                    392: 
                    393: iclose(stack, err)
                    394:        int stack, err;
                    395: {
                    396: 
                    397:        if (err) {
                    398:                if (infile) {
                    399:                        (void) close(infile);
                    400:                        infile = 0;
                    401:                }
                    402:                while (--ifiledepth >= 0)
                    403:                        if (istack[ifiledepth].fd)
                    404:                                (void) close(istack[ifiledepth].fd);
                    405:                ifiledepth = 0;
                    406:        } else if (stack == 0) {
                    407:                if (infile) {
                    408:                        (void) close(infile);
                    409:                        infile = 0;
                    410:                }
                    411:        } else if (stack > 0) {
                    412:                if (ifiledepth >= MAXIFD)
                    413:                        error(TOODEEP);
                    414:                istack[ifiledepth].fd = infile;
                    415:                istack[ifiledepth].v9 = var[9];
                    416:                ifiledepth++;
                    417:                infile = 0;
                    418:        } else {
                    419:                if (infile) {
                    420:                        (void) close(infile);
                    421:                        infile = 0;
                    422:                }
                    423:                if (ifiledepth > 0) {
                    424:                        infile = istack[--ifiledepth].fd;
                    425:                        var[9] = istack[ifiledepth].v9;
                    426:                }
                    427:        }
                    428: }
                    429: 
                    430: oclose()
                    431: {
                    432: 
                    433:        if (outfile != 1) {
                    434:                flushbuf();
                    435:                (void) close(outfile);
                    436:                outfile = 1;
                    437:        }
                    438: }

unix.superglobalmegacorp.com

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