xref: /plan9-contrib/sys/src/cmd/troff/n7.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
13e12c5d1SDavid du Colombier #include "tdef.h"
23e12c5d1SDavid du Colombier #include "fns.h"
33e12c5d1SDavid du Colombier #include "ext.h"
43e12c5d1SDavid du Colombier 
5219b2ee8SDavid du Colombier #ifdef STRICT
6219b2ee8SDavid du Colombier 	/* not in ANSI or POSIX */
7*14f51593SDavid du Colombier #undef  isascii
8219b2ee8SDavid du Colombier #define	isascii(a) ((a) >= 0 && (a) <= 127)
9219b2ee8SDavid du Colombier #endif
10219b2ee8SDavid du Colombier 
113e12c5d1SDavid du Colombier #define GETCH gettch
123e12c5d1SDavid du Colombier Tchar	gettch(void);
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier /*
163e12c5d1SDavid du Colombier  * troff7.c
173e12c5d1SDavid du Colombier  *
183e12c5d1SDavid du Colombier  * text
193e12c5d1SDavid du Colombier  */
203e12c5d1SDavid du Colombier 
213e12c5d1SDavid du Colombier int	brflg;
223e12c5d1SDavid du Colombier 
tbreak(void)233e12c5d1SDavid du Colombier void tbreak(void)
243e12c5d1SDavid du Colombier {
253e12c5d1SDavid du Colombier 	int pad, k;
263e12c5d1SDavid du Colombier 	Tchar *i, j;
273e12c5d1SDavid du Colombier 	int resol;
283e12c5d1SDavid du Colombier 	int un0 = un;
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier 	trap = 0;
313e12c5d1SDavid du Colombier 	if (nb)
323e12c5d1SDavid du Colombier 		return;
33219b2ee8SDavid du Colombier 	if (dip == d && numtabp[NL].val == -1) {
343e12c5d1SDavid du Colombier 		newline(1);
353e12c5d1SDavid du Colombier 		return;
363e12c5d1SDavid du Colombier 	}
373e12c5d1SDavid du Colombier 	if (!nc) {
383e12c5d1SDavid du Colombier 		setnel();
393e12c5d1SDavid du Colombier 		if (!wch)
403e12c5d1SDavid du Colombier 			return;
413e12c5d1SDavid du Colombier 		if (pendw)
423e12c5d1SDavid du Colombier 			getword(1);
433e12c5d1SDavid du Colombier 		movword();
443e12c5d1SDavid du Colombier 	} else if (pendw && !brflg) {
453e12c5d1SDavid du Colombier 		getword(1);
463e12c5d1SDavid du Colombier 		movword();
473e12c5d1SDavid du Colombier 	}
483e12c5d1SDavid du Colombier 	*linep = dip->nls = 0;
493e12c5d1SDavid du Colombier 	if (NROFF && dip == d)
503e12c5d1SDavid du Colombier 		horiz(po);
513e12c5d1SDavid du Colombier 	if (lnmod)
523e12c5d1SDavid du Colombier 		donum();
533e12c5d1SDavid du Colombier 	lastl = ne;
543e12c5d1SDavid du Colombier 	if (brflg != 1) {
553e12c5d1SDavid du Colombier 		totout = 0;
563e12c5d1SDavid du Colombier 	} else if (ad) {
573e12c5d1SDavid du Colombier 		if ((lastl = ll - un) < ne)
583e12c5d1SDavid du Colombier 			lastl = ne;
593e12c5d1SDavid du Colombier 	}
603e12c5d1SDavid du Colombier 	if (admod && ad && (brflg != 2)) {
613e12c5d1SDavid du Colombier 		lastl = ne;
623e12c5d1SDavid du Colombier 		adsp = adrem = 0;
633e12c5d1SDavid du Colombier 		if (admod == 1)
643e12c5d1SDavid du Colombier 			un +=  quant(nel / 2, HOR);
653e12c5d1SDavid du Colombier 		else if (admod == 2)
663e12c5d1SDavid du Colombier 			un += nel;
673e12c5d1SDavid du Colombier 	}
683e12c5d1SDavid du Colombier 	totout++;
693e12c5d1SDavid du Colombier 	brflg = 0;
703e12c5d1SDavid du Colombier 	if (lastl + un > dip->maxl)
713e12c5d1SDavid du Colombier 		dip->maxl = lastl + un;
723e12c5d1SDavid du Colombier 	horiz(un);
733e12c5d1SDavid du Colombier 	if (NROFF) {
743e12c5d1SDavid du Colombier 		if (adrem % t.Adj)
753e12c5d1SDavid du Colombier 			resol = t.Hor;
763e12c5d1SDavid du Colombier 		else
773e12c5d1SDavid du Colombier 			resol = t.Adj;
783e12c5d1SDavid du Colombier 	} else
793e12c5d1SDavid du Colombier 		resol = HOR;
803e12c5d1SDavid du Colombier 
813e12c5d1SDavid du Colombier 	lastl = ne + (nwd-1) * adsp + adrem;
823e12c5d1SDavid du Colombier 	for (i = line; nc > 0; ) {
833e12c5d1SDavid du Colombier 		if ((cbits(j = *i++)) == ' ') {
843e12c5d1SDavid du Colombier 			pad = 0;
853e12c5d1SDavid du Colombier 			do {
863e12c5d1SDavid du Colombier 				pad += width(j);
873e12c5d1SDavid du Colombier 				nc--;
883e12c5d1SDavid du Colombier 			} while ((cbits(j = *i++)) == ' ');
893e12c5d1SDavid du Colombier 			i--;
903e12c5d1SDavid du Colombier 			pad += adsp;
913e12c5d1SDavid du Colombier 			--nwd;
923e12c5d1SDavid du Colombier 			if (adrem) {
933e12c5d1SDavid du Colombier 				if (adrem < 0) {
943e12c5d1SDavid du Colombier 					pad -= resol;
953e12c5d1SDavid du Colombier 					adrem += resol;
963e12c5d1SDavid du Colombier 				} else if ((totout & 01) || adrem / resol >= nwd) {
973e12c5d1SDavid du Colombier 					pad += resol;
983e12c5d1SDavid du Colombier 					adrem -= resol;
993e12c5d1SDavid du Colombier 				}
1003e12c5d1SDavid du Colombier 			}
1013e12c5d1SDavid du Colombier 			pchar((Tchar) WORDSP);
1023e12c5d1SDavid du Colombier 			horiz(pad);
1033e12c5d1SDavid du Colombier 		} else {
1043e12c5d1SDavid du Colombier 			pchar(j);
1053e12c5d1SDavid du Colombier 			nc--;
1063e12c5d1SDavid du Colombier 		}
1073e12c5d1SDavid du Colombier 	}
1083e12c5d1SDavid du Colombier 	if (ic) {
1093e12c5d1SDavid du Colombier 		if ((k = ll - un0 - lastl + ics) > 0)
1103e12c5d1SDavid du Colombier 			horiz(k);
1113e12c5d1SDavid du Colombier 		pchar(ic);
1123e12c5d1SDavid du Colombier 	}
1133e12c5d1SDavid du Colombier 	if (icf)
1143e12c5d1SDavid du Colombier 		icf++;
1153e12c5d1SDavid du Colombier 	else
1163e12c5d1SDavid du Colombier 		ic = 0;
1173e12c5d1SDavid du Colombier 	ne = nwd = 0;
1183e12c5d1SDavid du Colombier 	un = in;
1193e12c5d1SDavid du Colombier 	setnel();
1203e12c5d1SDavid du Colombier 	newline(0);
1213e12c5d1SDavid du Colombier 	if (dip != d) {
1223e12c5d1SDavid du Colombier 		if (dip->dnl > dip->hnl)
1233e12c5d1SDavid du Colombier 			dip->hnl = dip->dnl;
1243e12c5d1SDavid du Colombier 	} else {
125219b2ee8SDavid du Colombier 		if (numtabp[NL].val > dip->hnl)
126219b2ee8SDavid du Colombier 			dip->hnl = numtabp[NL].val;
1273e12c5d1SDavid du Colombier 	}
1283e12c5d1SDavid du Colombier 	for (k = ls - 1; k > 0 && !trap; k--)
1293e12c5d1SDavid du Colombier 		newline(0);
1303e12c5d1SDavid du Colombier 	spread = 0;
1313e12c5d1SDavid du Colombier }
1323e12c5d1SDavid du Colombier 
donum(void)1333e12c5d1SDavid du Colombier void donum(void)
1343e12c5d1SDavid du Colombier {
1353e12c5d1SDavid du Colombier 	int i, nw;
136219b2ee8SDavid du Colombier 	int lnv = numtabp[LN].val;
1373e12c5d1SDavid du Colombier 
1383e12c5d1SDavid du Colombier 	nrbits = nmbits;
1393e12c5d1SDavid du Colombier 	nw = width('1' | nrbits);
1403e12c5d1SDavid du Colombier 	if (nn) {
1413e12c5d1SDavid du Colombier 		nn--;
1423e12c5d1SDavid du Colombier 		goto d1;
1433e12c5d1SDavid du Colombier 	}
144219b2ee8SDavid du Colombier 	if (lnv % ndf) {
145219b2ee8SDavid du Colombier 		numtabp[LN].val++;
1463e12c5d1SDavid du Colombier d1:
147219b2ee8SDavid du Colombier 		un += nw * (nmwid + nms + ni);
1483e12c5d1SDavid du Colombier 		return;
1493e12c5d1SDavid du Colombier 	}
1503e12c5d1SDavid du Colombier 	i = 0;
151219b2ee8SDavid du Colombier 	do {		/* count digits in numtabp[LN].val */
1523e12c5d1SDavid du Colombier 		i++;
153219b2ee8SDavid du Colombier 	} while ((lnv /= 10) > 0);
154219b2ee8SDavid du Colombier 	horiz(nw * (ni + max(nmwid-i, 0)));
1553e12c5d1SDavid du Colombier 	nform = 0;
156219b2ee8SDavid du Colombier 	fnumb(numtabp[LN].val, pchar);
1573e12c5d1SDavid du Colombier 	un += nw * nms;
158219b2ee8SDavid du Colombier 	numtabp[LN].val++;
1593e12c5d1SDavid du Colombier }
1603e12c5d1SDavid du Colombier 
1613e12c5d1SDavid du Colombier 
text(void)1623e12c5d1SDavid du Colombier void text(void)
1633e12c5d1SDavid du Colombier {
1643e12c5d1SDavid du Colombier 	Tchar i;
1653e12c5d1SDavid du Colombier 	static int spcnt;
1663e12c5d1SDavid du Colombier 
1673e12c5d1SDavid du Colombier 	nflush++;
168219b2ee8SDavid du Colombier 	numtabp[HP].val = 0;
169219b2ee8SDavid du Colombier 	if ((dip == d) && (numtabp[NL].val == -1)) {
1703e12c5d1SDavid du Colombier 		newline(1);
1713e12c5d1SDavid du Colombier 		return;
1723e12c5d1SDavid du Colombier 	}
1733e12c5d1SDavid du Colombier 	setnel();
1743e12c5d1SDavid du Colombier 	if (ce || !fi) {
1753e12c5d1SDavid du Colombier 		nofill();
1763e12c5d1SDavid du Colombier 		return;
1773e12c5d1SDavid du Colombier 	}
1783e12c5d1SDavid du Colombier 	if (pendw)
1793e12c5d1SDavid du Colombier 		goto t4;
1803e12c5d1SDavid du Colombier 	if (pendt)
1813e12c5d1SDavid du Colombier 		if (spcnt)
1823e12c5d1SDavid du Colombier 			goto t2;
1833e12c5d1SDavid du Colombier 		else
1843e12c5d1SDavid du Colombier 			goto t3;
1853e12c5d1SDavid du Colombier 	pendt++;
1863e12c5d1SDavid du Colombier 	if (spcnt)
1873e12c5d1SDavid du Colombier 		goto t2;
1883e12c5d1SDavid du Colombier 	while ((cbits(i = GETCH())) == ' ') {
1893e12c5d1SDavid du Colombier 		spcnt++;
190219b2ee8SDavid du Colombier 		numtabp[HP].val += sps;
1913e12c5d1SDavid du Colombier 		widthp = sps;
1923e12c5d1SDavid du Colombier 	}
1933e12c5d1SDavid du Colombier 	if (nlflg) {
1943e12c5d1SDavid du Colombier t1:
1953e12c5d1SDavid du Colombier 		nflush = pendt = ch = spcnt = 0;
1963e12c5d1SDavid du Colombier 		callsp();
1973e12c5d1SDavid du Colombier 		return;
1983e12c5d1SDavid du Colombier 	}
1993e12c5d1SDavid du Colombier 	ch = i;
2003e12c5d1SDavid du Colombier 	if (spcnt) {
2013e12c5d1SDavid du Colombier t2:
2023e12c5d1SDavid du Colombier 		tbreak();
2033e12c5d1SDavid du Colombier 		if (nc || wch)
2043e12c5d1SDavid du Colombier 			goto rtn;
2053e12c5d1SDavid du Colombier 		un += spcnt * sps;
2063e12c5d1SDavid du Colombier 		spcnt = 0;
2073e12c5d1SDavid du Colombier 		setnel();
2083e12c5d1SDavid du Colombier 		if (trap)
2093e12c5d1SDavid du Colombier 			goto rtn;
2103e12c5d1SDavid du Colombier 		if (nlflg)
2113e12c5d1SDavid du Colombier 			goto t1;
2123e12c5d1SDavid du Colombier 	}
2133e12c5d1SDavid du Colombier t3:
2143e12c5d1SDavid du Colombier 	if (spread)
2153e12c5d1SDavid du Colombier 		goto t5;
2163e12c5d1SDavid du Colombier 	if (pendw || !wch)
2173e12c5d1SDavid du Colombier t4:
2183e12c5d1SDavid du Colombier 		if (getword(0))
2193e12c5d1SDavid du Colombier 			goto t6;
2203e12c5d1SDavid du Colombier 	if (!movword())
2213e12c5d1SDavid du Colombier 		goto t3;
2223e12c5d1SDavid du Colombier t5:
2233e12c5d1SDavid du Colombier 	if (nlflg)
2243e12c5d1SDavid du Colombier 		pendt = 0;
2253e12c5d1SDavid du Colombier 	adsp = adrem = 0;
2263e12c5d1SDavid du Colombier 	if (ad) {
2273e12c5d1SDavid du Colombier 		if (nwd == 1)
2283e12c5d1SDavid du Colombier 			adsp = nel;
2293e12c5d1SDavid du Colombier 		else
2303e12c5d1SDavid du Colombier 			adsp = nel / (nwd - 1);
2313e12c5d1SDavid du Colombier 		adsp = (adsp / HOR) * HOR;
2323e12c5d1SDavid du Colombier 		adrem = nel - adsp*(nwd-1);
2333e12c5d1SDavid du Colombier 	}
2343e12c5d1SDavid du Colombier 	brflg = 1;
2353e12c5d1SDavid du Colombier 	tbreak();
2363e12c5d1SDavid du Colombier 	spread = 0;
2373e12c5d1SDavid du Colombier 	if (!trap)
2383e12c5d1SDavid du Colombier 		goto t3;
2393e12c5d1SDavid du Colombier 	if (!nlflg)
2403e12c5d1SDavid du Colombier 		goto rtn;
2413e12c5d1SDavid du Colombier t6:
2423e12c5d1SDavid du Colombier 	pendt = 0;
2433e12c5d1SDavid du Colombier 	ckul();
2443e12c5d1SDavid du Colombier rtn:
2453e12c5d1SDavid du Colombier 	nflush = 0;
2463e12c5d1SDavid du Colombier }
2473e12c5d1SDavid du Colombier 
2483e12c5d1SDavid du Colombier 
nofill(void)2493e12c5d1SDavid du Colombier void nofill(void)
2503e12c5d1SDavid du Colombier {
2513e12c5d1SDavid du Colombier 	int j;
2523e12c5d1SDavid du Colombier 	Tchar i;
2533e12c5d1SDavid du Colombier 
2543e12c5d1SDavid du Colombier 	if (!pendnf) {
2553e12c5d1SDavid du Colombier 		over = 0;
2563e12c5d1SDavid du Colombier 		tbreak();
2573e12c5d1SDavid du Colombier 		if (trap)
2583e12c5d1SDavid du Colombier 			goto rtn;
2593e12c5d1SDavid du Colombier 		if (nlflg) {
2603e12c5d1SDavid du Colombier 			ch = nflush = 0;
2613e12c5d1SDavid du Colombier 			callsp();
2623e12c5d1SDavid du Colombier 			return;
2633e12c5d1SDavid du Colombier 		}
2643e12c5d1SDavid du Colombier 		adsp = adrem = 0;
2653e12c5d1SDavid du Colombier 		nwd = 10000;
2663e12c5d1SDavid du Colombier 	}
2673e12c5d1SDavid du Colombier 	while ((j = (cbits(i = GETCH()))) != '\n') {
2683e12c5d1SDavid du Colombier 		if (j == ohc)
2693e12c5d1SDavid du Colombier 			continue;
2703e12c5d1SDavid du Colombier 		if (j == CONT) {
2713e12c5d1SDavid du Colombier 			pendnf++;
2723e12c5d1SDavid du Colombier 			nflush = 0;
2733e12c5d1SDavid du Colombier 			flushi();
2743e12c5d1SDavid du Colombier 			ckul();
2753e12c5d1SDavid du Colombier 			return;
2763e12c5d1SDavid du Colombier 		}
2773e12c5d1SDavid du Colombier 		j = width(i);
2783e12c5d1SDavid du Colombier 		widthp = j;
279219b2ee8SDavid du Colombier 		numtabp[HP].val += j;
2803e12c5d1SDavid du Colombier 		storeline(i, j);
2813e12c5d1SDavid du Colombier 	}
2823e12c5d1SDavid du Colombier 	if (ce) {
2833e12c5d1SDavid du Colombier 		ce--;
2843e12c5d1SDavid du Colombier 		if ((i = quant(nel / 2, HOR)) > 0)
2853e12c5d1SDavid du Colombier 			un += i;
2863e12c5d1SDavid du Colombier 	}
2873e12c5d1SDavid du Colombier 	if (!nc)
2883e12c5d1SDavid du Colombier 		storeline((Tchar)FILLER, 0);
2893e12c5d1SDavid du Colombier 	brflg = 2;
2903e12c5d1SDavid du Colombier 	tbreak();
2913e12c5d1SDavid du Colombier 	ckul();
2923e12c5d1SDavid du Colombier rtn:
2933e12c5d1SDavid du Colombier 	pendnf = nflush = 0;
2943e12c5d1SDavid du Colombier }
2953e12c5d1SDavid du Colombier 
2963e12c5d1SDavid du Colombier 
callsp(void)2973e12c5d1SDavid du Colombier void callsp(void)
2983e12c5d1SDavid du Colombier {
2993e12c5d1SDavid du Colombier 	int i;
3003e12c5d1SDavid du Colombier 
3013e12c5d1SDavid du Colombier 	if (flss)
3023e12c5d1SDavid du Colombier 		i = flss;
3033e12c5d1SDavid du Colombier 	else
3043e12c5d1SDavid du Colombier 		i = lss;
3053e12c5d1SDavid du Colombier 	flss = 0;
3063e12c5d1SDavid du Colombier 	casesp1(i);
3073e12c5d1SDavid du Colombier }
3083e12c5d1SDavid du Colombier 
3093e12c5d1SDavid du Colombier 
ckul(void)3103e12c5d1SDavid du Colombier void ckul(void)
3113e12c5d1SDavid du Colombier {
3123e12c5d1SDavid du Colombier 	if (ul && (--ul == 0)) {
3133e12c5d1SDavid du Colombier 		cu = 0;
3143e12c5d1SDavid du Colombier 		font = sfont;
3153e12c5d1SDavid du Colombier 		mchbits();
3163e12c5d1SDavid du Colombier 	}
3173e12c5d1SDavid du Colombier 	if (it && --it == 0 && itmac)
3183e12c5d1SDavid du Colombier 		control(itmac, 0);
3193e12c5d1SDavid du Colombier }
3203e12c5d1SDavid du Colombier 
3213e12c5d1SDavid du Colombier 
storeline(Tchar c,int w)3223e12c5d1SDavid du Colombier void storeline(Tchar c, int w)
3233e12c5d1SDavid du Colombier {
324219b2ee8SDavid du Colombier 	int diff;
325219b2ee8SDavid du Colombier 
3263e12c5d1SDavid du Colombier 	if (linep >= line + lnsize - 2) {
327219b2ee8SDavid du Colombier 		lnsize += LNSIZE;
328219b2ee8SDavid du Colombier 		diff = linep - line;
329219b2ee8SDavid du Colombier 		if (( line = (Tchar *)realloc((char *)line, lnsize * sizeof(Tchar))) != NULL) {
330219b2ee8SDavid du Colombier 			if (linep && diff)
331219b2ee8SDavid du Colombier 				linep = line + diff;
332219b2ee8SDavid du Colombier 		} else {
333219b2ee8SDavid du Colombier 			if (over) {
334219b2ee8SDavid du Colombier 				return;
335219b2ee8SDavid du Colombier 			} else {
3363e12c5d1SDavid du Colombier 				flusho();
3373e12c5d1SDavid du Colombier 				ERROR "Line overflow." WARN;
3383e12c5d1SDavid du Colombier 				over++;
339219b2ee8SDavid du Colombier 				*linep++ = LEFTHAND;
340219b2ee8SDavid du Colombier 				w = width(LEFTHAND);
341219b2ee8SDavid du Colombier 				nc++;
342219b2ee8SDavid du Colombier 				c = '\n';
3433e12c5d1SDavid du Colombier 			}
344219b2ee8SDavid du Colombier 		}
3453e12c5d1SDavid du Colombier 	}
3463e12c5d1SDavid du Colombier 	*linep++ = c;
3473e12c5d1SDavid du Colombier 	ne += w;
3483e12c5d1SDavid du Colombier 	nel -= w;
3493e12c5d1SDavid du Colombier 	nc++;
3503e12c5d1SDavid du Colombier }
3513e12c5d1SDavid du Colombier 
3523e12c5d1SDavid du Colombier 
newline(int a)3533e12c5d1SDavid du Colombier void newline(int a)
3543e12c5d1SDavid du Colombier {
3553e12c5d1SDavid du Colombier 	int i, j, nlss;
3563e12c5d1SDavid du Colombier 	int opn;
3573e12c5d1SDavid du Colombier 
358*14f51593SDavid du Colombier 	nlss = 0;
3593e12c5d1SDavid du Colombier 	if (a)
3603e12c5d1SDavid du Colombier 		goto nl1;
3613e12c5d1SDavid du Colombier 	if (dip != d) {
3623e12c5d1SDavid du Colombier 		j = lss;
3633e12c5d1SDavid du Colombier 		pchar1((Tchar)FLSS);
3643e12c5d1SDavid du Colombier 		if (flss)
3653e12c5d1SDavid du Colombier 			lss = flss;
3663e12c5d1SDavid du Colombier 		i = lss + dip->blss;
3673e12c5d1SDavid du Colombier 		dip->dnl += i;
3683e12c5d1SDavid du Colombier 		pchar1((Tchar)i);
3693e12c5d1SDavid du Colombier 		pchar1((Tchar)'\n');
3703e12c5d1SDavid du Colombier 		lss = j;
3713e12c5d1SDavid du Colombier 		dip->blss = flss = 0;
3723e12c5d1SDavid du Colombier 		if (dip->alss) {
3733e12c5d1SDavid du Colombier 			pchar1((Tchar)FLSS);
3743e12c5d1SDavid du Colombier 			pchar1((Tchar)dip->alss);
3753e12c5d1SDavid du Colombier 			pchar1((Tchar)'\n');
3763e12c5d1SDavid du Colombier 			dip->dnl += dip->alss;
3773e12c5d1SDavid du Colombier 			dip->alss = 0;
3783e12c5d1SDavid du Colombier 		}
3793e12c5d1SDavid du Colombier 		if (dip->ditrap && !dip->ditf && dip->dnl >= dip->ditrap && dip->dimac)
3803e12c5d1SDavid du Colombier 			if (control(dip->dimac, 0)) {
3813e12c5d1SDavid du Colombier 				trap++;
3823e12c5d1SDavid du Colombier 				dip->ditf++;
3833e12c5d1SDavid du Colombier 			}
3843e12c5d1SDavid du Colombier 		return;
3853e12c5d1SDavid du Colombier 	}
3863e12c5d1SDavid du Colombier 	j = lss;
3873e12c5d1SDavid du Colombier 	if (flss)
3883e12c5d1SDavid du Colombier 		lss = flss;
3893e12c5d1SDavid du Colombier 	nlss = dip->alss + dip->blss + lss;
390219b2ee8SDavid du Colombier 	numtabp[NL].val += nlss;
3913e12c5d1SDavid du Colombier 	if (TROFF && ascii) {
3923e12c5d1SDavid du Colombier 		dip->alss = dip->blss = 0;
3933e12c5d1SDavid du Colombier 	}
3943e12c5d1SDavid du Colombier 	pchar1((Tchar)'\n');
3953e12c5d1SDavid du Colombier 	flss = 0;
3963e12c5d1SDavid du Colombier 	lss = j;
397219b2ee8SDavid du Colombier 	if (numtabp[NL].val < pl)
3983e12c5d1SDavid du Colombier 		goto nl2;
3993e12c5d1SDavid du Colombier nl1:
400219b2ee8SDavid du Colombier 	ejf = dip->hnl = numtabp[NL].val = 0;
4013e12c5d1SDavid du Colombier 	ejl = frame;
4023e12c5d1SDavid du Colombier 	if (donef) {
4033e12c5d1SDavid du Colombier 		if ((!nc && !wch) || ndone)
4043e12c5d1SDavid du Colombier 			done1(0);
4053e12c5d1SDavid du Colombier 		ndone++;
4063e12c5d1SDavid du Colombier 		donef = 0;
4073e12c5d1SDavid du Colombier 		if (frame == stk)
4083e12c5d1SDavid du Colombier 			nflush++;
4093e12c5d1SDavid du Colombier 	}
410219b2ee8SDavid du Colombier 	opn = numtabp[PN].val;
411219b2ee8SDavid du Colombier 	numtabp[PN].val++;
4123e12c5d1SDavid du Colombier 	if (npnflg) {
413219b2ee8SDavid du Colombier 		numtabp[PN].val = npn;
4143e12c5d1SDavid du Colombier 		npn = npnflg = 0;
4153e12c5d1SDavid du Colombier 	}
4163e12c5d1SDavid du Colombier nlpn:
417219b2ee8SDavid du Colombier 	if (numtabp[PN].val == pfrom) {
4183e12c5d1SDavid du Colombier 		print++;
4193e12c5d1SDavid du Colombier 		pfrom = -1;
4203e12c5d1SDavid du Colombier 	} else if (opn == pto) {
4213e12c5d1SDavid du Colombier 		print = 0;
4223e12c5d1SDavid du Colombier 		opn = -1;
4233e12c5d1SDavid du Colombier 		chkpn();
4243e12c5d1SDavid du Colombier 		goto nlpn;
4253e12c5d1SDavid du Colombier 	}
4263e12c5d1SDavid du Colombier 	if (print)
427219b2ee8SDavid du Colombier 		ptpage(numtabp[PN].val);	/* supposedly in a clean state so can pause */
4283e12c5d1SDavid du Colombier 	if (stop && print) {
4293e12c5d1SDavid du Colombier 		dpn++;
4303e12c5d1SDavid du Colombier 		if (dpn >= stop) {
4313e12c5d1SDavid du Colombier 			dpn = 0;
4323e12c5d1SDavid du Colombier 			ptpause();
4333e12c5d1SDavid du Colombier 		}
4343e12c5d1SDavid du Colombier 	}
4353e12c5d1SDavid du Colombier nl2:
4363e12c5d1SDavid du Colombier 	trap = 0;
437219b2ee8SDavid du Colombier 	if (numtabp[NL].val == 0) {
4383e12c5d1SDavid du Colombier 		if ((j = findn(0)) != NTRAP)
4393e12c5d1SDavid du Colombier 			trap = control(mlist[j], 0);
440219b2ee8SDavid du Colombier 	} else if ((i = findt(numtabp[NL].val - nlss)) <= nlss) {
441219b2ee8SDavid du Colombier 		if ((j = findn1(numtabp[NL].val - nlss + i)) == NTRAP) {
4423e12c5d1SDavid du Colombier 			flusho();
4433e12c5d1SDavid du Colombier 			ERROR "Trap botch." WARN;
4443e12c5d1SDavid du Colombier 			done2(-5);
4453e12c5d1SDavid du Colombier 		}
4463e12c5d1SDavid du Colombier 		trap = control(mlist[j], 0);
4473e12c5d1SDavid du Colombier 	}
4483e12c5d1SDavid du Colombier }
4493e12c5d1SDavid du Colombier 
4503e12c5d1SDavid du Colombier 
findn1(int a)4513e12c5d1SDavid du Colombier findn1(int a)
4523e12c5d1SDavid du Colombier {
4533e12c5d1SDavid du Colombier 	int i, j;
4543e12c5d1SDavid du Colombier 
4553e12c5d1SDavid du Colombier 	for (i = 0; i < NTRAP; i++) {
4563e12c5d1SDavid du Colombier 		if (mlist[i]) {
4573e12c5d1SDavid du Colombier 			if ((j = nlist[i]) < 0)
4583e12c5d1SDavid du Colombier 				j += pl;
4593e12c5d1SDavid du Colombier 			if (j == a)
4603e12c5d1SDavid du Colombier 				break;
4613e12c5d1SDavid du Colombier 		}
4623e12c5d1SDavid du Colombier 	}
4633e12c5d1SDavid du Colombier 	return(i);
4643e12c5d1SDavid du Colombier }
4653e12c5d1SDavid du Colombier 
4663e12c5d1SDavid du Colombier 
chkpn(void)4673e12c5d1SDavid du Colombier void chkpn(void)
4683e12c5d1SDavid du Colombier {
4693e12c5d1SDavid du Colombier 	pto = *(pnp++);
4703e12c5d1SDavid du Colombier 	pfrom = pto>=0 ? pto : -pto;
471219b2ee8SDavid du Colombier 	if (pto == -INT_MAX) {
4723e12c5d1SDavid du Colombier 		flusho();
4733e12c5d1SDavid du Colombier 		done1(0);
4743e12c5d1SDavid du Colombier 	}
4753e12c5d1SDavid du Colombier 	if (pto < 0) {
4763e12c5d1SDavid du Colombier 		pto = -pto;
4773e12c5d1SDavid du Colombier 		print++;
4783e12c5d1SDavid du Colombier 		pfrom = 0;
4793e12c5d1SDavid du Colombier 	}
4803e12c5d1SDavid du Colombier }
4813e12c5d1SDavid du Colombier 
4823e12c5d1SDavid du Colombier 
findt(int a)4833e12c5d1SDavid du Colombier findt(int a)
4843e12c5d1SDavid du Colombier {
4853e12c5d1SDavid du Colombier 	int i, j, k;
4863e12c5d1SDavid du Colombier 
487219b2ee8SDavid du Colombier 	k = INT_MAX;
4883e12c5d1SDavid du Colombier 	if (dip != d) {
4893e12c5d1SDavid du Colombier 		if (dip->dimac && (i = dip->ditrap - a) > 0)
4903e12c5d1SDavid du Colombier 			k = i;
4913e12c5d1SDavid du Colombier 		return(k);
4923e12c5d1SDavid du Colombier 	}
4933e12c5d1SDavid du Colombier 	for (i = 0; i < NTRAP; i++) {
4943e12c5d1SDavid du Colombier 		if (mlist[i]) {
4953e12c5d1SDavid du Colombier 			if ((j = nlist[i]) < 0)
4963e12c5d1SDavid du Colombier 				j += pl;
4973e12c5d1SDavid du Colombier 			if ((j -= a) <= 0)
4983e12c5d1SDavid du Colombier 				continue;
4993e12c5d1SDavid du Colombier 			if (j < k)
5003e12c5d1SDavid du Colombier 				k = j;
5013e12c5d1SDavid du Colombier 		}
5023e12c5d1SDavid du Colombier 	}
5033e12c5d1SDavid du Colombier 	i = pl - a;
5043e12c5d1SDavid du Colombier 	if (k > i)
5053e12c5d1SDavid du Colombier 		k = i;
5063e12c5d1SDavid du Colombier 	return(k);
5073e12c5d1SDavid du Colombier }
5083e12c5d1SDavid du Colombier 
5093e12c5d1SDavid du Colombier 
findt1(void)5103e12c5d1SDavid du Colombier findt1(void)
5113e12c5d1SDavid du Colombier {
5123e12c5d1SDavid du Colombier 	int i;
5133e12c5d1SDavid du Colombier 
5143e12c5d1SDavid du Colombier 	if (dip != d)
5153e12c5d1SDavid du Colombier 		i = dip->dnl;
5163e12c5d1SDavid du Colombier 	else
517219b2ee8SDavid du Colombier 		i = numtabp[NL].val;
5183e12c5d1SDavid du Colombier 	return(findt(i));
5193e12c5d1SDavid du Colombier }
5203e12c5d1SDavid du Colombier 
5213e12c5d1SDavid du Colombier 
eject(Stack * a)5223e12c5d1SDavid du Colombier void eject(Stack *a)
5233e12c5d1SDavid du Colombier {
5243e12c5d1SDavid du Colombier 	int savlss;
5253e12c5d1SDavid du Colombier 
5263e12c5d1SDavid du Colombier 	if (dip != d)
5273e12c5d1SDavid du Colombier 		return;
5283e12c5d1SDavid du Colombier 	ejf++;
5293e12c5d1SDavid du Colombier 	if (a)
5303e12c5d1SDavid du Colombier 		ejl = a;
5313e12c5d1SDavid du Colombier 	else
5323e12c5d1SDavid du Colombier 		ejl = frame;
5333e12c5d1SDavid du Colombier 	if (trap)
5343e12c5d1SDavid du Colombier 		return;
5353e12c5d1SDavid du Colombier e1:
5363e12c5d1SDavid du Colombier 	savlss = lss;
537219b2ee8SDavid du Colombier 	lss = findt(numtabp[NL].val);
5383e12c5d1SDavid du Colombier 	newline(0);
5393e12c5d1SDavid du Colombier 	lss = savlss;
540219b2ee8SDavid du Colombier 	if (numtabp[NL].val && !trap)
5413e12c5d1SDavid du Colombier 		goto e1;
5423e12c5d1SDavid du Colombier }
5433e12c5d1SDavid du Colombier 
5443e12c5d1SDavid du Colombier 
movword(void)5453e12c5d1SDavid du Colombier movword(void)
5463e12c5d1SDavid du Colombier {
5473e12c5d1SDavid du Colombier 	int w;
5483e12c5d1SDavid du Colombier 	Tchar i, *wp;
5493e12c5d1SDavid du Colombier 	int savwch, hys;
5503e12c5d1SDavid du Colombier 
5513e12c5d1SDavid du Colombier 	over = 0;
5523e12c5d1SDavid du Colombier 	wp = wordp;
5533e12c5d1SDavid du Colombier 	if (!nwd) {
5543e12c5d1SDavid du Colombier 		while (cbits(*wp++) == ' ') {
5553e12c5d1SDavid du Colombier 			wch--;
5563e12c5d1SDavid du Colombier 			wne -= sps;
5573e12c5d1SDavid du Colombier 		}
5583e12c5d1SDavid du Colombier 		wp--;
5593e12c5d1SDavid du Colombier 	}
5603e12c5d1SDavid du Colombier 	if (wne > nel && !hyoff && hyf && (!nwd || nel > 3 * sps) &&
5613e12c5d1SDavid du Colombier 	   (!(hyf & 02) || (findt1() > lss)))
5623e12c5d1SDavid du Colombier 		hyphen(wp);
5633e12c5d1SDavid du Colombier 	savwch = wch;
5643e12c5d1SDavid du Colombier 	hyp = hyptr;
5653e12c5d1SDavid du Colombier 	nhyp = 0;
5663e12c5d1SDavid du Colombier 	while (*hyp && *hyp <= wp)
5673e12c5d1SDavid du Colombier 		hyp++;
5683e12c5d1SDavid du Colombier 	while (wch) {
5693e12c5d1SDavid du Colombier 		if (hyoff != 1 && *hyp == wp) {
5703e12c5d1SDavid du Colombier 			hyp++;
5713e12c5d1SDavid du Colombier 			if (!wdstart || (wp > wdstart + 1 && wp < wdend &&
5723e12c5d1SDavid du Colombier 			   (!(hyf & 04) || wp < wdend - 1) &&		/* 04 => last 2 */
5733e12c5d1SDavid du Colombier 			   (!(hyf & 010) || wp > wdstart + 2))) {	/* 010 => 1st 2 */
5743e12c5d1SDavid du Colombier 				nhyp++;
5753e12c5d1SDavid du Colombier 				storeline((Tchar)IMP, 0);
5763e12c5d1SDavid du Colombier 			}
5773e12c5d1SDavid du Colombier 		}
5783e12c5d1SDavid du Colombier 		i = *wp++;
5793e12c5d1SDavid du Colombier 		w = width(i);
5803e12c5d1SDavid du Colombier 		wne -= w;
5813e12c5d1SDavid du Colombier 		wch--;
5823e12c5d1SDavid du Colombier 		storeline(i, w);
5833e12c5d1SDavid du Colombier 	}
5843e12c5d1SDavid du Colombier 	if (nel >= 0) {
5853e12c5d1SDavid du Colombier 		nwd++;
5863e12c5d1SDavid du Colombier 		return(0);	/* line didn't fill up */
5873e12c5d1SDavid du Colombier 	}
5883e12c5d1SDavid du Colombier 	if (TROFF)
5893e12c5d1SDavid du Colombier 		xbits((Tchar)HYPHEN, 1);
5903e12c5d1SDavid du Colombier 	hys = width((Tchar)HYPHEN);
5913e12c5d1SDavid du Colombier m1:
5923e12c5d1SDavid du Colombier 	if (!nhyp) {
5933e12c5d1SDavid du Colombier 		if (!nwd)
5943e12c5d1SDavid du Colombier 			goto m3;
5953e12c5d1SDavid du Colombier 		if (wch == savwch)
5963e12c5d1SDavid du Colombier 			goto m4;
5973e12c5d1SDavid du Colombier 	}
5983e12c5d1SDavid du Colombier 	if (*--linep != IMP)
5993e12c5d1SDavid du Colombier 		goto m5;
6003e12c5d1SDavid du Colombier 	if (!(--nhyp))
6013e12c5d1SDavid du Colombier 		if (!nwd)
6023e12c5d1SDavid du Colombier 			goto m2;
6033e12c5d1SDavid du Colombier 	if (nel < hys) {
6043e12c5d1SDavid du Colombier 		nc--;
6053e12c5d1SDavid du Colombier 		goto m1;
6063e12c5d1SDavid du Colombier 	}
6073e12c5d1SDavid du Colombier m2:
6083e12c5d1SDavid du Colombier 	if ((i = cbits(*(linep - 1))) != '-' && i != EMDASH) {
6093e12c5d1SDavid du Colombier 		*linep = (*(linep - 1) & SFMASK) | HYPHEN;
6103e12c5d1SDavid du Colombier 		w = width(*linep);
6113e12c5d1SDavid du Colombier 		nel -= w;
6123e12c5d1SDavid du Colombier 		ne += w;
6133e12c5d1SDavid du Colombier 		linep++;
6143e12c5d1SDavid du Colombier 	}
6153e12c5d1SDavid du Colombier m3:
6163e12c5d1SDavid du Colombier 	nwd++;
6173e12c5d1SDavid du Colombier m4:
6183e12c5d1SDavid du Colombier 	wordp = wp;
6193e12c5d1SDavid du Colombier 	return(1);	/* line filled up */
6203e12c5d1SDavid du Colombier m5:
6213e12c5d1SDavid du Colombier 	nc--;
6223e12c5d1SDavid du Colombier 	w = width(*linep);
6233e12c5d1SDavid du Colombier 	ne -= w;
6243e12c5d1SDavid du Colombier 	nel += w;
6253e12c5d1SDavid du Colombier 	wne += w;
6263e12c5d1SDavid du Colombier 	wch++;
6273e12c5d1SDavid du Colombier 	wp--;
6283e12c5d1SDavid du Colombier 	goto m1;
6293e12c5d1SDavid du Colombier }
6303e12c5d1SDavid du Colombier 
6313e12c5d1SDavid du Colombier 
horiz(int i)6323e12c5d1SDavid du Colombier void horiz(int i)
6333e12c5d1SDavid du Colombier {
6343e12c5d1SDavid du Colombier 	vflag = 0;
6353e12c5d1SDavid du Colombier 	if (i)
6363e12c5d1SDavid du Colombier 		pchar(makem(i));
6373e12c5d1SDavid du Colombier }
6383e12c5d1SDavid du Colombier 
6393e12c5d1SDavid du Colombier 
setnel(void)6403e12c5d1SDavid du Colombier void setnel(void)
6413e12c5d1SDavid du Colombier {
6423e12c5d1SDavid du Colombier 	if (!nc) {
6433e12c5d1SDavid du Colombier 		linep = line;
6443e12c5d1SDavid du Colombier 		if (un1 >= 0) {
6453e12c5d1SDavid du Colombier 			un = un1;
6463e12c5d1SDavid du Colombier 			un1 = -1;
6473e12c5d1SDavid du Colombier 		}
6483e12c5d1SDavid du Colombier 		nel = ll - un;
6493e12c5d1SDavid du Colombier 		ne = adsp = adrem = 0;
6503e12c5d1SDavid du Colombier 	}
6513e12c5d1SDavid du Colombier }
6523e12c5d1SDavid du Colombier 
6533e12c5d1SDavid du Colombier 
getword(int x)6543e12c5d1SDavid du Colombier getword(int x)
6553e12c5d1SDavid du Colombier {
6563e12c5d1SDavid du Colombier 	int j, k;
6573e12c5d1SDavid du Colombier 	Tchar i, *wp;
6583e12c5d1SDavid du Colombier 	int noword;
6593e12c5d1SDavid du Colombier 	int obits;
6603e12c5d1SDavid du Colombier 
661*14f51593SDavid du Colombier 	j = noword = 0;
6623e12c5d1SDavid du Colombier 	if (x)
6633e12c5d1SDavid du Colombier 		if (pendw) {
6643e12c5d1SDavid du Colombier 			*pendw = 0;
6653e12c5d1SDavid du Colombier 			goto rtn;
6663e12c5d1SDavid du Colombier 		}
6673e12c5d1SDavid du Colombier 	if (wordp = pendw)
6683e12c5d1SDavid du Colombier 		goto g1;
6693e12c5d1SDavid du Colombier 	hyp = hyptr;
6703e12c5d1SDavid du Colombier 	wordp = word;
6713e12c5d1SDavid du Colombier 	over = wne = wch = 0;
6723e12c5d1SDavid du Colombier 	hyoff = 0;
6733e12c5d1SDavid du Colombier 	obits = chbits;
6743e12c5d1SDavid du Colombier 	while (1) {	/* picks up 1st char of word */
6753e12c5d1SDavid du Colombier 		j = cbits(i = GETCH());
6763e12c5d1SDavid du Colombier 		if (j == '\n') {
6773e12c5d1SDavid du Colombier 			wne = wch = 0;
6783e12c5d1SDavid du Colombier 			noword = 1;
6793e12c5d1SDavid du Colombier 			goto rtn;
6803e12c5d1SDavid du Colombier 		}
6813e12c5d1SDavid du Colombier 		if (j == ohc) {
6823e12c5d1SDavid du Colombier 			hyoff = 1;	/* 1 => don't hyphenate */
6833e12c5d1SDavid du Colombier 			continue;
6843e12c5d1SDavid du Colombier 		}
6853e12c5d1SDavid du Colombier 		if (j == ' ') {
686219b2ee8SDavid du Colombier 			numtabp[HP].val += sps;
6873e12c5d1SDavid du Colombier 			widthp = sps;
6883e12c5d1SDavid du Colombier 			storeword(i, sps);
6893e12c5d1SDavid du Colombier 			continue;
6903e12c5d1SDavid du Colombier 		}
6913e12c5d1SDavid du Colombier 		break;
6923e12c5d1SDavid du Colombier 	}
6933e12c5d1SDavid du Colombier 	storeword(' ' | obits, sps);
6943e12c5d1SDavid du Colombier 	if (spflg) {
6953e12c5d1SDavid du Colombier 		storeword(' ' | obits, sps);
6963e12c5d1SDavid du Colombier 		spflg = 0;
6973e12c5d1SDavid du Colombier 	}
6983e12c5d1SDavid du Colombier g0:
6993e12c5d1SDavid du Colombier 	if (j == CONT) {
7003e12c5d1SDavid du Colombier 		pendw = wordp;
7013e12c5d1SDavid du Colombier 		nflush = 0;
7023e12c5d1SDavid du Colombier 		flushi();
7033e12c5d1SDavid du Colombier 		return(1);
7043e12c5d1SDavid du Colombier 	}
7053e12c5d1SDavid du Colombier 	if (hyoff != 1) {
7063e12c5d1SDavid du Colombier 		if (j == ohc) {
7073e12c5d1SDavid du Colombier 			hyoff = 2;
7083e12c5d1SDavid du Colombier 			*hyp++ = wordp;
7093e12c5d1SDavid du Colombier 			if (hyp > hyptr + NHYP - 1)
7103e12c5d1SDavid du Colombier 				hyp = hyptr + NHYP - 1;
7113e12c5d1SDavid du Colombier 			goto g1;
7123e12c5d1SDavid du Colombier 		}
713219b2ee8SDavid du Colombier 		if (((j == '-' || j == EMDASH)) && !(i & ZBIT))	/* zbit avoids \X */
7143e12c5d1SDavid du Colombier 			if (wordp > word + 1) {
7153e12c5d1SDavid du Colombier 				hyoff = 2;
7163e12c5d1SDavid du Colombier 				*hyp++ = wordp + 1;
7173e12c5d1SDavid du Colombier 				if (hyp > hyptr + NHYP - 1)
7183e12c5d1SDavid du Colombier 					hyp = hyptr + NHYP - 1;
7193e12c5d1SDavid du Colombier 			}
7203e12c5d1SDavid du Colombier 	}
7213e12c5d1SDavid du Colombier 	j = width(i);
722219b2ee8SDavid du Colombier 	numtabp[HP].val += j;
7233e12c5d1SDavid du Colombier 	storeword(i, j);
7243e12c5d1SDavid du Colombier g1:
7253e12c5d1SDavid du Colombier 	j = cbits(i = GETCH());
7263e12c5d1SDavid du Colombier 	if (j != ' ') {
7273e12c5d1SDavid du Colombier 		static char *sentchar = ".?!";	/* sentence terminators */
7283e12c5d1SDavid du Colombier 		if (j != '\n')
7293e12c5d1SDavid du Colombier 			goto g0;
7303e12c5d1SDavid du Colombier 		wp = wordp-1;	/* handle extra space at end of sentence */
7313e12c5d1SDavid du Colombier 		while (wp >= word) {
7323e12c5d1SDavid du Colombier 			j = cbits(*wp--);
7333e12c5d1SDavid du Colombier 			if (j=='"' || j=='\'' || j==')' || j==']' || j=='*' || j==DAGGER)
7343e12c5d1SDavid du Colombier 				continue;
7353e12c5d1SDavid du Colombier 			for (k = 0; sentchar[k]; k++)
7363e12c5d1SDavid du Colombier 				if (j == sentchar[k]) {
7373e12c5d1SDavid du Colombier 					spflg++;
7383e12c5d1SDavid du Colombier 					break;
7393e12c5d1SDavid du Colombier 				}
7403e12c5d1SDavid du Colombier 			break;
7413e12c5d1SDavid du Colombier 		}
7423e12c5d1SDavid du Colombier 	}
7433e12c5d1SDavid du Colombier 	*wordp = 0;
744219b2ee8SDavid du Colombier 	numtabp[HP].val += sps;
7453e12c5d1SDavid du Colombier rtn:
7463e12c5d1SDavid du Colombier 	for (wp = word; *wp; wp++) {
747219b2ee8SDavid du Colombier 		if (ismot(j))
748219b2ee8SDavid du Colombier 			break;	/* drechsler */
7493e12c5d1SDavid du Colombier 		j = cbits(*wp);
7503e12c5d1SDavid du Colombier 		if (j == ' ')
7513e12c5d1SDavid du Colombier 			continue;
752219b2ee8SDavid du Colombier 		if (!(isascii(j) && isdigit(j)) && j != '-')
7533e12c5d1SDavid du Colombier 			break;
7543e12c5d1SDavid du Colombier 	}
7553e12c5d1SDavid du Colombier 	if (*wp == 0)	/* all numbers, so don't hyphenate */
7563e12c5d1SDavid du Colombier 		hyoff = 1;
7573e12c5d1SDavid du Colombier 	wdstart = 0;
7583e12c5d1SDavid du Colombier 	wordp = word;
7593e12c5d1SDavid du Colombier 	pendw = 0;
7603e12c5d1SDavid du Colombier 	*hyp++ = 0;
7613e12c5d1SDavid du Colombier 	setnel();
7623e12c5d1SDavid du Colombier 	return(noword);
7633e12c5d1SDavid du Colombier }
7643e12c5d1SDavid du Colombier 
7653e12c5d1SDavid du Colombier 
storeword(Tchar c,int w)7663e12c5d1SDavid du Colombier void storeword(Tchar c, int w)
7673e12c5d1SDavid du Colombier {
768219b2ee8SDavid du Colombier 	Tchar *savp;
769219b2ee8SDavid du Colombier 	int i;
770219b2ee8SDavid du Colombier 
771219b2ee8SDavid du Colombier 	if (wordp >= word + wdsize - 2) {
772219b2ee8SDavid du Colombier 		wdsize += WDSIZE;
773219b2ee8SDavid du Colombier 		savp = word;
774219b2ee8SDavid du Colombier 		if (( word = (Tchar *)realloc((char *)word, wdsize * sizeof(Tchar))) != NULL) {
775219b2ee8SDavid du Colombier 			if (wordp)
776219b2ee8SDavid du Colombier 				wordp = word + (wordp - savp);
777219b2ee8SDavid du Colombier 			if (pendw)
778219b2ee8SDavid du Colombier 				pendw = word + (pendw - savp);
779219b2ee8SDavid du Colombier 			if (wdstart)
780219b2ee8SDavid du Colombier 				wdstart = word + (wdstart - savp);
781219b2ee8SDavid du Colombier 			if (wdend)
782219b2ee8SDavid du Colombier 				wdend = word + (wdend - savp);
783219b2ee8SDavid du Colombier 			for (i = 0; i < NHYP; i++)
784219b2ee8SDavid du Colombier 				if (hyptr[i])
785219b2ee8SDavid du Colombier 					hyptr[i] = word + (hyptr[i] - savp);
786219b2ee8SDavid du Colombier 		} else {
787219b2ee8SDavid du Colombier 			if (over) {
788219b2ee8SDavid du Colombier 				return;
789219b2ee8SDavid du Colombier 			} else {
7903e12c5d1SDavid du Colombier 				flusho();
7913e12c5d1SDavid du Colombier 				ERROR "Word overflow." WARN;
7923e12c5d1SDavid du Colombier 				over++;
7933e12c5d1SDavid du Colombier 				c = LEFTHAND;
794219b2ee8SDavid du Colombier 				w = width(LEFTHAND);
7953e12c5d1SDavid du Colombier 			}
7963e12c5d1SDavid du Colombier 		}
797219b2ee8SDavid du Colombier 	}
7983e12c5d1SDavid du Colombier 	widthp = w;
7993e12c5d1SDavid du Colombier 	wne += w;
8003e12c5d1SDavid du Colombier 	*wordp++ = c;
8013e12c5d1SDavid du Colombier 	wch++;
8023e12c5d1SDavid du Colombier }
8033e12c5d1SDavid du Colombier 
8043e12c5d1SDavid du Colombier 
gettch(void)8053e12c5d1SDavid du Colombier Tchar gettch(void)
8063e12c5d1SDavid du Colombier {
8073e12c5d1SDavid du Colombier 	extern int c_isalnum;
8083e12c5d1SDavid du Colombier 	Tchar i;
8093e12c5d1SDavid du Colombier 	int j;
8103e12c5d1SDavid du Colombier 
8113e12c5d1SDavid du Colombier 	if (TROFF)
8123e12c5d1SDavid du Colombier 		return getch();
8133e12c5d1SDavid du Colombier 
8143e12c5d1SDavid du Colombier 	i = getch();
8153e12c5d1SDavid du Colombier 	j = cbits(i);
8163e12c5d1SDavid du Colombier 	if (ismot(i) || fbits(i) != ulfont)
8173e12c5d1SDavid du Colombier 		return(i);
8183e12c5d1SDavid du Colombier 	if (cu) {
8193e12c5d1SDavid du Colombier 		if (trtab[j] == ' ') {
8203e12c5d1SDavid du Colombier 			setcbits(i, '_');
8213e12c5d1SDavid du Colombier 			setfbits(i, FT);	/* default */
8223e12c5d1SDavid du Colombier 		}
8233e12c5d1SDavid du Colombier 		return(i);
8243e12c5d1SDavid du Colombier 	}
8253e12c5d1SDavid du Colombier 	/* should test here for characters that ought to be underlined */
8263e12c5d1SDavid du Colombier 	/* in the old nroff, that was the 200 bit on the width! */
8273e12c5d1SDavid du Colombier 	/* for now, just do letters, digits and certain special chars */
8283e12c5d1SDavid du Colombier 	if (j <= 127) {
8293e12c5d1SDavid du Colombier 		if (!isalnum(j))
8303e12c5d1SDavid du Colombier 			setfbits(i, FT);
8313e12c5d1SDavid du Colombier 	} else {
8323e12c5d1SDavid du Colombier 		if (j < c_isalnum)
8333e12c5d1SDavid du Colombier 			setfbits(i, FT);
8343e12c5d1SDavid du Colombier 	}
8353e12c5d1SDavid du Colombier 	return(i);
8363e12c5d1SDavid du Colombier }
837