Annotation of 41BSD/cmd/vpr/rvsort.c, revision 1.1.1.1

1.1       root        1: # include <stdio.h>
                      2: /*
                      3:  * vsort - Sort troff output for versatec to reduce amount of reverse leading
                      4:  */ 
                      5: 
                      6: #define NULL 0
                      7: 
                      8: double atof();
                      9: char *calloc();
                     10: 
                     11: FILE *in,*out;
                     12: 
                     13: struct achar *piles[500], *afreel;
                     14: 
                     15: int skipfirst = 1;     /* skip the first leading so start at top of page */
                     16: int cpsize = 02;       /*  Funny sizes  */
                     17: struct point_sizes {
                     18:        int stupid_code;
                     19:        int real_code;
                     20: } point_sizes[] = {
                     21:        010, 6,
                     22:        0, 7,
                     23:        01, 8,
                     24:        07, 9,
                     25:        02, 10,
                     26:        03, 11,
                     27:        04, 12,
                     28:        05, 14,
                     29:        0211, 16,
                     30:        06, 18,
                     31:        0212, 20,
                     32:        0213, 22,
                     33:        0214, 24,
                     34:        0215, 28,
                     35:        0216, 36,
                     36:        0, 0
                     37: };
                     38: 
                     39: int    pagelength = 144 * 11;  /* in Leading units */
                     40: int    pagemod;                /* horizontal page number (for versatec) */
                     41: #define        MODOFF 3672             /* 432 * 8.5 */
                     42: 
                     43: int    esc, lead, back, verd, mcase, railmag;
                     44: int    col, row;
                     45: 
                     46: int    oback, omcase, orailmag, ocol, orow, overd;
                     47: int    opsize = 02;
                     48: 
                     49: struct achar
                     50: {
                     51:        char    code;
                     52:        char    psize;
                     53:        short   col;
                     54:        short   row;
                     55:        char    railmag;
                     56:        char    verd;
                     57:        char    back;
                     58:        char    mcase;
                     59:        struct  achar *next;
                     60: };
                     61: 
                     62: main(argc, argv) 
                     63:        int argc;
                     64:        char *argv[];
                     65: {
                     66:        register i;
                     67: 
                     68:        for(i = 3; i < 15; i++)
                     69:                close(i);
                     70:        while (argc > 1 && argv[1][0] == '-') {
                     71:                switch (argv[1][1]) {
                     72:                        case 'l': {
                     73:                                float f = 144 * atof(argv[1] + 2);
                     74:                                if (f < 144) {
                     75:                                        error("bad length");
                     76:                                        exit(1);
                     77:                                }
                     78:                                pagelength = f;
                     79:                                break;
                     80:                        }
                     81:                }
                     82:                argc--; argv++;
                     83:        }
                     84:        out = stdout;
                     85:        if(argc > 1) {
                     86:                while(--argc) {
                     87:                        argv++;
                     88:                        if((in=fopen(argv[0], "r")) == NULL)
                     89:                                perror("vsort");
                     90:                        else {
                     91:                                ofile();
                     92:                                fclose(in);
                     93:                        }
                     94:                }
                     95:        } else {
                     96:                in = stdin;
                     97:                ofile();
                     98:        }
                     99:        exit(0);
                    100: }
                    101: 
                    102: ofile()
                    103: {
                    104:        register int c;
                    105:        static int initialized;
                    106: 
                    107:        while((c = getch()) != -1) {
                    108:                if(!c)
                    109:                        continue;
                    110:                if(c & 0200) {          /* escape (left/right) */
                    111:                        esc += (~c) & 0177;
                    112:                        continue;
                    113:                }
                    114:                if(esc) {
                    115:                        if(back)
                    116:                                esc = -esc;
                    117:                        col += esc;
                    118:                        esc = 0;
                    119:                }
                    120:                if((c & 0377) < 0100)   /*  Purely for efficiency  */
                    121:                        goto normal_char;
                    122:                switch(c) {
                    123: 
                    124:                case 0100:
                    125:                        if(initialized++) {
                    126:                                linesflush();
                    127:                                return;
                    128:                        }
                    129:                        row = 0;
                    130:                        col = 0;        esc = 0;
                    131:                        lead = 0;
                    132:                        verd = 0;       back = 0;       mcase = 0;
                    133:                        railmag = 0;
                    134:                        ocol = 0;
                    135:                        orow = 0;
                    136:                        oback = 0;      omcase = 0;
                    137:                        orailmag = 0;
                    138:                        if(loadfont(railmag, cpsize) < 0)
                    139:                                error("init");
                    140:                        putc(0100, out);
                    141:                        break;
                    142: 
                    143:                case 0101:      /* lower rail */
                    144:                        crail(railmag &= ~01);
                    145:                        break;
                    146: 
                    147:                case 0102:      /* upper rail */
                    148:                        crail(railmag |= 01);
                    149:                        break;
                    150: 
                    151:                case 0103:      /* upper mag */
                    152:                        crail(railmag |= 02);
                    153:                        break;
                    154: 
                    155:                case 0104:      /* lower mag */
                    156:                        crail(railmag &= ~02);
                    157:                        break;
                    158: 
                    159:                case 0105:      /* lower case */
                    160:                        mcase = 0;
                    161:                        break;
                    162: 
                    163:                case 0106:      /* upper case */
                    164:                        mcase = 1;
                    165:                        break;
                    166: 
                    167:                case 0107:      /* escape forward */
                    168:                        back = 0;
                    169:                        break;
                    170: 
                    171:                case 0110:      /* escape backwards */
                    172:                        back = 1;
                    173:                        break;
                    174: 
                    175:                case 0111:      /* stop */
                    176:                        break;
                    177: 
                    178:                case 0112:      /* lead forward */
                    179:                        verd = 0;
                    180:                        break;
                    181: 
                    182:                case 0113:      /* undefined */
                    183:                        break;
                    184: 
                    185:                case 0114:      /* lead backward */
                    186:                        verd = 1;
                    187:                        break;
                    188: 
                    189:                case 0115:      /* undefined */
                    190:                case 0116:
                    191:                case 0117:
                    192:                        break;
                    193: 
                    194:                default:
                    195:                        if((c & 0340) == 0140) {/* leading */
                    196:                                lead = (~c) & 037;
                    197:                                if(verd)
                    198:                                        lead = -lead;
                    199:                                if (skipfirst > 0) {
                    200:                                        skipfirst--;
                    201:                                        continue;
                    202:                                }
                    203:                                row += lead;
                    204:                                if (row >= pagelength)
                    205:                                        allflush();
                    206:                                continue;
                    207:                        }
                    208:                        if((c & 0360)== 0120) { /* size change */
                    209:                                col += stupidadj(c & 017, cpsize);
                    210:                                loadfont(railmag, c & 017);
                    211:                                continue;
                    212:                        }
                    213:                        if(c & 0300)
                    214:                                continue;
                    215:                normal_char:
                    216:                        c = (c & 077);
                    217:                        stuffc(c);
                    218:                }
                    219:        }
                    220:        linesflush();
                    221:        putc(0111, out);
                    222:        putc(0111, out);
                    223:        putc(0111, out);
                    224:        putc(0111, out);
                    225:        putc(0111, out);
                    226:        putc(0111, out);
                    227:        putc(0111, out);
                    228:        putc(0111, out);
                    229: }
                    230: 
                    231: int    peekc;
                    232: 
                    233: getch()
                    234: {
                    235:        register c;
                    236: 
                    237:        if(peekc) {
                    238:                c = peekc;
                    239:                peekc = 0;
                    240:                return(c);
                    241:        }
                    242:        return(getc(in));
                    243: }
                    244: 
                    245: ungetc(c)
                    246: {
                    247:        peekc = c;
                    248: }
                    249: 
                    250: error(s)
                    251:        char *s;
                    252: {
                    253: 
                    254:        fflush(out);
                    255:        fprintf(stderr, "vsort: %s\n", s);
                    256: }
                    257: 
                    258: crail(nrail)
                    259:        int nrail;
                    260: {
                    261: 
                    262:        railmag = nrail;
                    263:        loadfont(nrail, cpsize);
                    264: }
                    265: 
                    266: loadfont(fnum, size)
                    267:        int fnum;
                    268:        int size;
                    269: {
                    270: 
                    271:        cpsize = size;
                    272:        return(0);
                    273: }
                    274: 
                    275: stuffc(code)
                    276:        register int code;
                    277: {
                    278:        register struct achar *ap, **bp;
                    279: 
                    280:        if (col < 0 || col >= 500*8)
                    281:                return;
                    282:        if (afreel) {
                    283:                ap = afreel;
                    284:                afreel = ap->next;
                    285:        } else
                    286:                ap = (struct achar *)malloc(sizeof (*ap));
                    287:        ap->row = row;
                    288:        ap->col = col;
                    289:        ap->psize = cpsize;
                    290:        ap->verd = verd;
                    291:        ap->back = back;
                    292:        ap->mcase = mcase;
                    293:        ap->code = code;
                    294:        ap->railmag = railmag;
                    295:        bp = &piles[col / 8];
                    296:        ap->next = *bp;
                    297:        *bp = ap;
                    298: }
                    299: 
                    300: allflush()
                    301: {
                    302: 
                    303:        linesflush();
                    304:        if (row > orow)
                    305:                ptlead(row - orow);
                    306:        row -= pagelength;
                    307:        orow = row;
                    308: }
                    309: 
                    310: 
                    311: linesflush()
                    312: {
                    313:        register struct achar **ap, *bp, *cp;
                    314:        static notfirst;
                    315: 
                    316:        if (notfirst)
                    317:                putc(0115, out);
                    318:        orow = 0;
                    319:        ocol = 0;
                    320:        notfirst = 1;
                    321:        for (ap = &piles[0]; ap < &piles[500]; ap++) {
                    322:                for (bp = *ap; bp; bp = cp) {
                    323:                        sendchar(bp);
                    324:                        cp = bp->next;
                    325:                        bp->next = afreel;
                    326:                        afreel = bp;
                    327:                }
                    328:                *ap = 0;
                    329:        }
                    330: }
                    331: 
                    332: sendchar(cp)
                    333:        register struct achar *cp;
                    334: {
                    335:        register int i;
                    336: 
                    337: #ifdef DUMPCHAR
                    338:        dumpchar(cp);
                    339: #endif
                    340:        if(cp->railmag != orailmag)
                    341:                ptrail(cp->railmag);
                    342:        if(cp->psize != opsize)
                    343:                ptsize(cp->psize);
                    344:        if(cp->mcase != omcase)
                    345:                ptmcase();
                    346:        if(cp->row != orow)
                    347:                ptlead(cp->row - orow);
                    348:        if(cp->col != ocol)
                    349:                ptesc(cp->col - ocol);
                    350:        if(cp->back != oback)
                    351:                ptback();
                    352:        putc(cp->code, out);
                    353:        orow = cp->row;
                    354:        orailmag = cp->railmag;
                    355:        opsize = cp->psize;
                    356:        omcase = cp->mcase;
                    357:        ocol = cp->col;
                    358:        oback = cp->back;
                    359: }
                    360: 
                    361: ptrail(rlmg)
                    362:        register int rlmg;
                    363: {
                    364: 
                    365:        if((rlmg & 01) != (orailmag & 01))
                    366:                putc((rlmg & 01) ? 0102:0101, out);     /*  rail  */
                    367:        if((rlmg & 02) != (orailmag & 02))
                    368:                putc((rlmg & 02) ? 0103:0104, out);     /*  mag  */
                    369: }
                    370: 
                    371: ptback()
                    372: {
                    373: 
                    374:        putc(oback ? 0107:0110, out);
                    375:        oback = !oback;
                    376: }
                    377: 
                    378: ptsize(size)
                    379:        register int size;
                    380: {
                    381: 
                    382:        putc(0120 | (size & 017), out);
                    383:        ptesc(-stupidadj(size, opsize));
                    384: }
                    385: 
                    386: stupidadj(code, lcode)
                    387:        register int code;
                    388:        int lcode;
                    389: {
                    390:        register struct point_sizes *psp;
                    391:        register struct point_sizes *lpsp;
                    392: 
                    393:        psp = point_sizes;
                    394:        while(psp->real_code != 0) {
                    395:                if((psp->stupid_code & 017) == code)
                    396:                        break;
                    397:                psp++;
                    398:        }
                    399:        lpsp = point_sizes;
                    400:        while(lpsp->real_code != 0) {
                    401:                if((lpsp->stupid_code & 017) == lcode)
                    402:                        break;
                    403:                lpsp++;
                    404:        }
                    405:        code = 0;
                    406:        if(!(lpsp->stupid_code & 0200) && (psp->stupid_code & 0200))
                    407:                code = -55;
                    408:        else
                    409:                if((lpsp->stupid_code & 0200) && !(psp->stupid_code & 0200))
                    410:                        code = 55;
                    411:        return(code);
                    412: }
                    413: 
                    414: ptmcase()
                    415: {
                    416: 
                    417:        putc(omcase ? 0105:0106, out);
                    418: }
                    419: 
                    420: ptesc(escc)
                    421:        register int escc;
                    422: {
                    423: 
                    424:        if((escc < 0 && !oback ) || (escc >= 0 && oback))
                    425:                ptback();
                    426:        escc = abs(escc);
                    427:        while(escc > 0177) {
                    428:                putc(0200, out);
                    429:                escc -= 0177;
                    430:        }
                    431:        if(escc)
                    432:                putc(0200 | ((~escc) & 0177), out);
                    433: }
                    434: 
                    435: ptlead(leadd)
                    436:        register int leadd;
                    437: {
                    438: 
                    439:        if (leadd == 0)
                    440:                return;
                    441:        if (leadd < 0) {
                    442:                if (overd == 0)
                    443:                        putc(0114, out), overd = 1;
                    444:                leadd = -leadd;
                    445:        } else {
                    446:                if (overd)
                    447:                        putc(0112, out), overd = 0;
                    448:        }
                    449:        if (leadd > 64) {
                    450:                putc(0116, out);
                    451:                putc(leadd / 64, out);
                    452:                leadd %= 64;
                    453:        }
                    454:        while (leadd > 037) {
                    455:                putc(0140, out);
                    456:                leadd -= 037;
                    457:        }
                    458:        if (leadd)
                    459:                putc(0140 | ((~leadd) & 037), out);
                    460: }
                    461: 
                    462: #ifdef DUMPLINE
                    463: dumpchar(cp)
                    464: register struct achar *cp;
                    465: {
                    466: 
                    467:        fprintf(stderr,
                    468: "code %o psize %d col %d row %d railmag %d verd %d back %d mcase %d\n",
                    469:            cp->code, cp->psize, cp->col, cp->row, cp->railmag, cp->verd,
                    470:            cp->back, cp->mcase);
                    471: }
                    472: #endif

unix.superglobalmegacorp.com

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