18861e462Sjaap #ifndef lint
2*cbcd6dcaSkarels /*
332a10137Sjaap static char sccsid[] = "@(#)n5.c	2.2 (CWI) 87/03/31";
4*cbcd6dcaSkarels */
5*cbcd6dcaSkarels static char sccsid[] = "@(#)n5.c	2.3 (Berkeley) 11/03/90";
68861e462Sjaap #endif lint
78861e462Sjaap #include "tdef.h"
88861e462Sjaap #include <sgtty.h>
96f545661Sjaap #include "ext.h"
108861e462Sjaap 
118861e462Sjaap /*
126f545661Sjaap  * troff5.c
136f545661Sjaap  *
146f545661Sjaap  * misc processing requests
158861e462Sjaap  */
168861e462Sjaap 
178861e462Sjaap int	iflist[NIF];
188861e462Sjaap int	ifx;
198861e462Sjaap 
casead()208861e462Sjaap casead()
218861e462Sjaap {
228861e462Sjaap 	register i;
238861e462Sjaap 
248861e462Sjaap 	ad = 1;
258861e462Sjaap 	/*leave admod alone*/
268861e462Sjaap 	if (skip())
278861e462Sjaap 		return;
288861e462Sjaap 	switch (i = cbits(getch())) {
298861e462Sjaap 	case 'r':	/*right adj, left ragged*/
308861e462Sjaap 		admod = 2;
318861e462Sjaap 		break;
328861e462Sjaap 	case 'l':	/*left adj, right ragged*/
338861e462Sjaap 		admod = ad = 0;	/*same as casena*/
348861e462Sjaap 		break;
358861e462Sjaap 	case 'c':	/*centered adj*/
368861e462Sjaap 		admod = 1;
378861e462Sjaap 		break;
388861e462Sjaap 	case 'b':
398861e462Sjaap 	case 'n':
408861e462Sjaap 		admod = 0;
418861e462Sjaap 		break;
428861e462Sjaap 	case '0':
438861e462Sjaap 	case '2':
448861e462Sjaap 	case '4':
458861e462Sjaap 		ad = 0;
468861e462Sjaap 	case '1':
478861e462Sjaap 	case '3':
488861e462Sjaap 	case '5':
498861e462Sjaap 		admod = (i - '0') / 2;
508861e462Sjaap 	}
518861e462Sjaap }
528861e462Sjaap 
538861e462Sjaap 
casena()548861e462Sjaap casena()
558861e462Sjaap {
568861e462Sjaap 	ad = 0;
578861e462Sjaap }
588861e462Sjaap 
598861e462Sjaap 
casefi()608861e462Sjaap casefi()
618861e462Sjaap {
628861e462Sjaap 	tbreak();
638861e462Sjaap 	fi++;
648861e462Sjaap 	pendnf = 0;
658861e462Sjaap 	lnsize = LNSIZE;
668861e462Sjaap }
678861e462Sjaap 
688861e462Sjaap 
casenf()698861e462Sjaap casenf()
708861e462Sjaap {
718861e462Sjaap 	tbreak();
728861e462Sjaap 	fi = 0;
738861e462Sjaap }
748861e462Sjaap 
758861e462Sjaap 
casers()768861e462Sjaap casers()
778861e462Sjaap {
788861e462Sjaap 	dip->nls = 0;
798861e462Sjaap }
808861e462Sjaap 
818861e462Sjaap 
casens()828861e462Sjaap casens()
838861e462Sjaap {
848861e462Sjaap 	dip->nls++;
858861e462Sjaap }
868861e462Sjaap 
878861e462Sjaap 
chget(c)888861e462Sjaap chget(c)
898861e462Sjaap int	c;
908861e462Sjaap {
918861e462Sjaap 	tchar i;
928861e462Sjaap 
938861e462Sjaap 	if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') {
948861e462Sjaap 		ch = i;
958861e462Sjaap 		return(c);
968861e462Sjaap 	} else
976f545661Sjaap 		return(i & BYTEMASK);
988861e462Sjaap }
998861e462Sjaap 
1008861e462Sjaap 
casecc()1018861e462Sjaap casecc()
1028861e462Sjaap {
1038861e462Sjaap 	cc = chget('.');
1048861e462Sjaap }
1058861e462Sjaap 
1068861e462Sjaap 
casec2()1078861e462Sjaap casec2()
1088861e462Sjaap {
1098861e462Sjaap 	c2 = chget('\'');
1108861e462Sjaap }
1118861e462Sjaap 
1128861e462Sjaap 
casehc()1138861e462Sjaap casehc()
1148861e462Sjaap {
1158861e462Sjaap 	ohc = chget(OHC);
1168861e462Sjaap }
1178861e462Sjaap 
1188861e462Sjaap 
casetc()1198861e462Sjaap casetc()
1208861e462Sjaap {
1218861e462Sjaap 	tabc = chget(0);
1228861e462Sjaap }
1238861e462Sjaap 
1248861e462Sjaap 
caselc()1258861e462Sjaap caselc()
1268861e462Sjaap {
1278861e462Sjaap 	dotc = chget(0);
1288861e462Sjaap }
1298861e462Sjaap 
1308861e462Sjaap 
casehy()1318861e462Sjaap casehy()
1328861e462Sjaap {
1338861e462Sjaap 	register i;
1348861e462Sjaap 
1358861e462Sjaap 	hyf = 1;
1368861e462Sjaap 	if (skip())
1378861e462Sjaap 		return;
1388861e462Sjaap 	noscale++;
1398861e462Sjaap 	i = atoi();
1408861e462Sjaap 	noscale = 0;
1418861e462Sjaap 	if (nonumb)
1428861e462Sjaap 		return;
1438861e462Sjaap 	hyf = max(i, 0);
1448861e462Sjaap }
1458861e462Sjaap 
1468861e462Sjaap 
casenh()1478861e462Sjaap casenh()
1488861e462Sjaap {
1498861e462Sjaap 	hyf = 0;
1508861e462Sjaap }
1518861e462Sjaap 
1528861e462Sjaap 
max(aa,bb)1538861e462Sjaap max(aa, bb)
1548861e462Sjaap int	aa, bb;
1558861e462Sjaap {
1568861e462Sjaap 	if (aa > bb)
1578861e462Sjaap 		return(aa);
1588861e462Sjaap 	else
1598861e462Sjaap 		return(bb);
1608861e462Sjaap }
1618861e462Sjaap 
1628861e462Sjaap 
casece()1638861e462Sjaap casece()
1648861e462Sjaap {
1658861e462Sjaap 	register i;
1668861e462Sjaap 
1678861e462Sjaap 	noscale++;
1688861e462Sjaap 	skip();
1698861e462Sjaap 	i = max(atoi(), 0);
1708861e462Sjaap 	if (nonumb)
1718861e462Sjaap 		i = 1;
1728861e462Sjaap 	tbreak();
1738861e462Sjaap 	ce = i;
1748861e462Sjaap 	noscale = 0;
1758861e462Sjaap }
1768861e462Sjaap 
1778861e462Sjaap 
casein()1788861e462Sjaap casein()
1798861e462Sjaap {
1808861e462Sjaap 	register i;
1818861e462Sjaap 
1828861e462Sjaap 	if (skip())
1838861e462Sjaap 		i = in1;
1848861e462Sjaap 	else
1858861e462Sjaap 		i = max(hnumb(&in), 0);
1868861e462Sjaap 	tbreak();
1878861e462Sjaap 	in1 = in;
1888861e462Sjaap 	in = i;
1898861e462Sjaap 	if (!nc) {
1908861e462Sjaap 		un = in;
1918861e462Sjaap 		setnel();
1928861e462Sjaap 	}
1938861e462Sjaap }
1948861e462Sjaap 
1958861e462Sjaap 
casell()1968861e462Sjaap casell()
1978861e462Sjaap {
1988861e462Sjaap 	register i;
1998861e462Sjaap 
2008861e462Sjaap 	if (skip())
2018861e462Sjaap 		i = ll1;
2028861e462Sjaap 	else
2038861e462Sjaap 		i = max(hnumb(&ll), INCH / 10);
2048861e462Sjaap 	ll1 = ll;
2058861e462Sjaap 	ll = i;
2068861e462Sjaap 	setnel();
2078861e462Sjaap }
2088861e462Sjaap 
2098861e462Sjaap 
caselt()2108861e462Sjaap caselt()
2118861e462Sjaap {
2128861e462Sjaap 	register i;
2138861e462Sjaap 
2148861e462Sjaap 	if (skip())
2158861e462Sjaap 		i = lt1;
2168861e462Sjaap 	else
2178861e462Sjaap 		i = max(hnumb(&lt), 0);
2188861e462Sjaap 	lt1 = lt;
2198861e462Sjaap 	lt = i;
2208861e462Sjaap }
2218861e462Sjaap 
2228861e462Sjaap 
caseti()2238861e462Sjaap caseti()
2248861e462Sjaap {
2258861e462Sjaap 	register i;
2268861e462Sjaap 
2278861e462Sjaap 	if (skip())
2288861e462Sjaap 		return;
2298861e462Sjaap 	i = max(hnumb(&in), 0);
2308861e462Sjaap 	tbreak();
2318861e462Sjaap 	un1 = i;
2328861e462Sjaap 	setnel();
2338861e462Sjaap }
2348861e462Sjaap 
2358861e462Sjaap 
casels()2368861e462Sjaap casels()
2378861e462Sjaap {
2388861e462Sjaap 	register i;
2398861e462Sjaap 
2408861e462Sjaap 	noscale++;
2418861e462Sjaap 	if (skip())
2428861e462Sjaap 		i = ls1;
2438861e462Sjaap 	else
2448861e462Sjaap 		i = max(inumb(&ls), 1);
2458861e462Sjaap 	ls1 = ls;
2468861e462Sjaap 	ls = i;
2478861e462Sjaap 	noscale = 0;
2488861e462Sjaap }
2498861e462Sjaap 
2508861e462Sjaap 
casepo()2518861e462Sjaap casepo()
2528861e462Sjaap {
2538861e462Sjaap 	register i;
2548861e462Sjaap 
2558861e462Sjaap 	if (skip())
2568861e462Sjaap 		i = po1;
2578861e462Sjaap 	else
2588861e462Sjaap 		i = max(hnumb(&po), 0);
2598861e462Sjaap 	po1 = po;
2608861e462Sjaap 	po = i;
2618861e462Sjaap #ifndef NROFF
2628861e462Sjaap 	if (!ascii)
2638861e462Sjaap 		esc += po - po1;
2648861e462Sjaap #endif
2658861e462Sjaap }
2668861e462Sjaap 
2678861e462Sjaap 
casepl()2688861e462Sjaap casepl()
2698861e462Sjaap {
2708861e462Sjaap 	register i;
2718861e462Sjaap 
2728861e462Sjaap 	skip();
2738861e462Sjaap 	if ((i = vnumb(&pl)) == 0)
2748861e462Sjaap 		pl = 11 * INCH; /*11in*/
2758861e462Sjaap 	else
2768861e462Sjaap 		pl = i;
2776f545661Sjaap 	if (numtab[NL].val > pl)
2786f545661Sjaap 		numtab[NL].val = pl;
2798861e462Sjaap }
2808861e462Sjaap 
2818861e462Sjaap 
casewh()2828861e462Sjaap casewh()
2838861e462Sjaap {
2848861e462Sjaap 	register i, j, k;
2858861e462Sjaap 
2868861e462Sjaap 	lgf++;
2878861e462Sjaap 	skip();
2888861e462Sjaap 	i = vnumb((int *)0);
2898861e462Sjaap 	if (nonumb)
2908861e462Sjaap 		return;
2918861e462Sjaap 	skip();
2928861e462Sjaap 	j = getrq();
2938861e462Sjaap 	if ((k = findn(i)) != NTRAP) {
2948861e462Sjaap 		mlist[k] = j;
2958861e462Sjaap 		return;
2968861e462Sjaap 	}
2978861e462Sjaap 	for (k = 0; k < NTRAP; k++)
2988861e462Sjaap 		if (mlist[k] == 0)
2998861e462Sjaap 			break;
3008861e462Sjaap 	if (k == NTRAP) {
3018861e462Sjaap 		flusho();
3026f545661Sjaap 		errprint("cannot plant trap.");
3038861e462Sjaap 		return;
3048861e462Sjaap 	}
3058861e462Sjaap 	mlist[k] = j;
3068861e462Sjaap 	nlist[k] = i;
3078861e462Sjaap }
3088861e462Sjaap 
3098861e462Sjaap 
casech()3108861e462Sjaap casech()
3118861e462Sjaap {
3128861e462Sjaap 	register i, j, k;
3138861e462Sjaap 
3148861e462Sjaap 	lgf++;
3158861e462Sjaap 	skip();
3168861e462Sjaap 	if (!(j = getrq()))
3178861e462Sjaap 		return;
3188861e462Sjaap 	else
3198861e462Sjaap 		for (k = 0; k < NTRAP; k++)
3208861e462Sjaap 			if (mlist[k] == j)
3218861e462Sjaap 				break;
3228861e462Sjaap 	if (k == NTRAP)
3238861e462Sjaap 		return;
3248861e462Sjaap 	skip();
3258861e462Sjaap 	i = vnumb((int *)0);
3268861e462Sjaap 	if (nonumb)
3278861e462Sjaap 		mlist[k] = 0;
3288861e462Sjaap 	nlist[k] = i;
3298861e462Sjaap }
3308861e462Sjaap 
3318861e462Sjaap 
findn(i)3328861e462Sjaap findn(i)
3338861e462Sjaap int	i;
3348861e462Sjaap {
3358861e462Sjaap 	register k;
3368861e462Sjaap 
3378861e462Sjaap 	for (k = 0; k < NTRAP; k++)
3388861e462Sjaap 		if ((nlist[k] == i) && (mlist[k] != 0))
3398861e462Sjaap 			break;
3408861e462Sjaap 	return(k);
3418861e462Sjaap }
3428861e462Sjaap 
3438861e462Sjaap 
casepn()3448861e462Sjaap casepn()
3458861e462Sjaap {
3468861e462Sjaap 	register i;
3478861e462Sjaap 
3488861e462Sjaap 	skip();
3498861e462Sjaap 	noscale++;
3506f545661Sjaap 	i = max(inumb(&numtab[PN].val), 0);
3518861e462Sjaap 	noscale = 0;
3528861e462Sjaap 	if (!nonumb) {
3538861e462Sjaap 		npn = i;
3548861e462Sjaap 		npnflg++;
3558861e462Sjaap 	}
3568861e462Sjaap }
3578861e462Sjaap 
3588861e462Sjaap 
casebp()3598861e462Sjaap casebp()
3608861e462Sjaap {
3618861e462Sjaap 	register i;
3628861e462Sjaap 	register struct s *savframe;
3638861e462Sjaap 
3648861e462Sjaap 	if (dip != d)
3658861e462Sjaap 		return;
3668861e462Sjaap 	savframe = frame;
3678861e462Sjaap 	skip();
3686f545661Sjaap 	if ((i = inumb(&numtab[PN].val)) < 0)
3698861e462Sjaap 		i = 0;
3708861e462Sjaap 	tbreak();
3718861e462Sjaap 	if (!nonumb) {
3728861e462Sjaap 		npn = i;
3738861e462Sjaap 		npnflg++;
3748861e462Sjaap 	} else if (dip->nls)
3758861e462Sjaap 		return;
3768861e462Sjaap 	eject(savframe);
3778861e462Sjaap }
3788861e462Sjaap 
3798861e462Sjaap 
casetm(ab)3806f545661Sjaap casetm(ab)
3816f545661Sjaap 	int ab;
3828861e462Sjaap {
3838861e462Sjaap 	register i;
3848861e462Sjaap 	char	tmbuf[NTM];
3858861e462Sjaap 
3868861e462Sjaap 	lgf++;
3878861e462Sjaap 	copyf++;
3886f545661Sjaap 	skip();
3898861e462Sjaap 	for (i = 0; i < NTM - 2; )
3908861e462Sjaap 		if ((tmbuf[i++] = getch()) == '\n')
3918861e462Sjaap 			break;
3928861e462Sjaap 	if (i == NTM - 2)
3938861e462Sjaap 		tmbuf[i++] = '\n';
3948861e462Sjaap 	tmbuf[i] = 0;
3958861e462Sjaap 	flusho();
3966f545661Sjaap 	fdprintf(stderr, "%s", tmbuf);
3978861e462Sjaap 	copyf--;
3986f545661Sjaap 	lgf--;
3998861e462Sjaap }
4008861e462Sjaap 
4018861e462Sjaap 
casesp(a)4028861e462Sjaap casesp(a)
4038861e462Sjaap int	a;
4048861e462Sjaap {
4058861e462Sjaap 	register i, j, savlss;
4068861e462Sjaap 
4078861e462Sjaap 	tbreak();
4088861e462Sjaap 	if (dip->nls || trap)
4098861e462Sjaap 		return;
4108861e462Sjaap 	i = findt1();
4118861e462Sjaap 	if (!a) {
4128861e462Sjaap 		skip();
4138861e462Sjaap 		j = vnumb((int *)0);
4148861e462Sjaap 		if (nonumb)
4158861e462Sjaap 			j = lss;
4168861e462Sjaap 	} else
4178861e462Sjaap 		j = a;
4188861e462Sjaap 	if (j == 0)
4198861e462Sjaap 		return;
4208861e462Sjaap 	if (i < j)
4218861e462Sjaap 		j = i;
4228861e462Sjaap 	savlss = lss;
4238861e462Sjaap 	if (dip != d)
4248861e462Sjaap 		i = dip->dnl;
4258861e462Sjaap 	else
4266f545661Sjaap 		i = numtab[NL].val;
4278861e462Sjaap 	if ((i + j) < 0)
4288861e462Sjaap 		j = -i;
4298861e462Sjaap 	lss = j;
4308861e462Sjaap 	newline(0);
4318861e462Sjaap 	lss = savlss;
4328861e462Sjaap }
4338861e462Sjaap 
4348861e462Sjaap 
casert()4358861e462Sjaap casert()
4368861e462Sjaap {
4378861e462Sjaap 	register a, *p;
4388861e462Sjaap 
4398861e462Sjaap 	skip();
4408861e462Sjaap 	if (dip != d)
4418861e462Sjaap 		p = &dip->dnl;
4428861e462Sjaap 	else
4436f545661Sjaap 		p = &numtab[NL].val;
4448861e462Sjaap 	a = vnumb(p);
4458861e462Sjaap 	if (nonumb)
4468861e462Sjaap 		a = dip->mkline;
4478861e462Sjaap 	if ((a < 0) || (a >= *p))
4488861e462Sjaap 		return;
4498861e462Sjaap 	nb++;
4508861e462Sjaap 	casesp(a - *p);
4518861e462Sjaap }
4528861e462Sjaap 
4538861e462Sjaap 
caseem()4548861e462Sjaap caseem()
4558861e462Sjaap {
4568861e462Sjaap 	lgf++;
4578861e462Sjaap 	skip();
4588861e462Sjaap 	em = getrq();
4598861e462Sjaap }
4608861e462Sjaap 
4618861e462Sjaap 
casefl()4628861e462Sjaap casefl()
4638861e462Sjaap {
4648861e462Sjaap 	tbreak();
4658861e462Sjaap 	flusho();
4668861e462Sjaap }
4678861e462Sjaap 
4688861e462Sjaap 
caseev()4698861e462Sjaap caseev()
4708861e462Sjaap {
4718861e462Sjaap 	register nxev;
4728861e462Sjaap 
4738861e462Sjaap 	if (skip()) {
474*cbcd6dcaSkarels 		if (evi != 0) {
475*cbcd6dcaSkarels 			ev =  evlist[--evi];
476*cbcd6dcaSkarels 			env = &env_array[ev];
477*cbcd6dcaSkarels 		}
4788861e462Sjaap 		return;
4798861e462Sjaap 	}
4808861e462Sjaap 	noscale++;
4818861e462Sjaap 	nxev = atoi();
4828861e462Sjaap 	noscale = 0;
483*cbcd6dcaSkarels 	if (nonumb) {
484*cbcd6dcaSkarels 		if (evi != 0) {
485*cbcd6dcaSkarels 			ev =  evlist[--evi];
486*cbcd6dcaSkarels 			env = &env_array[ev];
487*cbcd6dcaSkarels 		}
488*cbcd6dcaSkarels 		return;
489*cbcd6dcaSkarels 	}
4908861e462Sjaap 	flushi();
4918861e462Sjaap 	if ((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)) {
4928861e462Sjaap 		flusho();
49332a10137Sjaap 		errprint("cannot do ev %d. (evi %d)", nxev, evi);
4948861e462Sjaap 		if (error)
4958861e462Sjaap 			done2(040);
4968861e462Sjaap 		else
4978861e462Sjaap 			edone(040);
4988861e462Sjaap 		return;
4998861e462Sjaap 	}
5008861e462Sjaap 	evlist[evi++] = ev;
5018861e462Sjaap 	ev = nxev;
502*cbcd6dcaSkarels 	env = &env_array[ev];
5038861e462Sjaap }
5048861e462Sjaap 
5058861e462Sjaap 
caseel()5068861e462Sjaap caseel()
5078861e462Sjaap {
5088861e462Sjaap 	if (--ifx < 0) {
5098861e462Sjaap 		ifx = 0;
5108861e462Sjaap 		iflist[0] = 0;
5118861e462Sjaap 	}
5128861e462Sjaap 	caseif(2);
5138861e462Sjaap }
5148861e462Sjaap 
5158861e462Sjaap 
caseie()5168861e462Sjaap caseie()
5178861e462Sjaap {
5188861e462Sjaap 	if (ifx >= NIF) {
5196f545661Sjaap 		errprint("if-else overflow.");
5208861e462Sjaap 		ifx = 0;
5218861e462Sjaap 		edone(040);
5228861e462Sjaap 	}
5238861e462Sjaap 	caseif(1);
5248861e462Sjaap 	ifx++;
5258861e462Sjaap }
5268861e462Sjaap 
5278861e462Sjaap 
caseif(x)5288861e462Sjaap caseif(x)
5298861e462Sjaap int	x;
5308861e462Sjaap {
5318861e462Sjaap 	extern int falsef;
5326f545661Sjaap 	register notflag, true;
5338861e462Sjaap 	tchar i;
5348861e462Sjaap 
5358861e462Sjaap 	if (x == 2) {
5368861e462Sjaap 		notflag = 0;
5378861e462Sjaap 		true = iflist[ifx];
5388861e462Sjaap 		goto i1;
5398861e462Sjaap 	}
5408861e462Sjaap 	true = 0;
5418861e462Sjaap 	skip();
5428861e462Sjaap 	if ((cbits(i = getch())) == '!') {
5438861e462Sjaap 		notflag = 1;
5448861e462Sjaap 	} else {
5458861e462Sjaap 		notflag = 0;
5468861e462Sjaap 		ch = i;
5478861e462Sjaap 	}
5488861e462Sjaap 	i = atoi();
5498861e462Sjaap 	if (!nonumb) {
5508861e462Sjaap 		if (i > 0)
5518861e462Sjaap 			true++;
5528861e462Sjaap 		goto i1;
5538861e462Sjaap 	}
5548861e462Sjaap 	i = getch();
5556f545661Sjaap 	switch (cbits(i)) {
5568861e462Sjaap 	case 'e':
5576f545661Sjaap 		if (!(numtab[PN].val & 01))
5588861e462Sjaap 			true++;
5598861e462Sjaap 		break;
5608861e462Sjaap 	case 'o':
5616f545661Sjaap 		if (numtab[PN].val & 01)
5628861e462Sjaap 			true++;
5638861e462Sjaap 		break;
5648861e462Sjaap #ifdef NROFF
5658861e462Sjaap 	case 'n':
5668861e462Sjaap 		true++;
5678861e462Sjaap 	case 't':
5688861e462Sjaap #endif
5698861e462Sjaap #ifndef NROFF
5708861e462Sjaap 	case 't':
5718861e462Sjaap 		true++;
5728861e462Sjaap 	case 'n':
5738861e462Sjaap #endif
5748861e462Sjaap 	case ' ':
5758861e462Sjaap 		break;
5768861e462Sjaap 	default:
5778861e462Sjaap 		true = cmpstr(i);
5788861e462Sjaap 	}
5798861e462Sjaap i1:
5808861e462Sjaap 	true ^= notflag;
5818861e462Sjaap 	if (x == 1)
5828861e462Sjaap 		iflist[ifx] = !true;
5838861e462Sjaap 	if (true) {
5848861e462Sjaap i2:
5856f545661Sjaap 		while ((cbits(i = getch())) == ' ')
5866f545661Sjaap 			;
5878861e462Sjaap 		if (cbits(i) == LEFT)
5888861e462Sjaap 			goto i2;
5898861e462Sjaap 		ch = i;
5908861e462Sjaap 		nflush++;
5918861e462Sjaap 	} else {
5928861e462Sjaap 		copyf++;
5938861e462Sjaap 		falsef++;
5946f545661Sjaap 		eatblk(0);
5958861e462Sjaap 		copyf--;
5968861e462Sjaap 		falsef--;
5978861e462Sjaap 	}
5988861e462Sjaap }
5998861e462Sjaap 
eatblk(inblk)6006f545661Sjaap eatblk(inblk)
6016f545661Sjaap int inblk;
6026f545661Sjaap {	register int cnt, i;
6038861e462Sjaap 
6046f545661Sjaap 	cnt = 0;
6056f545661Sjaap 	do {
6066f545661Sjaap 		if (ch)	{
6076f545661Sjaap 			i = cbits(ch);
6086f545661Sjaap 			ch = 0;
6096f545661Sjaap 		} else
6106f545661Sjaap 			i = cbits(getch0());
6116f545661Sjaap 		if (i == ESC)
6126f545661Sjaap 			cnt++;
6136f545661Sjaap 		else {
6146f545661Sjaap 			if (cnt == 1)
6156f545661Sjaap 				switch (i) {
6166f545661Sjaap 				case '{':  i = LEFT; break;
6176f545661Sjaap 				case '}':  i = RIGHT; break;
6186f545661Sjaap 				case '\n': i = 'x'; break;
6198861e462Sjaap 				}
6206f545661Sjaap 			cnt = 0;
6218861e462Sjaap 		}
6226f545661Sjaap 		if (i == LEFT) eatblk(1);
6236f545661Sjaap 	} while ((!inblk && (i != '\n')) || (inblk && (i != RIGHT)));
6246f545661Sjaap 	if (i == '\n')
6256f545661Sjaap 		nlflg++;
6268861e462Sjaap }
6278861e462Sjaap 
6288861e462Sjaap 
cmpstr(c)6298861e462Sjaap cmpstr(c)
6308861e462Sjaap tchar c;
6318861e462Sjaap {
6328861e462Sjaap 	register j, delim;
6336f545661Sjaap 	register tchar i;
6346f545661Sjaap 	register val;
6356f545661Sjaap 	int savapts, savapts1, savfont, savfont1, savpts, savpts1;
6366f545661Sjaap 	tchar string[1280];
6376f545661Sjaap 	register tchar *sp;
6388861e462Sjaap 
6398861e462Sjaap 	if (ismot(c))
6408861e462Sjaap 		return(0);
6418861e462Sjaap 	delim = cbits(c);
6428861e462Sjaap 	savapts = apts;
6438861e462Sjaap 	savapts1 = apts1;
6448861e462Sjaap 	savfont = font;
6458861e462Sjaap 	savfont1 = font1;
6468861e462Sjaap 	savpts = pts;
6478861e462Sjaap 	savpts1 = pts1;
6486f545661Sjaap 	sp = string;
6496f545661Sjaap 	while ((j = cbits(i = getch()))!=delim && j!='\n' && sp<&string[1280-1])
6506f545661Sjaap 		*sp++ = i;
6516f545661Sjaap 	if (sp >= string + 1280) {
6526f545661Sjaap 		errprint("too-long string compare.");
6536f545661Sjaap 		edone(0100);
6548861e462Sjaap 	}
6556f545661Sjaap 	if (nlflg) {
6566f545661Sjaap 		val = sp==string;
6578861e462Sjaap 		goto rtn;
6586f545661Sjaap 	}
6596f545661Sjaap 	*sp++ = 0;
6608861e462Sjaap 	apts = savapts;
6618861e462Sjaap 	apts1 = savapts1;
6628861e462Sjaap 	font = savfont;
6638861e462Sjaap 	font1 = savfont1;
6648861e462Sjaap 	pts = savpts;
6658861e462Sjaap 	pts1 = savpts1;
6668861e462Sjaap 	mchbits();
6676f545661Sjaap 	val = 1;
6686f545661Sjaap 	sp = string;
6698861e462Sjaap 	while ((j = cbits(i = getch())) != delim && j != '\n') {
6706f545661Sjaap 		if (*sp != i) {
6718861e462Sjaap 			eat(delim);
6726f545661Sjaap 			val = 0;
6736f545661Sjaap 			goto rtn;
6748861e462Sjaap 		}
6756f545661Sjaap 		sp++;
6768861e462Sjaap 	}
6776f545661Sjaap 	if (*sp)
6786f545661Sjaap 		val = 0;
6798861e462Sjaap rtn:
6808861e462Sjaap 	apts = savapts;
6818861e462Sjaap 	apts1 = savapts1;
6828861e462Sjaap 	font = savfont;
6838861e462Sjaap 	font1 = savfont1;
6848861e462Sjaap 	pts = savpts;
6858861e462Sjaap 	pts1 = savpts1;
6868861e462Sjaap 	mchbits();
6876f545661Sjaap 	return(val);
6888861e462Sjaap }
6898861e462Sjaap 
6908861e462Sjaap 
caserd()6918861e462Sjaap caserd()
6928861e462Sjaap {
6938861e462Sjaap 
6948861e462Sjaap 	lgf++;
6958861e462Sjaap 	skip();
6968861e462Sjaap 	getname();
6978861e462Sjaap 	if (!iflg) {
6988861e462Sjaap 		if (quiet) {
6998861e462Sjaap 			ttys.sg_flags &= ~ECHO;
7008861e462Sjaap 			stty(0, &ttys);
7018861e462Sjaap 			flusho();
7026f545661Sjaap 			fdprintf(stderr, "\007"); /*bell*/
7038861e462Sjaap 		} else {
7048861e462Sjaap 			if (nextf[0]) {
7056f545661Sjaap 				fdprintf(stderr, "%s:", nextf);
7068861e462Sjaap 			} else {
7076f545661Sjaap 				fdprintf(stderr, "\007"); /*bell*/
7088861e462Sjaap 			}
7098861e462Sjaap 		}
7108861e462Sjaap 	}
7118861e462Sjaap 	collect();
7128861e462Sjaap 	tty++;
7136f545661Sjaap 	pushi(NBLIST*BLK, PAIR('r','d'));
7148861e462Sjaap }
7158861e462Sjaap 
7168861e462Sjaap 
rdtty()7178861e462Sjaap rdtty()
7188861e462Sjaap {
7198861e462Sjaap 	char	onechar;
7208861e462Sjaap 
7218861e462Sjaap 	onechar = 0;
7228861e462Sjaap 	if (read(0, &onechar, 1) == 1) {
7238861e462Sjaap 		if (onechar == '\n')
7248861e462Sjaap 			tty++;
7258861e462Sjaap 		else
7268861e462Sjaap 			tty = 1;
7278861e462Sjaap 		if (tty != 3)
7288861e462Sjaap 			return(onechar);
7298861e462Sjaap 	}
7308861e462Sjaap 	popi();
7318861e462Sjaap 	tty = 0;
7328861e462Sjaap 	if (quiet) {
7338861e462Sjaap 		ttys.sg_flags |= ECHO;
7348861e462Sjaap 		stty(0, &ttys);
7358861e462Sjaap 	}
7368861e462Sjaap 	return(0);
7378861e462Sjaap }
7388861e462Sjaap 
7398861e462Sjaap 
caseec()7408861e462Sjaap caseec()
7418861e462Sjaap {
7428861e462Sjaap 	eschar = chget('\\');
7438861e462Sjaap }
7448861e462Sjaap 
7458861e462Sjaap 
caseeo()7468861e462Sjaap caseeo()
7478861e462Sjaap {
7488861e462Sjaap 	eschar = 0;
7498861e462Sjaap }
7508861e462Sjaap 
7518861e462Sjaap 
caseta()7528861e462Sjaap caseta()
7538861e462Sjaap {
7548861e462Sjaap 	register i;
7558861e462Sjaap 
7568861e462Sjaap 	tabtab[0] = nonumb = 0;
7578861e462Sjaap 	for (i = 0; ((i < (NTAB - 1)) && !nonumb); i++) {
7588861e462Sjaap 		if (skip())
7598861e462Sjaap 			break;
7606f545661Sjaap 		tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]), 0) & TABMASK;
7618861e462Sjaap 		if (!nonumb)
7628861e462Sjaap 			switch (cbits(ch)) {
7638861e462Sjaap 			case 'C':
7648861e462Sjaap 				tabtab[i] |= CTAB;
7658861e462Sjaap 				break;
7668861e462Sjaap 			case 'R':
7678861e462Sjaap 				tabtab[i] |= RTAB;
7688861e462Sjaap 				break;
7698861e462Sjaap 			default: /*includes L*/
7708861e462Sjaap 				break;
7718861e462Sjaap 			}
7728861e462Sjaap 		nonumb = ch = 0;
7738861e462Sjaap 	}
7748861e462Sjaap 	tabtab[i] = 0;
7758861e462Sjaap }
7768861e462Sjaap 
7778861e462Sjaap 
casene()7788861e462Sjaap casene()
7798861e462Sjaap {
7808861e462Sjaap 	register i, j;
7818861e462Sjaap 
7828861e462Sjaap 	skip();
7838861e462Sjaap 	i = vnumb((int *)0);
7848861e462Sjaap 	if (nonumb)
7858861e462Sjaap 		i = lss;
7868861e462Sjaap 	if (i > (j = findt1())) {
7878861e462Sjaap 		i = lss;
7888861e462Sjaap 		lss = j;
7898861e462Sjaap 		dip->nls = 0;
7908861e462Sjaap 		newline(0);
7918861e462Sjaap 		lss = i;
7928861e462Sjaap 	}
7938861e462Sjaap }
7948861e462Sjaap 
7958861e462Sjaap 
casetr()7968861e462Sjaap casetr()
7978861e462Sjaap {
7988861e462Sjaap 	register i, j;
7998861e462Sjaap 	tchar k;
8008861e462Sjaap 
8018861e462Sjaap 	lgf++;
8028861e462Sjaap 	skip();
8038861e462Sjaap 	while ((i = cbits(k=getch())) != '\n') {
8048861e462Sjaap 		if (ismot(k))
8058861e462Sjaap 			return;
8068861e462Sjaap 		if (ismot(k = getch()))
8078861e462Sjaap 			return;
8088861e462Sjaap 		if ((j = cbits(k)) == '\n')
8098861e462Sjaap 			j = ' ';
8108861e462Sjaap 		trtab[i] = j;
8118861e462Sjaap 	}
8128861e462Sjaap }
8138861e462Sjaap 
8148861e462Sjaap 
casecu()8158861e462Sjaap casecu()
8168861e462Sjaap {
8178861e462Sjaap 	cu++;
8188861e462Sjaap 	caseul();
8198861e462Sjaap }
8208861e462Sjaap 
8218861e462Sjaap 
caseul()8228861e462Sjaap caseul()
8238861e462Sjaap {
8248861e462Sjaap 	register i;
8258861e462Sjaap 
8268861e462Sjaap 	noscale++;
8278861e462Sjaap 	if (skip())
8288861e462Sjaap 		i = 1;
8298861e462Sjaap 	else
8308861e462Sjaap 		i = atoi();
8318861e462Sjaap 	if (ul && (i == 0)) {
8328861e462Sjaap 		font = sfont;
8338861e462Sjaap 		ul = cu = 0;
8348861e462Sjaap 	}
8358861e462Sjaap 	if (i) {
8368861e462Sjaap 		if (!ul) {
8378861e462Sjaap 			sfont = font;
8388861e462Sjaap 			font = ulfont;
8398861e462Sjaap 		}
8408861e462Sjaap 		ul = i;
8418861e462Sjaap 	}
8428861e462Sjaap 	noscale = 0;
8438861e462Sjaap 	mchbits();
8448861e462Sjaap }
8458861e462Sjaap 
8468861e462Sjaap 
caseuf()8478861e462Sjaap caseuf()
8488861e462Sjaap {
8498861e462Sjaap 	register i, j;
8508861e462Sjaap 
8518861e462Sjaap 	if (skip() || !(i = getrq()) || i == 'S' ||  (j = findft(i))  == -1)
8526f545661Sjaap 		ulfont = ULFONT; /*default underline position*/
8538861e462Sjaap 	else
8548861e462Sjaap 		ulfont = j;
8558861e462Sjaap #ifdef NROFF
8566f545661Sjaap 	if (ulfont == FT)
8576f545661Sjaap 		ulfont = ULFONT;
8588861e462Sjaap #endif
8598861e462Sjaap }
8608861e462Sjaap 
8618861e462Sjaap 
caseit()8628861e462Sjaap caseit()
8638861e462Sjaap {
8648861e462Sjaap 	register i;
8658861e462Sjaap 
8668861e462Sjaap 	lgf++;
8678861e462Sjaap 	it = itmac = 0;
8688861e462Sjaap 	noscale++;
8698861e462Sjaap 	skip();
8708861e462Sjaap 	i = atoi();
8718861e462Sjaap 	skip();
8728861e462Sjaap 	if (!nonumb && (itmac = getrq()))
8738861e462Sjaap 		it = i;
8748861e462Sjaap 	noscale = 0;
8758861e462Sjaap }
8768861e462Sjaap 
8778861e462Sjaap 
casemc()8788861e462Sjaap casemc()
8798861e462Sjaap {
8808861e462Sjaap 	register i;
8818861e462Sjaap 
8828861e462Sjaap 	if (icf > 1)
8838861e462Sjaap 		ic = 0;
8848861e462Sjaap 	icf = 0;
8858861e462Sjaap 	if (skip())
8868861e462Sjaap 		return;
8878861e462Sjaap 	ic = getch();
8888861e462Sjaap 	icf = 1;
8898861e462Sjaap 	skip();
8908861e462Sjaap 	i = max(hnumb((int *)0), 0);
8918861e462Sjaap 	if (!nonumb)
8928861e462Sjaap 		ics = i;
8938861e462Sjaap }
8948861e462Sjaap 
8958861e462Sjaap 
casemk()8968861e462Sjaap casemk()
8978861e462Sjaap {
8988861e462Sjaap 	register i, j;
8998861e462Sjaap 
9008861e462Sjaap 	if (dip != d)
9018861e462Sjaap 		j = dip->dnl;
9028861e462Sjaap 	else
9036f545661Sjaap 		j = numtab[NL].val;
9048861e462Sjaap 	if (skip()) {
9058861e462Sjaap 		dip->mkline = j;
9068861e462Sjaap 		return;
9078861e462Sjaap 	}
9088861e462Sjaap 	if ((i = getrq()) == 0)
9098861e462Sjaap 		return;
9106f545661Sjaap 	numtab[findr(i)].val = j;
9118861e462Sjaap }
9128861e462Sjaap 
9138861e462Sjaap 
casesv()9148861e462Sjaap casesv()
9158861e462Sjaap {
9168861e462Sjaap 	register i;
9178861e462Sjaap 
9188861e462Sjaap 	skip();
9198861e462Sjaap 	if ((i = vnumb((int *)0)) < 0)
9208861e462Sjaap 		return;
9218861e462Sjaap 	if (nonumb)
9228861e462Sjaap 		i = 1;
9238861e462Sjaap 	sv += i;
9248861e462Sjaap 	caseos();
9258861e462Sjaap }
9268861e462Sjaap 
9278861e462Sjaap 
caseos()9288861e462Sjaap caseos()
9298861e462Sjaap {
9308861e462Sjaap 	register savlss;
9318861e462Sjaap 
9328861e462Sjaap 	if (sv <= findt1()) {
9338861e462Sjaap 		savlss = lss;
9348861e462Sjaap 		lss = sv;
9358861e462Sjaap 		newline(0);
9368861e462Sjaap 		lss = savlss;
9378861e462Sjaap 		sv = 0;
9388861e462Sjaap 	}
9398861e462Sjaap }
9408861e462Sjaap 
9418861e462Sjaap 
casenm()9428861e462Sjaap casenm()
9438861e462Sjaap {
9448861e462Sjaap 	register i;
9458861e462Sjaap 
9468861e462Sjaap 	lnmod = nn = 0;
9478861e462Sjaap 	if (skip())
9488861e462Sjaap 		return;
9498861e462Sjaap 	lnmod++;
9508861e462Sjaap 	noscale++;
9516f545661Sjaap 	i = inumb(&numtab[LN].val);
9528861e462Sjaap 	if (!nonumb)
9536f545661Sjaap 		numtab[LN].val = max(i, 0);
9548861e462Sjaap 	getnm(&ndf, 1);
9558861e462Sjaap 	getnm(&nms, 0);
9568861e462Sjaap 	getnm(&ni, 0);
9578861e462Sjaap 	noscale = 0;
9588861e462Sjaap 	nmbits = chbits;
9598861e462Sjaap }
9608861e462Sjaap 
9618861e462Sjaap 
getnm(p,min)9628861e462Sjaap getnm(p, min)
9638861e462Sjaap int	*p, min;
9648861e462Sjaap {
9658861e462Sjaap 	register i;
9668861e462Sjaap 
9678861e462Sjaap 	eat(' ');
9688861e462Sjaap 	if (skip())
9698861e462Sjaap 		return;
9708861e462Sjaap 	i = atoi();
9718861e462Sjaap 	if (nonumb)
9728861e462Sjaap 		return;
9738861e462Sjaap 	*p = max(i, min);
9748861e462Sjaap }
9758861e462Sjaap 
9768861e462Sjaap 
casenn()9778861e462Sjaap casenn()
9788861e462Sjaap {
9798861e462Sjaap 	noscale++;
9808861e462Sjaap 	skip();
9818861e462Sjaap 	nn = max(atoi(), 1);
9828861e462Sjaap 	noscale = 0;
9838861e462Sjaap }
9848861e462Sjaap 
9858861e462Sjaap 
caseab()9868861e462Sjaap caseab()
9878861e462Sjaap {
9888861e462Sjaap 	casetm(1);
9896f545661Sjaap 	done3(0);
9908861e462Sjaap }
991