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