Annotation of 43BSD/old/vpr/sidebyside.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: /*
                      3:  * sidebyside -- make wide listings by placing pages side by side
                      4:  */
                      5: int    width = 90;
                      6: 
                      7: #define        LINELN 440
                      8: #define        EJLINE  86
                      9: #define        LMARG   10
                     10: 
                     11: char   screen[EJLINE][LINELN];
                     12: char   ul[EJLINE][LINELN];
                     13: char   anyul[EJLINE];
                     14: int    frame;
                     15: int    origin;
                     16: int    outline;
                     17: int    outcol;
                     18: 
                     19: main(argc, argv)
                     20:        int argc;
                     21:        char *argv[];
                     22: {
                     23: 
                     24:        argc--, argv++;
                     25:        while (argc > 0 && argv[0][0] == '-') {
                     26:                switch (argv[0][1]) {
                     27: 
                     28:                case 'w':
                     29:                        width = atoi(argv[0]+2);
                     30:                        break;
                     31:                
                     32:                default:
                     33:                        fprintf(stderr, "usage: sidebyside [ -wwidth ] file ...\n");
                     34:                        break;
                     35:                }
                     36:                argc--, argv++;
                     37:        }
                     38:        clear(screen, EJLINE * LINELN);
                     39:        origin = LMARG;
                     40:        outcol = LMARG;
                     41:        cutmark(LMARG);
                     42:        do {
                     43:                if (argc > 0) {
                     44:                        if (freopen(argv[0], "r", stdin) == NULL) {
                     45:                                perror(argv[0]);
                     46:                                argc--, argv++;
                     47:                                continue;
                     48:                        }
                     49:                        argc--, argv++;
                     50:                }
                     51:                process();
                     52:        } while (argc > 0);
                     53:        exit(0);
                     54: }
                     55: 
                     56: process()
                     57: {
                     58:        char linebuf[BUFSIZ];
                     59:        register char *cp;
                     60:        register int c;
                     61: 
                     62:        while (fgets(linebuf, sizeof linebuf, stdin)) {
                     63:                for (cp = linebuf; c = *cp; cp++) switch (c) {
                     64: 
                     65:                case '\t':
                     66:                        do {
                     67:                                int ooutcol = outcol;
                     68:                                outchar(' ');
                     69:                                if (outcol == ooutcol)
                     70:                                        break;
                     71:                        } while ((outcol - origin) % 8 != 0);
                     72:                        break;
                     73: 
                     74:                case '\b':
                     75:                        if (outcol > origin)
                     76:                                outcol--;
                     77:                        break;
                     78: 
                     79:                case '\r':
                     80:                        outcol = origin + LMARG; 
                     81:                        break;
                     82: 
                     83:                case '\f':
                     84:                        outline = EJLINE - 1;
                     85:                        /* fall into ... */
                     86: 
                     87:                case '\n':
                     88:                        outline++;
                     89:                        if (outline == EJLINE) {
                     90:                                origin += width;
                     91:                                if (origin + width > LINELN) {
                     92:                                        cutmark(origin);
                     93:                                        oflush();
                     94:                                        break;
                     95:                                }
                     96: /*
                     97:                                if (origin * 2 + LMARG < LINELN && origin * 3 > LINELN) {
                     98:                                        cutmark(origin);
                     99:                                        origin += LMARG;
                    100:                                }
                    101: */
                    102:                                outline = 0;
                    103:                                cutmark(origin);
                    104:                        }
                    105:                        outcol = origin;
                    106:                        break;
                    107: 
                    108:                default:
                    109:                        outchar(c);
                    110:                        break;
                    111:                }
                    112:        }
                    113:        if (outline || origin != LMARG) {
                    114:                cutmark(origin + width);
                    115:                oflush();
                    116:        }
                    117: }
                    118: 
                    119: outchar(c)
                    120:        register int c;
                    121: {
                    122:        register char *cp = screen[outline];
                    123:        register char *up;
                    124:        register int d;
                    125: 
                    126:        if (c < 040 || c >= 0177)
                    127:                return;
                    128:        if (outcol < LINELN) {
                    129:                cp += outcol;
                    130:                d = *cp;
                    131:                if (d == ' ') {
                    132:                        *cp = c;
                    133:                        outcol++;
                    134:                        return;
                    135:                }
                    136:                if (d == '_' || c == '_') {
                    137:                        if (c == d) {
                    138:                                outcol++;
                    139:                                return;
                    140:                        }
                    141:                        if (anyul[outline] == 0)
                    142:                                clear(ul[outline], LINELN);
                    143:                        anyul[outline] = 1;
                    144:                        ul[outline][outcol] = '_';
                    145:                        if (c == '_')
                    146:                                c = d;
                    147:                }
                    148:                *cp = c;
                    149:                outcol++;
                    150:        }
                    151: }
                    152: 
                    153: oflush()
                    154: {
                    155:        register char *cp, *dp;
                    156:        register int i, j, oc, dc, c;
                    157: 
                    158:        frame++;
                    159: /*
                    160:        if (frame > 1) {
                    161:                printf("\n\n\n");
                    162:                for (j = 0; j < LINELN; j++)
                    163:                        putchar('_');
                    164:                printf("\n");
                    165:        }
                    166: */
                    167:        printf("\n");
                    168:        for (i = 0; i < EJLINE; i++) {
                    169:                putline(screen[i]);
                    170:                if (anyul[i]) {
                    171:                        putchar('\r');
                    172:                        putline(ul[i]);
                    173:                        anyul[i] = 0;
                    174:                }
                    175:                putchar('\n');
                    176:        }
                    177:        for (i = 0; i < LINELN; i++)
                    178:                putchar('_');
                    179:        putchar('\n');
                    180:        clear(screen, EJLINE * LINELN);
                    181:        outline = 0;
                    182:        outcol = LMARG;
                    183:        origin = LMARG;
                    184:        cutmark(LMARG);
                    185: }
                    186: 
                    187: clear(cp, i)
                    188:        register char *cp;
                    189:        register int i;
                    190: {
                    191: 
                    192:        if (i > 0)
                    193:                do
                    194:                        *cp++ = ' ';
                    195:                while (--i);
                    196: }
                    197: 
                    198: cutmark(o)
                    199:        register int o;
                    200: {
                    201:        register int i;
                    202: 
                    203:        screen[0][o - LMARG] = '|';
                    204:        screen[1][o - LMARG] = '|';
                    205:        screen[EJLINE - 1][o - LMARG] = '|';
                    206:        screen[EJLINE - 2][o - LMARG] = '|';
                    207: }
                    208: 
                    209: putline(cp)
                    210:        register char *cp;
                    211: {
                    212:        register int j = LINELN;
                    213:        register int c, oc, dc;
                    214: 
                    215:        oc = dc = 0;
                    216:        do {
                    217:                if ((c = *cp++) == ' ') {
                    218:                        dc++;
                    219:                        continue;
                    220:                }
                    221:                while (((oc + 8) &~ 7) < dc) {
                    222:                        putchar('\t');
                    223:                        oc = (oc + 8) &~ 7;
                    224:                }
                    225:                while (oc < dc) {
                    226:                        putchar(' ');
                    227:                        oc++;
                    228:                }
                    229:                putchar(c);
                    230:                oc++, dc++;
                    231:        } while (--j != 0);
                    232: }

unix.superglobalmegacorp.com

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