Annotation of researchv9/cmd/adb/comm/output.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  *
                      4:  *     UNIX debugger
                      5:  *
                      6:  */
                      7: 
                      8: #include "defs.h"
                      9: 
                     10: 
                     11: int    infile = STDIN;
                     12: int    outfile = STDOUT;
                     13: int    maxpos = MAXPOS;
                     14: int    radix = 0;      /* magic multi-radix */
                     15: 
                     16: static char    printbuf[MAXLIN];
                     17: static char    *printptr = printbuf;
                     18: static char    *digitptr;
                     19: 
                     20: printc(c)
                     21: char           c;
                     22: {
                     23:        char    d;
                     24:        register char   *q;
                     25:        register int p;
                     26:        int     posn, tabs;
                     27: 
                     28:        if (mkfault)
                     29:                return;
                     30:        else if ((*printptr=c)==EOR) {
                     31:                tabs=0;
                     32:                posn=0;
                     33:                q=printbuf;
                     34:                for (p=0; p<printptr-printbuf; p++) {
                     35:                        d=printbuf[p];
                     36:                        if ((p&7)==0 && posn) {
                     37:                                tabs++;
                     38:                                posn=0;
                     39:                        }
                     40:                        if (d==SPC)
                     41:                                posn++;
                     42:                        else {
                     43:                                while (tabs>0) {
                     44:                                        *q++=TB;
                     45:                                        tabs--;
                     46:                                }
                     47:                                while (posn>0) {
                     48:                                        *q++=SPC;
                     49:                                        posn--;
                     50:                                }
                     51:                                *q++=d;
                     52:                        }
                     53:                }
                     54:                *q++=EOR;
                     55:                write(outfile,printbuf,q-printbuf);
                     56:                printptr=printbuf;
                     57:        } else if (c==TB) {
                     58:                *printptr++=SPC;
                     59:                while ((printptr-printbuf)&7)
                     60:                        *printptr++=SPC;
                     61:        } else if (c)
                     62:                printptr++;
                     63:        if (printptr >= &printbuf[MAXLIN-9]) {
                     64:                write(outfile, printbuf, printptr - printbuf);
                     65:                printptr = printbuf;
                     66:        }
                     67: }
                     68: 
                     69: charpos()
                     70: {
                     71:        return(printptr-printbuf);
                     72: }
                     73: 
                     74: flushbuf()
                     75: {
                     76:        if (printptr!=printbuf)
                     77:                printc(EOR);
                     78: }
                     79: 
                     80: /*
                     81:  * our very own printf.  yes.
                     82:  * `int' things (like %d) expect ints
                     83:  * `long' things (like %D) expect WORDs
                     84:  * there is no %f, for reasons to horrible to explain here
                     85:  *
                     86:  * declare lots of silly arguments because of the cray's calling sequence
                     87:  */
                     88: 
                     89: printf(fmat, a1, a2, a3, a4, a5, a6, a7, a8, a9)
                     90: char *fmat;
                     91: int a1;
                     92: {
                     93:        register int *ap;
                     94:        register char *s;
                     95:        register int n, width;
                     96:        int prec;
                     97:        char *fptr;
                     98:        int *ip;
                     99:        WORD *lp;
                    100:        char **sp;
                    101:        char c, adj;
                    102:        char digits[64];
                    103: 
                    104:        fptr = fmat;
                    105:        ap = &a1;               /* hack */
                    106:        while (c = *fptr++) {
                    107:                if (c!='%') {
                    108:                        printc(c);
                    109:                        continue;
                    110:                }
                    111:                adj = 'r';
                    112:                if (*fptr=='-') {
                    113:                        adj = 'l';
                    114:                        fptr++;
                    115:                }
                    116:                width=convert(&fptr);
                    117:                prec = -1;
                    118:                if (*fptr=='.') {
                    119:                        fptr++;
                    120:                        prec=convert(&fptr);
                    121:                }
                    122:                digitptr=digits;
                    123:                s = NULL;
                    124:                ip = (int *)ap;
                    125:                lp = (long *)ap;
                    126:                sp = (char **)ap;
                    127:                switch (c = *fptr++) {
                    128: 
                    129:                case 'd':
                    130:                        printsigned((WORD)*ip++, 10);
                    131:                        ap = (int *)ip;
                    132:                        break;
                    133: 
                    134:                case 'D':
                    135:                        printsigned((WORD)*lp++, 10);
                    136:                        ap = (int *)lp;
                    137:                        break;
                    138: 
                    139:                case 'u':
                    140:                        printus((WORD)*ip++, 10);
                    141:                        ap = (int *)ip;
                    142:                        break;
                    143: 
                    144:                case 'U':
                    145:                        printus((WORD)*lp++, 10);
                    146:                        ap = (int *)lp;
                    147:                        break;
                    148: 
                    149:                case 'o':
                    150:                        printus((WORD)*ip++, 8);
                    151:                        ap = (int *)ip;
                    152:                        break;
                    153: 
                    154:                case 'O':
                    155:                        printus((WORD)*lp++, 8);
                    156:                        ap = (int *)lp;
                    157:                        break;
                    158: 
                    159:                case 'q':
                    160:                        printsigned((WORD)*ip++, 8);
                    161:                        ap = (int *)ip;
                    162:                        break;
                    163: 
                    164:                case 'Q':
                    165:                        printsigned((WORD)*lp++, 8);
                    166:                        ap = (int *)lp;
                    167:                        break;
                    168: 
                    169:                case 'x':
                    170:                        printus((WORD)*ip++, 16);
                    171:                        ap = (int *)ip;
                    172:                        break;
                    173: 
                    174:                case 'X':
                    175:                        printus((WORD)*lp++, 16);
                    176:                        ap = (int *)lp;
                    177:                        break;
                    178: 
                    179:                case 'r':
                    180:                        printmaybe((WORD)*ip++, radix == 0 ? DEFRADIX : radix);
                    181:                        ap = (int *)ip;
                    182:                        break;
                    183: 
                    184:                case 'R':
                    185:                        printmaybe((WORD)*lp++, radix == 0 ? DEFRADIX : radix);
                    186:                        ap = (int *)lp;
                    187:                        break;
                    188: 
                    189:                case 'Y':
                    190:                        printdate((long)*lp++);
                    191:                        ap = (int *)lp;
                    192:                        break;
                    193: 
                    194:                case 'c':
                    195:                        printc((char)*ap++);
                    196:                        break;
                    197: 
                    198:                case 's':
                    199:                        s = *sp++;
                    200:                        ap = (int *)sp;
                    201:                        break;
                    202: 
                    203:                /* m is for `move' */
                    204:                case 'm':
                    205:                        break;
                    206: 
                    207:                case 'M':
                    208:                        width = *ap++;
                    209:                        break;
                    210: 
                    211:                case 'T':
                    212:                        width = *ap++;
                    213:                        /* fall in */
                    214:                case 't':
                    215:                        if (width)
                    216:                                width -= charpos()%width;
                    217:                        break;
                    218: 
                    219:                default:
                    220:                        printc(c);
                    221:                        break;
                    222:                }
                    223:                if (s == NULL) {
                    224:                        *digitptr = 0;
                    225:                        s = digits;
                    226:                }
                    227:                n = strlen(s);
                    228:                if (prec >= 0 && prec < n)
                    229:                        n = prec;
                    230:                width -= n;
                    231:                if (adj=='r')
                    232:                        while (width-- > 0)
                    233:                                printc(SPC);
                    234:                while (n--)
                    235:                        printc(*s++);
                    236:                while (width-- > 0)
                    237:                        printc(SPC);
                    238:                digitptr=digits;
                    239:        }
                    240: }
                    241: 
                    242: printdate(tvec)
                    243: long tvec;
                    244: {
                    245:        char *ctime();
                    246: 
                    247:        strcpy(digitptr, ctime(&tvec));
                    248:        digitptr += strlen(digitptr) - 1;       /* chop the newline */
                    249: }
                    250: 
                    251: prints(s)
                    252: char *s;
                    253: {
                    254:        printf("%s",s);
                    255: }
                    256: 
                    257: newline()
                    258: {
                    259:        printc(EOR);
                    260: }
                    261: 
                    262: convert(cp)
                    263: register char **cp;
                    264: {
                    265:        register char c;
                    266:        register int n;
                    267: 
                    268:        n=0;
                    269:        while (isdigit(c = *(*cp)++))
                    270:                n=n*10+c-'0';
                    271:        (*cp)--;
                    272:        return(n);
                    273: }
                    274: 
                    275: printmaybe(n, base)
                    276: WORD n;
                    277: {
                    278:        if (REALLYNEG(n))
                    279:                printsigned(n, base);
                    280:        else
                    281:                printus(n, base);
                    282: }
                    283: 
                    284: printsigned(n, base)
                    285: WORD n;
                    286: int base;
                    287: {
                    288: 
                    289:        if (n < 0) {
                    290:                n = -n;
                    291:                /* if (n < 0)  what? */
                    292:                *digitptr++ = '-';
                    293:        }
                    294:        printnum((unsigned long)n, base);
                    295: }
                    296: 
                    297: printus(n, base)
                    298: WORD n;
                    299: int base;
                    300: {
                    301: 
                    302:        printnum((unsigned long)n, base);
                    303: }
                    304: 
                    305: printnum(n, base)
                    306: unsigned long n;
                    307: int base;
                    308: {
                    309:        unsigned long d;
                    310:        register int r;
                    311:        static char digits[] = "0123456789abcdef";
                    312: 
                    313:        if ((d = n / base) != 0) {
                    314:                printnum(d, base);
                    315:                r = n - (d * base);
                    316:        }
                    317:        else {                  /* hack for first digit */
                    318:                r = n;
                    319:                if (base == radix) {
                    320:                        if (r >= 10)
                    321:                                *digitptr++ = '0';
                    322:                }
                    323:                else if (radix == 0)
                    324:                        switch (base) {
                    325:                        case 16:
                    326:                                *digitptr++ = '#';
                    327:                                break;
                    328: 
                    329:                        case 8:
                    330:                                if (r)
                    331:                                        *digitptr++ = '0';
                    332:                                break;
                    333:                        }
                    334:        }
                    335:        if (r < sizeof(digits) - 1)
                    336:                *digitptr++ = digits[r];
                    337:        else
                    338:                *digitptr++ = '?';
                    339: }
                    340: 
                    341: #define        MAXIFD  5
                    342: struct {
                    343:        int     fd;
                    344:        int     r9;
                    345: } istack[MAXIFD];
                    346: int    ifiledepth;
                    347: 
                    348: iclose(stack, err)
                    349: {
                    350:        if (err) {
                    351:                if (infile) {
                    352:                        close(infile);
                    353:                        infile=STDIN;
                    354:                }
                    355:                while (--ifiledepth >= 0)
                    356:                        if (istack[ifiledepth].fd)
                    357:                                close(istack[ifiledepth].fd);
                    358:                ifiledepth = 0;
                    359:        } else if (stack == 0) {
                    360:                if (infile) {
                    361:                        close(infile);
                    362:                        infile=STDIN;
                    363:                }
                    364:        } else if (stack > 0) {
                    365:                if (ifiledepth >= MAXIFD)
                    366:                        error("$<< nested too deeply");
                    367:                istack[ifiledepth].fd = infile;
                    368:                istack[ifiledepth].r9 = var[9];
                    369:                ifiledepth++;
                    370:                infile = STDIN;
                    371:        } else {
                    372:                if (infile) {
                    373:                        close(infile); 
                    374:                        infile=STDIN;
                    375:                }
                    376:                if (ifiledepth > 0) {
                    377:                        infile = istack[--ifiledepth].fd;
                    378:                        var[9] = istack[ifiledepth].r9;
                    379:                }
                    380:        }
                    381: }
                    382: 
                    383: oclose()
                    384: {
                    385:        if (outfile!=1) {
                    386:                flushbuf();
                    387:                close(outfile);
                    388:                outfile=STDOUT;
                    389:        }
                    390: }
                    391: 
                    392: endline()
                    393: {
                    394: 
                    395:        if (maxpos <= charpos())
                    396:                newline();
                    397: }

unix.superglobalmegacorp.com

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