Annotation of 43BSDTahoe/usr.bin/col.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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