# 2.11BSD#431 - /usr/src/usr.bin/roff/common_source/n1.c

##### Functions

    acctg             X
    casecf            X
    casenx            X
    caseso            X
    catch             X
    cnum              X
    control           X
    cvtime            X
    flushi            X
    fpecatch          X
    getach            X
    getch             X
    getch0            X
    getname           X
    getpn             X
    getrq             X
    init1             X
    init2             X
    kcatch            X
    main              X
    mesg              X
    nextfile          X
    popf              X
    prstr             X
    prstrfl           X
    setrpt            X
    sumhp             X

##### Variables

    acctf             X
    ifilt             X
    inchar            X
    ioff              X
    ipl               X
    ms                X
    offl              X
    pinchar           X
    stopmesg          X
    ttyp              X

##### struct's

    contab            X

       1: #ifndef lint
       2: static char sccsid[] = "@(#)n1.c	4.8 7/21/87";
       3: #endif lint
       4:
       5: #include "tdef.h"
       6: #include <sys/types.h>
       7: #include <sys/stat.h>
       8: #include <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:     extern time_t time();
     399:     time_t t;
     400:     register struct tm *tmp;
     401:
     402:     t = time((time_t *)0);
     403:     tmp = localtime(&t);
     404:     v.dy = tmp->tm_mday;
     405:     v.dw = tmp->tm_wday + 1;
     406:     v.yr = tmp->tm_year;
     407:     v.mo = tmp->tm_mon + 1;
     408: }
     409: cnum(a)
     410: char *a;
     411: {
     412:     register i;
     413:
     414:     ibufp = a;
     415:     eibuf = (char *) MAXPTR;
     416:     i = atoi();
     417:     ch = 0;
     418:     return(i);
     419: }
     420: mesg(f)
     421: int f;
     422: {
     423:     static int mode;
     424:
     425:     if (ttyp==0)
     426:         return;
     427:     if(!f){
     428:         stat(ttyp,cbuf);
     429:         mode = ((struct stat *)(cbuf))->st_mode;
     430:         chmod(ttyp,mode & ~022);
     431:     }else{
     432:         chmod(ttyp,mode);
     433:     }
     434: }
     435: prstrfl(s)
     436: char *s;
     437: {
     438:     flusho();
     439:     prstr(s);
     440: }
     441: prstr(s)
     442: char *s;
     443: {
     444:     register i;
     445:     register char *j;
     446:
     447:     j = s;
     448:     for(i=0;*s;i++)s++;
     449:     write(ttyod,j,i);
     450: }
     451: control(a,b)
     452: int a,b;
     453: {
     454:     register i,j;
     455:     extern filep boff();
     456:
     457:     i = a;
     458:     if((i == 0) || ((j = findmn(i)) == -1))return(0);
     459:     if(contab[j].rq & MMASK){
     460:         nxf->nargs = 0;
     461:         if(b)collect();
     462:         flushi();
     463:         return(pushi(((filep)contab[j].x.mx)<<BLKBITS));
     464:     }else{
     465:         if(!b)return(0);
     466:         return((*contab[j].x.f)(0));
     467:     }
     468: }
     469:
     470: getrq(){
     471:     register i,j;
     472:
     473:     if(((i=getach()) == 0) ||
     474:        ((j=getach()) == 0))goto rtn;
     475:     i = PAIR(i,j);
     476: rtn:
     477:     return(i);
     478: }
     479: getch(){
     480:     register int i, j, k;
     481:
     482:     level++;
     483: g0:
     484:     if(ch){
     485:         if(((i = ch) & CMASK) == '\n')nlflg++;
     486:         ch = 0;
     487:         level--;
     488:         return(i);
     489:     }
     490:
     491:     if(nlflg){
     492:         level--;
     493:         return('\n');
     494:     }
     495:
     496:     if((k = (i = getch0()) & CMASK) != ESC){
     497:         if(i & MOT)goto g2;
     498:         if(k == FLSS){
     499:             copyf++; raw++;
     500:             i = getch0();
     501:             if(!fi)flss = i;
     502:             copyf--; raw--;
     503:             goto g0;
     504:         }
     505:         if(k == RPT){
     506:             setrpt();
     507:             goto g0;
     508:         }
     509:         if(!copyf){
     510:             if((k == 'f') && lg && !lgf){
     511:                 i = getlg(i);
     512:                 goto g2;
     513:             }
     514:             if((k == fc) || (k == tabch) || (k == ldrch)){
     515:                 if((i=setfield(k)) == 0)goto g0; else goto g2;
     516:             }
     517:             if(k == 010){
     518:                 i = makem(-width(' ' | chbits));
     519:                 goto g2;
     520:             }
     521:         }
     522:         goto g2;
     523:     }
     524:     k = (j = getch0()) & CMASK;
     525:     if(j & MOT){
     526:         i = j;
     527:         goto g2;
     528:     }
     529: /*
     530: 	if(k == tdelim){
     531: 		i = TDELIM;
     532: 		tdelim = IMP;
     533: 		goto g2;
     534: 	}
     535: */
     536:     switch(k){
     537:
     538:         case '\n':  /*concealed newline*/
     539:             goto g0;
     540:         case 'n':   /*number register*/
     541:             setn();
     542:             goto g0;
     543:         case '*':   /*string indicator*/
     544:             setstr();
     545:             goto g0;
     546:         case '$':   /*argument indicator*/
     547:             seta();
     548:             goto g0;
     549:         case '{':   /*LEFT*/
     550:             i = LEFT;
     551:             goto gx;
     552:         case '}':   /*RIGHT*/
     553:             i = RIGHT;
     554:             goto gx;
     555:         case '"':   /*comment*/
     556:             while(((i=getch0()) & CMASK ) != '\n');
     557:             goto g2;
     558:         case ESC:   /*double backslash*/
     559:             i = eschar;
     560:             goto gx;
     561:         case 'e':   /*printable version of current eschar*/
     562:             i = PRESC;
     563:             goto gx;
     564:         case ' ':   /*unpaddable space*/
     565:             i = UNPAD;
     566:             goto gx;
     567:         case '|':   /*narrow space*/
     568:             i = NARSP;
     569:             goto gx;
     570:         case '^':   /*half of narrow space*/
     571:             i = HNSP;
     572:             goto gx;
     573:         case '\'':  /*\(aa*/
     574:             i = 0222;
     575:             goto gx;
     576:         case '`':   /*\(ga*/
     577:             i = 0223;
     578:             goto gx;
     579:         case '_':   /*\(ul*/
     580:             i = 0224;
     581:             goto gx;
     582:         case '-':   /*current font minus*/
     583:             i = 0210;
     584:             goto gx;
     585:         case '&':   /*filler*/
     586:             i = FILLER;
     587:             goto gx;
     588:         case 'c':   /*to be continued*/
     589:             i = CONT;
     590:             goto gx;
     591:         case ':':   /*lem's char*/
     592:             i = COLON;
     593:             goto gx;
     594:         case '!':   /*transparent indicator*/
     595:             i = XPAR;
     596:             goto gx;
     597:         case 't':   /*tab*/
     598:             i = '\t';
     599:             goto g2;
     600:         case 'a':   /*leader (SOH)*/
     601:             i = LEADER;
     602:             goto g2;
     603:         case '%':   /*ohc*/
     604:             i = OHC;
     605:             goto g2;
     606:         case '.':   /*.*/
     607:             i = '.';
     608:         gx:
     609:             i = (j & ~CMASK) | i;
     610:             goto g2;
     611:     }
     612:     if(!copyf)
     613:         switch(k){
     614:
     615:             case 'p':   /*spread*/
     616:                 spread++;
     617:                 goto g0;
     618:             case '(':   /*special char name*/
     619:                 if((i=setch()) == 0)goto g0;
     620:                 break;
     621:             case 's':   /*size indicator*/
     622:                 setps();
     623:                 goto g0;
     624:             case 'f':   /*font indicator*/
     625:                 setfont(0);
     626:                 goto g0;
     627:             case 'w':   /*width function*/
     628:                 setwd();
     629:                 goto g0;
     630:             case 'v':   /*vert mot*/
     631:                 if(i = vmot())break;
     632:                 goto g0;
     633:             case 'h':   /*horiz mot*/
     634:                 if(i = hmot())break;
     635:                 goto g0;
     636:             case 'z':   /*zero with char*/
     637:                 i = setz();
     638:                 break;
     639:             case 'l':   /*hor line*/
     640:                 setline();
     641:                 goto g0;
     642:             case 'L':   /*vert line*/
     643:                 setvline();
     644:                 goto g0;
     645:             case 'b':   /*bracket*/
     646:                 setbra();
     647:                 goto g0;
     648:             case 'o':   /*overstrike*/
     649:                 setov();
     650:                 goto g0;
     651:             case 'k':   /*mark hor place*/
     652:                 if((i=findr(getsn())) == -1)goto g0;
     653:                 vlist[i] = v.hp = sumhp();  /* XXX */
     654:                 goto g0;
     655:             case 'j':   /*mark output hor place*/
     656:                 if(!(i=getach()))goto g0;
     657:                 i = (i<<BYTE) | JREG;
     658:                 break;
     659:             case '0':   /*number space*/
     660:                 i = makem(width('0' | chbits));
     661:                 break;
     662:             case 'x':   /*extra line space*/
     663:                 if(i = xlss())break;
     664:                 goto g0;
     665:             case 'u':   /*half em up*/
     666:             case 'r':   /*full em up*/
     667:             case 'd':   /*half em down*/
     668:                 i = sethl(k);
     669:                 break;
     670:             default:
     671:                 i = j;
     672:         }
     673:     else{
     674:         ch0 = j;
     675:         i = eschar;
     676:     }
     677: g2:
     678:     if((i & CMASK) == '\n'){
     679:         nlflg++;
     680:         v.hp = 0;
     681:         pinchar = inchar;   /* XXX */
     682:         if(ip == 0)v.cd++;
     683:     }
     684:     if(!--level){
     685:         /* j = width(i); */
     686:         /* v.hp += j; */
     687:         /* cwidth = j; */
     688:         if (pinchar >= inchar + LNSIZE) {   /* XXX */
     689:             inchar[0] = makem(sumhp());
     690:             pinchar = &inchar[1];
     691:         }
     692:         *pinchar++ = i; /* XXX */
     693:     }
     694:     return(i);
     695: }
     696:
     697: sumhp() /* XXX - add up widths in inchar array */
     698: {
     699:     register int n;
     700:     register int *p;
     701:
     702:     n = 0;
     703:     for (p = inchar; p < pinchar; p++)
     704:         n += width(*p);
     705:     return(n);
     706: }
     707: char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012};
     708: getch0(){
     709:     register int i, j;
     710:
     711:     if(ch0){i=ch0; ch0=0; return(i);}
     712:     if(nchar){nchar--; return(rchar);}
     713:
     714: again:
     715:     if(cp){
     716:         if((i = *cp++) == 0){
     717:             cp = 0;
     718:             goto again;
     719:         }
     720:     }else if(ap){
     721:         if((i = *ap++) == 0){
     722:             ap = 0;
     723:             goto again;
     724:         }
     725:     }else if(ip){
     726:         if(ip == -1)i = rdtty();
     727:         else i = rbf();
     728:     }else{
     729:         if(donef)done(0);
     730:         if(nx || ((ibufp >= eibuf) && (eibuf != (char *) MAXPTR))){
     731:             if(nfo)goto g1;
     732:         g0:
     733:             if(nextfile()){
     734:                 if(ip)goto again;
     735:                 if(ibufp < eibuf)goto g2;
     736:             }
     737:         g1:
     738:             nx = 0;
     739:             if((j=read(ifile,ibuf,IBUFSZ)) <= 0)goto g0;
     740:             ibufp = ibuf;
     741:             eibuf = ibuf + j;
     742:             if(ip)goto again;
     743:         }
     744:     g2:
     745:         i = *ibufp++ & 0177;
     746:         ioff++;
     747:         if(i >= 040)goto g4; else i = ifilt[i];
     748:     }
     749:     if(raw)return(i);
     750:     if((j = i & CMASK) == IMP)goto again;
     751:     if((i == 0) && !init)goto again;
     752: g4:
     753:     if((copyf == 0) && ((i & ~BMASK) == 0) && ((i & CMASK) < 0370))
     754: #ifndef NROFF
     755:         if(spbits && (i>31) && ((codetab[i-32] & 0200))) i |= spbits;
     756:         else
     757: #endif
     758:         i |= chbits;
     759:     if((i & CMASK) == eschar)i = (i & ~CMASK) | ESC;
     760:     return(i);
     761: }
     762: nextfile(){
     763:     register char *p;
     764:
     765: n0:
     766:     if(ifile)close(ifile);
     767:     if(nx){
     768:         p = nextf;
     769:         if(*p != 0)goto n1;
     770:     }
     771:     if(ifi > 0){
     772:         if(popf())goto n0; /*popf error*/
     773:         return(1); /*popf ok*/
     774:     }
     775:     if(rargc-- <= 0)goto n2;
     776:     p = (argp++)[0];
     777: n1:
     778:     if((p[0] == '-') && (p[1] == 0)){
     779:         ifile = 0;
     780:     }else if((ifile=open(p,0)) < 0){
     781:         prstr("Cannot open ");
     782:         prstr(p);
     783:         prstr("\n");
     784:         nfo -= mflg;
     785:         done(02);
     786:     }
     787:     nfo++;
     788:     v.cd = 0;
     789:     ioff = 0;
     790:     return(0);
     791: n2:
     792:     if((nfo -= mflg) && !stdi)done(0);
     793:     nfo++;
     794:     v.cd = ifile =  stdi = mflg = 0;
     795:     ioff = 0;
     796:     return(0);
     797: }
     798: popf(){
     799:     register i;
     800:     register char *p, *q;
     801:     extern char *ttyname();
     802:
     803:     ioff = offl[--ifi];
     804:     ip = ipl[ifi];
     805:     if((ifile = ifl[ifi]) == 0){
     806:         p = xbuf;
     807:         q = ibuf;
     808:         ibufp = xbufp;
     809:         eibuf = xeibuf;
     810:         while(q < eibuf)*q++ = *p++;
     811:         return(0);
     812:     }
     813:     if((lseek(ifile,(long)(ioff & ~(IBUFSZ-1)),0) < 0) ||
     814:        ((i = read(ifile,ibuf,IBUFSZ)) < 0))return(1);
     815:     eibuf = ibuf + i;
     816:     ibufp = ibuf;
     817:     if(ttyname(ifile) == (char *)0)
     818:         if((ibufp = ibuf + (int)(ioff & (IBUFSZ-1)))  >= eibuf)return(1);
     819:     return(0);
     820: }
     821: flushi(){
     822:     if(nflush)return;
     823:     ch = 0;
     824:     if((ch0 & CMASK) == '\n')nlflg++;
     825:     ch0 = 0;
     826:     copyf++;
     827:     while(!nlflg){
     828:         if(donef && (frame == stk))break;
     829:         getch();
     830:     }
     831:     copyf--;
     832:     v.hp = 0;
     833:     pinchar = inchar;   /* XXX */
     834: }
     835: getach(){
     836:     register i;
     837:
     838:     lgf++;
     839:     if(((i = getch()) & MOT) ||
     840:         ((i&CMASK) == ' ') ||
     841:         ((i&CMASK) == '\n')||
     842:         (i & 0200)){
     843:             ch = i;
     844:             i = 0;
     845:     }
     846:     lgf--;
     847:     return(i & 0177);
     848: }
     849: casenx(){
     850:     lgf++;
     851:     skip();
     852:     getname();
     853:     nx++;
     854:     nextfile();
     855:     nlflg++;
     856:     ip = 0;
     857:     ap = 0;
     858:     nchar = pendt = 0;
     859:     frame = stk;
     860:     nxf = frame + 1;
     861: }
     862: getname(){
     863:     register int i, j, k;
     864:
     865:     lgf++;
     866:     for(k=0; k < (NS-1); k++){
     867:         if(((j=(i=getch()) & CMASK) <= ' ') ||
     868:             (j > 0176))break;
     869:         nextf[k] = j;
     870:     }
     871:     nextf[k] = 0;
     872:     ch = i;
     873:     lgf--;
     874:     return(nextf[0]);
     875: }
     876: caseso(){
     877:     register i;
     878:     register char *p, *q;
     879:
     880:     lgf++;
     881:     nextf[0] = 0;
     882:     if(skip() || !getname() || ((i=open(nextf,0)) <0) || (ifi >= NSO)) {
     883:         prstr("can't open file ");
     884:         prstr(nextf);
     885:         prstr("\n");
     886:         done(02);
     887:     }
     888:     flushi();
     889:     ifl[ifi] = ifile;
     890:     ifile = i;
     891:     offl[ifi] = ioff;
     892:     ioff = 0;
     893:     ipl[ifi] = ip;
     894:     ip = 0;
     895:     nx++;
     896:     nflush++;
     897:     if(!ifl[ifi++]){
     898:         p = ibuf;
     899:         q = xbuf;
     900:         xbufp = ibufp;
     901:         xeibuf = eibuf;
     902:         while(p < eibuf)*q++ = *p++;
     903:     }
     904: }
     905:
     906: casecf(){   /* copy file without change */
     907:     int fd, i, n;
     908:     char buf[OBUFSZ];
     909:
     910:     flusho();
     911:     lgf++;
     912:     nextf[0] = 0;
     913:     if(skip() || !getname() || ((fd=open(nextf,0)) <0) || (ifi >= NSO)) {
     914:         prstr("can't open file ");
     915:         prstr(nextf);
     916:         prstr("\n");
     917:         done(02);
     918:     }
     919:     while ((n = read(fd, buf, OBUFSZ)) > 0)
     920:         for (i = 0; i < n; i++)
     921:             oput(buf[i]);
     922:     flusho();
     923:     close(fd);
     924: }
     925: getpn(a)
     926: char *a;
     927: {
     928:     register i, neg;
     929:     long atoi1();
     930:
     931:     if((*a & 0177) == 0)return;
     932:     neg = 0;
     933:     ibufp = a;
     934:     eibuf = (char *) MAXPTR;
     935:     noscale++;
     936:     while((i = getch() & CMASK) != 0)switch(i){
     937:         case '+':
     938:         case ',':
     939:             continue;
     940:         case '-':
     941:             neg = MOT;
     942:             goto d2;
     943:         default:
     944:             ch = i;
     945:         d2:
     946:             i = atoi1();
     947:             if(nonumb)goto fini;
     948:             else{
     949:                 *pnp++ = i | neg;
     950:                 neg = 0;
     951:                 if(pnp >= &pnlist[NPN-2]){
     952:                     prstr("Too many page numbers\n");
     953:                     done3(-3);
     954:                 }
     955:             }
     956:         }
     957: fini:
     958:     if(neg)*pnp++ = -2;
     959:     *pnp = -1;
     960:     ch = noscale = print = 0;
     961:     pnp = pnlist;
     962:     if(*pnp != -1)chkpn();
     963: }
     964: setrpt(){
     965:     register i, j;
     966:
     967:     copyf++;raw++;
     968:     i = getch0();
     969:     copyf--;raw--;
     970:     if((i < 0) ||
     971:        (((j = getch0()) & CMASK) == RPT))return;
     972:     rchar = j;
     973:     nchar = i & BMASK;
     974: }

