Annotation of researchv9/cmd/troff/n5.c, revision 1.1.1.1

1.1       root        1: #include "tdef.h"
                      2: #include "ext.h"
                      3: 
                      4: #define        stty(f, a)      ioctl(f, TIOCSETP, a)
                      5: #define        gtty(f, a)      ioctl(f, TIOCGETP, a)
                      6: 
                      7: /*
                      8:  * troff5.c
                      9:  * 
                     10:  * misc processing requests
                     11:  */
                     12: 
                     13: int    iflist[NIF];
                     14: int    ifx;
                     15: 
                     16: casead()
                     17: {
                     18:        register i;
                     19: 
                     20:        ad = 1;
                     21:        /*leave admod alone*/
                     22:        if (skip())
                     23:                return;
                     24:        switch (i = cbits(getch())) {
                     25:        case 'r':       /*right adj, left ragged*/
                     26:                admod = 2;
                     27:                break;
                     28:        case 'l':       /*left adj, right ragged*/
                     29:                admod = ad = 0; /*same as casena*/
                     30:                break;
                     31:        case 'c':       /*centered adj*/
                     32:                admod = 1;
                     33:                break;
                     34:        case 'b': 
                     35:        case 'n':
                     36:                admod = 0;
                     37:                break;
                     38:        case '0': 
                     39:        case '2': 
                     40:        case '4':
                     41:                ad = 0;
                     42:        case '1': 
                     43:        case '3': 
                     44:        case '5':
                     45:                admod = (i - '0') / 2;
                     46:        }
                     47: }
                     48: 
                     49: 
                     50: casena()
                     51: {
                     52:        ad = 0;
                     53: }
                     54: 
                     55: 
                     56: casefi()
                     57: {
                     58:        tbreak();
                     59:        fi++;
                     60:        pendnf = 0;
                     61:        lnsize = LNSIZE;
                     62: }
                     63: 
                     64: 
                     65: casenf()
                     66: {
                     67:        tbreak();
                     68:        fi = 0;
                     69: }
                     70: 
                     71: 
                     72: casers()
                     73: {
                     74:        dip->nls = 0;
                     75: }
                     76: 
                     77: 
                     78: casens()
                     79: {
                     80:        dip->nls++;
                     81: }
                     82: 
                     83: 
                     84: chget(c)
                     85: int    c;
                     86: {
                     87:        tchar i;
                     88: 
                     89:        if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') {
                     90:                ch = i;
                     91:                return(c);
                     92:        } else 
                     93:                return(i & BYTEMASK);
                     94: }
                     95: 
                     96: 
                     97: casecc()
                     98: {
                     99:        cc = chget('.');
                    100: }
                    101: 
                    102: 
                    103: casec2()
                    104: {
                    105:        c2 = chget('\'');
                    106: }
                    107: 
                    108: 
                    109: casehc()
                    110: {
                    111:        ohc = chget(OHC);
                    112: }
                    113: 
                    114: 
                    115: casetc()
                    116: {
                    117:        tabc = chget(0);
                    118: }
                    119: 
                    120: 
                    121: caselc()
                    122: {
                    123:        dotc = chget(0);
                    124: }
                    125: 
                    126: 
                    127: casehy()
                    128: {
                    129:        register i;
                    130: 
                    131:        hyf = 1;
                    132:        if (skip())
                    133:                return;
                    134:        noscale++;
                    135:        i = atoi();
                    136:        noscale = 0;
                    137:        if (nonumb)
                    138:                return;
                    139:        hyf = max(i, 0);
                    140: }
                    141: 
                    142: 
                    143: casenh()
                    144: {
                    145:        hyf = 0;
                    146: }
                    147: 
                    148: 
                    149: max(aa, bb)
                    150: int    aa, bb;
                    151: {
                    152:        if (aa > bb)
                    153:                return(aa);
                    154:        else 
                    155:                return(bb);
                    156: }
                    157: 
                    158: 
                    159: casece()
                    160: {
                    161:        register i;
                    162: 
                    163:        noscale++;
                    164:        skip();
                    165:        i = max(atoi(), 0);
                    166:        if (nonumb)
                    167:                i = 1;
                    168:        tbreak();
                    169:        ce = i;
                    170:        noscale = 0;
                    171: }
                    172: 
                    173: 
                    174: casein()
                    175: {
                    176:        register i;
                    177: 
                    178:        if (skip())
                    179:                i = in1;
                    180:        else 
                    181:                i = max(hnumb(&in), 0);
                    182:        tbreak();
                    183:        in1 = in;
                    184:        in = i;
                    185:        if (!nc) {
                    186:                un = in;
                    187:                setnel();
                    188:        }
                    189: }
                    190: 
                    191: 
                    192: casell()
                    193: {
                    194:        register i;
                    195: 
                    196:        if (skip())
                    197:                i = ll1;
                    198:        else 
                    199:                i = max(hnumb(&ll), INCH / 10);
                    200:        ll1 = ll;
                    201:        ll = i;
                    202:        setnel();
                    203: }
                    204: 
                    205: 
                    206: caselt()
                    207: {
                    208:        register i;
                    209: 
                    210:        if (skip())
                    211:                i = lt1;
                    212:        else 
                    213:                i = max(hnumb(&lt), 0);
                    214:        lt1 = lt;
                    215:        lt = i;
                    216: }
                    217: 
                    218: 
                    219: caseti()
                    220: {
                    221:        register i;
                    222: 
                    223:        if (skip())
                    224:                return;
                    225:        i = max(hnumb(&in), 0);
                    226:        tbreak();
                    227:        un1 = i;
                    228:        setnel();
                    229: }
                    230: 
                    231: 
                    232: casels()
                    233: {
                    234:        register i;
                    235: 
                    236:        noscale++;
                    237:        if (skip())
                    238:                i = ls1;
                    239:        else 
                    240:                i = max(inumb(&ls), 1);
                    241:        ls1 = ls;
                    242:        ls = i;
                    243:        noscale = 0;
                    244: }
                    245: 
                    246: 
                    247: casepo()
                    248: {
                    249:        register i;
                    250: 
                    251:        if (skip())
                    252:                i = po1;
                    253:        else {
                    254:                i = max(hnumb(&po), 0);
                    255:                if (nonumb)
                    256:                        i = po1;
                    257:        }
                    258:        po1 = po;
                    259:        po = i;
                    260: #ifndef NROFF
                    261:        if (!ascii)
                    262:                esc += po - po1;
                    263: #endif
                    264: }
                    265: 
                    266: 
                    267: casepl()
                    268: {
                    269:        register i;
                    270: 
                    271:        skip();
                    272:        if ((i = vnumb(&pl)) == 0)
                    273:                pl = 11 * INCH; /*11in*/
                    274:        else 
                    275:                pl = i;
                    276:        if (numtab[NL].val > pl)
                    277:                numtab[NL].val = pl;
                    278: }
                    279: 
                    280: 
                    281: casewh()
                    282: {
                    283:        register i, j, k;
                    284: 
                    285:        lgf++;
                    286:        skip();
                    287:        i = vnumb((int *)0);
                    288:        if (nonumb)
                    289:                return;
                    290:        skip();
                    291:        j = getrq();
                    292:        if ((k = findn(i)) != NTRAP) {
                    293:                mlist[k] = j;
                    294:                return;
                    295:        }
                    296:        for (k = 0; k < NTRAP; k++)
                    297:                if (mlist[k] == 0)
                    298:                        break;
                    299:        if (k == NTRAP) {
                    300:                flusho();
                    301:                errprint("cannot plant trap.");
                    302:                return;
                    303:        }
                    304:        mlist[k] = j;
                    305:        nlist[k] = i;
                    306: }
                    307: 
                    308: 
                    309: casech()
                    310: {
                    311:        register i, j, k;
                    312: 
                    313:        lgf++;
                    314:        skip();
                    315:        if (!(j = getrq()))
                    316:                return;
                    317:        else 
                    318:                for (k = 0; k < NTRAP; k++)
                    319:                        if (mlist[k] == j)
                    320:                                break;
                    321:        if (k == NTRAP)
                    322:                return;
                    323:        skip();
                    324:        i = vnumb((int *)0);
                    325:        if (nonumb)
                    326:                mlist[k] = 0;
                    327:        nlist[k] = i;
                    328: }
                    329: 
                    330: 
                    331: findn(i)
                    332: int    i;
                    333: {
                    334:        register k;
                    335: 
                    336:        for (k = 0; k < NTRAP; k++)
                    337:                if ((nlist[k] == i) && (mlist[k] != 0))
                    338:                        break;
                    339:        return(k);
                    340: }
                    341: 
                    342: 
                    343: casepn()
                    344: {
                    345:        register i;
                    346: 
                    347:        skip();
                    348:        noscale++;
                    349:        i = max(inumb(&numtab[PN].val), 0);
                    350:        noscale = 0;
                    351:        if (!nonumb) {
                    352:                npn = i;
                    353:                npnflg++;
                    354:        }
                    355: }
                    356: 
                    357: 
                    358: casebp()
                    359: {
                    360:        register i;
                    361:        register struct s *savframe;
                    362: 
                    363:        if (dip != d)
                    364:                return;
                    365:        savframe = frame;
                    366:        skip();
                    367:        if ((i = inumb(&numtab[PN].val)) < 0)
                    368:                i = 0;
                    369:        tbreak();
                    370:        if (!nonumb) {
                    371:                npn = i;
                    372:                npnflg++;
                    373:        } else if (dip->nls)
                    374:                return;
                    375:        eject(savframe);
                    376: }
                    377: 
                    378: 
                    379: casetm(ab) 
                    380:        int ab;
                    381: {
                    382:        register i, c;
                    383:        char    tmbuf[NTM];
                    384: 
                    385:        lgf++;
                    386:        copyf++;
                    387:        if (skip() && ab)
                    388:                errprint("User Abort");
                    389:        for (i = 0; i < NTM - 2; )
                    390:                if ((c = tmbuf[i++] = getch()) == '\n' || c == RIGHT)
                    391:                        break;
                    392:        if (i == NTM - 2)
                    393:                tmbuf[i++] = '\n';
                    394:        tmbuf[i] = 0;
                    395:        if (ab) /* truncate output */
                    396:                obufp = obuf;   /* should be a function in n2.c */
                    397:        flusho();
                    398:        fdprintf(stderr, "%s", tmbuf);
                    399:        copyf--;
                    400:        lgf--;
                    401: }
                    402: 
                    403: 
                    404: casesp(a)
                    405: int    a;
                    406: {
                    407:        register i, j, savlss;
                    408: 
                    409:        tbreak();
                    410:        if (dip->nls || trap)
                    411:                return;
                    412:        i = findt1();
                    413:        if (!a) {
                    414:                skip();
                    415:                j = vnumb((int *)0);
                    416:                if (nonumb)
                    417:                        j = lss;
                    418:        } else 
                    419:                j = a;
                    420:        if (j == 0)
                    421:                return;
                    422:        if (i < j)
                    423:                j = i;
                    424:        savlss = lss;
                    425:        if (dip != d)
                    426:                i = dip->dnl; 
                    427:        else 
                    428:                i = numtab[NL].val;
                    429:        if ((i + j) < 0)
                    430:                j = -i;
                    431:        lss = j;
                    432:        newline(0);
                    433:        lss = savlss;
                    434: }
                    435: 
                    436: 
                    437: casert()
                    438: {
                    439:        register a, *p;
                    440: 
                    441:        skip();
                    442:        if (dip != d)
                    443:                p = &dip->dnl; 
                    444:        else 
                    445:                p = &numtab[NL].val;
                    446:        a = vnumb(p);
                    447:        if (nonumb)
                    448:                a = dip->mkline;
                    449:        if ((a < 0) || (a >= *p))
                    450:                return;
                    451:        nb++;
                    452:        casesp(a - *p);
                    453: }
                    454: 
                    455: 
                    456: caseem()
                    457: {
                    458:        lgf++;
                    459:        skip();
                    460:        em = getrq();
                    461: }
                    462: 
                    463: 
                    464: casefl()
                    465: {
                    466:        tbreak();
                    467:        flusho();
                    468: }
                    469: 
                    470: 
                    471: caseev()
                    472: {
                    473:        register nxev;
                    474: 
                    475:        if (skip()) {
                    476: e0:
                    477:                if (evi == 0)
                    478:                        return;
                    479:                nxev =  evlist[--evi];
                    480:                goto e1;
                    481:        }
                    482:        noscale++;
                    483:        nxev = atoi();
                    484:        noscale = 0;
                    485:        if (nonumb)
                    486:                goto e0;
                    487:        flushi();
                    488:        if ((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)) {
                    489:                flusho();
                    490:                errprint("cannot do ev.");
                    491:                if (error)
                    492:                        done2(040);
                    493:                else 
                    494:                        edone(040);
                    495:                return;
                    496:        }
                    497:        evlist[evi++] = ev;
                    498: e1:
                    499:        if (ev == nxev)
                    500:                return;
                    501: #ifdef INCORE
                    502:        { extern tchar corebuf[];
                    503:        envcopy((struct env *) &corebuf[ev * sizeof(env)/sizeof(tchar)], &env);
                    504:        envcopy(&env, (struct env *) &corebuf[nxev * sizeof(env)/sizeof(tchar)]);
                    505:        }
                    506: #else
                    507:        lseek(ibf, ev * (long)sizeof(env), 0);
                    508:        write(ibf, (char *) & env, sizeof(env));
                    509:        lseek(ibf, nxev * (long)sizeof(env), 0);
                    510:        read(ibf, (char *) & env, sizeof(env));
                    511: #endif
                    512:        ev = nxev;
                    513: }
                    514: 
                    515: envcopy(e1, e2)        /* copy env e2 to e1 */
                    516:        struct env *e1, *e2;
                    517: {
                    518:        *e1 = *e2;      /* rumor hath that this fails on some machines */
                    519: }
                    520: 
                    521: 
                    522: caseel()
                    523: {
                    524:        if (--ifx < 0) {
                    525:                ifx = 0;
                    526:                iflist[0] = 0;
                    527:        }
                    528:        caseif(2);
                    529: }
                    530: 
                    531: 
                    532: caseie()
                    533: {
                    534:        if (ifx >= NIF) {
                    535:                errprint("if-else overflow.");
                    536:                ifx = 0;
                    537:                edone(040);
                    538:        }
                    539:        caseif(1);
                    540:        ifx++;
                    541: }
                    542: 
                    543: 
                    544: caseif(x)
                    545: int    x;
                    546: {
                    547:        extern int falsef;
                    548:        register notflag, true;
                    549:        tchar i;
                    550: 
                    551:        if (x == 2) {
                    552:                notflag = 0;
                    553:                true = iflist[ifx];
                    554:                goto i1;
                    555:        }
                    556:        true = 0;
                    557:        skip();
                    558:        if ((cbits(i = getch())) == '!') {
                    559:                notflag = 1;
                    560:        } else {
                    561:                notflag = 0;
                    562:                ch = i;
                    563:        }
                    564:        i = atoi();
                    565:        if (!nonumb) {
                    566:                if (i > 0)
                    567:                        true++;
                    568:                goto i1;
                    569:        }
                    570:        i = getch();
                    571:        switch (cbits(i)) {
                    572:        case 'e':
                    573:                if (!(numtab[PN].val & 01))
                    574:                        true++;
                    575:                break;
                    576:        case 'o':
                    577:                if (numtab[PN].val & 01)
                    578:                        true++;
                    579:                break;
                    580: #ifdef NROFF
                    581:        case 'n':
                    582:                true++;
                    583:        case 't':
                    584: #endif
                    585: #ifndef NROFF
                    586:        case 't':
                    587:                true++;
                    588:        case 'n':
                    589: #endif
                    590:        case ' ':
                    591:                break;
                    592:        default:
                    593:                true = cmpstr(i);
                    594:        }
                    595: i1:
                    596:        true ^= notflag;
                    597:        if (x == 1)
                    598:                iflist[ifx] = !true;
                    599:        if (true) {
                    600: i2:
                    601:                while ((cbits(i = getch())) == ' ')
                    602:                        ;
                    603:                if (cbits(i) == LEFT)
                    604:                        goto i2;
                    605:                ch = i;
                    606:                nflush++;
                    607:        } else {
                    608:                copyf++;
                    609:                falsef++;
                    610:                eatblk(0);
                    611:                copyf--;
                    612:                falsef--;
                    613:        }
                    614: }
                    615: 
                    616: eatblk(inblk)
                    617: int inblk;
                    618: {      register int cnt, i;
                    619: 
                    620:        cnt = 0;
                    621:        do {
                    622:                if (ch) {
                    623:                        i = cbits(ch);
                    624:                        ch = 0;
                    625:                } else
                    626:                        i = cbits(getch0());
                    627:                if (i == ESC)
                    628:                        cnt++;
                    629:                else {
                    630:                        if (cnt == 1)
                    631:                                switch (i) {
                    632:                                case '{':  i = LEFT; break;
                    633:                                case '}':  i = RIGHT; break;
                    634:                                case '\n': i = 'x'; break;
                    635:                                }
                    636:                        cnt = 0;
                    637:                }
                    638:                if (i == LEFT) eatblk(1);
                    639:        } while ((!inblk && (i != '\n')) || (inblk && (i != RIGHT)));
                    640:        if (i == '\n')
                    641:                nlflg++;
                    642: }
                    643: 
                    644: 
                    645: cmpstr(c)
                    646: tchar c;
                    647: {
                    648:        register j, delim;
                    649:        register tchar i;
                    650:        register val;
                    651:        int savapts, savapts1, savfont, savfont1, savpts, savpts1;
                    652:        tchar string[1280];
                    653:        register tchar *sp;
                    654: 
                    655:        if (ismot(c))
                    656:                return(0);
                    657:        delim = cbits(c);
                    658:        savapts = apts;
                    659:        savapts1 = apts1;
                    660:        savfont = font;
                    661:        savfont1 = font1;
                    662:        savpts = pts;
                    663:        savpts1 = pts1;
                    664:        sp = string;
                    665:        while ((j = cbits(i = getch()))!=delim && j!='\n' && sp<&string[1280-1])
                    666:                *sp++ = i;
                    667:        if (sp >= string + 1280) {
                    668:                errprint("too-long string compare.");
                    669:                edone(0100);
                    670:        }
                    671:        if (nlflg) {
                    672:                val = sp==string;
                    673:                goto rtn;
                    674:        }
                    675:        *sp = 0;
                    676:        apts = savapts;
                    677:        apts1 = savapts1;
                    678:        font = savfont;
                    679:        font1 = savfont1;
                    680:        pts = savpts;
                    681:        pts1 = savpts1;
                    682:        mchbits();
                    683:        val = 1;
                    684:        sp = string;
                    685:        while ((j = cbits(i = getch())) != delim && j != '\n') {
                    686:                if (*sp != i) {
                    687:                        eat(delim);
                    688:                        val = 0;
                    689:                        goto rtn;
                    690:                }
                    691:                sp++;
                    692:        }
                    693:        if (*sp)
                    694:                val = 0;
                    695: rtn:
                    696:        apts = savapts;
                    697:        apts1 = savapts1;
                    698:        font = savfont;
                    699:        font1 = savfont1;
                    700:        pts = savpts;
                    701:        pts1 = savpts1;
                    702:        mchbits();
                    703:        return(val);
                    704: }
                    705: 
                    706: 
                    707: caserd()
                    708: {
                    709: 
                    710:        lgf++;
                    711:        skip();
                    712:        getname();
                    713:        if (!iflg) {
                    714:                if (quiet) {
                    715: #ifdef NROFF
                    716:                        echo_off();
                    717:                        flusho();
                    718: #endif NROFF
                    719:                        fdprintf(stderr, "\007"); /*bell*/
                    720:                } else {
                    721:                        if (nextf[0]) {
                    722:                                fdprintf(stderr, "%s:", nextf);
                    723:                        } else {
                    724:                                fdprintf(stderr, "\007"); /*bell*/
                    725:                        }
                    726:                }
                    727:        }
                    728:        collect();
                    729:        tty++;
                    730:        pushi((filep)NBLIST*BLK, PAIR('r','d'));
                    731: }
                    732: 
                    733: 
                    734: rdtty()
                    735: {
                    736:        char    onechar;
                    737: 
                    738:        onechar = 0;
                    739:        if (read(0, &onechar, 1) == 1) {
                    740:                if (onechar == '\n')
                    741:                        tty++;
                    742:                else 
                    743:                        tty = 1;
                    744:                if (tty != 3)
                    745:                        return(onechar);
                    746:        }
                    747:        popi();
                    748:        tty = 0;
                    749: #ifdef NROFF
                    750:        if (quiet)
                    751:                echo_on();
                    752: #endif NROFF
                    753:        return(0);
                    754: }
                    755: 
                    756: 
                    757: caseec()
                    758: {
                    759:        eschar = chget('\\');
                    760: }
                    761: 
                    762: 
                    763: caseeo()
                    764: {
                    765:        eschar = 0;
                    766: }
                    767: 
                    768: 
                    769: caseta()
                    770: {
                    771:        register i;
                    772: 
                    773:        tabtab[0] = nonumb = 0;
                    774:        for (i = 0; ((i < (NTAB - 1)) && !nonumb); i++) {
                    775:                if (skip())
                    776:                        break;
                    777:                tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]), 0) & TABMASK;
                    778:                if (!nonumb) 
                    779:                        switch (cbits(ch)) {
                    780:                        case 'C':
                    781:                                tabtab[i] |= CTAB;
                    782:                                break;
                    783:                        case 'R':
                    784:                                tabtab[i] |= RTAB;
                    785:                                break;
                    786:                        default: /*includes L*/
                    787:                                break;
                    788:                        }
                    789:                nonumb = ch = 0;
                    790:        }
                    791:        tabtab[i] = 0;
                    792: }
                    793: 
                    794: 
                    795: casene()
                    796: {
                    797:        register i, j;
                    798: 
                    799:        skip();
                    800:        i = vnumb((int *)0);
                    801:        if (nonumb)
                    802:                i = lss;
                    803:        if (i > (j = findt1())) {
                    804:                i = lss;
                    805:                lss = j;
                    806:                dip->nls = 0;
                    807:                newline(0);
                    808:                lss = i;
                    809:        }
                    810: }
                    811: 
                    812: 
                    813: casetr()
                    814: {
                    815:        register i, j;
                    816:        tchar k;
                    817: 
                    818:        lgf++;
                    819:        skip();
                    820:        while ((i = cbits(k=getch())) != '\n') {
                    821:                if (ismot(k))
                    822:                        return;
                    823:                if (ismot(k = getch()))
                    824:                        return;
                    825:                if ((j = cbits(k)) == '\n')
                    826:                        j = ' ';
                    827:                trtab[i] = j;
                    828:        }
                    829: }
                    830: 
                    831: 
                    832: casecu()
                    833: {
                    834:        cu++;
                    835:        caseul();
                    836: }
                    837: 
                    838: 
                    839: caseul()
                    840: {
                    841:        register i;
                    842: 
                    843:        noscale++;
                    844:        if (skip())
                    845:                i = 1;
                    846:        else 
                    847:                i = atoi();
                    848:        if (ul && (i == 0)) {
                    849:                font = sfont;
                    850:                ul = cu = 0;
                    851:        }
                    852:        if (i) {
                    853:                if (!ul) {
                    854:                        sfont = font;
                    855:                        font = ulfont;
                    856:                }
                    857:                ul = i;
                    858:        }
                    859:        noscale = 0;
                    860:        mchbits();
                    861: }
                    862: 
                    863: 
                    864: caseuf()
                    865: {
                    866:        register i, j;
                    867: 
                    868:        if (skip() || !(i = getrq()) || i == 'S' ||  (j = findft(i))  == -1)
                    869:                ulfont = ULFONT; /*default underline position*/
                    870:        else 
                    871:                ulfont = j;
                    872: #ifdef NROFF
                    873:        if (ulfont == FT)
                    874:                ulfont = ULFONT;
                    875: #endif
                    876: }
                    877: 
                    878: 
                    879: caseit()
                    880: {
                    881:        register i;
                    882: 
                    883:        lgf++;
                    884:        it = itmac = 0;
                    885:        noscale++;
                    886:        skip();
                    887:        i = atoi();
                    888:        skip();
                    889:        if (!nonumb && (itmac = getrq()))
                    890:                it = i;
                    891:        noscale = 0;
                    892: }
                    893: 
                    894: 
                    895: casemc()
                    896: {
                    897:        register i;
                    898: 
                    899:        if (icf > 1)
                    900:                ic = 0;
                    901:        icf = 0;
                    902:        if (skip())
                    903:                return;
                    904:        ic = getch();
                    905:        icf = 1;
                    906:        skip();
                    907:        i = max(hnumb((int *)0), 0);
                    908:        if (!nonumb)
                    909:                ics = i;
                    910: }
                    911: 
                    912: 
                    913: casemk()
                    914: {
                    915:        register i, j;
                    916: 
                    917:        if (dip != d)
                    918:                j = dip->dnl; 
                    919:        else 
                    920:                j = numtab[NL].val;
                    921:        if (skip()) {
                    922:                dip->mkline = j;
                    923:                return;
                    924:        }
                    925:        if ((i = getrq()) == 0)
                    926:                return;
                    927:        numtab[findr(i)].val = j;
                    928: }
                    929: 
                    930: 
                    931: casesv()
                    932: {
                    933:        register i;
                    934: 
                    935:        skip();
                    936:        if ((i = vnumb((int *)0)) < 0)
                    937:                return;
                    938:        if (nonumb)
                    939:                i = 1;
                    940:        sv += i;
                    941:        caseos();
                    942: }
                    943: 
                    944: 
                    945: caseos()
                    946: {
                    947:        register savlss;
                    948: 
                    949:        if (sv <= findt1()) {
                    950:                savlss = lss;
                    951:                lss = sv;
                    952:                newline(0);
                    953:                lss = savlss;
                    954:                sv = 0;
                    955:        }
                    956: }
                    957: 
                    958: 
                    959: casenm()
                    960: {
                    961:        register i;
                    962: 
                    963:        lnmod = nn = 0;
                    964:        if (skip())
                    965:                return;
                    966:        lnmod++;
                    967:        noscale++;
                    968:        i = inumb(&numtab[LN].val);
                    969:        if (!nonumb)
                    970:                numtab[LN].val = max(i, 0);
                    971:        getnm(&ndf, 1);
                    972:        getnm(&nms, 0);
                    973:        getnm(&ni, 0);
                    974:        noscale = 0;
                    975:        nmbits = chbits;
                    976: }
                    977: 
                    978: 
                    979: getnm(p, min)
                    980: int    *p, min;
                    981: {
                    982:        register i;
                    983: 
                    984:        eat(' ');
                    985:        if (skip())
                    986:                return;
                    987:        i = atoi();
                    988:        if (nonumb)
                    989:                return;
                    990:        *p = max(i, min);
                    991: }
                    992: 
                    993: 
                    994: casenn()
                    995: {
                    996:        noscale++;
                    997:        skip();
                    998:        nn = max(atoi(), 1);
                    999:        noscale = 0;
                   1000: }
                   1001: 
                   1002: 
                   1003: caseab()
                   1004: {
                   1005:        casetm(1);
                   1006:        done3(0);
                   1007: }
                   1008: 
                   1009: #ifdef NROFF
                   1010: /*
                   1011:  * The following routines are concerned with setting terminal options.
                   1012:  *     The manner of doing this differs between research/Berkeley systems
                   1013:  *     and UNIX System V systems (i.e. DOCUMENTER'S WORKBENCH)
                   1014:  *     The distinction is controlled by the #define'd variable USG,
                   1015:  *     which must be set by System V users.
                   1016:  */
                   1017: 
                   1018: 
                   1019: #ifdef USG
                   1020: 
                   1021: #include <termio.h>
                   1022: #define        ECHO_USG (ECHO | ECHOE | ECHOK | ECHONL)
                   1023: struct termio  ttys;
                   1024: 
                   1025: #else
                   1026: 
                   1027: #include <sys/ttyio.h>
                   1028: /* #include <sgtty.h> */
                   1029: struct sgttyb  ttys[2];
                   1030: #include "tw.h"
                   1031: extern struct t t;
                   1032: 
                   1033: #endif USG
                   1034: 
                   1035: int    ttysave[2] = {-1, -1};
                   1036: 
                   1037: save_tty()                     /*save any tty settings that may be changed*/
                   1038: {
                   1039: 
                   1040: #ifdef USG
                   1041:        if (ioctl(0, TCGETA, &ttys) >= 0)
                   1042:                ttysave[0] = ttys.c_lflag;
                   1043: #else
                   1044:        if (gtty(0, &ttys[0]) >= 0)
                   1045:                ttysave[0] = ttys[0].sg_flags;
                   1046:        if (gtty(1, &ttys[1]) >= 0)
                   1047:                ttysave[1] = ttys[1].sg_flags;
                   1048: #endif USG
                   1049: 
                   1050: }
                   1051: 
                   1052: 
                   1053: restore_tty()                  /*restore tty settings from beginning*/
                   1054: {
                   1055: 
                   1056:        if (ttysave[0] != -1) {
                   1057: #ifdef USG
                   1058:                ttys.c_lflag = ttysave[0];
                   1059:                ioctl(0, TCSETAW, &ttys);
                   1060: #else
                   1061:                ttys[0].sg_flags = ttysave[0];
                   1062:                stty(0, &ttys[0]);
                   1063:        }
                   1064:        if (ttysave[1] != -1) {
                   1065:                ttys[1].sg_flags = ttysave[1];
                   1066:                stty(1, &ttys[1]);
                   1067: #endif USG
                   1068:        }
                   1069: }
                   1070: 
                   1071: 
                   1072: set_tty()
                   1073: {
                   1074: 
                   1075: #ifndef        USG
                   1076:        if (t.bset || t.breset) {
                   1077:                if (ttysave[1] == -1)
                   1078:                        save_tty();
                   1079:                if (ttysave[1] != -1) {
                   1080:                        ttys[1].sg_flags &= ~t.breset;
                   1081:                        ttys[1].sg_flags |= t.bset;
                   1082:                        stty(1, &ttys[1]);
                   1083:                }
                   1084:        }
                   1085: #endif USG
                   1086: 
                   1087: }
                   1088: 
                   1089: 
                   1090: echo_off()                     /*turn off ECHO for .rd in "-q" mode*/
                   1091: {
                   1092: 
                   1093: #ifdef USG
                   1094:        ttys.c_lflag &= ~ECHO_USG;
                   1095:        ioctl(0, TCSETAW, &ttys);
                   1096: #else
                   1097:        ttys[0].sg_flags &= ~ECHO;
                   1098:        stty(0, &ttys[0]);
                   1099: #endif USG
                   1100: 
                   1101: }
                   1102: 
                   1103: 
                   1104: echo_on()                      /*restore ECHO after .rd in "-q" mode*/
                   1105: {
                   1106: 
                   1107: #ifdef USG
                   1108:        ttys.c_lflag |= ECHO_USG;
                   1109:        ioctl(0, TCSETAW, &ttys);
                   1110: #else
                   1111:        ttys[0].sg_flags |= ECHO;
                   1112:        stty(0, &ttys[0]);
                   1113: #endif USG
                   1114: 
                   1115: }
                   1116: #endif NROFF

unix.superglobalmegacorp.com

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