Annotation of researchv10no/cmd/ccom/common/printx.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: 
        !             3: #define BSIZE  4096
        !             4: #define STRSIZE        1024
        !             5: #define BTOTAL (BSIZE+STRSIZE)
        !             6: 
        !             7: int nosharp, syncstdio;
        !             8: 
        !             9: static char buffer[BTOTAL];
        !            10: static char *bufpt = buffer;
        !            11: 
        !            12: char *sprintxl(), *sprintd(), *sprinto(), *sprintX();
        !            13: 
        !            14: /*
        !            15: main()
        !            16: {
        !            17:        printx("string: %s, decimals: %d, %d, %d, %d\npercent: %%, sharp: %#\n",
        !            18:            "this is it", 123456, 2147483647, -2147483647, -2147483648);
        !            19:        printx("octal: %o, hex: %x, char: %c\n",
        !            20:            0123456, 0x123456, 'z');
        !            21:        exit(0);
        !            22: }
        !            23: */
        !            24: 
        !            25: printx(fmt, list)
        !            26: char *fmt; long list;
        !            27: {
        !            28:        if (bufpt >= &buffer[BSIZE])
        !            29:                flushx();
        !            30:        bufpt = sprintxl(bufpt, fmt, &list);
        !            31:        if (syncstdio)
        !            32:                flushx();
        !            33: }
        !            34: 
        !            35: printbuf(p, n)
        !            36: register char *p; register int n;
        !            37: {
        !            38:        register int ncp;
        !            39:        while (n > 0) {
        !            40:                if (bufpt >= &buffer[BTOTAL])
        !            41:                        flushx();
        !            42:                ncp = &buffer[BTOTAL] - bufpt;
        !            43:                if (n < ncp)
        !            44:                        ncp = n;
        !            45:                memcpy(bufpt, p, ncp);
        !            46:                bufpt += ncp;
        !            47:                p += ncp;
        !            48:                n -= ncp;
        !            49:        }
        !            50:        if (syncstdio)
        !            51:                flushx();
        !            52: }
        !            53: 
        !            54: flushx()
        !            55: {
        !            56:        register int ncp;
        !            57:        if (ncp = bufpt - buffer)
        !            58:                if (syncstdio)
        !            59:                        fwrite(bufpt = buffer, sizeof(char), ncp, stdout);
        !            60:                else
        !            61:                        write(1, bufpt=buffer, ncp);
        !            62: }
        !            63: 
        !            64: char *
        !            65: sprintx(str, fmt, list)
        !            66: char *str, *fmt; long list;
        !            67: {
        !            68:        return sprintxl(str, fmt, &list);
        !            69: }
        !            70: 
        !            71: char *
        !            72: sprintxl(str, fmt, lp)
        !            73: register char *str, *fmt; register long *lp;
        !            74: {
        !            75:        register c; register char *p; char *sprintd();
        !            76:        while (c = *fmt++) switch (c) {
        !            77:        case '%': casePCT:
        !            78:                switch (c = *fmt++) {
        !            79:                case 'd':
        !            80:                        str = sprintd(str, *lp++); break;
        !            81:                case 's':
        !            82:                        for (p = (char *)(*lp++); *p;)
        !            83:                                *str++ = *p++;
        !            84:                        break;
        !            85:                case 'o':
        !            86:                        str = sprinto(str, *lp++); break;
        !            87:                case 'x':
        !            88:                        str = sprintX(str, *lp++); break;
        !            89:                case 'c':
        !            90:                        *str++ = *lp++; break;
        !            91:                case '%':
        !            92:                case '#':
        !            93:                        *str++ = c; break;
        !            94:                case 'l':
        !            95:                        goto casePCT;
        !            96:                default:
        !            97:                        *str++ = '%'; *str++ = c;
        !            98:                        if (c == 0) return --str;
        !            99:                        break;
        !           100:                }
        !           101:                break;
        !           102:        case '#':
        !           103:                if (nosharp == 0) *str++ = c; break;
        !           104:        default:
        !           105:                *str++ = c; break;
        !           106:        }
        !           107:        *str = 0;
        !           108:        return str;
        !           109: }
        !           110: 
        !           111: static int pwrd[] = {
        !           112:        0, 10, 100, 1000, 10000, 100000, 1000000,
        !           113:        10000000, 100000000, 1000000000, 0xffffffff,
        !           114: };
        !           115: 
        !           116: static char mostneg[] = "-2147483648";
        !           117: 
        !           118: char *
        !           119: sprintd(str, x)
        !           120: register char *str; register int x;
        !           121: {
        !           122:        register int *p = &pwrd[1], d;
        !           123: 
        !           124:        if (x < 0) {
        !           125:                x = -x;
        !           126:                if (x < 0) {
        !           127:                        memcpy(str, mostneg, sizeof mostneg);
        !           128:                        return str + (sizeof mostneg) - 1;
        !           129:                }
        !           130:                *str++ = '-';
        !           131:        }
        !           132:        while ((unsigned)(*p++) <= (unsigned)x)
        !           133:                /* void */;
        !           134:        --p;
        !           135:        while (*--p) {
        !           136:                d = x / *p;
        !           137:                x -= d * *p;
        !           138:                *str++ = d + '0';
        !           139:        }
        !           140:        *str++ = x + '0';
        !           141:        *str = 0;
        !           142:        return str;
        !           143: }
        !           144: 
        !           145: static unsigned int pwro[] = {
        !           146:        010, 0100, 01000, 010000, 0100000, 01000000,
        !           147:        010000000, 0100000000, 01000000000, 010000000000, 0,
        !           148: };
        !           149: 
        !           150: char *
        !           151: sprinto(str, x)
        !           152: register char *str; register unsigned int x;
        !           153: {
        !           154:        register int i = 0;
        !           155:        while (pwro[i] && (pwro[i] <= x))
        !           156:                ++i;
        !           157:        i *= 3;
        !           158:        do
        !           159:                *str++ = ((x>>i)&07) + '0';
        !           160:        while ((i -= 3) >= 0);
        !           161:        *str = 0;
        !           162:        return str;
        !           163: }
        !           164: 
        !           165: static unsigned int pwrx[] = {
        !           166:        0x10, 0x100, 0x1000, 0x10000, 0x100000, 0x1000000,
        !           167:        0x10000000, 0,
        !           168: };
        !           169: 
        !           170: static char hexit[] = {
        !           171:        '0', '1', '2', '3', '4', '5', '6', '7',
        !           172:        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
        !           173: };
        !           174: 
        !           175: char *
        !           176: sprintX(str, x)
        !           177: register char *str; register unsigned int x;
        !           178: {
        !           179:        register int i = 0;
        !           180:        while (pwrx[i] && (pwrx[i] <= x))
        !           181:                ++i;
        !           182:        i *= 4;
        !           183:        do
        !           184:                *str++ = hexit[(x>>i)&0xf];
        !           185:        while ((i -= 4) >= 0);
        !           186:        *str = 0;
        !           187:        return str;
        !           188: }

unix.superglobalmegacorp.com

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