#### Defined functions

acctg defined in line 333; used 1 times

- in line 347

casecf defined in line 906; used 2 times

- in /usr/src/usr.bin/roff/common_source/ni.c line 76, 177

casenx defined in line 849; used 2 times

- in /usr/src/usr.bin/roff/common_source/ni.c line 66, 135

caseso defined in line 876; used 2 times

- in /usr/src/usr.bin/roff/common_source/ni.c line 66, 136

catch defined in line 318; used 4 times

- in line 156-159(3), 165

cnum defined in line 409; used 6 times

- in line 183-187(2), 193-196(2), 265-270(2)

control defined in line 451; used 8 times

- in line 309
- in /usr/src/usr.bin/roff/common_source/n2.c line 223
- in /usr/src/usr.bin/roff/common_source/n3.c line 81, 134
- in /usr/src/usr.bin/roff/common_source/n7.c line 353, 409, 459, 465

cvtime defined in line 396; used 1 times

- in line 390

flushi defined in line 821; used 7 times

- in line 310, 462, 888
- in /usr/src/usr.bin/roff/common_source/n3.c line 223
- in /usr/src/usr.bin/roff/common_source/n5.c line 422
- in /usr/src/usr.bin/roff/common_source/n7.c line 323, 688

fpecatch defined in line 324; used 3 times

