xref: /plan9-contrib/sys/src/cmd/troff/n5.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * troff5.c
33e12c5d1SDavid du Colombier  *
43e12c5d1SDavid du Colombier  * misc processing requests
53e12c5d1SDavid du Colombier  */
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier #include "tdef.h"
83e12c5d1SDavid du Colombier #include "fns.h"
93e12c5d1SDavid du Colombier #include "ext.h"
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier int	iflist[NIF];
123e12c5d1SDavid du Colombier int	ifx;
13219b2ee8SDavid du Colombier int	ifnum = 0;	/* trying numeric expression for .if or .ie condition */
143e12c5d1SDavid du Colombier 
casead(void)153e12c5d1SDavid du Colombier void casead(void)
163e12c5d1SDavid du Colombier {
173e12c5d1SDavid du Colombier 	int i;
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier 	ad = 1;
203e12c5d1SDavid du Colombier 	/* leave admod alone */
213e12c5d1SDavid du Colombier 	if (skip())
223e12c5d1SDavid du Colombier 		return;
233e12c5d1SDavid du Colombier 	switch (i = cbits(getch())) {
243e12c5d1SDavid du Colombier 	case 'r':	/* right adj, left ragged */
253e12c5d1SDavid du Colombier 		admod = 2;
263e12c5d1SDavid du Colombier 		break;
273e12c5d1SDavid du Colombier 	case 'l':	/* left adj, right ragged */
283e12c5d1SDavid du Colombier 		admod = ad = 0;	/* same as casena */
293e12c5d1SDavid du Colombier 		break;
303e12c5d1SDavid du Colombier 	case 'c':	/*centered adj*/
313e12c5d1SDavid du Colombier 		admod = 1;
323e12c5d1SDavid du Colombier 		break;
333e12c5d1SDavid du Colombier 	case 'b':
343e12c5d1SDavid du Colombier 	case 'n':
353e12c5d1SDavid du Colombier 		admod = 0;
363e12c5d1SDavid du Colombier 		break;
373e12c5d1SDavid du Colombier 	case '0':
383e12c5d1SDavid du Colombier 	case '2':
393e12c5d1SDavid du Colombier 	case '4':
403e12c5d1SDavid du Colombier 		ad = 0;
413e12c5d1SDavid du Colombier 	case '1':
423e12c5d1SDavid du Colombier 	case '3':
433e12c5d1SDavid du Colombier 	case '5':
443e12c5d1SDavid du Colombier 		admod = (i - '0') / 2;
453e12c5d1SDavid du Colombier 	}
463e12c5d1SDavid du Colombier }
473e12c5d1SDavid du Colombier 
483e12c5d1SDavid du Colombier 
casena(void)493e12c5d1SDavid du Colombier void casena(void)
503e12c5d1SDavid du Colombier {
513e12c5d1SDavid du Colombier 	ad = 0;
523e12c5d1SDavid du Colombier }
533e12c5d1SDavid du Colombier 
543e12c5d1SDavid du Colombier 
casefi(void)553e12c5d1SDavid du Colombier void casefi(void)
563e12c5d1SDavid du Colombier {
573e12c5d1SDavid du Colombier 	tbreak();
58219b2ee8SDavid du Colombier 	fi = 1;
593e12c5d1SDavid du Colombier 	pendnf = 0;
603e12c5d1SDavid du Colombier }
613e12c5d1SDavid du Colombier 
623e12c5d1SDavid du Colombier 
casenf(void)633e12c5d1SDavid du Colombier void casenf(void)
643e12c5d1SDavid du Colombier {
653e12c5d1SDavid du Colombier 	tbreak();
663e12c5d1SDavid du Colombier 	fi = 0;
673e12c5d1SDavid du Colombier }
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier 
casers(void)703e12c5d1SDavid du Colombier void casers(void)
713e12c5d1SDavid du Colombier {
723e12c5d1SDavid du Colombier 	dip->nls = 0;
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier 
753e12c5d1SDavid du Colombier 
casens(void)763e12c5d1SDavid du Colombier void casens(void)
773e12c5d1SDavid du Colombier {
783e12c5d1SDavid du Colombier 	dip->nls++;
793e12c5d1SDavid du Colombier }
803e12c5d1SDavid du Colombier 
813e12c5d1SDavid du Colombier 
chget(int c)823e12c5d1SDavid du Colombier chget(int c)
833e12c5d1SDavid du Colombier {
843e12c5d1SDavid du Colombier 	Tchar i;
853e12c5d1SDavid du Colombier 
86*14f51593SDavid du Colombier 	i = 0;
873e12c5d1SDavid du Colombier 	if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') {
883e12c5d1SDavid du Colombier 		ch = i;
893e12c5d1SDavid du Colombier 		return(c);
903e12c5d1SDavid du Colombier 	} else
913e12c5d1SDavid du Colombier 		return cbits(i);	/* was (i & BYTEMASK) */
923e12c5d1SDavid du Colombier }
933e12c5d1SDavid du Colombier 
943e12c5d1SDavid du Colombier 
casecc(void)953e12c5d1SDavid du Colombier void casecc(void)
963e12c5d1SDavid du Colombier {
973e12c5d1SDavid du Colombier 	cc = chget('.');
983e12c5d1SDavid du Colombier }
993e12c5d1SDavid du Colombier 
1003e12c5d1SDavid du Colombier 
casec2(void)1013e12c5d1SDavid du Colombier void casec2(void)
1023e12c5d1SDavid du Colombier {
1033e12c5d1SDavid du Colombier 	c2 = chget('\'');
1043e12c5d1SDavid du Colombier }
1053e12c5d1SDavid du Colombier 
1063e12c5d1SDavid du Colombier 
casehc(void)1073e12c5d1SDavid du Colombier void casehc(void)
1083e12c5d1SDavid du Colombier {
1093e12c5d1SDavid du Colombier 	ohc = chget(OHC);
1103e12c5d1SDavid du Colombier }
1113e12c5d1SDavid du Colombier 
1123e12c5d1SDavid du Colombier 
casetc(void)1133e12c5d1SDavid du Colombier void casetc(void)
1143e12c5d1SDavid du Colombier {
1153e12c5d1SDavid du Colombier 	tabc = chget(0);
1163e12c5d1SDavid du Colombier }
1173e12c5d1SDavid du Colombier 
1183e12c5d1SDavid du Colombier 
caselc(void)1193e12c5d1SDavid du Colombier void caselc(void)
1203e12c5d1SDavid du Colombier {
1213e12c5d1SDavid du Colombier 	dotc = chget(0);
1223e12c5d1SDavid du Colombier }
1233e12c5d1SDavid du Colombier 
1243e12c5d1SDavid du Colombier 
casehy(void)1253e12c5d1SDavid du Colombier void casehy(void)
1263e12c5d1SDavid du Colombier {
1273e12c5d1SDavid du Colombier 	int i;
1283e12c5d1SDavid du Colombier 
1293e12c5d1SDavid du Colombier 	hyf = 1;
1303e12c5d1SDavid du Colombier 	if (skip())
1313e12c5d1SDavid du Colombier 		return;
1323e12c5d1SDavid du Colombier 	noscale++;
1333e12c5d1SDavid du Colombier 	i = atoi0();
1343e12c5d1SDavid du Colombier 	noscale = 0;
1353e12c5d1SDavid du Colombier 	if (nonumb)
1363e12c5d1SDavid du Colombier 		return;
1373e12c5d1SDavid du Colombier 	hyf = max(i, 0);
1383e12c5d1SDavid du Colombier }
1393e12c5d1SDavid du Colombier 
1403e12c5d1SDavid du Colombier 
casenh(void)1413e12c5d1SDavid du Colombier void casenh(void)
1423e12c5d1SDavid du Colombier {
1433e12c5d1SDavid du Colombier 	hyf = 0;
1443e12c5d1SDavid du Colombier }
1453e12c5d1SDavid du Colombier 
1463e12c5d1SDavid du Colombier 
max(int aa,int bb)1473e12c5d1SDavid du Colombier max(int aa, int bb)
1483e12c5d1SDavid du Colombier {
1493e12c5d1SDavid du Colombier 	if (aa > bb)
1503e12c5d1SDavid du Colombier 		return(aa);
1513e12c5d1SDavid du Colombier 	else
1523e12c5d1SDavid du Colombier 		return(bb);
1533e12c5d1SDavid du Colombier }
1543e12c5d1SDavid du Colombier 
1553e12c5d1SDavid du Colombier 
casece(void)1563e12c5d1SDavid du Colombier void casece(void)
1573e12c5d1SDavid du Colombier {
1583e12c5d1SDavid du Colombier 	int i;
1593e12c5d1SDavid du Colombier 
1603e12c5d1SDavid du Colombier 	noscale++;
1613e12c5d1SDavid du Colombier 	skip();
1623e12c5d1SDavid du Colombier 	i = max(atoi0(), 0);
1633e12c5d1SDavid du Colombier 	if (nonumb)
1643e12c5d1SDavid du Colombier 		i = 1;
1653e12c5d1SDavid du Colombier 	tbreak();
1663e12c5d1SDavid du Colombier 	ce = i;
1673e12c5d1SDavid du Colombier 	noscale = 0;
1683e12c5d1SDavid du Colombier }
1693e12c5d1SDavid du Colombier 
1703e12c5d1SDavid du Colombier 
casein(void)1713e12c5d1SDavid du Colombier void casein(void)
1723e12c5d1SDavid du Colombier {
1733e12c5d1SDavid du Colombier 	int i;
1743e12c5d1SDavid du Colombier 
1753e12c5d1SDavid du Colombier 	if (skip())
1763e12c5d1SDavid du Colombier 		i = in1;
177219b2ee8SDavid du Colombier 	else {
1783e12c5d1SDavid du Colombier 		i = max(hnumb(&in), 0);
179219b2ee8SDavid du Colombier 		if (nonumb)
180219b2ee8SDavid du Colombier 			i = in1;
181219b2ee8SDavid du Colombier 	}
1823e12c5d1SDavid du Colombier 	tbreak();
1833e12c5d1SDavid du Colombier 	in1 = in;
1843e12c5d1SDavid du Colombier 	in = i;
1853e12c5d1SDavid du Colombier 	if (!nc) {
1863e12c5d1SDavid du Colombier 		un = in;
1873e12c5d1SDavid du Colombier 		setnel();
1883e12c5d1SDavid du Colombier 	}
1893e12c5d1SDavid du Colombier }
1903e12c5d1SDavid du Colombier 
1913e12c5d1SDavid du Colombier 
casell(void)1923e12c5d1SDavid du Colombier void casell(void)
1933e12c5d1SDavid du Colombier {
1943e12c5d1SDavid du Colombier 	int i;
1953e12c5d1SDavid du Colombier 
1963e12c5d1SDavid du Colombier 	if (skip())
1973e12c5d1SDavid du Colombier 		i = ll1;
198219b2ee8SDavid du Colombier 	else {
1993e12c5d1SDavid du Colombier 		i = max(hnumb(&ll), INCH / 10);
200219b2ee8SDavid du Colombier 		if (nonumb)
201219b2ee8SDavid du Colombier 			i = ll1;
202219b2ee8SDavid du Colombier 	}
2033e12c5d1SDavid du Colombier 	ll1 = ll;
2043e12c5d1SDavid du Colombier 	ll = i;
2053e12c5d1SDavid du Colombier 	setnel();
2063e12c5d1SDavid du Colombier }
2073e12c5d1SDavid du Colombier 
2083e12c5d1SDavid du Colombier 
caselt(void)2093e12c5d1SDavid du Colombier void caselt(void)
2103e12c5d1SDavid du Colombier {
2113e12c5d1SDavid du Colombier 	int i;
2123e12c5d1SDavid du Colombier 
2133e12c5d1SDavid du Colombier 	if (skip())
2143e12c5d1SDavid du Colombier 		i = lt1;
215219b2ee8SDavid du Colombier 	else {
2163e12c5d1SDavid du Colombier 		i = max(hnumb(&lt), 0);
217219b2ee8SDavid du Colombier 		if (nonumb)
218219b2ee8SDavid du Colombier 			i = lt1;
219219b2ee8SDavid du Colombier 	}
2203e12c5d1SDavid du Colombier 	lt1 = lt;
2213e12c5d1SDavid du Colombier 	lt = i;
2223e12c5d1SDavid du Colombier }
2233e12c5d1SDavid du Colombier 
2243e12c5d1SDavid du Colombier 
caseti(void)2253e12c5d1SDavid du Colombier void caseti(void)
2263e12c5d1SDavid du Colombier {
2273e12c5d1SDavid du Colombier 	int i;
2283e12c5d1SDavid du Colombier 
2293e12c5d1SDavid du Colombier 	if (skip())
2303e12c5d1SDavid du Colombier 		return;
2313e12c5d1SDavid du Colombier 	i = max(hnumb(&in), 0);
2323e12c5d1SDavid du Colombier 	tbreak();
2333e12c5d1SDavid du Colombier 	un1 = i;
2343e12c5d1SDavid du Colombier 	setnel();
2353e12c5d1SDavid du Colombier }
2363e12c5d1SDavid du Colombier 
2373e12c5d1SDavid du Colombier 
casels(void)2383e12c5d1SDavid du Colombier void casels(void)
2393e12c5d1SDavid du Colombier {
2403e12c5d1SDavid du Colombier 	int i;
2413e12c5d1SDavid du Colombier 
2423e12c5d1SDavid du Colombier 	noscale++;
2433e12c5d1SDavid du Colombier 	if (skip())
2443e12c5d1SDavid du Colombier 		i = ls1;
245219b2ee8SDavid du Colombier 	else {
2463e12c5d1SDavid du Colombier 		i = max(inumb(&ls), 1);
247219b2ee8SDavid du Colombier 		if (nonumb)
248219b2ee8SDavid du Colombier 			i = ls1;
249219b2ee8SDavid du Colombier 	}
2503e12c5d1SDavid du Colombier 	ls1 = ls;
2513e12c5d1SDavid du Colombier 	ls = i;
2523e12c5d1SDavid du Colombier 	noscale = 0;
2533e12c5d1SDavid du Colombier }
2543e12c5d1SDavid du Colombier 
2553e12c5d1SDavid du Colombier 
casepo(void)2563e12c5d1SDavid du Colombier void casepo(void)
2573e12c5d1SDavid du Colombier {
2583e12c5d1SDavid du Colombier 	int i;
2593e12c5d1SDavid du Colombier 
2603e12c5d1SDavid du Colombier 	if (skip())
2613e12c5d1SDavid du Colombier 		i = po1;
2623e12c5d1SDavid du Colombier 	else {
2633e12c5d1SDavid du Colombier 		i = max(hnumb(&po), 0);
2643e12c5d1SDavid du Colombier 		if (nonumb)
2653e12c5d1SDavid du Colombier 			i = po1;
2663e12c5d1SDavid du Colombier 	}
2673e12c5d1SDavid du Colombier 	po1 = po;
2683e12c5d1SDavid du Colombier 	po = i;
2693e12c5d1SDavid du Colombier 	if (TROFF & !ascii)
2703e12c5d1SDavid du Colombier 		esc += po - po1;
2713e12c5d1SDavid du Colombier }
2723e12c5d1SDavid du Colombier 
2733e12c5d1SDavid du Colombier 
casepl(void)2743e12c5d1SDavid du Colombier void casepl(void)
2753e12c5d1SDavid du Colombier {
2763e12c5d1SDavid du Colombier 	int i;
2773e12c5d1SDavid du Colombier 
2783e12c5d1SDavid du Colombier 	skip();
2793e12c5d1SDavid du Colombier 	if ((i = vnumb(&pl)) == 0)
2803e12c5d1SDavid du Colombier 		pl = 11 * INCH; /*11in*/
2813e12c5d1SDavid du Colombier 	else
2823e12c5d1SDavid du Colombier 		pl = i;
283219b2ee8SDavid du Colombier 	if (numtabp[NL].val > pl)
284219b2ee8SDavid du Colombier 		numtabp[NL].val = pl;
2853e12c5d1SDavid du Colombier }
2863e12c5d1SDavid du Colombier 
2873e12c5d1SDavid du Colombier 
casewh(void)2883e12c5d1SDavid du Colombier void casewh(void)
2893e12c5d1SDavid du Colombier {
2903e12c5d1SDavid du Colombier 	int i, j, k;
2913e12c5d1SDavid du Colombier 
2923e12c5d1SDavid du Colombier 	lgf++;
2933e12c5d1SDavid du Colombier 	skip();
2943e12c5d1SDavid du Colombier 	i = vnumb((int *)0);
2953e12c5d1SDavid du Colombier 	if (nonumb)
2963e12c5d1SDavid du Colombier 		return;
2973e12c5d1SDavid du Colombier 	skip();
2983e12c5d1SDavid du Colombier 	j = getrq();
2993e12c5d1SDavid du Colombier 	if ((k = findn(i)) != NTRAP) {
3003e12c5d1SDavid du Colombier 		mlist[k] = j;
3013e12c5d1SDavid du Colombier 		return;
3023e12c5d1SDavid du Colombier 	}
3033e12c5d1SDavid du Colombier 	for (k = 0; k < NTRAP; k++)
3043e12c5d1SDavid du Colombier 		if (mlist[k] == 0)
3053e12c5d1SDavid du Colombier 			break;
3063e12c5d1SDavid du Colombier 	if (k == NTRAP) {
3073e12c5d1SDavid du Colombier 		flusho();
3083e12c5d1SDavid du Colombier 		ERROR "cannot plant trap." WARN;
3093e12c5d1SDavid du Colombier 		return;
3103e12c5d1SDavid du Colombier 	}
3113e12c5d1SDavid du Colombier 	mlist[k] = j;
3123e12c5d1SDavid du Colombier 	nlist[k] = i;
3133e12c5d1SDavid du Colombier }
3143e12c5d1SDavid du Colombier 
3153e12c5d1SDavid du Colombier 
casech(void)3163e12c5d1SDavid du Colombier void casech(void)
3173e12c5d1SDavid du Colombier {
3183e12c5d1SDavid du Colombier 	int i, j, k;
3193e12c5d1SDavid du Colombier 
3203e12c5d1SDavid du Colombier 	lgf++;
3213e12c5d1SDavid du Colombier 	skip();
3223e12c5d1SDavid du Colombier 	if (!(j = getrq()))
3233e12c5d1SDavid du Colombier 		return;
3243e12c5d1SDavid du Colombier 	else
3253e12c5d1SDavid du Colombier 		for (k = 0; k < NTRAP; k++)
3263e12c5d1SDavid du Colombier 			if (mlist[k] == j)
3273e12c5d1SDavid du Colombier 				break;
3283e12c5d1SDavid du Colombier 	if (k == NTRAP)
3293e12c5d1SDavid du Colombier 		return;
3303e12c5d1SDavid du Colombier 	skip();
3313e12c5d1SDavid du Colombier 	i = vnumb((int *)0);
3323e12c5d1SDavid du Colombier 	if (nonumb)
3333e12c5d1SDavid du Colombier 		mlist[k] = 0;
3343e12c5d1SDavid du Colombier 	nlist[k] = i;
3353e12c5d1SDavid du Colombier }
3363e12c5d1SDavid du Colombier 
3373e12c5d1SDavid du Colombier 
findn(int i)3383e12c5d1SDavid du Colombier findn(int i)
3393e12c5d1SDavid du Colombier {
3403e12c5d1SDavid du Colombier 	int k;
3413e12c5d1SDavid du Colombier 
3423e12c5d1SDavid du Colombier 	for (k = 0; k < NTRAP; k++)
3433e12c5d1SDavid du Colombier 		if ((nlist[k] == i) && (mlist[k] != 0))
3443e12c5d1SDavid du Colombier 			break;
3453e12c5d1SDavid du Colombier 	return(k);
3463e12c5d1SDavid du Colombier }
3473e12c5d1SDavid du Colombier 
3483e12c5d1SDavid du Colombier 
casepn(void)3493e12c5d1SDavid du Colombier void casepn(void)
3503e12c5d1SDavid du Colombier {
3513e12c5d1SDavid du Colombier 	int i;
3523e12c5d1SDavid du Colombier 
3533e12c5d1SDavid du Colombier 	skip();
3543e12c5d1SDavid du Colombier 	noscale++;
355219b2ee8SDavid du Colombier 	i = max(inumb(&numtabp[PN].val), 0);
3563e12c5d1SDavid du Colombier 	noscale = 0;
3573e12c5d1SDavid du Colombier 	if (!nonumb) {
3583e12c5d1SDavid du Colombier 		npn = i;
3593e12c5d1SDavid du Colombier 		npnflg++;
3603e12c5d1SDavid du Colombier 	}
3613e12c5d1SDavid du Colombier }
3623e12c5d1SDavid du Colombier 
3633e12c5d1SDavid du Colombier 
casebp(void)3643e12c5d1SDavid du Colombier void casebp(void)
3653e12c5d1SDavid du Colombier {
3663e12c5d1SDavid du Colombier 	int i;
3673e12c5d1SDavid du Colombier 	Stack *savframe;
3683e12c5d1SDavid du Colombier 
3693e12c5d1SDavid du Colombier 	if (dip != d)
3703e12c5d1SDavid du Colombier 		return;
3713e12c5d1SDavid du Colombier 	savframe = frame;
3723e12c5d1SDavid du Colombier 	skip();
373219b2ee8SDavid du Colombier 	if ((i = inumb(&numtabp[PN].val)) < 0)
3743e12c5d1SDavid du Colombier 		i = 0;
3753e12c5d1SDavid du Colombier 	tbreak();
3763e12c5d1SDavid du Colombier 	if (!nonumb) {
3773e12c5d1SDavid du Colombier 		npn = i;
3783e12c5d1SDavid du Colombier 		npnflg++;
3793e12c5d1SDavid du Colombier 	} else if (dip->nls)
3803e12c5d1SDavid du Colombier 		return;
3813e12c5d1SDavid du Colombier 	eject(savframe);
3823e12c5d1SDavid du Colombier }
3833e12c5d1SDavid du Colombier 
casetm(void)3843e12c5d1SDavid du Colombier void casetm(void)
3853e12c5d1SDavid du Colombier {
386219b2ee8SDavid du Colombier 	casetm1(0, stderr);
3873e12c5d1SDavid du Colombier }
3883e12c5d1SDavid du Colombier 
389219b2ee8SDavid du Colombier 
casefm(void)390219b2ee8SDavid du Colombier void casefm(void)
391219b2ee8SDavid du Colombier {
392219b2ee8SDavid du Colombier 	static struct fcache {
393219b2ee8SDavid du Colombier 		char *name;
394219b2ee8SDavid du Colombier 		FILE *fp;
395219b2ee8SDavid du Colombier 	} fcache[15];
396219b2ee8SDavid du Colombier 	int i;
397219b2ee8SDavid du Colombier 
398219b2ee8SDavid du Colombier 	if ( skip() || !getname()) {
399219b2ee8SDavid du Colombier 		ERROR "fm: missing filename" WARN;
400219b2ee8SDavid du Colombier 		return;
401219b2ee8SDavid du Colombier 	}
402219b2ee8SDavid du Colombier 
403219b2ee8SDavid du Colombier 	for (i = 0; i < 15 && fcache[i].fp != NULL; i++) {
404219b2ee8SDavid du Colombier 		if (strcmp(nextf, fcache[i].name) == 0)
405219b2ee8SDavid du Colombier 			break;
406219b2ee8SDavid du Colombier 	}
407219b2ee8SDavid du Colombier 	if (i >= 15) {
408219b2ee8SDavid du Colombier 		ERROR "fm: too many streams" WARN;
409219b2ee8SDavid du Colombier 		return;
410219b2ee8SDavid du Colombier 	}
411219b2ee8SDavid du Colombier 	if (fcache[i].fp == NULL) {
412219b2ee8SDavid du Colombier 		if( (fcache[i].fp = fopen(nextf, "w")) == NULL) {
413219b2ee8SDavid du Colombier 			ERROR "fm: cannot open %s", nextf WARN;
414219b2ee8SDavid du Colombier 			return;
415219b2ee8SDavid du Colombier 		}
416219b2ee8SDavid du Colombier 		fcache[i].name = strdupl(nextf);
417219b2ee8SDavid du Colombier 	}
418219b2ee8SDavid du Colombier 	casetm1(0, fcache[i].fp);
419219b2ee8SDavid du Colombier }
420219b2ee8SDavid du Colombier 
casetm1(int ab,FILE * out)421219b2ee8SDavid du Colombier void casetm1(int ab, FILE *out)
4223e12c5d1SDavid du Colombier {
4233e12c5d1SDavid du Colombier 	int i, j, c;
4243e12c5d1SDavid du Colombier 	char *p;
4253e12c5d1SDavid du Colombier 	char tmbuf[NTM];
4263e12c5d1SDavid du Colombier 
4273e12c5d1SDavid du Colombier 	lgf++;
4283e12c5d1SDavid du Colombier 	copyf++;
429219b2ee8SDavid du Colombier 	if (ab) {
430219b2ee8SDavid du Colombier 		if (skip())
4313e12c5d1SDavid du Colombier 			ERROR "User Abort" WARN;
432219b2ee8SDavid du Colombier 		else {
433219b2ee8SDavid du Colombier 			extern int error;
434219b2ee8SDavid du Colombier 			int savtrac = trace;
435*14f51593SDavid du Colombier 			trace = 0;
436219b2ee8SDavid du Colombier 			noscale++;
437219b2ee8SDavid du Colombier 			i = inumb(&trace);
438219b2ee8SDavid du Colombier 			noscale--;
439219b2ee8SDavid du Colombier 			if (i) {
440219b2ee8SDavid du Colombier 				error = i;
441219b2ee8SDavid du Colombier 				if (nlflg || skip())
442219b2ee8SDavid du Colombier 					ERROR "User Abort, exit code %d", i WARN;
443219b2ee8SDavid du Colombier 			}
444219b2ee8SDavid du Colombier 			trace = savtrac;
445219b2ee8SDavid du Colombier 		}
446219b2ee8SDavid du Colombier 	} else
447219b2ee8SDavid du Colombier 		skip();
4483e12c5d1SDavid du Colombier 	for (i = 0; i < NTM - 2; ) {
4493e12c5d1SDavid du Colombier 		if ((c = cbits(getch())) == '\n' || c == RIGHT)
4503e12c5d1SDavid du Colombier 			break;
4513e12c5d1SDavid du Colombier 		else if (c == MINUS) {	/* special pleading for strange encodings */
4523e12c5d1SDavid du Colombier 			tmbuf[i++] = '\\';
4533e12c5d1SDavid du Colombier 			tmbuf[i++] = '-';
4543e12c5d1SDavid du Colombier 		} else if (c == PRESC) {
4553e12c5d1SDavid du Colombier 			tmbuf[i++] = '\\';
4563e12c5d1SDavid du Colombier 			tmbuf[i++] = 'e';
4573e12c5d1SDavid du Colombier 		} else if (c == FILLER) {
4583e12c5d1SDavid du Colombier 			tmbuf[i++] = '\\';
4593e12c5d1SDavid du Colombier 			tmbuf[i++] = '&';
4603e12c5d1SDavid du Colombier 		} else if (c == UNPAD) {
4613e12c5d1SDavid du Colombier 			tmbuf[i++] = '\\';
4623e12c5d1SDavid du Colombier 			tmbuf[i++] = ' ';
4633e12c5d1SDavid du Colombier 		} else if (c == OHC) {
4643e12c5d1SDavid du Colombier 			tmbuf[i++] = '\\';
4653e12c5d1SDavid du Colombier 			tmbuf[i++] = '%';
466219b2ee8SDavid du Colombier 		} else if (c >= ALPHABET) {
4673e12c5d1SDavid du Colombier 			p = chname(c);
468219b2ee8SDavid du Colombier 			switch (*p) {
469219b2ee8SDavid du Colombier 			case MBchar:
470219b2ee8SDavid du Colombier 				sprintf(&tmbuf[i], p+1);
471219b2ee8SDavid du Colombier 				break;
472219b2ee8SDavid du Colombier 			case Number:
473219b2ee8SDavid du Colombier 				sprintf(&tmbuf[i], "\\N'%s'", p+1);
474219b2ee8SDavid du Colombier 				break;
475219b2ee8SDavid du Colombier 			case Troffchar:
476*14f51593SDavid du Colombier 				if (strlen(p+1) == 2)
477219b2ee8SDavid du Colombier 					sprintf(&tmbuf[i], "\\(%s", p+1);
478219b2ee8SDavid du Colombier 				else
479219b2ee8SDavid du Colombier 					sprintf(&tmbuf[i], "\\C'%s'", p+1);
480219b2ee8SDavid du Colombier 				break;
481219b2ee8SDavid du Colombier 			default:
482219b2ee8SDavid du Colombier 				sprintf(&tmbuf[i]," %s? ", p);
483219b2ee8SDavid du Colombier 				break;
4843e12c5d1SDavid du Colombier 			}
485219b2ee8SDavid du Colombier 			j = strlen(&tmbuf[i]);
486219b2ee8SDavid du Colombier 			i += j;
4873e12c5d1SDavid du Colombier 		} else
4883e12c5d1SDavid du Colombier 			tmbuf[i++] = c;
4893e12c5d1SDavid du Colombier 	}
4903e12c5d1SDavid du Colombier 	tmbuf[i] = 0;
4913e12c5d1SDavid du Colombier 	if (ab)	/* truncate output */
4923e12c5d1SDavid du Colombier 		obufp = obuf;	/* should be a function in n2.c */
4933e12c5d1SDavid du Colombier 	flusho();
494219b2ee8SDavid du Colombier 	if (i)
495219b2ee8SDavid du Colombier 		fprintf(out, "%s\n", tmbuf);
496219b2ee8SDavid du Colombier 	fflush(out);
4973e12c5d1SDavid du Colombier 	copyf--;
4983e12c5d1SDavid du Colombier 	lgf--;
4993e12c5d1SDavid du Colombier }
5003e12c5d1SDavid du Colombier 
5013e12c5d1SDavid du Colombier 
casesp(void)5023e12c5d1SDavid du Colombier void casesp(void)
5033e12c5d1SDavid du Colombier {
5043e12c5d1SDavid du Colombier 	casesp1(0);
5053e12c5d1SDavid du Colombier }
5063e12c5d1SDavid du Colombier 
casesp1(int a)5073e12c5d1SDavid du Colombier void casesp1(int a)
5083e12c5d1SDavid du Colombier {
5093e12c5d1SDavid du Colombier 	int i, j, savlss;
5103e12c5d1SDavid du Colombier 
5113e12c5d1SDavid du Colombier 	tbreak();
5123e12c5d1SDavid du Colombier 	if (dip->nls || trap)
5133e12c5d1SDavid du Colombier 		return;
5143e12c5d1SDavid du Colombier 	i = findt1();
5153e12c5d1SDavid du Colombier 	if (!a) {
5163e12c5d1SDavid du Colombier 		skip();
5173e12c5d1SDavid du Colombier 		j = vnumb((int *)0);
5183e12c5d1SDavid du Colombier 		if (nonumb)
5193e12c5d1SDavid du Colombier 			j = lss;
5203e12c5d1SDavid du Colombier 	} else
5213e12c5d1SDavid du Colombier 		j = a;
5223e12c5d1SDavid du Colombier 	if (j == 0)
5233e12c5d1SDavid du Colombier 		return;
5243e12c5d1SDavid du Colombier 	if (i < j)
5253e12c5d1SDavid du Colombier 		j = i;
5263e12c5d1SDavid du Colombier 	savlss = lss;
5273e12c5d1SDavid du Colombier 	if (dip != d)
5283e12c5d1SDavid du Colombier 		i = dip->dnl;
5293e12c5d1SDavid du Colombier 	else
530219b2ee8SDavid du Colombier 		i = numtabp[NL].val;
5313e12c5d1SDavid du Colombier 	if ((i + j) < 0)
5323e12c5d1SDavid du Colombier 		j = -i;
5333e12c5d1SDavid du Colombier 	lss = j;
5343e12c5d1SDavid du Colombier 	newline(0);
5353e12c5d1SDavid du Colombier 	lss = savlss;
5363e12c5d1SDavid du Colombier }
5373e12c5d1SDavid du Colombier 
5383e12c5d1SDavid du Colombier 
casert(void)5393e12c5d1SDavid du Colombier void casert(void)
5403e12c5d1SDavid du Colombier {
5413e12c5d1SDavid du Colombier 	int a, *p;
5423e12c5d1SDavid du Colombier 
5433e12c5d1SDavid du Colombier 	skip();
5443e12c5d1SDavid du Colombier 	if (dip != d)
5453e12c5d1SDavid du Colombier 		p = &dip->dnl;
5463e12c5d1SDavid du Colombier 	else
547219b2ee8SDavid du Colombier 		p = &numtabp[NL].val;
5483e12c5d1SDavid du Colombier 	a = vnumb(p);
5493e12c5d1SDavid du Colombier 	if (nonumb)
5503e12c5d1SDavid du Colombier 		a = dip->mkline;
5513e12c5d1SDavid du Colombier 	if ((a < 0) || (a >= *p))
5523e12c5d1SDavid du Colombier 		return;
5533e12c5d1SDavid du Colombier 	nb++;
5543e12c5d1SDavid du Colombier 	casesp1(a - *p);
5553e12c5d1SDavid du Colombier }
5563e12c5d1SDavid du Colombier 
5573e12c5d1SDavid du Colombier 
caseem(void)5583e12c5d1SDavid du Colombier void caseem(void)
5593e12c5d1SDavid du Colombier {
5603e12c5d1SDavid du Colombier 	lgf++;
5613e12c5d1SDavid du Colombier 	skip();
5623e12c5d1SDavid du Colombier 	em = getrq();
5633e12c5d1SDavid du Colombier }
5643e12c5d1SDavid du Colombier 
5653e12c5d1SDavid du Colombier 
casefl(void)5663e12c5d1SDavid du Colombier void casefl(void)
5673e12c5d1SDavid du Colombier {
5683e12c5d1SDavid du Colombier 	tbreak();
5693e12c5d1SDavid du Colombier 	if (!ascii)
5703e12c5d1SDavid du Colombier 		ptflush();
5713e12c5d1SDavid du Colombier 	flusho();
5723e12c5d1SDavid du Colombier }
5733e12c5d1SDavid du Colombier 
5743e12c5d1SDavid du Colombier 
caseev(void)5753e12c5d1SDavid du Colombier void caseev(void)
5763e12c5d1SDavid du Colombier {
5773e12c5d1SDavid du Colombier 	int nxev;
5783e12c5d1SDavid du Colombier 
5793e12c5d1SDavid du Colombier 	if (skip()) {
5803e12c5d1SDavid du Colombier e0:
5813e12c5d1SDavid du Colombier 		if (evi == 0)
5823e12c5d1SDavid du Colombier 			return;
5833e12c5d1SDavid du Colombier 		nxev =  evlist[--evi];
5843e12c5d1SDavid du Colombier 		goto e1;
5853e12c5d1SDavid du Colombier 	}
5863e12c5d1SDavid du Colombier 	noscale++;
5873e12c5d1SDavid du Colombier 	nxev = atoi0();
5883e12c5d1SDavid du Colombier 	noscale = 0;
5893e12c5d1SDavid du Colombier 	if (nonumb)
5903e12c5d1SDavid du Colombier 		goto e0;
5913e12c5d1SDavid du Colombier 	flushi();
5923e12c5d1SDavid du Colombier 	if (nxev >= NEV || nxev < 0 || evi >= EVLSZ) {
5933e12c5d1SDavid du Colombier 		flusho();
5943e12c5d1SDavid du Colombier 		ERROR "cannot do .ev %d", nxev WARN;
5953e12c5d1SDavid du Colombier 		if (error)
5963e12c5d1SDavid du Colombier 			done2(040);
5973e12c5d1SDavid du Colombier 		else
5983e12c5d1SDavid du Colombier 			edone(040);
5993e12c5d1SDavid du Colombier 		return;
6003e12c5d1SDavid du Colombier 	}
6013e12c5d1SDavid du Colombier 	evlist[evi++] = ev;
6023e12c5d1SDavid du Colombier e1:
6033e12c5d1SDavid du Colombier 	if (ev == nxev)
6043e12c5d1SDavid du Colombier 		return;
6053e12c5d1SDavid du Colombier 	ev = nxev;
6063e12c5d1SDavid du Colombier 	envp = &env[ev];
6073e12c5d1SDavid du Colombier }
6083e12c5d1SDavid du Colombier 
envcopy(Env * e1,Env * e2)6093e12c5d1SDavid du Colombier void envcopy(Env *e1, Env *e2)	/* copy env e2 to e1 */
6103e12c5d1SDavid du Colombier {
6113e12c5d1SDavid du Colombier 	*e1 = *e2;	/* rumor hath that this fails on some machines */
6123e12c5d1SDavid du Colombier }
6133e12c5d1SDavid du Colombier 
6143e12c5d1SDavid du Colombier 
caseel(void)6153e12c5d1SDavid du Colombier void caseel(void)
6163e12c5d1SDavid du Colombier {
6173e12c5d1SDavid du Colombier 	if (--ifx < 0) {
6183e12c5d1SDavid du Colombier 		ifx = 0;
6193e12c5d1SDavid du Colombier 		iflist[0] = 0;
6203e12c5d1SDavid du Colombier 	}
6213e12c5d1SDavid du Colombier 	caseif1(2);
6223e12c5d1SDavid du Colombier }
6233e12c5d1SDavid du Colombier 
6243e12c5d1SDavid du Colombier 
caseie(void)6253e12c5d1SDavid du Colombier void caseie(void)
6263e12c5d1SDavid du Colombier {
6273e12c5d1SDavid du Colombier 	if (ifx >= NIF) {
6283e12c5d1SDavid du Colombier 		ERROR "if-else overflow." WARN;
6293e12c5d1SDavid du Colombier 		ifx = 0;
6303e12c5d1SDavid du Colombier 		edone(040);
6313e12c5d1SDavid du Colombier 	}
6323e12c5d1SDavid du Colombier 	caseif1(1);
6333e12c5d1SDavid du Colombier 	ifx++;
6343e12c5d1SDavid du Colombier }
6353e12c5d1SDavid du Colombier 
6363e12c5d1SDavid du Colombier 
caseif(void)6373e12c5d1SDavid du Colombier void caseif(void)
6383e12c5d1SDavid du Colombier {
6393e12c5d1SDavid du Colombier 	caseif1(0);
6403e12c5d1SDavid du Colombier }
6413e12c5d1SDavid du Colombier 
caseif1(int x)6423e12c5d1SDavid du Colombier void caseif1(int x)
6433e12c5d1SDavid du Colombier {
6443e12c5d1SDavid du Colombier 	extern int falsef;
6453e12c5d1SDavid du Colombier 	int notflag, true;
6463e12c5d1SDavid du Colombier 	Tchar i;
6473e12c5d1SDavid du Colombier 
6483e12c5d1SDavid du Colombier 	if (x == 2) {
6493e12c5d1SDavid du Colombier 		notflag = 0;
6503e12c5d1SDavid du Colombier 		true = iflist[ifx];
6513e12c5d1SDavid du Colombier 		goto i1;
6523e12c5d1SDavid du Colombier 	}
6533e12c5d1SDavid du Colombier 	true = 0;
6543e12c5d1SDavid du Colombier 	skip();
6553e12c5d1SDavid du Colombier 	if ((cbits(i = getch())) == '!') {
6563e12c5d1SDavid du Colombier 		notflag = 1;
6573e12c5d1SDavid du Colombier 	} else {
6583e12c5d1SDavid du Colombier 		notflag = 0;
6593e12c5d1SDavid du Colombier 		ch = i;
6603e12c5d1SDavid du Colombier 	}
661219b2ee8SDavid du Colombier 	ifnum++;
6623e12c5d1SDavid du Colombier 	i = atoi0();
663219b2ee8SDavid du Colombier 	ifnum = 0;
6643e12c5d1SDavid du Colombier 	if (!nonumb) {
6653e12c5d1SDavid du Colombier 		if (i > 0)
6663e12c5d1SDavid du Colombier 			true++;
6673e12c5d1SDavid du Colombier 		goto i1;
6683e12c5d1SDavid du Colombier 	}
6693e12c5d1SDavid du Colombier 	i = getch();
6703e12c5d1SDavid du Colombier 	switch (cbits(i)) {
6713e12c5d1SDavid du Colombier 	case 'e':
672219b2ee8SDavid du Colombier 		if (!(numtabp[PN].val & 01))
6733e12c5d1SDavid du Colombier 			true++;
6743e12c5d1SDavid du Colombier 		break;
6753e12c5d1SDavid du Colombier 	case 'o':
676219b2ee8SDavid du Colombier 		if (numtabp[PN].val & 01)
6773e12c5d1SDavid du Colombier 			true++;
6783e12c5d1SDavid du Colombier 		break;
6793e12c5d1SDavid du Colombier 	case 'n':
6803e12c5d1SDavid du Colombier 		if (NROFF)
6813e12c5d1SDavid du Colombier 			true++;
6823e12c5d1SDavid du Colombier 		break;
6833e12c5d1SDavid du Colombier 	case 't':
6843e12c5d1SDavid du Colombier 		if (TROFF)
6853e12c5d1SDavid du Colombier 			true++;
6863e12c5d1SDavid du Colombier 		break;
6873e12c5d1SDavid du Colombier 	case ' ':
6883e12c5d1SDavid du Colombier 		break;
6893e12c5d1SDavid du Colombier 	default:
6903e12c5d1SDavid du Colombier 		true = cmpstr(i);
6913e12c5d1SDavid du Colombier 	}
6923e12c5d1SDavid du Colombier i1:
6933e12c5d1SDavid du Colombier 	true ^= notflag;
6943e12c5d1SDavid du Colombier 	if (x == 1)
6953e12c5d1SDavid du Colombier 		iflist[ifx] = !true;
6963e12c5d1SDavid du Colombier 	if (true) {
6973e12c5d1SDavid du Colombier i2:
6983e12c5d1SDavid du Colombier 		while ((cbits(i = getch())) == ' ')
6993e12c5d1SDavid du Colombier 			;
7003e12c5d1SDavid du Colombier 		if (cbits(i) == LEFT)
7013e12c5d1SDavid du Colombier 			goto i2;
7023e12c5d1SDavid du Colombier 		ch = i;
7033e12c5d1SDavid du Colombier 		nflush++;
7043e12c5d1SDavid du Colombier 	} else {
705219b2ee8SDavid du Colombier 		if (!nlflg) {
7063e12c5d1SDavid du Colombier 			copyf++;
7073e12c5d1SDavid du Colombier 			falsef++;
7083e12c5d1SDavid du Colombier 			eatblk(0);
7093e12c5d1SDavid du Colombier 			copyf--;
7103e12c5d1SDavid du Colombier 			falsef--;
7113e12c5d1SDavid du Colombier 		}
7123e12c5d1SDavid du Colombier 	}
713219b2ee8SDavid du Colombier }
7143e12c5d1SDavid du Colombier 
eatblk(int inblk)7153e12c5d1SDavid du Colombier void eatblk(int inblk)
7163e12c5d1SDavid du Colombier {
7173e12c5d1SDavid du Colombier 	int cnt, i;
7183e12c5d1SDavid du Colombier 
7193e12c5d1SDavid du Colombier 	cnt = 0;
7203e12c5d1SDavid du Colombier 	do {
7213e12c5d1SDavid du Colombier 		if (ch)	{
7223e12c5d1SDavid du Colombier 			i = cbits(ch);
7233e12c5d1SDavid du Colombier 			ch = 0;
7243e12c5d1SDavid du Colombier 		} else
7253e12c5d1SDavid du Colombier 			i = cbits(getch0());
7263e12c5d1SDavid du Colombier 		if (i == ESC)
7273e12c5d1SDavid du Colombier 			cnt++;
7283e12c5d1SDavid du Colombier 		else {
7293e12c5d1SDavid du Colombier 			if (cnt == 1)
7303e12c5d1SDavid du Colombier 				switch (i) {
7313e12c5d1SDavid du Colombier 				case '{':  i = LEFT; break;
7323e12c5d1SDavid du Colombier 				case '}':  i = RIGHT; break;
7333e12c5d1SDavid du Colombier 				case '\n': i = 'x'; break;
7343e12c5d1SDavid du Colombier 				}
7353e12c5d1SDavid du Colombier 			cnt = 0;
7363e12c5d1SDavid du Colombier 		}
7373e12c5d1SDavid du Colombier 		if (i == LEFT) eatblk(1);
7383e12c5d1SDavid du Colombier 	} while ((!inblk && (i != '\n')) || (inblk && (i != RIGHT)));
739219b2ee8SDavid du Colombier 	if (i == '\n') {
7403e12c5d1SDavid du Colombier 		nlflg++;
741219b2ee8SDavid du Colombier 		if (ip == 0)
742219b2ee8SDavid du Colombier 			numtabp[CD].val++;
743219b2ee8SDavid du Colombier 	}
7443e12c5d1SDavid du Colombier }
7453e12c5d1SDavid du Colombier 
7463e12c5d1SDavid du Colombier 
cmpstr(Tchar c)7473e12c5d1SDavid du Colombier cmpstr(Tchar c)
7483e12c5d1SDavid du Colombier {
7493e12c5d1SDavid du Colombier 	int j, delim;
7503e12c5d1SDavid du Colombier 	Tchar i;
7513e12c5d1SDavid du Colombier 	int val;
7523e12c5d1SDavid du Colombier 	int savapts, savapts1, savfont, savfont1, savpts, savpts1;
7533e12c5d1SDavid du Colombier 	Tchar string[1280];
7543e12c5d1SDavid du Colombier 	Tchar *sp;
7553e12c5d1SDavid du Colombier 
7563e12c5d1SDavid du Colombier 	if (ismot(c))
7573e12c5d1SDavid du Colombier 		return(0);
7583e12c5d1SDavid du Colombier 	delim = cbits(c);
7593e12c5d1SDavid du Colombier 	savapts = apts;
7603e12c5d1SDavid du Colombier 	savapts1 = apts1;
7613e12c5d1SDavid du Colombier 	savfont = font;
7623e12c5d1SDavid du Colombier 	savfont1 = font1;
7633e12c5d1SDavid du Colombier 	savpts = pts;
7643e12c5d1SDavid du Colombier 	savpts1 = pts1;
7653e12c5d1SDavid du Colombier 	sp = string;
7663e12c5d1SDavid du Colombier 	while ((j = cbits(i = getch()))!=delim && j!='\n' && sp<&string[1280-1])
7673e12c5d1SDavid du Colombier 		*sp++ = i;
7683e12c5d1SDavid du Colombier 	if (sp >= string + 1280) {
7693e12c5d1SDavid du Colombier 		ERROR "too-long string compare." WARN;
7703e12c5d1SDavid du Colombier 		edone(0100);
7713e12c5d1SDavid du Colombier 	}
7723e12c5d1SDavid du Colombier 	if (nlflg) {
7733e12c5d1SDavid du Colombier 		val = sp==string;
7743e12c5d1SDavid du Colombier 		goto rtn;
7753e12c5d1SDavid du Colombier 	}
7763e12c5d1SDavid du Colombier 	*sp = 0;
7773e12c5d1SDavid du Colombier 	apts = savapts;
7783e12c5d1SDavid du Colombier 	apts1 = savapts1;
7793e12c5d1SDavid du Colombier 	font = savfont;
7803e12c5d1SDavid du Colombier 	font1 = savfont1;
7813e12c5d1SDavid du Colombier 	pts = savpts;
7823e12c5d1SDavid du Colombier 	pts1 = savpts1;
7833e12c5d1SDavid du Colombier 	mchbits();
7843e12c5d1SDavid du Colombier 	val = 1;
7853e12c5d1SDavid du Colombier 	sp = string;
7863e12c5d1SDavid du Colombier 	while ((j = cbits(i = getch())) != delim && j != '\n') {
7873e12c5d1SDavid du Colombier 		if (*sp != i) {
7883e12c5d1SDavid du Colombier 			eat(delim);
7893e12c5d1SDavid du Colombier 			val = 0;
7903e12c5d1SDavid du Colombier 			goto rtn;
7913e12c5d1SDavid du Colombier 		}
7923e12c5d1SDavid du Colombier 		sp++;
7933e12c5d1SDavid du Colombier 	}
7943e12c5d1SDavid du Colombier 	if (*sp)
7953e12c5d1SDavid du Colombier 		val = 0;
7963e12c5d1SDavid du Colombier rtn:
7973e12c5d1SDavid du Colombier 	apts = savapts;
7983e12c5d1SDavid du Colombier 	apts1 = savapts1;
7993e12c5d1SDavid du Colombier 	font = savfont;
8003e12c5d1SDavid du Colombier 	font1 = savfont1;
8013e12c5d1SDavid du Colombier 	pts = savpts;
8023e12c5d1SDavid du Colombier 	pts1 = savpts1;
8033e12c5d1SDavid du Colombier 	mchbits();
8043e12c5d1SDavid du Colombier 	return(val);
8053e12c5d1SDavid du Colombier }
8063e12c5d1SDavid du Colombier 
8073e12c5d1SDavid du Colombier 
caserd(void)8083e12c5d1SDavid du Colombier void caserd(void)
8093e12c5d1SDavid du Colombier {
8103e12c5d1SDavid du Colombier 
8113e12c5d1SDavid du Colombier 	lgf++;
8123e12c5d1SDavid du Colombier 	skip();
8133e12c5d1SDavid du Colombier 	getname();
8143e12c5d1SDavid du Colombier 	if (!iflg) {
8153e12c5d1SDavid du Colombier 		if (quiet) {
8163e12c5d1SDavid du Colombier 			if (NROFF) {
8173e12c5d1SDavid du Colombier 				echo_off();
8183e12c5d1SDavid du Colombier 				flusho();
8193e12c5d1SDavid du Colombier 			}
8203e12c5d1SDavid du Colombier 			fprintf(stderr, "\007"); /*bell*/
8213e12c5d1SDavid du Colombier 		} else {
8223e12c5d1SDavid du Colombier 			if (nextf[0]) {
8233e12c5d1SDavid du Colombier 				fprintf(stderr, "%s:", nextf);
8243e12c5d1SDavid du Colombier 			} else {
8253e12c5d1SDavid du Colombier 				fprintf(stderr, "\007"); /*bell*/
8263e12c5d1SDavid du Colombier 			}
8273e12c5d1SDavid du Colombier 		}
8283e12c5d1SDavid du Colombier 	}
8293e12c5d1SDavid du Colombier 	collect();
8303e12c5d1SDavid du Colombier 	tty++;
8313e12c5d1SDavid du Colombier 	pushi(RD_OFFSET, PAIR('r','d'));
8323e12c5d1SDavid du Colombier }
8333e12c5d1SDavid du Colombier 
8343e12c5d1SDavid du Colombier 
rdtty(void)8353e12c5d1SDavid du Colombier rdtty(void)
8363e12c5d1SDavid du Colombier {
8373e12c5d1SDavid du Colombier 	char	onechar;
8383e12c5d1SDavid du Colombier 
8393e12c5d1SDavid du Colombier 	onechar = 0;
8403e12c5d1SDavid du Colombier 	if (read(0, &onechar, 1) == 1) {
8413e12c5d1SDavid du Colombier 		if (onechar == '\n')
8423e12c5d1SDavid du Colombier 			tty++;
8433e12c5d1SDavid du Colombier 		else
8443e12c5d1SDavid du Colombier 			tty = 1;
8453e12c5d1SDavid du Colombier 		if (tty != 3)
8463e12c5d1SDavid du Colombier 			return(onechar);
8473e12c5d1SDavid du Colombier 	}
8483e12c5d1SDavid du Colombier 	tty = 0;
8493e12c5d1SDavid du Colombier 	if (NROFF && quiet)
8503e12c5d1SDavid du Colombier 		echo_on();
8513e12c5d1SDavid du Colombier 	return(0);
8523e12c5d1SDavid du Colombier }
8533e12c5d1SDavid du Colombier 
8543e12c5d1SDavid du Colombier 
caseec(void)8553e12c5d1SDavid du Colombier void caseec(void)
8563e12c5d1SDavid du Colombier {
8573e12c5d1SDavid du Colombier 	eschar = chget('\\');
8583e12c5d1SDavid du Colombier }
8593e12c5d1SDavid du Colombier 
8603e12c5d1SDavid du Colombier 
caseeo(void)8613e12c5d1SDavid du Colombier void caseeo(void)
8623e12c5d1SDavid du Colombier {
8633e12c5d1SDavid du Colombier 	eschar = 0;
8643e12c5d1SDavid du Colombier }
8653e12c5d1SDavid du Colombier 
8663e12c5d1SDavid du Colombier 
caseta(void)8673e12c5d1SDavid du Colombier void caseta(void)
8683e12c5d1SDavid du Colombier {
869219b2ee8SDavid du Colombier 	int i, j, k;
8703e12c5d1SDavid du Colombier 
8713e12c5d1SDavid du Colombier 	tabtab[0] = nonumb = 0;
8723e12c5d1SDavid du Colombier 	for (i = 0; ((i < (NTAB - 1)) && !nonumb); i++) {
8733e12c5d1SDavid du Colombier 		if (skip())
8743e12c5d1SDavid du Colombier 			break;
875219b2ee8SDavid du Colombier 		k = tabtab[max(i-1, 0)] & TABMASK;
876219b2ee8SDavid du Colombier 		if ((j = max(hnumb(&k), 0)) > TABMASK) {
877219b2ee8SDavid du Colombier 			ERROR "Tab too far away" WARN;
878219b2ee8SDavid du Colombier 			j = TABMASK;
879219b2ee8SDavid du Colombier 		}
880219b2ee8SDavid du Colombier 		tabtab[i] = j & TABMASK;
8813e12c5d1SDavid du Colombier 		if (!nonumb)
8823e12c5d1SDavid du Colombier 			switch (cbits(ch)) {
8833e12c5d1SDavid du Colombier 			case 'C':
8843e12c5d1SDavid du Colombier 				tabtab[i] |= CTAB;
8853e12c5d1SDavid du Colombier 				break;
8863e12c5d1SDavid du Colombier 			case 'R':
8873e12c5d1SDavid du Colombier 				tabtab[i] |= RTAB;
8883e12c5d1SDavid du Colombier 				break;
8893e12c5d1SDavid du Colombier 			default: /*includes L*/
8903e12c5d1SDavid du Colombier 				break;
8913e12c5d1SDavid du Colombier 			}
8923e12c5d1SDavid du Colombier 		nonumb = ch = 0;
8933e12c5d1SDavid du Colombier 	}
894219b2ee8SDavid du Colombier 	if (!skip())
895219b2ee8SDavid du Colombier 		ERROR "Too many tab stops" WARN;
8963e12c5d1SDavid du Colombier 	tabtab[i] = 0;
8973e12c5d1SDavid du Colombier }
8983e12c5d1SDavid du Colombier 
8993e12c5d1SDavid du Colombier 
casene(void)9003e12c5d1SDavid du Colombier void casene(void)
9013e12c5d1SDavid du Colombier {
9023e12c5d1SDavid du Colombier 	int i, j;
9033e12c5d1SDavid du Colombier 
9043e12c5d1SDavid du Colombier 	skip();
9053e12c5d1SDavid du Colombier 	i = vnumb((int *)0);
9063e12c5d1SDavid du Colombier 	if (nonumb)
9073e12c5d1SDavid du Colombier 		i = lss;
908219b2ee8SDavid du Colombier 	if (dip == d && numtabp[NL].val == -1) {
909219b2ee8SDavid du Colombier 		newline(1);
910219b2ee8SDavid du Colombier 		return;
911219b2ee8SDavid du Colombier 	}
9123e12c5d1SDavid du Colombier 	if (i > (j = findt1())) {
9133e12c5d1SDavid du Colombier 		i = lss;
9143e12c5d1SDavid du Colombier 		lss = j;
9153e12c5d1SDavid du Colombier 		dip->nls = 0;
9163e12c5d1SDavid du Colombier 		newline(0);
9173e12c5d1SDavid du Colombier 		lss = i;
9183e12c5d1SDavid du Colombier 	}
9193e12c5d1SDavid du Colombier }
9203e12c5d1SDavid du Colombier 
9213e12c5d1SDavid du Colombier 
casetr(void)9223e12c5d1SDavid du Colombier void casetr(void)
9233e12c5d1SDavid du Colombier {
9243e12c5d1SDavid du Colombier 	int i, j;
9253e12c5d1SDavid du Colombier 	Tchar k;
9263e12c5d1SDavid du Colombier 
9273e12c5d1SDavid du Colombier 	lgf++;
9283e12c5d1SDavid du Colombier 	skip();
9293e12c5d1SDavid du Colombier 	while ((i = cbits(k=getch())) != '\n') {
9303e12c5d1SDavid du Colombier 		if (ismot(k))
9313e12c5d1SDavid du Colombier 			return;
9323e12c5d1SDavid du Colombier 		if (ismot(k = getch()))
9333e12c5d1SDavid du Colombier 			return;
9343e12c5d1SDavid du Colombier 		if ((j = cbits(k)) == '\n')
9353e12c5d1SDavid du Colombier 			j = ' ';
9363e12c5d1SDavid du Colombier 		trtab[i] = j;
9373e12c5d1SDavid du Colombier 	}
9383e12c5d1SDavid du Colombier }
9393e12c5d1SDavid du Colombier 
9403e12c5d1SDavid du Colombier 
casecu(void)9413e12c5d1SDavid du Colombier void casecu(void)
9423e12c5d1SDavid du Colombier {
9433e12c5d1SDavid du Colombier 	cu++;
9443e12c5d1SDavid du Colombier 	caseul();
9453e12c5d1SDavid du Colombier }
9463e12c5d1SDavid du Colombier 
9473e12c5d1SDavid du Colombier 
caseul(void)9483e12c5d1SDavid du Colombier void caseul(void)
9493e12c5d1SDavid du Colombier {
9503e12c5d1SDavid du Colombier 	int i;
9513e12c5d1SDavid du Colombier 
9523e12c5d1SDavid du Colombier 	noscale++;
953219b2ee8SDavid du Colombier 	skip();
954219b2ee8SDavid du Colombier 	i = max(atoi0(), 0);
955219b2ee8SDavid du Colombier 	if (nonumb)
9563e12c5d1SDavid du Colombier 		i = 1;
9573e12c5d1SDavid du Colombier 	if (ul && (i == 0)) {
9583e12c5d1SDavid du Colombier 		font = sfont;
9593e12c5d1SDavid du Colombier 		ul = cu = 0;
9603e12c5d1SDavid du Colombier 	}
9613e12c5d1SDavid du Colombier 	if (i) {
9623e12c5d1SDavid du Colombier 		if (!ul) {
9633e12c5d1SDavid du Colombier 			sfont = font;
9643e12c5d1SDavid du Colombier 			font = ulfont;
9653e12c5d1SDavid du Colombier 		}
9663e12c5d1SDavid du Colombier 		ul = i;
9673e12c5d1SDavid du Colombier 	}
9683e12c5d1SDavid du Colombier 	noscale = 0;
9693e12c5d1SDavid du Colombier 	mchbits();
9703e12c5d1SDavid du Colombier }
9713e12c5d1SDavid du Colombier 
9723e12c5d1SDavid du Colombier 
caseuf(void)9733e12c5d1SDavid du Colombier void caseuf(void)
9743e12c5d1SDavid du Colombier {
9753e12c5d1SDavid du Colombier 	int i, j;
9763e12c5d1SDavid du Colombier 
9773e12c5d1SDavid du Colombier 	if (skip() || !(i = getrq()) || i == 'S' ||  (j = findft(i))  == -1)
9783e12c5d1SDavid du Colombier 		ulfont = ULFONT; /*default underline position*/
9793e12c5d1SDavid du Colombier 	else
9803e12c5d1SDavid du Colombier 		ulfont = j;
9813e12c5d1SDavid du Colombier 	if (NROFF && ulfont == FT)
9823e12c5d1SDavid du Colombier 		ulfont = ULFONT;
9833e12c5d1SDavid du Colombier }
9843e12c5d1SDavid du Colombier 
9853e12c5d1SDavid du Colombier 
caseit(void)9863e12c5d1SDavid du Colombier void caseit(void)
9873e12c5d1SDavid du Colombier {
9883e12c5d1SDavid du Colombier 	int i;
9893e12c5d1SDavid du Colombier 
9903e12c5d1SDavid du Colombier 	lgf++;
9913e12c5d1SDavid du Colombier 	it = itmac = 0;
9923e12c5d1SDavid du Colombier 	noscale++;
9933e12c5d1SDavid du Colombier 	skip();
9943e12c5d1SDavid du Colombier 	i = atoi0();
9953e12c5d1SDavid du Colombier 	skip();
9963e12c5d1SDavid du Colombier 	if (!nonumb && (itmac = getrq()))
9973e12c5d1SDavid du Colombier 		it = i;
9983e12c5d1SDavid du Colombier 	noscale = 0;
9993e12c5d1SDavid du Colombier }
10003e12c5d1SDavid du Colombier 
10013e12c5d1SDavid du Colombier 
casemc(void)10023e12c5d1SDavid du Colombier void casemc(void)
10033e12c5d1SDavid du Colombier {
10043e12c5d1SDavid du Colombier 	int i;
10053e12c5d1SDavid du Colombier 
10063e12c5d1SDavid du Colombier 	if (icf > 1)
10073e12c5d1SDavid du Colombier 		ic = 0;
10083e12c5d1SDavid du Colombier 	icf = 0;
10093e12c5d1SDavid du Colombier 	if (skip())
10103e12c5d1SDavid du Colombier 		return;
10113e12c5d1SDavid du Colombier 	ic = getch();
10123e12c5d1SDavid du Colombier 	icf = 1;
10133e12c5d1SDavid du Colombier 	skip();
10143e12c5d1SDavid du Colombier 	i = max(hnumb((int *)0), 0);
10153e12c5d1SDavid du Colombier 	if (!nonumb)
10163e12c5d1SDavid du Colombier 		ics = i;
10173e12c5d1SDavid du Colombier }
10183e12c5d1SDavid du Colombier 
10193e12c5d1SDavid du Colombier 
casemk(void)10203e12c5d1SDavid du Colombier void casemk(void)
10213e12c5d1SDavid du Colombier {
10223e12c5d1SDavid du Colombier 	int i, j;
10233e12c5d1SDavid du Colombier 
10243e12c5d1SDavid du Colombier 	if (dip != d)
10253e12c5d1SDavid du Colombier 		j = dip->dnl;
10263e12c5d1SDavid du Colombier 	else
1027219b2ee8SDavid du Colombier 		j = numtabp[NL].val;
10283e12c5d1SDavid du Colombier 	if (skip()) {
10293e12c5d1SDavid du Colombier 		dip->mkline = j;
10303e12c5d1SDavid du Colombier 		return;
10313e12c5d1SDavid du Colombier 	}
10323e12c5d1SDavid du Colombier 	if ((i = getrq()) == 0)
10333e12c5d1SDavid du Colombier 		return;
1034219b2ee8SDavid du Colombier 	numtabp[findr(i)].val = j;
10353e12c5d1SDavid du Colombier }
10363e12c5d1SDavid du Colombier 
10373e12c5d1SDavid du Colombier 
casesv(void)10383e12c5d1SDavid du Colombier void casesv(void)
10393e12c5d1SDavid du Colombier {
10403e12c5d1SDavid du Colombier 	int i;
10413e12c5d1SDavid du Colombier 
10423e12c5d1SDavid du Colombier 	skip();
10433e12c5d1SDavid du Colombier 	if ((i = vnumb((int *)0)) < 0)
10443e12c5d1SDavid du Colombier 		return;
10453e12c5d1SDavid du Colombier 	if (nonumb)
10463e12c5d1SDavid du Colombier 		i = 1;
10473e12c5d1SDavid du Colombier 	sv += i;
10483e12c5d1SDavid du Colombier 	caseos();
10493e12c5d1SDavid du Colombier }
10503e12c5d1SDavid du Colombier 
10513e12c5d1SDavid du Colombier 
caseos(void)10523e12c5d1SDavid du Colombier void caseos(void)
10533e12c5d1SDavid du Colombier {
10543e12c5d1SDavid du Colombier 	int savlss;
10553e12c5d1SDavid du Colombier 
10563e12c5d1SDavid du Colombier 	if (sv <= findt1()) {
10573e12c5d1SDavid du Colombier 		savlss = lss;
10583e12c5d1SDavid du Colombier 		lss = sv;
10593e12c5d1SDavid du Colombier 		newline(0);
10603e12c5d1SDavid du Colombier 		lss = savlss;
10613e12c5d1SDavid du Colombier 		sv = 0;
10623e12c5d1SDavid du Colombier 	}
10633e12c5d1SDavid du Colombier }
10643e12c5d1SDavid du Colombier 
10653e12c5d1SDavid du Colombier 
casenm(void)10663e12c5d1SDavid du Colombier void casenm(void)
10673e12c5d1SDavid du Colombier {
10683e12c5d1SDavid du Colombier 	int i;
10693e12c5d1SDavid du Colombier 
10703e12c5d1SDavid du Colombier 	lnmod = nn = 0;
10713e12c5d1SDavid du Colombier 	if (skip())
10723e12c5d1SDavid du Colombier 		return;
10733e12c5d1SDavid du Colombier 	lnmod++;
10743e12c5d1SDavid du Colombier 	noscale++;
1075219b2ee8SDavid du Colombier 	i = inumb(&numtabp[LN].val);
10763e12c5d1SDavid du Colombier 	if (!nonumb)
1077219b2ee8SDavid du Colombier 		numtabp[LN].val = max(i, 0);
10783e12c5d1SDavid du Colombier 	getnm(&ndf, 1);
10793e12c5d1SDavid du Colombier 	getnm(&nms, 0);
10803e12c5d1SDavid du Colombier 	getnm(&ni, 0);
1081219b2ee8SDavid du Colombier 	getnm(&nmwid, 3);	/* really kludgy! */
10823e12c5d1SDavid du Colombier 	noscale = 0;
10833e12c5d1SDavid du Colombier 	nmbits = chbits;
10843e12c5d1SDavid du Colombier }
10853e12c5d1SDavid du Colombier 
1086219b2ee8SDavid du Colombier /*
1087219b2ee8SDavid du Colombier  * .nm relies on the fact that illegal args are skipped; don't warn
1088219b2ee8SDavid du Colombier  * for illegality of these
1089219b2ee8SDavid du Colombier  */
getnm(int * p,int min)10903e12c5d1SDavid du Colombier void getnm(int *p, int min)
10913e12c5d1SDavid du Colombier {
10923e12c5d1SDavid du Colombier 	int i;
1093219b2ee8SDavid du Colombier 	int savtr = trace;
10943e12c5d1SDavid du Colombier 
10953e12c5d1SDavid du Colombier 	eat(' ');
10963e12c5d1SDavid du Colombier 	if (skip())
10973e12c5d1SDavid du Colombier 		return;
1098219b2ee8SDavid du Colombier 	trace = 0;
10993e12c5d1SDavid du Colombier 	i = atoi0();
11003e12c5d1SDavid du Colombier 	if (nonumb)
11013e12c5d1SDavid du Colombier 		return;
11023e12c5d1SDavid du Colombier 	*p = max(i, min);
1103219b2ee8SDavid du Colombier 	trace = savtr;
11043e12c5d1SDavid du Colombier }
11053e12c5d1SDavid du Colombier 
11063e12c5d1SDavid du Colombier 
casenn(void)11073e12c5d1SDavid du Colombier void casenn(void)
11083e12c5d1SDavid du Colombier {
11093e12c5d1SDavid du Colombier 	noscale++;
11103e12c5d1SDavid du Colombier 	skip();
11113e12c5d1SDavid du Colombier 	nn = max(atoi0(), 1);
11123e12c5d1SDavid du Colombier 	noscale = 0;
11133e12c5d1SDavid du Colombier }
11143e12c5d1SDavid du Colombier 
11153e12c5d1SDavid du Colombier 
caseab(void)11163e12c5d1SDavid du Colombier void caseab(void)
11173e12c5d1SDavid du Colombier {
1118219b2ee8SDavid du Colombier 	casetm1(1, stderr);
11193e12c5d1SDavid du Colombier 	done3(0);
11203e12c5d1SDavid du Colombier }
11213e12c5d1SDavid du Colombier 
11223e12c5d1SDavid du Colombier 
11233e12c5d1SDavid du Colombier /* nroff terminal handling has been pretty well excised */
11243e12c5d1SDavid du Colombier /* as part of the merge with troff.  these are ghostly remnants, */
11253e12c5d1SDavid du Colombier /* called, but doing nothing. restore them at your peril. */
11263e12c5d1SDavid du Colombier 
11273e12c5d1SDavid du Colombier 
save_tty(void)11283e12c5d1SDavid du Colombier void save_tty(void)			/*save any tty settings that may be changed*/
11293e12c5d1SDavid du Colombier {
11303e12c5d1SDavid du Colombier }
11313e12c5d1SDavid du Colombier 
11323e12c5d1SDavid du Colombier 
restore_tty(void)11333e12c5d1SDavid du Colombier void restore_tty(void)			/*restore tty settings from beginning*/
11343e12c5d1SDavid du Colombier {
11353e12c5d1SDavid du Colombier }
11363e12c5d1SDavid du Colombier 
11373e12c5d1SDavid du Colombier 
set_tty(void)11383e12c5d1SDavid du Colombier void set_tty(void)
11393e12c5d1SDavid du Colombier {
11403e12c5d1SDavid du Colombier }
11413e12c5d1SDavid du Colombier 
11423e12c5d1SDavid du Colombier 
echo_off(void)11433e12c5d1SDavid du Colombier void echo_off(void)			/*turn off ECHO for .rd in "-q" mode*/
11443e12c5d1SDavid du Colombier {
11453e12c5d1SDavid du Colombier }
11463e12c5d1SDavid du Colombier 
11473e12c5d1SDavid du Colombier 
echo_on(void)11483e12c5d1SDavid du Colombier void echo_on(void)			/*restore ECHO after .rd in "-q" mode*/
11493e12c5d1SDavid du Colombier {
11503e12c5d1SDavid du Colombier }
1151