Annotation of 3BSD/cmd/col.c, revision 1.1

1.1     ! root        1: # include <stdio.h>
        !             2: # define PL 256
        !             3: # define ESC '\033'
        !             4: # define RLF '\013'
        !             5: # define SI '\017'
        !             6: # define SO '\016'
        !             7: # define GREEK 0200
        !             8: # define LINELN 800
        !             9: 
        !            10: char *page[PL];
        !            11: char lbuff [LINELN], *line;
        !            12: int bflag, hflag, fflag;
        !            13: int half;
        !            14: int cp, lp;
        !            15: int ll, llh, mustwr;
        !            16: int pcp = 0;
        !            17: char *pgmname;
        !            18: char   *strcpy();
        !            19: 
        !            20: main (argc, argv)
        !            21:        int argc; char **argv;
        !            22: {
        !            23:        int i;
        !            24:        int greek;
        !            25:        register int c;
        !            26:        char fbuff[BUFSIZ];
        !            27: 
        !            28:        setbuf (stdout, fbuff);
        !            29:        pgmname = argv[0];
        !            30: 
        !            31:        for (i = 1; i < argc; i++) {
        !            32:                register char *p;
        !            33:                if (*argv[i] != '-') {
        !            34:                        fprintf (stderr, "%s: bad option %s\n",
        !            35:                                pgmname, argv[i]);
        !            36:                        exit (2);
        !            37:                }
        !            38:                for (p = argv[i]+1; *p; p++) {
        !            39:                        switch (*p) {
        !            40:                        case 'b':
        !            41:                                bflag++;
        !            42:                                break;
        !            43: 
        !            44:                        case 'h':
        !            45:                                hflag++;
        !            46:                                break;
        !            47: 
        !            48:                        case 'f':
        !            49:                                fflag++;
        !            50:                                break;
        !            51: 
        !            52:                        default:
        !            53:                                fprintf (stderr, "%s: bad option letter %c\n",
        !            54:                                        pgmname, *p);
        !            55:                                exit (2);
        !            56:                        }
        !            57:                }
        !            58:        }
        !            59: 
        !            60:        for (ll=0; ll<PL; ll++)
        !            61:                page[ll] = 0;
        !            62: 
        !            63:        cp = 0;
        !            64:        ll = 0;
        !            65:        greek = 0;
        !            66:        mustwr = PL;
        !            67:        line = lbuff;
        !            68: 
        !            69:        while ((c = getchar()) != EOF) {
        !            70:                switch (c) {
        !            71:                case '\n':
        !            72:                        incr();
        !            73:                        incr();
        !            74:                        cp = 0;
        !            75:                        continue;
        !            76: 
        !            77:                case '\0':
        !            78:                        continue;
        !            79: 
        !            80:                case ESC:
        !            81:                        c = getchar();
        !            82:                        switch (c) {
        !            83:                        case '7':       /* reverse full line feed */
        !            84:                                decr();
        !            85:                                decr();
        !            86:                                break;
        !            87: 
        !            88:                        case '8':       /* reverse half line feed */
        !            89:                                if (fflag)
        !            90:                                        decr();
        !            91:                                else {
        !            92:                                        if (--half < -1) {
        !            93:                                                decr();
        !            94:                                                decr();
        !            95:                                                half += 2;
        !            96:                                        }
        !            97:                                }
        !            98:                                break;
        !            99: 
        !           100:                        case '9':       /* forward half line feed */
        !           101:                                if (fflag)
        !           102:                                        incr();
        !           103:                                else {
        !           104:                                        if (++half > 0) {
        !           105:                                                incr();
        !           106:                                                incr();
        !           107:                                                half -= 2;
        !           108:                                        }
        !           109:                                }
        !           110:                                break;
        !           111:                        }
        !           112:                        continue;
        !           113: 
        !           114:                case SO:
        !           115:                        greek = GREEK;
        !           116:                        continue;
        !           117: 
        !           118:                case SI:
        !           119:                        greek = 0;
        !           120:                        continue;
        !           121: 
        !           122:                case RLF:
        !           123:                        decr();
        !           124:                        decr();
        !           125:                        continue;
        !           126: 
        !           127:                case '\r':
        !           128:                        cp = 0;
        !           129:                        continue;
        !           130: 
        !           131:                case '\t':
        !           132:                        cp = (cp + 8) & -8;
        !           133:                        continue;
        !           134: 
        !           135:                case '\b':
        !           136:                        if (cp > 0)
        !           137:                                cp--;
        !           138:                        continue;
        !           139: 
        !           140:                case ' ':
        !           141:                        cp++;
        !           142:                        continue;
        !           143: 
        !           144:                default:
        !           145:                        c &= 0177;
        !           146:                        if (c > 040 && c < 0177) {      /* if printable */
        !           147:                                outc(c | greek);
        !           148:                                cp++;
        !           149:                        }
        !           150:                        continue;
        !           151:                }
        !           152:        }
        !           153: 
        !           154:        for (i=0; i<PL; i++)
        !           155:                if (page[(mustwr+i)%PL] != 0)
        !           156:                        emit (page[(mustwr+i) % PL], mustwr+i-PL);
        !           157:        emit (" ", (llh + 1) & -2);
        !           158:        return 0;
        !           159: }
        !           160: 
        !           161: outc (c)
        !           162:        register char c;
        !           163: {
        !           164:        if (lp > cp) {
        !           165:                line = lbuff;
        !           166:                lp = 0;
        !           167:        }
        !           168: 
        !           169:        while (lp < cp) {
        !           170:                switch (*line) {
        !           171:                case '\0':
        !           172:                        *line = ' ';
        !           173:                        lp++;
        !           174:                        break;
        !           175: 
        !           176:                case '\b':
        !           177:                        lp--;
        !           178:                        break;
        !           179: 
        !           180:                default:
        !           181:                        lp++;
        !           182:                }
        !           183:                line++;
        !           184:        }
        !           185:        while (*line == '\b') {
        !           186:                line += 2;
        !           187:        }
        !           188:        if (bflag || *line == '\0' || *line == ' ')
        !           189:                *line = c;
        !           190:        else {
        !           191:                register char c1, c2, c3;
        !           192:                c1 = *++line;
        !           193:                *line++ = '\b';
        !           194:                c2 = *line;
        !           195:                *line++ = c;
        !           196:                while (c1) {
        !           197:                        c3 = *line;
        !           198:                        *line++ = c1;
        !           199:                        c1 = c2;
        !           200:                        c2 = c3;
        !           201:                }
        !           202:                lp = 0;
        !           203:                line = lbuff;
        !           204:        }
        !           205: }
        !           206: 
        !           207: store (lno)
        !           208: {
        !           209:        char *malloc();
        !           210: 
        !           211:        lno %= PL;
        !           212:        if (page[lno] != 0)
        !           213:                free (page[lno]);
        !           214:        page[lno] = malloc((unsigned)strlen(lbuff) + 2);
        !           215:        if (page[lno] == 0) {
        !           216:                fprintf (stderr, "%s: no storage\n", pgmname);
        !           217:                exit (2);
        !           218:        }
        !           219:        strcpy (page[lno],lbuff);
        !           220: }
        !           221: 
        !           222: fetch(lno)
        !           223: {
        !           224:        register char *p;
        !           225: 
        !           226:        lno %= PL;
        !           227:        p = lbuff;
        !           228:        while (*p)
        !           229:                *p++ = '\0';
        !           230:        line = lbuff;
        !           231:        lp = 0;
        !           232:        if (page[lno])
        !           233:                strcpy (line, page[lno]);
        !           234: }
        !           235: emit (s, lineno)
        !           236:        char *s;
        !           237:        int lineno;
        !           238: {
        !           239:        static int cline = 0;
        !           240:        register int ncp;
        !           241:        register char *p;
        !           242:        static int gflag = 0;
        !           243: 
        !           244:        if (*s) {
        !           245:                while (cline < lineno - 1) {
        !           246:                        putchar ('\n');
        !           247:                        pcp = 0;
        !           248:                        cline += 2;
        !           249:                }
        !           250:                if (cline != lineno) {
        !           251:                        putchar (ESC);
        !           252:                        putchar ('9');
        !           253:                        cline++;
        !           254:                }
        !           255:                if (pcp)
        !           256:                        putchar ('\r');
        !           257:                pcp = 0;
        !           258:                p = s;
        !           259:                while (*p) {
        !           260:                        ncp = pcp;
        !           261:                        while (*p++ == ' ') {
        !           262:                                if ((++ncp & 7) == 0 && hflag) {
        !           263:                                        pcp = ncp;
        !           264:                                        putchar ('\t');
        !           265:                                }
        !           266:                        }
        !           267:                        if (!*--p)
        !           268:                                break;
        !           269:                        while (pcp < ncp) {
        !           270:                                putchar (' ');
        !           271:                                pcp++;
        !           272:                        }
        !           273:                        if (gflag != (*p & GREEK) && *p != '\b') {
        !           274:                                if (gflag)
        !           275:                                        putchar (SI);
        !           276:                                else
        !           277:                                        putchar (SO);
        !           278:                                gflag ^= GREEK;
        !           279:                        }
        !           280:                        putchar (*p & ~GREEK);
        !           281:                        if (*p++ == '\b')
        !           282:                                pcp--;
        !           283:                        else
        !           284:                                pcp++;
        !           285:                }
        !           286:        }
        !           287: }
        !           288: 
        !           289: incr()
        !           290: {
        !           291:        store (ll++);
        !           292:        if (ll > llh)
        !           293:                llh = ll;
        !           294:        if (ll >= mustwr && page[ll%PL]) {
        !           295:                emit (page[ll%PL], ll - PL);
        !           296:                mustwr++;
        !           297:                free (page[ll%PL]);
        !           298:                page[ll%PL] = 0;
        !           299:        }
        !           300:        fetch (ll);
        !           301: }
        !           302: 
        !           303: decr()
        !           304: {
        !           305:        if (ll > mustwr - PL) {
        !           306:                store (ll--);
        !           307:                fetch (ll);
        !           308:        }
        !           309: }

unix.superglobalmegacorp.com

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