- in line 156, 164, 326

getach defined in line 835; used 5 times

- in line 473-474(2), 656
- in /usr/src/usr.bin/roff/common_source/n3.c line 232, 472

getch defined in line 479; used 89 times

- in line 288, 297, 305, 829, 839, 867, 936
- in /usr/src/usr.bin/roff/common_source/n3.c line 208, 227, 271-272(2), 558-568(3), 598, 656-661(2)
- in /usr/src/usr.bin/roff/common_source/n4.c line 70, 261, 304, 312, 319, 337, 353, 368, 380, 474-476(2), 504
- in /usr/src/usr.bin/roff/common_source/n5.c line 115, 162, 360, 465, 476, 507, 525, 559, 576, 691-692(2), 751
- in /usr/src/usr.bin/roff/common_source/n7.c line 750
- in /usr/src/usr.bin/roff/common_source/n8.c line 105
- in /usr/src/usr.bin/roff/common_source/n9.c line 40, 47, 58, 99, 107-109(2), 142, 152, 177, 188-190(2), 228, 261, 310
- in /usr/src/usr.bin/roff/nroff/n6.c line 106-107(2), 116, 151, 162, 200-205(2), 238, 259-263(2)
- in /usr/src/usr.bin/roff/troff/svt6.c line 241, 318-319(2), 331, 375, 386, 425-430(2), 502, 599-603(2)
- in /usr/src/usr.bin/roff/troff/t6.c line 241, 318-319(2), 331, 376, 391, 433-438(2), 513, 610-614(2)

