Annotation of 3BSD/cmd/versatec/vsort.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 cycle for(;;)
                      7: #define NULL 0
                      8: 
                      9: #define INTR   2
                     10: #define QUIT   3
                     11: #define HUP    1
                     12: #define BROKENPIPE 13
                     13: 
                     14: double atof();
                     15: 
                     16: FILE *inbuf,*outbuf;
                     17: 
                     18: int skmagic = 1;       /* skip the first leading so start at top of page */
                     19: int cpsize = 02;       /*  Funny sizes  */
                     20: struct point_sizes
                     21:        {
                     22:        int stupid_code;
                     23:        int real_code;
                     24:        } point_sizes[]
                     25:                {
                     26:                010, 6,
                     27:                0, 7,
                     28:                01, 8,
                     29:                07, 9,
                     30:                02, 10,
                     31:                03, 11,
                     32:                04, 12,
                     33:                05, 14,
                     34:                0211, 16,
                     35:                06, 18,
                     36:                0212, 20,
                     37:                0213, 22,
                     38:                0214, 24,
                     39:                0215, 28,
                     40:                0216, 36,
                     41:                0, 0
                     42:                };
                     43: 
                     44: int    overflow = 144 * 11;
                     45: int    pagemod;
                     46: #define        MODOFF 3672             /* 432 * 8.5 */
                     47: 
                     48: int esc, lead, back, verd, mcase, railmag;
                     49: int col, row;
                     50: int pstart 0;  /*  Means a startline is pending  */
                     51: 
                     52: int oback, omcase, orailmag, ocol;
                     53: int opsize 02;
                     54: 
                     55: struct lstate
                     56:        {
                     57:        int row;
                     58:        int col;
                     59:        int psize;
                     60:        char railmag;
                     61:        char verd;
                     62:        char back;
                     63:        char mcase;
                     64:        };
                     65: 
                     66: struct line
                     67:        {
                     68:        struct line *nextp;
                     69:        struct line *lastp;
                     70:        int len;
                     71:        struct lstate start;
                     72:        struct lstate end;
                     73:        char *codep;
                     74:        };
                     75: 
                     76: struct line *head;
                     77: struct line *tail;
                     78: struct line cline { -1,-1,-1,-1};
                     79: 
                     80: #define TBUFLEN 1024
                     81: char *codep;
                     82: char tbuf[TBUFLEN];
                     83: 
                     84: #ifdef MONITORING
                     85: extern etext();
                     86: int monbuf[1000];
                     87: #endif
                     88: 
                     89: main(argc, argv) 
                     90:        int argc;
                     91:        char *argv[];
                     92:        {
                     93:        register i;
                     94: 
                     95: #ifndef TESTING
                     96:        signal(BROKENPIPE, 1);
                     97: #endif
                     98: 
                     99:        for(i = 3; i < 15; i++)
                    100:                close(i);
                    101: #ifdef MONITORING
                    102:        monitor(2,etext,monbuf,sizeof monbuf/2,0);
                    103: #endif
                    104:        if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'l') {
                    105:                float f = 144 * atof(argv[1] + 2);
                    106:                if (f < 144) {
                    107:                        error("bad length");
                    108:                        exit(1);
                    109:                }
                    110:                overflow = f;
                    111:                argc--, argv++;
                    112:        }
                    113:        outbuf = stdout;
                    114:        if(argc > 1)
                    115:                {
                    116:                while(--argc)
                    117:                        {
                    118:                        argv++;
                    119:                        process(argv[0]);
                    120:                        }
                    121:                }
                    122:           else
                    123:                {
                    124:                inbuf = stdin;
                    125:                ofile();
                    126:                }
                    127: #ifdef MONITORING
                    128:        monitor(0);
                    129: #endif
                    130:        done();
                    131: }
                    132: 
                    133: 
                    134: process(name)
                    135:        char *name;
                    136: {
                    137:        if((inbuf=fopen(name, "r")) == NULL)
                    138:                error("cannot open data file");
                    139:        ofile();
                    140: }
                    141: 
                    142: ofile()
                    143:        {
                    144:        register int c;
                    145:        static int initialized;
                    146: 
                    147:        while((c = getch()) != -1) {
                    148:                if(!c)
                    149:                        continue;
                    150:                if(c & 0200)
                    151:                        {
                    152:                        if(!pstart)
                    153:                                stuffc(c);
                    154:                        esc += (~c) & 0177;
                    155:                        continue;
                    156:                        }
                    157:                if(esc)
                    158:                        {
                    159:                        if(back)
                    160:                                esc = -esc;
                    161:                        col += esc;
                    162:                        esc = 0;
                    163:                        }
                    164:                if((c & 0377) < 0100)   /*  Purely for efficiency  */
                    165:                        goto normal_char;
                    166:                switch(c) {
                    167:                        case 0100:
                    168:                                if(initialized++)
                    169:                                        goto out;
                    170:                                row = 0;
                    171:                                col = 0;        esc = 0;
                    172:                                lead = 0;
                    173:                                verd = 0;       back = 0;       mcase = 0;
                    174:                                railmag = 0;
                    175:                                ocol = 0;
                    176:                                oback = 0;      omcase = 0;
                    177:                                orailmag = 0;
                    178:                                if(loadfont(railmag, cpsize) < 0)
                    179:                                        error("init");
                    180:                                startline();
                    181:                                putc(0100, outbuf);     /*  Dont stuff it guys  */
                    182:                                break;
                    183:                        case 0101:      /* lower rail */
                    184:                                crail(railmag =& ~01);
                    185:                                if(!pstart)
                    186:                                        stuffc(c);
                    187:                                break;
                    188:                        case 0102:      /* upper rail */
                    189:                                crail(railmag =| 01);
                    190:                                if(!pstart)
                    191:                                        stuffc(c);
                    192:                                break;
                    193:                        case 0103:      /* upper mag */
                    194:                                crail(railmag =| 02);
                    195:                                if(!pstart)
                    196:                                        stuffc(c);
                    197:                                break;
                    198:                        case 0104:      /* lower mag */
                    199:                                crail(railmag =& ~02);
                    200:                                if(!pstart)
                    201:                                        stuffc(c);
                    202:                                break;
                    203:                        case 0105:      /* lower case */
                    204:                                mcase = 0;
                    205:                                if(!pstart)
                    206:                                        stuffc(c);
                    207:                                break;
                    208:                        case 0106:      /* upper case */
                    209:                                mcase = 0100;
                    210:                                if(!pstart)
                    211:                                        stuffc(c);
                    212:                                break;
                    213:                        case 0107:      /* escape forward */
                    214:                                back = 0;
                    215:                                if(!pstart)
                    216:                                        stuffc(c);
                    217:                                break;
                    218:                        case 0110:      /* escape backwards */
                    219:                                back = 1;
                    220:                                if(!pstart)
                    221:                                        stuffc(c);
                    222:                                break;
                    223:                        case 0111:      /* stop */
                    224:                                stuffc(c);
                    225:                                break;
                    226:                        case 0112:      /* lead forward */
                    227:                                verd = 0;
                    228:                                break;
                    229:                        case 0113:      /* undefined */
                    230:                                break;
                    231:                        case 0114:      /* lead backward */
                    232:                                verd = 1;
                    233:                                break;
                    234:                        case 0115:      /* undefined */
                    235:                        case 0116:
                    236:                        case 0117:
                    237:                                break;
                    238:                        default:
                    239:                                if((c & 0340) == 0140)  /* leading */
                    240:                                        {
                    241:                                        termline();
                    242:                                        lead = (~c) & 037;
                    243:                                        if(verd)
                    244:                                                lead = -lead;
                    245:                                        if (skmagic > 0) {
                    246:                                                skmagic--;
                    247:                                                ptlead(lead);
                    248:                                                continue;
                    249:                                        }
                    250:                                        row += lead;
                    251:                                        if (row >= overflow) {
                    252:                                                if (pagemod == 3) {
                    253:                                                        allflush();
                    254:                                                        col %= MODOFF;
                    255:                                                        pagemod = 0;
                    256:                                                } else {
                    257:                                                        pagemod++;
                    258:                                                        col += MODOFF;
                    259:                                                        row -= overflow;
                    260:                                                }
                    261:                                        }
                    262:                                        if (row >= overflow)
                    263:                                                write(2, "URK\n", 4);
                    264:                                /*
                    265:                                        if (row > overflow)
                    266:                                                miniflush();
                    267:                                */
                    268:                                        if (row < 0) {
                    269:                                                if (pagemod) {
                    270:                                                        pagemod--;
                    271:                                                        col -= MODOFF;
                    272:                                                        row += overflow;
                    273:                                                }
                    274:                                        }
                    275:                                        if (row < 0)
                    276:                                                write(2, "URK2\n", 5);
                    277:                                        pstart++;
                    278:                                        continue;
                    279:                                }
                    280:                                if((c & 0360) == 0120)  /* size change */
                    281:                                {
                    282:                                        if(!pstart)
                    283:                                                stuffc(c);
                    284:                                        col += stupidadj(c & 017, cpsize);
                    285:                                        loadfont(railmag, c & 017);
                    286:                                        continue;
                    287:                                }
                    288:                                if(c & 0300)
                    289:                                        continue;
                    290:                        normal_char:
                    291:                                c = (c & 077);
                    292:                                stuffc(c);
                    293:                }
                    294:        }
                    295:    out:
                    296:        termline();
                    297:        allflush();
                    298:        fclose(inbuf);
                    299: }
                    300: 
                    301: done() {
                    302:        termline();
                    303:        allflush();
                    304:        exit();
                    305: }
                    306: 
                    307: int peekc;
                    308: getch() {
                    309:        register c;
                    310:        if(peekc) {
                    311:                c = peekc;
                    312:                peekc = 0;
                    313:                return(c);
                    314:        }
                    315:        return(getc(inbuf));
                    316: }
                    317: 
                    318: ungetc(c) {
                    319:        peekc = c;
                    320: }
                    321: 
                    322: 
                    323: error(s)
                    324:        char *s;
                    325: {
                    326: 
                    327:        fflush(outbuf);
                    328:        fprintf(stderr, "Vsort: %s\n", s);
                    329: }
                    330: 
                    331: crail(nrail)
                    332:        register int nrail;
                    333: {
                    334:        register int psize;
                    335: 
                    336:        psize = cpsize;
                    337:        loadfont(nrail, psize);
                    338: }
                    339: 
                    340: loadfont(fnum, size)
                    341:        register int fnum;
                    342:        register int size;
                    343: {
                    344: 
                    345:        cpsize = size;
                    346:        return(0);
                    347: }
                    348: 
                    349: startline()
                    350: {
                    351: 
                    352:        if(pstart != 0) {
                    353:                cline.start.row = row;
                    354:                return;
                    355:        }
                    356:        cline.len = 0;
                    357:        cline.start.row = row;
                    358:        cline.start.col = col;
                    359:        cline.start.psize = cpsize;
                    360:        cline.start.mcase = mcase;
                    361:        cline.start.back = back;
                    362:        cline.start.verd = verd;
                    363:        cline.start.railmag = railmag;
                    364:        codep = tbuf;
                    365: }
                    366: 
                    367: termline()
                    368: {
                    369:        register struct line *linep;
                    370:        register char *allp;
                    371:        register char *cp;
                    372:        int i;
                    373: 
                    374:        if(pstart != 0)
                    375:                return;
                    376:        if((allp = calloc(sizeof *linep,1)) == -1)
                    377:                error("alloc");
                    378:        linep = allp;
                    379:        linep->end.row = row;
                    380:        linep->end.col = col;
                    381:        linep->end.psize = cpsize;
                    382:        linep->end.mcase = mcase;
                    383:        linep->end.back = back;
                    384:        linep->end.verd = verd;
                    385:        linep->end.railmag = railmag;
                    386:        linep->start.row = cline.start.row;
                    387:        linep->start.col = cline.start.col;
                    388:        linep->start.psize = cline.start.psize;
                    389:        linep->start.mcase = cline.start.mcase;
                    390:        linep->start.back = cline.start.back;
                    391:        linep->start.verd = cline.start.verd;
                    392:        linep->start.railmag = cline.start.railmag;
                    393:        linep->len = cline.len;
                    394:        if((allp = calloc(cline.len,1)) == -1)
                    395:                error("alloc");
                    396:        linep->codep = allp;
                    397:        cp = tbuf;
                    398:        for(i = 0; i < cline.len; i++)
                    399:                *allp++ = *cp++;
                    400:        sortin(linep);
                    401:        }
                    402: 
                    403: sortin(linep)
                    404:        register struct line *linep;
                    405: {
                    406:        register struct line *clp;
                    407: 
                    408:        if((clp = tail) == NULL) {
                    409:                head = tail = linep;
                    410:                linep->lastp = linep->nextp = NULL;
                    411:                return;
                    412:        }
                    413:        while(clp != NULL && clp->start.row > linep->start.row)
                    414:                clp = clp->lastp;
                    415:        if(clp == tail) {
                    416:                linep->lastp = tail;
                    417:                linep->nextp = NULL;
                    418:                tail->nextp = linep;
                    419:                tail = linep;
                    420:        } else
                    421:                if(clp == NULL) /*  goes at head of list  */ {
                    422:                        linep->lastp = NULL;
                    423:                        linep->nextp = head;
                    424:                        head->lastp = linep;
                    425:                        head = linep;
                    426:                } else {
                    427:                        linep->lastp = clp;
                    428:                        linep->nextp = clp->nextp;
                    429:                        clp->nextp->lastp = linep;
                    430:                        clp->nextp = linep;
                    431:                }
                    432: }
                    433: 
                    434: stuffc(code)
                    435:        register int code;
                    436: {
                    437: 
                    438:        if(pstart != 0) {
                    439:                pstart = 0;
                    440:                startline();
                    441:        }
                    442:        if(cline.len > TBUFLEN) {
                    443:                termline();
                    444:                startline();
                    445:        }
                    446:        *codep++ = code;
                    447:        cline.len++;
                    448: }
                    449: 
                    450: miniflush()
                    451: {
                    452: 
                    453:        sendline();
                    454: }
                    455: 
                    456: allflush()
                    457: {
                    458: 
                    459:        while(head != NULL)
                    460:                sendline();
                    461:        sendline();
                    462:        fflush(outbuf);
                    463: }
                    464: 
                    465: sendline()
                    466: {
                    467:        register char *cp;
                    468:        register struct line *linep;
                    469:        register int i;
                    470:        int drow;
                    471: 
                    472:        if((linep = head) == NULL) {
                    473:                while(row >= overflow) {
                    474:                        /* fprintf(stderr, "spitting %d\n", overflow - row); */
                    475:                        if (overflow - row)
                    476:                                ptlead(overflow - row);
                    477:                        updatelist(overflow);
                    478:                }
                    479:                return;
                    480:        }
                    481:        adjparms(linep);
                    482:        cp = linep->codep;
                    483:        for(i = 0; i < linep->len; i++)
                    484:                putc(*cp++, outbuf);
                    485:        setparms(linep);
                    486:        if(linep->nextp != NULL)
                    487:                drow = linep->nextp->start.row;
                    488:        else
                    489:                drow = overflow;
                    490:        head = linep->nextp;
                    491:        cfree(linep->codep);
                    492:        cfree(linep);
                    493:        if(head == NULL)
                    494:                tail = NULL;
                    495:        else
                    496:                head->lastp = NULL;
                    497:        ptlead(drow - row);
                    498:        row = drow;
                    499:        /* updatelist(drow); */
                    500: }
                    501: 
                    502: adjparms(linep)
                    503:        register struct line *linep;
                    504: {
                    505: 
                    506:        if(linep->start.railmag != orailmag)
                    507:                ptrail(linep->start.railmag);
                    508:        if(linep->start.psize != opsize)
                    509:                ptsize(linep->start.psize);
                    510:        if(linep->start.mcase != omcase)
                    511:                ptmcase();
                    512:        if(linep->start.row != row)     /*  lead forward  */
                    513:        {
                    514:                ptlead(linep->start.row - row);
                    515:                row = linep->start.row;
                    516:                /* updatelist(linep->start.row); */
                    517:        }
                    518:        if(linep->start.col != ocol)
                    519:                ptesc(linep->start.col-ocol);
                    520:        if(linep->start.back != oback)
                    521:                ptback();
                    522: }
                    523: 
                    524: ptrail(rlmg)
                    525:        register int rlmg;
                    526: {
                    527: 
                    528:        if((rlmg & 01) != (orailmag & 01))
                    529:                putc((rlmg & 01) ? 0102:0101, outbuf);  /*  rail  */
                    530:        if((rlmg & 02) != (orailmag & 02))
                    531:                putc((rlmg & 02) ? 0103:0104, outbuf);  /*  mag  */
                    532: }
                    533: 
                    534: ptback()
                    535: {
                    536: 
                    537:        putc(oback ? 0107:0110, outbuf);
                    538:        oback = !oback;
                    539: }
                    540: 
                    541: ptsize(size)
                    542:        register int size;
                    543: {
                    544: 
                    545:        putc(0120 | (size & 017), outbuf);
                    546:        ptesc(-stupidadj(size, opsize));
                    547: }
                    548: 
                    549: stupidadj(code, lcode)
                    550:        register int code;
                    551:        int lcode;
                    552: {
                    553:        register struct point_sizes *psp;
                    554:        register struct point_sizes *lpsp;
                    555: 
                    556:        psp = point_sizes;
                    557:        while(psp->real_code != 0) {
                    558:                if((psp->stupid_code & 017) == code)
                    559:                        break;
                    560:                psp++;
                    561:        }
                    562:        lpsp = point_sizes;
                    563:        while(lpsp->real_code != 0) {
                    564:                if((lpsp->stupid_code & 017) == lcode)
                    565:                        break;
                    566:                lpsp++;
                    567:        }
                    568:        code = 0;
                    569:        if(!(lpsp->stupid_code & 0200) && (psp->stupid_code & 0200))
                    570:                code = -55;
                    571:        else
                    572:                if((lpsp->stupid_code & 0200) && !(psp->stupid_code & 0200))
                    573:                        code = 55;
                    574:        return(code);
                    575: }
                    576: 
                    577: ptmcase()
                    578: {
                    579: 
                    580:        putc(omcase ? 0105:0106, outbuf);
                    581: }
                    582: 
                    583: ptesc(escc)
                    584:        register int escc;
                    585: {
                    586: 
                    587:        if((escc < 0 && !oback ) || (escc >= 0 && oback))
                    588:                ptback();
                    589:        escc = abs(escc);
                    590:        while(escc > 0177) {
                    591:                putc(0200, outbuf);
                    592:                escc -= 0177;
                    593:        }
                    594:        if(escc)
                    595:                putc(0200 | ((~escc) & 0177), outbuf);
                    596: }
                    597: 
                    598: ptlead(leadd)
                    599:        register int leadd;
                    600: {
                    601: 
                    602:        while(leadd > 037) {
                    603:                putc(0140, outbuf);
                    604:                leadd -= 037;
                    605:        }
                    606:        if(leadd)
                    607:                putc(0140 | ((~leadd) & 037), outbuf);
                    608: }
                    609: 
                    610: setparms(linep)
                    611:        register struct line *linep;
                    612: {
                    613: 
                    614:        orailmag = linep->end.railmag;
                    615:        opsize = linep->end.psize;
                    616:        omcase = linep->end.mcase;
                    617:        ocol = linep->end.col;
                    618:        oback = linep->end.back;
                    619: }
                    620: 
                    621: updatelist(drow)
                    622:        register int drow;
                    623: {
                    624:        register struct line *clp;
                    625: 
                    626:        for(clp = head; clp != NULL; clp = clp->nextp)
                    627:                clp->start.row -= drow;
                    628:        row -= drow;
                    629: }

unix.superglobalmegacorp.com

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