Annotation of researchv10no/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 'c':
                    190:                        printc((char)*ap++);
                    191:                        break;
                    192: 
                    193:                case 's':
                    194:                        s = *sp++;
                    195:                        ap = (int *)sp;
                    196:                        break;
                    197: 
                    198:                /* m is for `move' */
                    199:                case 'm':
                    200:                        break;
                    201: 
                    202:                case 'M':
                    203:                        width = *ap++;
                    204:                        break;
                    205: 
                    206:                case 'T':
                    207:                        width = *ap++;
                    208:                        /* fall in */
                    209:                case 't':
                    210:                        if (width)
                    211:                                width -= charpos()%width;
                    212:                        break;
                    213: 
                    214:                default:
                    215:                        printc(c);
                    216:                        break;
                    217:                }
                    218:                if (s == NULL) {
                    219:                        *digitptr = 0;
                    220:                        s = digits;
                    221:                }
                    222:                n = strlen(s);
                    223:                if (prec >= 0 && prec < n)
                    224:                        n = prec;
                    225:                width -= n;
                    226:                if (adj=='r')
                    227:                        while (width-- > 0)
                    228:                                printc(SPC);
                    229:                while (n--)
                    230:                        printc(*s++);
                    231:                while (width-- > 0)
                    232:                        printc(SPC);
                    233:                digitptr=digits;
                    234:        }
                    235: }
                    236: 
                    237: prints(s)
                    238: char *s;
                    239: {
                    240:        printf("%s",s);
                    241: }
                    242: 
                    243: newline()
                    244: {
                    245:        printc(EOR);
                    246: }
                    247: 
                    248: convert(cp)
                    249: register char **cp;
                    250: {
                    251:        register char c;
                    252:        register int n;
                    253: 
                    254:        n=0;
                    255:        while (isdigit(c = *(*cp)++))
                    256:                n=n*10+c-'0';
                    257:        (*cp)--;
                    258:        return(n);
                    259: }
                    260: 
                    261: printmaybe(n, base)
                    262: WORD n;
                    263: {
                    264:        if (REALLYNEG(n))
                    265:                printsigned(n, base);
                    266:        else
                    267:                printus(n, base);
                    268: }
                    269: 
                    270: printsigned(n, base)
                    271: WORD n;
                    272: int base;
                    273: {
                    274: 
                    275:        if (n < 0) {
                    276:                n = -n;
                    277:                /* if (n < 0)  what? */
                    278:                *digitptr++ = '-';
                    279:        }
                    280:        printnum((unsigned long)n, base);
                    281: }
                    282: 
                    283: printus(n, base)
                    284: WORD n;
                    285: int base;
                    286: {
                    287: 
                    288:        printnum((unsigned long)n, base);
                    289: }
                    290: 
                    291: printnum(n, base)
                    292: unsigned long n;
                    293: int base;
                    294: {
                    295:        unsigned long d;
                    296:        register int r;
                    297:        static char digits[] = "0123456789abcdef";
                    298: 
                    299:        if ((d = n / base) != 0) {
                    300:                printnum(d, base);
                    301:                r = n - (d * base);
                    302:        }
                    303:        else {                  /* hack for first digit */
                    304:                r = n;
                    305:                if (base == radix) {
                    306:                        if (r >= 10)
                    307:                                *digitptr++ = '0';
                    308:                }
                    309:                else if (radix == 0)
                    310:                        switch (base) {
                    311:                        case 16:
                    312:                                *digitptr++ = '#';
                    313:                                break;
                    314: 
                    315:                        case 8:
                    316:                                if (r)
                    317:                                        *digitptr++ = '0';
                    318:                                break;
                    319:                        }
                    320:        }
                    321:        if (r < sizeof(digits) - 1)
                    322:                *digitptr++ = digits[r];
                    323:        else
                    324:                *digitptr++ = '?';
                    325: }
                    326: 
                    327: #define        MAXIFD  5
                    328: struct {
                    329:        int     fd;
                    330:        int     r9;
                    331: } istack[MAXIFD];
                    332: int    ifiledepth;
                    333: 
                    334: iclose(stack, err)
                    335: {
                    336:        if (err) {
                    337:                if (infile) {
                    338:                        close(infile);
                    339:                        infile=STDIN;
                    340:                }
                    341:                while (--ifiledepth >= 0)
                    342:                        if (istack[ifiledepth].fd)
                    343:                                close(istack[ifiledepth].fd);
                    344:                ifiledepth = 0;
                    345:        } else if (stack == 0) {
                    346:                if (infile) {
                    347:                        close(infile);
                    348:                        infile=STDIN;
                    349:                }
                    350:        } else if (stack > 0) {
                    351:                if (ifiledepth >= MAXIFD)
                    352:                        error("$<< nested too deeply");
                    353:                istack[ifiledepth].fd = infile;
                    354:                istack[ifiledepth].r9 = var[9];
                    355:                ifiledepth++;
                    356:                infile = STDIN;
                    357:        } else {
                    358:                if (infile) {
                    359:                        close(infile); 
                    360:                        infile=STDIN;
                    361:                }
                    362:                if (ifiledepth > 0) {
                    363:                        infile = istack[--ifiledepth].fd;
                    364:                        var[9] = istack[ifiledepth].r9;
                    365:                }
                    366:        }
                    367: }
                    368: 
                    369: oclose()
                    370: {
                    371:        if (outfile!=1) {
                    372:                flushbuf();
                    373:                close(outfile);
                    374:                outfile=STDOUT;
                    375:        }
                    376: }
                    377: 
                    378: endline()
                    379: {
                    380: 
                    381:        if (maxpos <= charpos())
                    382:                newline();
                    383: }

unix.superglobalmegacorp.com

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