getch0 defined in line 708; used 11 times

- in line 496-500(2), 524, 556, 968-971(2)
- in /usr/src/usr.bin/roff/common_source/n9.c line 306
- in /usr/src/usr.bin/roff/troff/svt6.c line 464-466(2)
- in /usr/src/usr.bin/roff/troff/t6.c line 472-474(2)

getname defined in line 862; used 5 times

- in line 852, 882, 913
- in /usr/src/usr.bin/roff/common_source/n2.c line 314
- in /usr/src/usr.bin/roff/common_source/n5.c line 601

getpn defined in line 925; used 1 times

- in line 211

getrq defined in line 470; used 33 times

- in line 309
- in /usr/src/usr.bin/roff/common_source/n3.c line 88-90(2), 96, 120, 218, 475, 610, 644
- in /usr/src/usr.bin/roff/common_source/n4.c line 441, 456, 472
- in /usr/src/usr.bin/roff/common_source/n5.c line 291, 309, 402, 724, 742, 765
- in /usr/src/usr.bin/roff/nroff/n6.c line 85, 131, 239
- in /usr/src/usr.bin/roff/troff/svt6.c line 192, 220, 347, 503, 538, 553
- in /usr/src/usr.bin/roff/troff/t6.c line 192, 220, 347, 514, 549, 564

