Annotation of 42BSD/usr.bin/troff/n1.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)n1.c       4.5 6/30/83";
                      3: #endif lint
                      4: 
                      5: #include "tdef.h"
                      6: #include <sys/types.h>
                      7: #include <sys/stat.h>
                      8: #include <sys/time.h>
                      9: extern
                     10: #include "d.h"
                     11: extern
                     12: #include "v.h"
                     13: #ifdef NROFF
                     14: extern
                     15: #include "tw.h"
                     16: #endif
                     17: #include "sdef.h"
                     18: #include <setjmp.h>
                     19: jmp_buf sjbuf;
                     20: #include       <sgtty.h>
                     21: /*
                     22: troff1.c
                     23: 
                     24: consume options, initialization, main loop,
                     25: input routines, escape function calling
                     26: */
                     27: 
                     28: int    inchar[LNSIZE], *pinchar = inchar;      /* XXX */
                     29: extern struct s *frame, *stk, *nxf;
                     30: extern struct s *ejl, *litlev;
                     31: extern filep ip;
                     32: extern filep offset;
                     33: extern filep nextb;
                     34: 
                     35: 
                     36: extern int stdi;
                     37: extern int waitf;
                     38: extern int nofeed;
                     39: extern int quiet;
                     40: extern int ptid;
                     41: extern int ascii;
                     42: extern int npn;
                     43: extern int xflg;
                     44: extern int stop;
                     45: extern char ibuf[IBUFSZ];
                     46: extern char xbuf[IBUFSZ];
                     47: extern char *ibufp;
                     48: extern char *xbufp;
                     49: extern char *eibuf;
                     50: extern char *xeibuf;
                     51: extern int cbuf[NC];
                     52: extern int *cp;
                     53: extern int *vlist;
                     54: extern int nx;
                     55: extern int mflg;
                     56: extern int ch;
                     57: extern int pto;
                     58: extern int pfrom;
                     59: extern int cps;
                     60: extern int chbits;
                     61: extern int ibf;
                     62: extern int ttyod;
                     63: extern struct sgttyb ttys;
                     64: extern int iflg;
                     65: extern int init;
                     66: extern int rargc;
                     67: extern char **argp;
                     68: extern char trtab[256];
                     69: extern int lgf;
                     70: extern int copyf;
                     71: extern int eschar;
                     72: extern int ch0;
                     73: extern int cwidth;
                     74: extern int nlflg;
                     75: extern int *ap;
                     76: extern int donef;
                     77: extern int nflush;
                     78: extern int nchar;
                     79: extern int rchar;
                     80: extern int nfo;
                     81: extern int ifile;
                     82: extern int fc;
                     83: extern int padc;
                     84: extern int tabc;
                     85: extern int dotc;
                     86: extern int raw;
                     87: extern int tabtab[NTAB];
                     88: extern char nextf[];
                     89: extern int nfi;
                     90: #ifdef NROFF
                     91: extern char termtab[];
                     92: extern int tti;
                     93: #endif
                     94: extern int ifl[NSO];
                     95: extern int ifi;
                     96: extern int pendt;
                     97: extern int flss;
                     98: extern int fi;
                     99: extern int lg;
                    100: extern char ptname[];
                    101: extern int print;
                    102: extern int nonumb;
                    103: extern int pnlist[];
                    104: extern int *pnp;
                    105: extern int nb;
                    106: extern int trap;
                    107: extern int tflg;
                    108: extern int ejf;
                    109: extern int lit;
                    110: extern int cc;
                    111: extern int c2;
                    112: extern int spread;
                    113: extern int gflag;
                    114: extern int oline[];
                    115: extern int *olinep;
                    116: extern int dpn;
                    117: extern int noscale;
                    118: extern char *unlkp;
                    119: extern int pts;
                    120: extern int level;
                    121: extern int ttysave;
                    122: extern int tdelim;
                    123: extern int dotT;
                    124: extern int tabch, ldrch;
                    125: extern int eqflg;
                    126: extern no_out;
                    127: extern int hflg;
                    128: #ifndef NROFF
                    129: extern char codetab[];
                    130: extern int spbits;
                    131: #endif
                    132: extern int xxx;
                    133: int stopmesg;
                    134: filep ipl[NSO];
                    135: long offl[NSO];
                    136: long ioff;
                    137: char *ttyp;
                    138: extern struct contab {
                    139:        int rq;
                    140:        union {
                    141:                int (*f)();
                    142:                unsigned mx;
                    143:        }x;
                    144: }contab[NM];
                    145: int ms[] = {31,28,31,30,31,30,31,31,30,31,30,31};
                    146: #ifndef NROFF
                    147: int acctf;
                    148: #endif
                    149: 
                    150: main(argc,argv)
                    151: int argc;
                    152: char **argv;
                    153: {
                    154:        char *p, *q;
                    155:        register i, j;
                    156:        extern catch(), fpecatch(), kcatch();
                    157: 
                    158:        signal(SIGHUP,catch);
                    159:        if(signal(SIGINT,catch) == SIG_IGN){
                    160:                signal(SIGHUP,SIG_IGN);
                    161:                signal(SIGINT,SIG_IGN);
                    162:                signal(SIGQUIT,SIG_IGN);
                    163:        }
                    164:        signal(SIGFPE,fpecatch);
                    165:        signal(SIGPIPE,catch);
                    166:        signal(SIGTERM,kcatch);
                    167:        init1(argv[0][0]);
                    168: options:
                    169:        while(--argc > 0 && (++argv)[0][0]=='-')
                    170:                switch(argv[0][1]){
                    171: 
                    172:                case 0:
                    173:                        goto start;
                    174:                case 'i':
                    175:                        stdi++;
                    176:                        continue;
                    177:                case 'q':
                    178:                        quiet++;
                    179:                        if(gtty(0, &ttys) >= 0)
                    180:                                ttysave = ttys.sg_flags;
                    181:                        continue;
                    182:                case 'n':
                    183:                        npn = cnum(&argv[0][2]);
                    184:                        continue;
                    185:                case 'p':
                    186:                        xflg = 0;
                    187:                        cps = cnum(&argv[0][2]);
                    188:                        continue;
                    189:                case 'S':
                    190:                        stopmesg++;
                    191:                        continue;
                    192:                case 's':
                    193:                        if(!(stop = cnum(&argv[0][2])))stop++;
                    194:                        continue;
                    195:                case 'r':
                    196:                        vlist[findr(argv[0][2])] = cnum(&argv[0][3]);
                    197:                        continue;
                    198:                case 'm':
                    199:                        p = &nextf[nfi];
                    200:                        q = &argv[0][2];
                    201:                        while((*p++ = *q++) != 0);
                    202:                        if (access(nextf, 4) < 0) {
                    203: char *local = "/usr/local/lib/tmac/tmac.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
                    204:                                strcat(local, &argv[0][2]);
                    205:                                if (access(local, 4) == 0)
                    206:                                        strcpy(nextf, local);
                    207:                        }
                    208:                        mflg++;
                    209:                        continue;
                    210:                case 'o':
                    211:                        getpn(&argv[0][2]);
                    212:                        continue;
                    213: #ifdef NROFF
                    214:                case 'h':
                    215:                        hflg++;
                    216:                        continue;
                    217:                case 'z':
                    218:                        no_out++;
                    219:                        continue;
                    220:                case 'e':
                    221:                        eqflg++;
                    222:                        continue;
                    223:                case 'T':
                    224:                        p = &termtab[tti];
                    225:                        q = &argv[0][2];
                    226:                        if(!((*q) & 0177))continue;
                    227:                        while((*p++ = *q++) != 0);
                    228:                        dotT++;
                    229:                        continue;
                    230: #endif
                    231: #ifndef NROFF
                    232:                case 'z':
                    233:                        no_out++;
                    234:                case 'a':
                    235:                        ascii = 1;
                    236:                        nofeed++;
                    237:                case 't':
                    238:                        ptid = 1;
                    239:                        continue;
                    240:                case 'w':
                    241:                        waitf = 1;
                    242:                        continue;
                    243:                case 'f':
                    244:                        nofeed++;
                    245:                        continue;
                    246:                case 'x':
                    247:                        xflg = 0;
                    248:                        continue;
                    249:                case 'b':
                    250:                        if(open(ptname,1) < 0)prstr("Busy.\n");
                    251:                        else prstr("Available.\n");
                    252:                        done3(0);
                    253:                case 'g':
                    254:                        stop = ptid = gflag = 1;
                    255:                        dpn = 0;
                    256:                        continue;
                    257:                case 'F':
                    258:                        {
                    259:                          extern char *fontfile;
                    260:                          fontfile = &argv[0][2];
                    261:                        }
                    262:                        continue;
                    263: #endif
                    264:                default:
                    265:                        pto = cnum(&argv[0][1]);
                    266:                        continue;
                    267:                }
                    268: 
                    269:        if(argv[0][0] == '+'){
                    270:                pfrom = cnum(&argv[0][1]);
                    271:                print = 0;
                    272:                if(argc > 0)goto options;
                    273:        }
                    274: 
                    275: start:
                    276:        argp = argv;
                    277:        rargc = argc;
                    278:        init2();
                    279:        setjmp(sjbuf);
                    280: loop:
                    281:        copyf = lgf = nb = nflush = nlflg = 0;
                    282:        if(ip && (rbf0(ip)==0) && ejf && (frame->pframe <= ejl)){
                    283:                nflush++;
                    284:                trap = 0;
                    285:                eject((struct s *)0);
                    286:                goto loop;
                    287:        }
                    288:        i = getch();
                    289:        if(pendt)goto lt;
                    290:        if(lit && (frame <= litlev)){
                    291:                lit--;
                    292:                goto lt;
                    293:        }
                    294:        if((j = (i & CMASK)) == XPAR){
                    295:                copyf++;
                    296:                tflg++;
                    297:                for(;(i & CMASK) != '\n';)pchar(i = getch());
                    298:                tflg = 0;
                    299:                copyf--;
                    300:                goto loop;
                    301:        }
                    302:        if((j == cc) || (j == c2)){
                    303:                if(j == c2)nb++;
                    304:                copyf++;
                    305:                while(((j=((i=getch()) & CMASK)) == ' ') ||
                    306:                        (j == '\t'));
                    307:                ch = i;
                    308:                copyf--;
                    309:                control(getrq(),1);
                    310:                flushi();
                    311:                goto loop;
                    312:        }
                    313: lt:
                    314:        ch = i;
                    315:        text();
                    316:        goto loop;
                    317: }
                    318: catch(){
                    319: /*
                    320:        prstr("Interrupt\n");
                    321: */
                    322:        done3(01);
                    323: }
                    324: fpecatch(){
                    325:        prstrfl("Floating Exception.\n");
                    326:        signal(SIGFPE,fpecatch);
                    327: }
                    328: kcatch(){
                    329:        signal(SIGTERM,SIG_IGN);
                    330:        done3(01);
                    331: }
                    332: #ifndef NROFF
                    333: acctg() {
                    334:        static char *acct_file = "/usr/adm/tracct";
                    335:        acctf = open(acct_file,1);
                    336:        setuid(getuid());
                    337: }
                    338: #endif
                    339: init1(a)
                    340: char a;
                    341: {
                    342:        register char *p;
                    343:        char *mktemp();
                    344:        register i;
                    345: 
                    346: #ifndef NROFF
                    347:        acctg();/*open troff actg file while mode 4755*/
                    348: #endif
                    349:        p = mktemp("/tmp/taXXXXX");
                    350:        if(a == 'a')p = &p[5];
                    351:        if((close(creat(p, 0600))) < 0){
                    352:                prstr("Cannot create temp file.\n");
                    353:                exit(-1);
                    354:        }
                    355:        ibf = open(p, 2);
                    356:        for(i=256; --i;)trtab[i]=i;
                    357:        trtab[UNPAD] = ' ';
                    358:        mchbits();
                    359:        if(a != 'a')unlkp = p;
                    360: }
                    361: init2()
                    362: {
                    363:        register i,j;
                    364:        extern int block;
                    365:        extern char *setbrk();
                    366:        extern char *ttyname();
                    367: 
                    368:        ttyod = 2;
                    369:        if(((ttyp=ttyname(j=0)) != (char *)0) ||
                    370:           ((ttyp=ttyname(j=1)) != (char *)0) ||
                    371:           ((ttyp=ttyname(j=2)) != (char *)0)
                    372:          );else ttyp = "notty";
                    373:        iflg = j;
                    374:        if(ascii)mesg(0);
                    375: 
                    376:        if((!ptid) && (!waitf)){
                    377:                if((ptid = open(ptname,1)) < 0){
                    378:                        prstr("Typesetter busy.\n");
                    379:                        done3(-2);
                    380:                }
                    381:        }
                    382:        ptinit();
                    383:        for(i=NEV; i--;)write(ibf, (char *)&block, EVS*sizeof(int));
                    384:        olinep = oline;
                    385:        ibufp = eibuf = ibuf;
                    386:        v.hp = init = 0;
                    387:        pinchar = inchar;       /* XXX */
                    388:        ioff = 0;
                    389:        v.nl = -1;
                    390:        cvtime();
                    391:        frame = stk = (struct s *)setbrk(DELTA);
                    392:        dip = &d[0];
                    393:        nxf = frame + 1;
                    394:        nx = mflg;
                    395: }
                    396: cvtime(){
                    397: 
                    398:        register i;
                    399:        struct timeval t;
                    400:        struct timezone tz;
                    401: 
                    402:        gettimeofday(&t, &tz);
                    403:        t.tv_sec -= 60*tz.tz_minuteswest;       /* 5hrs for EST */
                    404:        v.dy = (t.tv_sec/86400L) + 1;
                    405:        v.dw = (v.dy + 3)%7 + 1;
                    406:        for(v.yr=70;; v.yr++){
                    407:                if((v.yr)%4)ms[1]=28;else ms[1]=29;
                    408:                for(i=0;i<12;){
                    409:                        if(v.dy<=ms[i]){
                    410:                                v.mo = i+1;
                    411:                                return;
                    412:                        }
                    413:                        v.dy -= ms[i++];
                    414:                }
                    415:        }
                    416: }
                    417: cnum(a)
                    418: char *a;
                    419: {
                    420:        register i;
                    421: 
                    422:        ibufp = a;
                    423:        eibuf = MAXPTR;
                    424:        i = atoi();
                    425:        ch = 0;
                    426:        return(i);
                    427: }
                    428: mesg(f)
                    429: int f;
                    430: {
                    431:        static int mode;
                    432: 
                    433:        if (ttyp==0)
                    434:                return;
                    435:        if(!f){
                    436:                stat(ttyp,cbuf);
                    437:                mode = ((struct stat *)(cbuf))->st_mode;
                    438:                chmod(ttyp,mode & ~022);
                    439:        }else{
                    440:                chmod(ttyp,mode);
                    441:        }
                    442: }
                    443: prstrfl(s)
                    444: char *s;
                    445: {
                    446:        flusho();
                    447:        prstr(s);
                    448: }
                    449: prstr(s)
                    450: char *s;
                    451: {
                    452:        register i;
                    453:        register char *j;
                    454: 
                    455:        j = s;
                    456:        for(i=0;*s;i++)s++;
                    457:        write(ttyod,j,i);
                    458: }
                    459: control(a,b)
                    460: int a,b;
                    461: {
                    462:        register i,j;
                    463:        extern filep boff();
                    464: 
                    465:        i = a;
                    466:        if((i == 0) || ((j = findmn(i)) == -1))return(0);
                    467:        if(contab[j].rq & MMASK){
                    468:                nxf->nargs = 0;
                    469:                if(b)collect();
                    470:                flushi();
                    471:                return(pushi(((filep)contab[j].x.mx)<<BLKBITS));
                    472:        }else{
                    473:                if(!b)return(0);
                    474:                return((*contab[j].x.f)(0));
                    475:        }
                    476: }
                    477: 
                    478: getrq(){
                    479:        register i,j;
                    480: 
                    481:        if(((i=getach()) == 0) ||
                    482:           ((j=getach()) == 0))goto rtn;
                    483:        i = PAIR(i,j);
                    484: rtn:
                    485:        return(i);
                    486: }
                    487: getch(){
                    488:        register int i, j, k;
                    489: 
                    490:        level++;
                    491: g0:
                    492:        if(ch){
                    493:                if(((i = ch) & CMASK) == '\n')nlflg++;
                    494:                ch = 0;
                    495:                level--;
                    496:                return(i);
                    497:        }
                    498: 
                    499:        if(nlflg){
                    500:                level--;
                    501:                return('\n');
                    502:        }
                    503: 
                    504:        if((k = (i = getch0()) & CMASK) != ESC){
                    505:                if(i & MOT)goto g2;
                    506:                if(k == FLSS){
                    507:                        copyf++; raw++;
                    508:                        i = getch0();
                    509:                        if(!fi)flss = i;
                    510:                        copyf--; raw--;
                    511:                        goto g0;
                    512:                }
                    513:                if(k == RPT){
                    514:                        setrpt();
                    515:                        goto g0;
                    516:                }
                    517:                if(!copyf){
                    518:                        if((k == 'f') && lg && !lgf){
                    519:                                i = getlg(i);
                    520:                                goto g2;
                    521:                        }
                    522:                        if((k == fc) || (k == tabch) || (k == ldrch)){
                    523:                                if((i=setfield(k)) == 0)goto g0; else goto g2;
                    524:                        }
                    525:                        if(k == 010){
                    526:                                i = makem(-width(' ' | chbits));
                    527:                                goto g2;
                    528:                        }
                    529:                }
                    530:                goto g2;
                    531:        }
                    532:        k = (j = getch0()) & CMASK;
                    533:        if(j & MOT){
                    534:                i = j;
                    535:                goto g2;
                    536:        }
                    537: /*
                    538:        if(k == tdelim){
                    539:                i = TDELIM;
                    540:                tdelim = IMP;
                    541:                goto g2;
                    542:        }
                    543: */
                    544:        switch(k){
                    545: 
                    546:                case '\n':      /*concealed newline*/
                    547:                        goto g0;
                    548:                case 'n':       /*number register*/
                    549:                        setn();
                    550:                        goto g0;
                    551:                case '*':       /*string indicator*/
                    552:                        setstr();
                    553:                        goto g0;
                    554:                case '$':       /*argument indicator*/
                    555:                        seta();
                    556:                        goto g0;
                    557:                case '{':       /*LEFT*/
                    558:                        i = LEFT;
                    559:                        goto gx;
                    560:                case '}':       /*RIGHT*/
                    561:                        i = RIGHT;
                    562:                        goto gx;
                    563:                case '"':       /*comment*/
                    564:                        while(((i=getch0()) & CMASK ) != '\n');
                    565:                        goto g2;
                    566:                case ESC:       /*double backslash*/
                    567:                        i = eschar;
                    568:                        goto gx;
                    569:                case 'e':       /*printable version of current eschar*/
                    570:                        i = PRESC;
                    571:                        goto gx;
                    572:                case ' ':       /*unpaddable space*/
                    573:                        i = UNPAD;
                    574:                        goto gx;
                    575:                case '|':       /*narrow space*/
                    576:                        i = NARSP;
                    577:                        goto gx;
                    578:                case '^':       /*half of narrow space*/
                    579:                        i = HNSP;
                    580:                        goto gx;
                    581:                case '\'':      /*\(aa*/
                    582:                        i = 0222;
                    583:                        goto gx;
                    584:                case '`':       /*\(ga*/
                    585:                        i = 0223;
                    586:                        goto gx;
                    587:                case '_':       /*\(ul*/
                    588:                        i = 0224;
                    589:                        goto gx;
                    590:                case '-':       /*current font minus*/
                    591:                        i = 0210;
                    592:                        goto gx;
                    593:                case '&':       /*filler*/
                    594:                        i = FILLER;
                    595:                        goto gx;
                    596:                case 'c':       /*to be continued*/
                    597:                        i = CONT;
                    598:                        goto gx;
                    599:                case ':':       /*lem's char*/
                    600:                        i = COLON;
                    601:                        goto gx;
                    602:                case '!':       /*transparent indicator*/
                    603:                        i = XPAR;
                    604:                        goto gx;
                    605:                case 't':       /*tab*/
                    606:                        i = '\t';
                    607:                        goto g2;
                    608:                case 'a':       /*leader (SOH)*/
                    609:                        i = LEADER;
                    610:                        goto g2;
                    611:                case '%':       /*ohc*/
                    612:                        i = OHC;
                    613:                        goto g2;
                    614:                case '.':       /*.*/
                    615:                        i = '.';
                    616:                gx:
                    617:                        i = (j & ~CMASK) | i;
                    618:                        goto g2;
                    619:        }
                    620:        if(!copyf)
                    621:                switch(k){
                    622: 
                    623:                        case 'p':       /*spread*/
                    624:                                spread++;
                    625:                                goto g0;
                    626:                        case '(':       /*special char name*/
                    627:                                if((i=setch()) == 0)goto g0;
                    628:                                break;
                    629:                        case 's':       /*size indicator*/
                    630:                                setps();
                    631:                                goto g0;
                    632:                        case 'f':       /*font indicator*/
                    633:                                setfont(0);
                    634:                                goto g0;
                    635:                        case 'w':       /*width function*/
                    636:                                setwd();
                    637:                                goto g0;
                    638:                        case 'v':       /*vert mot*/
                    639:                                if(i = vmot())break;
                    640:                                goto g0;
                    641:                        case 'h':       /*horiz mot*/
                    642:                                if(i = hmot())break;
                    643:                                goto g0;
                    644:                        case 'z':       /*zero with char*/
                    645:                                i = setz();
                    646:                                break;
                    647:                        case 'l':       /*hor line*/
                    648:                                setline();
                    649:                                goto g0;
                    650:                        case 'L':       /*vert line*/
                    651:                                setvline();
                    652:                                goto g0;
                    653:                        case 'b':       /*bracket*/
                    654:                                setbra();
                    655:                                goto g0;
                    656:                        case 'o':       /*overstrike*/
                    657:                                setov();
                    658:                                goto g0;
                    659:                        case 'k':       /*mark hor place*/
                    660:                                if((i=findr(getsn())) == -1)goto g0;
                    661:                                vlist[i] = v.hp = sumhp();      /* XXX */
                    662:                                goto g0;
                    663:                        case 'j':       /*mark output hor place*/
                    664:                                if(!(i=getach()))goto g0;
                    665:                                i = (i<<BYTE) | JREG;
                    666:                                break;
                    667:                        case '0':       /*number space*/
                    668:                                i = makem(width('0' | chbits));
                    669:                                break;
                    670:                        case 'x':       /*extra line space*/
                    671:                                if(i = xlss())break;
                    672:                                goto g0;
                    673:                        case 'u':       /*half em up*/
                    674:                        case 'r':       /*full em up*/
                    675:                        case 'd':       /*half em down*/
                    676:                                i = sethl(k);
                    677:                                break;
                    678:                        default:
                    679:                                i = j;
                    680:                }
                    681:        else{
                    682:                ch0 = j;
                    683:                i = eschar;
                    684:        }
                    685: g2:
                    686:        if((i & CMASK) == '\n'){
                    687:                nlflg++;
                    688:                v.hp = 0;
                    689:                pinchar = inchar;       /* XXX */
                    690:                if(ip == 0)v.cd++;
                    691:        }
                    692:        if(!--level){
                    693:                /* j = width(i); */
                    694:                /* v.hp += j; */
                    695:                /* cwidth = j; */
                    696:                if (pinchar >= inchar + LNSIZE) {       /* XXX */
                    697:                        inchar[0] = makem(sumhp());
                    698:                        pinchar = &inchar[1];
                    699:                }
                    700:                *pinchar++ = i; /* XXX */
                    701:        }
                    702:        return(i);
                    703: }
                    704: 
                    705: sumhp()        /* XXX - add up widths in inchar array */
                    706: {
                    707:        register int n;
                    708:        register int *p;
                    709: 
                    710:        n = 0;
                    711:        for (p = inchar; p < pinchar; p++)
                    712:                n += width(*p);
                    713:        return(n);
                    714: }
                    715: char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012};
                    716: getch0(){
                    717:        register int i, j;
                    718: 
                    719:        if(ch0){i=ch0; ch0=0; return(i);}
                    720:        if(nchar){nchar--; return(rchar);}
                    721: 
                    722: again:
                    723:        if(cp){
                    724:                if((i = *cp++) == 0){
                    725:                        cp = 0;
                    726:                        goto again;
                    727:                }
                    728:        }else if(ap){
                    729:                if((i = *ap++) == 0){
                    730:                        ap = 0;
                    731:                        goto again;
                    732:                }
                    733:        }else if(ip){
                    734:                if(ip == -1)i = rdtty();
                    735:                else i = rbf();
                    736:        }else{
                    737:                if(donef)done(0);
                    738:                if(nx || ((ibufp >= eibuf) && (ibufp != MAXPTR))){
                    739:                        if(nfo)goto g1;
                    740:                g0:
                    741:                        if(nextfile()){
                    742:                                if(ip)goto again;
                    743:                                if(ibufp < eibuf)goto g2;
                    744:                        }
                    745:                g1:
                    746:                        nx = 0;
                    747:                        if((j=read(ifile,ibuf,IBUFSZ)) <= 0)goto g0;
                    748:                        ibufp = ibuf;
                    749:                        eibuf = ibuf + j;
                    750:                        if(ip)goto again;
                    751:                }
                    752:        g2:
                    753:                i = *ibufp++ & 0177;
                    754:                ioff++;
                    755:                if(i >= 040)goto g4; else i = ifilt[i];
                    756:        }
                    757:        if(raw)return(i);
                    758:        if((j = i & CMASK) == IMP)goto again;
                    759:        if((i == 0) && !init)goto again;
                    760: g4:
                    761:        if((copyf == 0) && ((i & ~BMASK) == 0) && ((i & CMASK) < 0370))
                    762: #ifndef NROFF
                    763:                if(spbits && (i>31) && ((codetab[i-32] & 0200))) i |= spbits;
                    764:                else
                    765: #endif
                    766:                i |= chbits;
                    767:        if((i & CMASK) == eschar)i = (i & ~CMASK) | ESC;
                    768:        return(i);
                    769: }
                    770: nextfile(){
                    771:        register char *p;
                    772: 
                    773: n0:
                    774:        if(ifile)close(ifile);
                    775:        if(nx){
                    776:                p = nextf;
                    777:                if(*p != 0)goto n1;
                    778:        }
                    779:        if(ifi > 0){
                    780:                if(popf())goto n0; /*popf error*/
                    781:                return(1); /*popf ok*/
                    782:        }
                    783:        if(rargc-- <= 0)goto n2;
                    784:        p = (argp++)[0];
                    785: n1:
                    786:        if((p[0] == '-') && (p[1] == 0)){
                    787:                ifile = 0;
                    788:        }else if((ifile=open(p,0)) < 0){
                    789:                prstr("Cannot open ");
                    790:                prstr(p);
                    791:                prstr("\n");
                    792:                nfo -= mflg;
                    793:                done(02);
                    794:        }
                    795:        nfo++;
                    796:        v.cd = 0;
                    797:        ioff = 0;
                    798:        return(0);
                    799: n2:
                    800:        if((nfo -= mflg) && !stdi)done(0);
                    801:        nfo++;
                    802:        v.cd = ifile =  stdi = mflg = 0;
                    803:        ioff = 0;
                    804:        return(0);
                    805: }
                    806: popf(){
                    807:        register i;
                    808:        register char *p, *q;
                    809:        extern char *ttyname();
                    810: 
                    811:        ioff = offl[--ifi];
                    812:        ip = ipl[ifi];
                    813:        if((ifile = ifl[ifi]) == 0){
                    814:                p = xbuf;
                    815:                q = ibuf;
                    816:                ibufp = xbufp;
                    817:                eibuf = xeibuf;
                    818:                while(q < eibuf)*q++ = *p++;
                    819:                return(0);
                    820:        }
                    821:        if((lseek(ifile,(long)(ioff & ~(IBUFSZ-1)),0) < 0) ||
                    822:           ((i = read(ifile,ibuf,IBUFSZ)) < 0))return(1);
                    823:        eibuf = ibuf + i;
                    824:        ibufp = ibuf;
                    825:        if(ttyname(ifile) == (char *)0)
                    826:                if((ibufp = ibuf + (int)(ioff & (IBUFSZ-1)))  >= eibuf)return(1);
                    827:        return(0);
                    828: }
                    829: flushi(){
                    830:        if(nflush)return;
                    831:        ch = 0;
                    832:        if((ch0 & CMASK) == '\n')nlflg++;
                    833:        ch0 = 0;
                    834:        copyf++;
                    835:        while(!nlflg){
                    836:                if(donef && (frame == stk))break;
                    837:                getch();
                    838:        }
                    839:        copyf--;
                    840:        v.hp = 0;
                    841:        pinchar = inchar;       /* XXX */
                    842: }
                    843: getach(){
                    844:        register i;
                    845: 
                    846:        lgf++;
                    847:        if(((i = getch()) & MOT) ||
                    848:            ((i&CMASK) == ' ') ||
                    849:            ((i&CMASK) == '\n')||
                    850:            (i & 0200)){
                    851:                        ch = i;
                    852:                        i = 0;
                    853:        }
                    854:        lgf--;
                    855:        return(i & 0177);
                    856: }
                    857: casenx(){
                    858:        lgf++;
                    859:        skip();
                    860:        getname();
                    861:        nx++;
                    862:        nextfile();
                    863:        nlflg++;
                    864:        ip = 0;
                    865:        ap = 0;
                    866:        nchar = pendt = 0;
                    867:        frame = stk;
                    868:        nxf = frame + 1;
                    869: }
                    870: getname(){
                    871:        register int i, j, k;
                    872: 
                    873:        lgf++;
                    874:        for(k=0; k < (NS-1); k++){
                    875:                if(((j=(i=getch()) & CMASK) <= ' ') ||
                    876:                        (j > 0176))break;
                    877:                nextf[k] = j;
                    878:        }
                    879:        nextf[k] = 0;
                    880:        ch = i;
                    881:        lgf--;
                    882:        return(nextf[0]);
                    883: }
                    884: caseso(){
                    885:        register i;
                    886:        register char *p, *q;
                    887: 
                    888:        lgf++;
                    889:        nextf[0] = 0;
                    890:        if(skip() || !getname() || ((i=open(nextf,0)) <0) || (ifi >= NSO)) {
                    891:                prstr("can't open file ");
                    892:                prstr(nextf);
                    893:                prstr("\n");
                    894:                done(02);
                    895:        }
                    896:        flushi();
                    897:        ifl[ifi] = ifile;
                    898:        ifile = i;
                    899:        offl[ifi] = ioff;
                    900:        ioff = 0;
                    901:        ipl[ifi] = ip;
                    902:        ip = 0;
                    903:        nx++;
                    904:        nflush++;
                    905:        if(!ifl[ifi++]){
                    906:                p = ibuf;
                    907:                q = xbuf;
                    908:                xbufp = ibufp;
                    909:                xeibuf = eibuf;
                    910:                while(p < eibuf)*q++ = *p++;
                    911:        }
                    912: }
                    913: 
                    914: casecf(){      /* copy file without change */
                    915:        int fd, i, n;
                    916:        char buf[OBUFSZ];
                    917: 
                    918:        flusho();
                    919:        lgf++;
                    920:        nextf[0] = 0;
                    921:        if(skip() || !getname() || ((fd=open(nextf,0)) <0) || (ifi >= NSO)) {
                    922:                prstr("can't open file ");
                    923:                prstr(nextf);
                    924:                prstr("\n");
                    925:                done(02);
                    926:        }
                    927:        while ((n = read(fd, buf, OBUFSZ)) > 0)
                    928:                for (i = 0; i < n; i++)
                    929:                        oput(buf[i]);
                    930:        flusho();
                    931:        close(fd);
                    932: }
                    933: getpn(a)
                    934: char *a;
                    935: {
                    936:        register i, neg;
                    937:        long atoi1();
                    938: 
                    939:        if((*a & 0177) == 0)return;
                    940:        neg = 0;
                    941:        ibufp = a;
                    942:        eibuf = MAXPTR;
                    943:        noscale++;
                    944:        while((i = getch() & CMASK) != 0)switch(i){
                    945:                case '+':
                    946:                case ',':
                    947:                        continue;
                    948:                case '-':
                    949:                        neg = MOT;
                    950:                        goto d2;
                    951:                default:
                    952:                        ch = i;
                    953:                d2:
                    954:                        i = atoi1();
                    955:                        if(nonumb)goto fini;
                    956:                        else{
                    957:                                *pnp++ = i | neg;
                    958:                                neg = 0;
                    959:                                if(pnp >= &pnlist[NPN-2]){
                    960:                                        prstr("Too many page numbers\n");
                    961:                                        done3(-3);
                    962:                                }
                    963:                        }
                    964:                }
                    965: fini:
                    966:        if(neg)*pnp++ = -2;
                    967:        *pnp = -1;
                    968:        ch = noscale = print = 0;
                    969:        pnp = pnlist;
                    970:        if(*pnp != -1)chkpn();
                    971: }
                    972: setrpt(){
                    973:        register i, j;
                    974: 
                    975:        copyf++;raw++;
                    976:        i = getch0();
                    977:        copyf--;raw--;
                    978:        if((i < 0) ||
                    979:           (((j = getch0()) & CMASK) == RPT))return;
                    980:        rchar = j;
                    981:        nchar = i & BMASK;
                    982: }

unix.superglobalmegacorp.com

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