148302Sbostic /*-
248302Sbostic * Copyright (c) 1991 The Regents of the University of California.
348302Sbostic * All rights reserved.
448302Sbostic *
548302Sbostic * %sccs.include.proprietary.c%
648302Sbostic */
748302Sbostic
87069Srrh #ifndef lint
9*48929Sbostic static char sccsid[] = "@(#)n5.c 4.4 (Berkeley) 05/02/91";
1048302Sbostic #endif /* not lint */
117069Srrh
127069Srrh #include "tdef.h"
137069Srrh #include <sgtty.h>
147069Srrh extern
157069Srrh #include "d.h"
167069Srrh extern
177069Srrh #include "v.h"
187069Srrh #include "sdef.h"
197069Srrh
207069Srrh /*
217069Srrh troff5.c
227069Srrh
237069Srrh misc processing requests
247069Srrh */
257069Srrh
267069Srrh extern int inchar[LNSIZE], *pinchar; /* XXX */
277069Srrh extern struct s *frame;
287069Srrh extern struct s *litlev;
297069Srrh extern filep ip;
307069Srrh extern filep offset;
317069Srrh
327069Srrh extern int ascii;
337069Srrh extern int nonumb;
347069Srrh extern int admod;
357069Srrh extern int ad;
367069Srrh extern int fi;
377069Srrh extern int cc;
387069Srrh extern int c2;
397069Srrh extern int ohc;
407069Srrh extern int tabc;
417069Srrh extern int dotc;
427069Srrh extern int pendnf;
437069Srrh extern int hyf;
447069Srrh extern int ce;
457069Srrh extern int po;
467069Srrh extern int po1;
477069Srrh extern int nc;
487069Srrh extern int in;
497069Srrh extern int un;
507069Srrh extern int un1;
517069Srrh extern int in1;
527069Srrh extern int ll;
537069Srrh extern int ll1;
547069Srrh extern int lt;
557069Srrh extern int lt1;
56*48929Sbostic extern int nlistx[NTRAP];
577069Srrh extern int mlist[NTRAP];
587069Srrh extern int lgf;
597069Srrh extern int pl;
607069Srrh extern int npn;
617069Srrh extern int npnflg;
627069Srrh extern int copyf;
637069Srrh extern char nextf[];
647069Srrh extern int trap;
657069Srrh extern int lss;
667069Srrh extern int em;
677069Srrh extern int evlist[EVLSZ];
687069Srrh extern int evi;
697069Srrh extern int ibf;
707069Srrh extern int ev;
717069Srrh extern int ch;
727069Srrh extern int nflush;
737069Srrh extern int tty;
747069Srrh extern struct sgttyb ttys;
757069Srrh extern int quiet;
767069Srrh extern int iflg;
777069Srrh extern int eschar;
787069Srrh extern int lit;
797069Srrh extern int ls;
807069Srrh extern int ls1;
817069Srrh extern int tabtab[];
827069Srrh extern char trtab[];
837069Srrh extern int ul;
847069Srrh extern int cu;
857069Srrh extern int sfont;
867069Srrh extern int font;
877069Srrh extern int fontlab[];
887069Srrh extern int it;
897069Srrh extern int itmac;
907069Srrh extern int noscale;
917069Srrh extern int ic;
927069Srrh extern int icf;
937069Srrh extern int ics;
947069Srrh extern int *vlist;
957069Srrh extern int sv;
967069Srrh extern int esc;
977069Srrh extern int nn;
987069Srrh extern int nms;
997069Srrh extern int ndf;
1007069Srrh extern int lnmod;
1017069Srrh extern int ni;
1027069Srrh extern int lnsize;
1037069Srrh extern int nb;
1047069Srrh extern int nlflg;
1057069Srrh extern int apts, apts1, pts, pts1, font, font1;
1067069Srrh extern int ulfont;
1077069Srrh extern int ulbit;
1087069Srrh extern int error;
1097069Srrh extern int nmbits;
1107069Srrh extern int chbits;
1117069Srrh extern int tdelim;
1127069Srrh extern int xxx;
1137069Srrh int iflist[NIF];
1147069Srrh int ifx;
1157069Srrh
casead()1167069Srrh casead(){
1177069Srrh register i;
1187069Srrh
1197069Srrh ad = 1;
1207069Srrh /*leave admod alone*/
1217069Srrh if(skip())return;
1227069Srrh switch(i = getch() & CMASK){
1237069Srrh case 'r': /*right adj, left ragged*/
1247069Srrh admod = 2;
1257069Srrh break;
1267069Srrh case 'l': /*left adj, right ragged*/
1277069Srrh admod = ad = 0; /*same as casena*/
1287069Srrh break;
1297069Srrh case 'c': /*centered adj*/
1307069Srrh admod = 1;
1317069Srrh break;
1327069Srrh case 'b': case 'n':
1337069Srrh admod = 0;
1347069Srrh break;
1357069Srrh case '0': case '2': case '4':
1367069Srrh ad = 0;
1377069Srrh case '1': case '3': case '5':
1387069Srrh admod = (i - '0')/2;
1397069Srrh }
1407069Srrh }
casena()1417069Srrh casena(){
1427069Srrh ad = 0;
1437069Srrh }
casefi()1447069Srrh casefi(){
1457069Srrh tbreak();
1467069Srrh fi++;
1477069Srrh pendnf = 0;
1487069Srrh lnsize = LNSIZE;
1497069Srrh }
casenf()1507069Srrh casenf(){
1517069Srrh tbreak();
1527069Srrh fi = 0;
1537069Srrh /* can't do while oline is only LNSIZE
1547069Srrh lnsize = LNSIZE + WDSIZE;
1557069Srrh */
1567069Srrh }
casers()1577069Srrh casers(){
1587069Srrh dip->nls = 0;
1597069Srrh }
casens()1607069Srrh casens(){
1617069Srrh dip->nls++;
1627069Srrh }
chget(c)1637069Srrh chget(c)
1647069Srrh int c;
1657069Srrh {
1667069Srrh register i;
1677069Srrh
1687069Srrh if(skip() ||
1697069Srrh ((i = getch()) & MOT) ||
1707069Srrh ((i&CMASK) == ' ') ||
1717069Srrh ((i&CMASK) == '\n')){
1727069Srrh ch = i;
1737069Srrh return(c);
1747069Srrh }else return(i & BMASK);
1757069Srrh }
casecc()1767069Srrh casecc(){
1777069Srrh cc = chget('.');
1787069Srrh }
casec2()1797069Srrh casec2(){
1807069Srrh c2 = chget('\'');
1817069Srrh }
casehc()1827069Srrh casehc(){
1837069Srrh ohc = chget(OHC);
1847069Srrh }
casetc()1857069Srrh casetc(){
1867069Srrh tabc = chget(0);
1877069Srrh }
caselc()1887069Srrh caselc(){
1897069Srrh dotc = chget(0);
1907069Srrh }
casehy()1917069Srrh casehy(){
1927069Srrh register i;
1937069Srrh
1947069Srrh hyf = 1;
1957069Srrh if(skip())return;
1967069Srrh noscale++;
1977069Srrh i = atoi();
1987069Srrh noscale = 0;
1997069Srrh if(nonumb)return;
2007069Srrh hyf = max(i,0);
2017069Srrh }
casenh()2027069Srrh casenh(){
2037069Srrh hyf = 0;
2047069Srrh }
max(aa,bb)2057069Srrh max(aa,bb)
2067069Srrh int aa,bb;
2077069Srrh {
2087069Srrh if(aa>bb)return(aa);
2097069Srrh else return(bb);
2107069Srrh }
casece()2117069Srrh casece(){
2127069Srrh register i;
2137069Srrh
2147069Srrh noscale++;
2157069Srrh skip();
2167069Srrh i = max(atoi(),0);
2177069Srrh if(nonumb)i = 1;
2187069Srrh tbreak();
2197069Srrh ce = i;
2207069Srrh noscale = 0;
2217069Srrh }
casein()2227069Srrh casein(){
2237069Srrh register i;
2247069Srrh
2257069Srrh if(skip())i = in1;
2267069Srrh else i = max(hnumb(&in),0);
2277069Srrh tbreak();
2287069Srrh in1 = in;
2297069Srrh in = i;
2307069Srrh if(!nc){
2317069Srrh un = in;
2327069Srrh setnel();
2337069Srrh }
2347069Srrh }
casell()2357069Srrh casell(){
2367069Srrh register i;
2377069Srrh
2387069Srrh if(skip())i = ll1;
2397069Srrh else i = max(hnumb(&ll),INCH/10);
2407069Srrh ll1 = ll;
2417069Srrh ll = i;
2427069Srrh setnel();
2437069Srrh }
caselt()2447069Srrh caselt(){
2457069Srrh register i;
2467069Srrh
2477069Srrh if(skip())i = lt1;
2487069Srrh else i = max(hnumb(<),0);
2497069Srrh lt1 = lt;
2507069Srrh lt = i;
2517069Srrh }
caseti()2527069Srrh caseti(){
2537069Srrh register i;
2547069Srrh
2557069Srrh if(skip())return;
2567069Srrh i = max(hnumb(&in),0);
2577069Srrh tbreak();
2587069Srrh un1 = i;
2597069Srrh setnel();
2607069Srrh }
casels()2617069Srrh casels(){
2627069Srrh register i;
2637069Srrh
2647069Srrh noscale++;
2657069Srrh if(skip())i = ls1;
2667069Srrh else i = max(inumb(&ls),1);
2677069Srrh ls1 = ls;
2687069Srrh ls = i;
2697069Srrh noscale = 0;
2707069Srrh }
casepo()2717069Srrh casepo(){
2727069Srrh register i;
2737069Srrh
2747069Srrh if(skip())i = po1;
2757069Srrh else i = max(hnumb(&po),0);
2767069Srrh po1 = po;
2777069Srrh po = i;
2787069Srrh #ifndef NROFF
2797069Srrh if(!ascii)esc += po - po1;
2807069Srrh #endif
2817069Srrh }
casepl()2827069Srrh casepl(){
2837069Srrh register i;
2847069Srrh
2857069Srrh skip();
2867069Srrh if((i = vnumb(&pl)) == 0)pl = 11 * INCH; /*11in*/
2877069Srrh else pl = i;
2887069Srrh if(v.nl > pl)v.nl = pl;
2897069Srrh }
casewh()2907069Srrh casewh(){
2917069Srrh register i, j, k;
2927069Srrh
2937069Srrh lgf++;
2947069Srrh skip();
2957069Srrh i = vnumb((int *)0);
2967069Srrh if(nonumb)return;
2977069Srrh skip();
2987069Srrh j = getrq();
2997069Srrh if((k=findn(i)) != NTRAP){
3007069Srrh mlist[k] = j;
3017069Srrh return;
3027069Srrh }
3037069Srrh for(k=0; k<NTRAP; k++)if(mlist[k] == 0)break;
3047069Srrh if(k == NTRAP){
3057069Srrh prstrfl("Cannot plant trap.\n");
3067069Srrh return;
3077069Srrh }
3087069Srrh mlist[k] = j;
309*48929Sbostic nlistx[k] = i;
3107069Srrh }
casech()3117069Srrh casech(){
3127069Srrh register i, j, k;
3137069Srrh
3147069Srrh lgf++;
3157069Srrh skip();
3167069Srrh if(!(j=getrq()))return;
3177069Srrh else for(k=0; k<NTRAP; k++)if(mlist[k] == j)break;
3187069Srrh if(k == NTRAP)return;
3197069Srrh skip();
3207069Srrh i = vnumb((int *)0);
3217069Srrh if(nonumb)mlist[k] = 0;
322*48929Sbostic nlistx[k] = i;
3237069Srrh }
findn(i)3247069Srrh findn(i)
3257069Srrh int i;
3267069Srrh {
3277069Srrh register k;
3287069Srrh
3297069Srrh for(k=0; k<NTRAP; k++)
330*48929Sbostic if((nlistx[k] == i) && (mlist[k] != 0))break;
3317069Srrh return(k);
3327069Srrh }
casepn()3337069Srrh casepn(){
3347069Srrh register i;
3357069Srrh
3367069Srrh skip();
3377069Srrh noscale++;
3387069Srrh i = max(inumb(&v.pn),0);
3397069Srrh noscale = 0;
3407069Srrh if(!nonumb){
3417069Srrh npn = i;
3427069Srrh npnflg++;
3437069Srrh }
3447069Srrh }
casebp()3457069Srrh casebp(){
3467069Srrh register i;
3477069Srrh register struct s *savframe;
3487069Srrh
3497069Srrh if(dip != d)return;
3507069Srrh savframe = frame;
3517069Srrh skip();
3527069Srrh if((i = inumb(&v.pn)) < 0)i = 0;
3537069Srrh tbreak();
3547069Srrh if(!nonumb){
3557069Srrh npn = i;
3567069Srrh npnflg++;
3577069Srrh }else if(dip->nls)return;
3587069Srrh eject(savframe);
3597069Srrh }
casetm(x)3607069Srrh casetm(x) int x;{
3617069Srrh register i;
3627069Srrh char tmbuf[NTM];
3637069Srrh
3647069Srrh lgf++;
3657069Srrh copyf++;
3667069Srrh if(skip() && x)prstrfl("User Abort.");
3677069Srrh for(i=0; i<NTM-2;)if((tmbuf[i++]=getch()) == '\n')break;
3687069Srrh if(i == NTM-2)tmbuf[i++] = '\n';
3697069Srrh tmbuf[i] = 0;
3707069Srrh prstrfl(tmbuf);
3717069Srrh copyf--;
3727069Srrh }
casesp(a)3737069Srrh casesp(a)
3747069Srrh int a;
3757069Srrh {
3767069Srrh register i, j, savlss;
3777069Srrh
3787069Srrh tbreak();
3797069Srrh if(dip->nls || trap)return;
3807069Srrh i = findt1();
3817069Srrh if(!a){
3827069Srrh skip();
3837069Srrh j = vnumb((int *)0);
3847069Srrh if(nonumb)j = lss;
3857069Srrh }else j = a;
3867069Srrh if(j == 0)return;
3877069Srrh if(i < j)j = i;
3887069Srrh savlss = lss;
3897069Srrh if(dip != d)i = dip->dnl; else i = v.nl;
3907069Srrh if((i + j) < 0)j = -i;
3917069Srrh lss = j;
3927069Srrh newline(0);
3937069Srrh lss = savlss;
3947069Srrh }
casert()3957069Srrh casert(){
3967069Srrh register a, *p;
3977069Srrh
3987069Srrh skip();
3997069Srrh if(dip != d)p = &dip->dnl; else p = &v.nl;
4007069Srrh a = vnumb(p);
4017069Srrh if(nonumb)a = dip->mkline;
4027069Srrh if((a < 0) || (a >= *p))return;
4037069Srrh nb++;
4047069Srrh casesp(a - *p);
4057069Srrh }
caseem()4067069Srrh caseem(){
4077069Srrh lgf++;
4087069Srrh skip();
4097069Srrh em = getrq();
4107069Srrh }
casefl()4117069Srrh casefl(){
4127069Srrh tbreak();
4137069Srrh flusho();
4147069Srrh }
caseev()4157069Srrh caseev(){
4167069Srrh register nxev;
4177069Srrh extern int block;
4187069Srrh
4197069Srrh if(skip()){
4207069Srrh e0:
4217069Srrh if(evi == 0)return;
4227069Srrh nxev = evlist[--evi];
4237069Srrh goto e1;
4247069Srrh }
4257069Srrh noscale++;
4267069Srrh nxev = atoi();
4277069Srrh noscale = 0;
4287069Srrh if(nonumb)goto e0;
4297069Srrh flushi();
4307069Srrh if((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)){
4317069Srrh prstrfl("Cannot do ev.\n");
4327069Srrh if(error)done2(040);else edone(040);
4337069Srrh return;
4347069Srrh }
4357069Srrh evlist[evi++] = ev;
4367069Srrh e1:
4377069Srrh if(ev == nxev)return;
4387069Srrh lseek(ibf, (long)(ev*EVS*sizeof(int)), 0);
4397069Srrh write(ibf,(char *)&block, EVS*sizeof(int));
4407069Srrh lseek(ibf, (long)(nxev*EVS*sizeof(int)), 0);
4417069Srrh read(ibf,(char *)&block, EVS*sizeof(int));
4427069Srrh ev = nxev;
4437069Srrh }
caseel()4447069Srrh caseel(){
4457069Srrh if(--ifx < 0){
4467069Srrh ifx = 0;
4477069Srrh iflist[0] = 0;
4487069Srrh }
4497069Srrh caseif(2);
4507069Srrh }
caseie()4517069Srrh caseie(){
4527069Srrh if(ifx >= NIF){
4537069Srrh prstr("if-else overflow.\n");
4547069Srrh ifx = 0;
4557069Srrh edone(040);
4567069Srrh }
4577069Srrh caseif(1);
4587069Srrh ifx++;
4597069Srrh }
caseif(x)4607069Srrh caseif(x)
4617069Srrh int x;
4627069Srrh {
4637069Srrh register i, notflag, true;
4647069Srrh
4657069Srrh if(x == 2){
4667069Srrh notflag = 0;
4677069Srrh true = iflist[ifx];
4687069Srrh goto i1;
4697069Srrh }
4707069Srrh true = 0;
4717069Srrh skip();
4727069Srrh if(((i = getch()) & CMASK) == '!'){
4737069Srrh notflag = 1;
4747069Srrh }else{
4757069Srrh notflag = 0;
4767069Srrh ch = i;
4777069Srrh }
4787069Srrh i = atoi();
4797069Srrh if(!nonumb){
4807069Srrh if(i > 0)true++;
4817069Srrh goto i1;
4827069Srrh }
4837069Srrh switch((i = getch()) & CMASK){
4847069Srrh case 'e':
4857069Srrh if(!(v.pn & 01))true++;
4867069Srrh break;
4877069Srrh case 'o':
4887069Srrh if(v.pn & 01)true++;
4897069Srrh break;
4907069Srrh #ifdef NROFF
4917069Srrh case 'n':
4927069Srrh true++;
4937069Srrh case 't':
4947069Srrh #endif
4957069Srrh #ifndef NROFF
4967069Srrh case 't':
4977069Srrh true++;
4987069Srrh case 'n':
4997069Srrh #endif
5007069Srrh case ' ':
5017069Srrh break;
5027069Srrh default:
5037069Srrh true = cmpstr(i);
5047069Srrh }
5057069Srrh i1:
5067069Srrh true ^= notflag;
5077069Srrh if(x == 1)iflist[ifx] = !true;
5087069Srrh if(true){
5097069Srrh i2:
5107069Srrh do{
5117069Srrh v.hp = 0;
5127069Srrh pinchar = inchar; /* XXX */
5137069Srrh }
5147069Srrh while(((i = getch()) & CMASK) == ' ');
5157069Srrh if((i & CMASK) == LEFT)goto i2;
5167069Srrh ch = i;
5177069Srrh nflush++;
5187069Srrh }else{
5197069Srrh copyf++;
5207069Srrh if(eat(LEFT) == LEFT){
5217069Srrh while(eatblk(RIGHT,LEFT) != RIGHT)nlflg = 0;
5227069Srrh }
5237069Srrh copyf--;
5247069Srrh }
5257069Srrh }
eatblk(right,left)5267069Srrh eatblk(right,left)
5277069Srrh int right,left;
5287069Srrh {
5297069Srrh register i;
5307069Srrh
5317069Srrh e0:
5327069Srrh while(((i = getch() & CMASK) != right) &&
5337069Srrh (i != left) &&
5347069Srrh (i != '\n'));
5357069Srrh if(i == left){
5367069Srrh while((i=eatblk(right,left)) != right)nlflg = 0;
5377069Srrh goto e0;
5387069Srrh }
5397069Srrh return(i);
5407069Srrh }
cmpstr(delim)5417069Srrh cmpstr(delim)
5427069Srrh int delim;
5437069Srrh {
5447069Srrh register i, j;
5457069Srrh register filep p;
5467069Srrh extern filep alloc();
5477069Srrh extern filep incoff();
5487069Srrh filep begin;
5497069Srrh int cnt, k;
5507069Srrh int savapts, savapts1, savfont, savfont1,
5517069Srrh savpts, savpts1;
5527069Srrh
5537069Srrh if(delim & MOT)return(0);
5547069Srrh delim &= CMASK;
5557069Srrh if(dip != d)wbfl();
5567069Srrh if((offset = begin = alloc()) == (filep)0)return(0);
5577069Srrh cnt = 0;
5587069Srrh v.hp = 0;
5597069Srrh pinchar = inchar; /* XXX */
5607069Srrh savapts = apts;
5617069Srrh savapts1 = apts1;
5627069Srrh savfont = font;
5637069Srrh savfont1 = font1;
5647069Srrh savpts = pts;
5657069Srrh savpts1 = pts1;
5667069Srrh while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
5677069Srrh wbf(i);
5687069Srrh cnt++;
5697069Srrh }
5707069Srrh wbt(0);
5717069Srrh k = !cnt;
5727069Srrh if(nlflg)goto rtn;
5737069Srrh p = begin;
5747069Srrh apts = savapts;
5757069Srrh apts1 = savapts1;
5767069Srrh font = savfont;
5777069Srrh font1 = savfont1;
5787069Srrh pts = savpts;
5797069Srrh pts1 = savpts1;
5807069Srrh mchbits();
5817069Srrh v.hp = 0;
5827069Srrh pinchar = inchar; /* XXX */
5837069Srrh while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
5847069Srrh if(rbf0(p) != i){
5857069Srrh eat(delim);
5867069Srrh k = 0;
5877069Srrh break;
5887069Srrh }
5897069Srrh p = incoff(p);
5907069Srrh k = !(--cnt);
5917069Srrh }
5927069Srrh rtn:
5937069Srrh apts = savapts;
5947069Srrh apts1 = savapts1;
5957069Srrh font = savfont;
5967069Srrh font1 = savfont1;
5977069Srrh pts = savpts;
5987069Srrh pts1 = savpts1;
5997069Srrh mchbits();
6007069Srrh offset = dip->op;
6017069Srrh ffree(begin);
6027069Srrh return(k);
6037069Srrh }
caserd()6047069Srrh caserd(){
6057069Srrh
6067069Srrh lgf++;
6077069Srrh skip();
6087069Srrh getname();
6097069Srrh if(!iflg){
6107069Srrh if(quiet){
6117069Srrh ttys.sg_flags &= ~ECHO;
6127069Srrh stty(0, &ttys);
6137069Srrh prstrfl(""); /*bell*/
6147069Srrh }else{
6157069Srrh if(nextf[0]){
6167069Srrh prstr(nextf);
6177069Srrh prstr(":");
6187069Srrh }else{
6197069Srrh prstr(""); /*bell*/
6207069Srrh }
6217069Srrh }
6227069Srrh }
6237069Srrh collect();
6247069Srrh tty++;
6257069Srrh pushi((filep)-1);
6267069Srrh }
rdtty()6277069Srrh rdtty(){
6287069Srrh char onechar;
6297069Srrh
6307069Srrh onechar = 0;
6317069Srrh if(read(0, &onechar, 1) == 1){
6327069Srrh if(onechar == '\n')tty++;
6337069Srrh else tty = 1;
6347069Srrh if(tty != 3)return(onechar);
6357069Srrh }
6367069Srrh popi();
6377069Srrh tty = 0;
6387069Srrh if(quiet){
6397069Srrh ttys.sg_flags |= ECHO;
6407069Srrh stty(0, &ttys);
6417069Srrh }
6427069Srrh return(0);
6437069Srrh }
caseec()6447069Srrh caseec(){
6457069Srrh eschar = chget('\\');
6467069Srrh }
caseeo()6477069Srrh caseeo(){
6487069Srrh eschar = 0;
6497069Srrh }
caseli()6507069Srrh caseli(){
6517069Srrh
6527069Srrh skip();
6537069Srrh lit = max(inumb((int *)0),1);
6547069Srrh litlev = frame;
6557069Srrh if((dip == d) && (v.nl == -1))newline(1);
6567069Srrh }
caseta()6577069Srrh caseta(){
6587069Srrh register i;
6597069Srrh
6607069Srrh tabtab[0] = nonumb = 0;
6617069Srrh for(i=0; ((i < (NTAB-1)) && !nonumb); i++){
6627069Srrh if(skip())break;
66313479Ssam tabtab[i] = tabtab[max(i-1,0)] & TMASK;
66413479Ssam tabtab[i] = max(hnumb(&tabtab[i]),0) & TMASK;
6657069Srrh if(!nonumb) switch(ch & CMASK){
6667069Srrh case 'C':
6677069Srrh tabtab[i] |= CTAB;
6687069Srrh break;
6697069Srrh case 'R':
6707069Srrh tabtab[i] |= RTAB;
6717069Srrh break;
6727069Srrh default: /*includes L*/
6737069Srrh break;
6747069Srrh }
6757069Srrh nonumb = ch = 0;
6767069Srrh }
6777069Srrh tabtab[i] = 0;
6787069Srrh }
casene()6797069Srrh casene(){
6807069Srrh register i, j;
6817069Srrh
6827069Srrh skip();
6837069Srrh i = vnumb((int *)0);
6847069Srrh if(nonumb)i = lss;
6857069Srrh if(i > (j = findt1())){
6867069Srrh i = lss;
6877069Srrh lss = j;
6887069Srrh dip->nls = 0;
6897069Srrh newline(0);
6907069Srrh lss = i;
6917069Srrh }
6927069Srrh }
casetr()6937069Srrh casetr(){
6947069Srrh register i, j;
6957069Srrh
6967069Srrh lgf++;
6977069Srrh skip();
6987069Srrh while((i = getch() & CMASK) != '\n'){
6997069Srrh if((i & MOT) || ((j = getch()) & MOT))return;
7007069Srrh if((j &= CMASK) == '\n')j = ' ';
7017069Srrh trtab[i] = j;
7027069Srrh }
7037069Srrh }
casecu()7047069Srrh casecu(){
7057069Srrh cu++;
7067069Srrh caseul();
7077069Srrh }
caseul()7087069Srrh caseul(){
7097069Srrh register i;
7107069Srrh
7117069Srrh noscale++;
7127069Srrh if(skip())i = 1;
7137069Srrh else i = atoi();
7147069Srrh if(ul && (i == 0)){
7157069Srrh font = sfont;
7167069Srrh ul = cu = 0;
7177069Srrh }
7187069Srrh if(i){
7197069Srrh if(!ul){
7207069Srrh sfont = font;
7217069Srrh font = ulfont;
7227069Srrh }
7237069Srrh ul = i;
7247069Srrh }
7257069Srrh noscale = 0;
7267069Srrh mchbits();
7277069Srrh }
caseuf()7287069Srrh caseuf(){
7297069Srrh register i, j;
7307069Srrh
7317069Srrh if(skip() || !(i = getrq()) || (i == 'S') ||
7327069Srrh ((j = find(i,fontlab)) == -1))
7337069Srrh ulfont = 1; /*default position 2*/
7347069Srrh else ulfont = j;
7357069Srrh #ifdef NROFF
7367069Srrh if(ulfont == 0)ulfont = 1;
7377069Srrh #endif
7387069Srrh ulbit = ulfont<<9;
7397069Srrh }
caseit()7407069Srrh caseit(){
7417069Srrh register i;
7427069Srrh
7437069Srrh lgf++;
7447069Srrh it = itmac = 0;
7457069Srrh noscale++;
7467069Srrh skip();
7477069Srrh i = atoi();
7487069Srrh skip();
7497069Srrh if(!nonumb && (itmac = getrq()))it = i;
7507069Srrh noscale = 0;
7517069Srrh }
casemc()7527069Srrh casemc(){
7537069Srrh register i;
7547069Srrh
7557069Srrh if(icf > 1)ic = 0;
7567069Srrh icf = 0;
7577069Srrh if(skip())return;
7587069Srrh ic = getch();
7597069Srrh icf = 1;
7607069Srrh skip();
7617069Srrh i = max(hnumb((int *)0),0);
7627069Srrh if(!nonumb)ics = i;
7637069Srrh }
casemk()7647069Srrh casemk(){
7657069Srrh register i, j;
7667069Srrh
7677069Srrh if(dip != d)j = dip->dnl; else j = v.nl;
7687069Srrh if(skip()){
7697069Srrh dip->mkline = j;
7707069Srrh return;
7717069Srrh }
7727069Srrh if((i = getrq()) == 0)return;
7737069Srrh vlist[findr(i)] = j;
7747069Srrh }
casesv()7757069Srrh casesv(){
7767069Srrh register i;
7777069Srrh
7787069Srrh skip();
7797069Srrh if((i = vnumb((int *)0)) < 0)return;
7807069Srrh if(nonumb)i = 1;
7817069Srrh sv += i;
7827069Srrh caseos();
7837069Srrh }
caseos()7847069Srrh caseos(){
7857069Srrh register savlss;
7867069Srrh
7877069Srrh if(sv <= findt1()){
7887069Srrh savlss = lss;
7897069Srrh lss = sv;
7907069Srrh newline(0);
7917069Srrh lss = savlss;
7927069Srrh sv = 0;
7937069Srrh }
7947069Srrh }
casenm()7957069Srrh casenm(){
7967069Srrh register i;
7977069Srrh
7987069Srrh lnmod = nn = 0;
7997069Srrh if(skip())return;
8007069Srrh lnmod++;
8017069Srrh noscale++;
8027069Srrh i = inumb(&v.ln);
8037069Srrh if(!nonumb)v.ln = max(i,0);
8047069Srrh getnm(&ndf,1);
8057069Srrh getnm(&nms,0);
8067069Srrh getnm(&ni,0);
8077069Srrh noscale = 0;
8087069Srrh nmbits = chbits;
8097069Srrh }
getnm(p,min)8107069Srrh getnm(p,min)
8117069Srrh int *p, min;
8127069Srrh {
8137069Srrh register i;
8147069Srrh
8157069Srrh eat(' ');
8167069Srrh if(skip())return;
8177069Srrh i = atoi();
8187069Srrh if(nonumb)return;
8197069Srrh *p = max(i,min);
8207069Srrh }
casenn()8217069Srrh casenn(){
8227069Srrh noscale++;
8237069Srrh skip();
8247069Srrh nn = max(atoi(),1);
8257069Srrh noscale = 0;
8267069Srrh }
caseab()8277069Srrh caseab(){
8287069Srrh dummy();
8297069Srrh casetm(1);
8307069Srrh done2(0);
8317069Srrh }
832