init1 defined in line 339; used 1 times

- in line 167

init2 defined in line 361; used 1 times

- in line 278

kcatch defined in line 328; used 2 times

- in line 156, 166

main defined in line 150; never used
mesg defined in line 420; used 2 times

- in line 374
- in /usr/src/usr.bin/roff/common_source/n2.c line 284

nextfile defined in line 762; used 2 times

- in line 733, 854

popf defined in line 798; used 1 times

- in line 772

prstr defined in line 441; used 60 times

- in line 250-251(2), 352, 378, 439, 781-783(3), 883-885(3), 914-916(3), 952
- in /usr/src/usr.bin/roff/common_source/n2.c line 185, 266, 316, 330-332(3)
- in /usr/src/usr.bin/roff/common_source/n3.c line 189, 334, 391, 622, 732-737(2)
- in /usr/src/usr.bin/roff/common_source/n5.c line 446, 609-612(3)
- in /usr/src/usr.bin/roff/common_source/n8.c line 128
- in /usr/src/usr.bin/roff/common_source/n9.c line 250
- in /usr/src/usr.bin/roff/nroff/n10.c line 54-56(3)
- in /usr/src/usr.bin/roff/troff/svt6.c line 502-510(5), 516, 525-530(5)
- in /usr/src/usr.bin/roff/troff/t10.c line 262, 310
- in /usr/src/usr.bin/roff/troff/t6.c line 513-521(5), 527, 536-541(5)

prstrfl defined in line 435; used 13 times

- in line 325
- in /usr/src/usr.bin/roff/common_source/n3.c line 459, 578
- in /usr/src/usr.bin/roff/common_source/n4.c line 158, 284
- in /usr/src/usr.bin/roff/common_source/n5.c line 298, 359-363(2), 424, 606
- in /usr/src/usr.bin/roff/common_source/n7.c line 364, 462, 731

setrpt defined in line 964; used 1 times

- in line 506

sumhp defined in line 697; used 4 times

- in line 653, 689
- in /usr/src/usr.bin/roff/common_source/n4.c line 429
- in /usr/src/usr.bin/roff/common_source/n9.c line 254

#### Defined variables

acctf defined in line 147; used 4 times

- in line 335
- in /usr/src/usr.bin/roff/common_source/n2.c line 301-305(3)

ifilt defined in line 707; used 1 times

- in line 747

inchar defined in line 28; used 17 times

- in line 28, 387, 681, 688-690(3), 703, 833
- in /usr/src/usr.bin/roff/common_source/n5.c line 505, 552, 575
- in /usr/src/usr.bin/roff/nroff/n6.c line 154-156(2), 179
- in /usr/src/usr.bin/roff/troff/t6.c line 379-381(2), 408

ioff defined in line 136; used 9 times

- in line 388, 746, 789, 795, 803, 813-818(2), 891-892(2)

ipl defined in line 134; used 2 times

- in line 804, 893

ms defined in line 145; never used
offl defined in line 135; used 2 times

- in line 803, 891

pinchar defined in line 28; used 21 times

- in line 387, 681, 688-692(3), 703, 833
- in /usr/src/usr.bin/roff/common_source/n4.c line 94
- in /usr/src/usr.bin/roff/common_source/n5.c line 505, 552, 575
- in /usr/src/usr.bin/roff/nroff/n6.c line 153-156(3), 178-179(2)
- in /usr/src/usr.bin/roff/troff/t6.c line 378-381(3), 407-408(2)

sccsid defined in line 2; never used
stopmesg defined in line 133; used 3 times

- in line 190
- in /usr/src/usr.bin/roff/common_source/n2.c line 266
- in /usr/src/usr.bin/roff/troff/t10.c line 310

ttyp defined in line 137; used 8 times

- in line 369-372(4), 425-432(4)

#### Defined struct's

contab defined in line 138; never used

Last modified: 1987-07-21 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 3936 |