123884Sjaap #ifndef lint
2*29789Sjaap static char sccsid[] = "@(#)n7.c	2.4 (CWI) 86/08/15";
323884Sjaap #endif lint
423884Sjaap #include "tdef.h"
523884Sjaap #ifdef NROFF
623884Sjaap #include "tw.h"
723884Sjaap #endif
823884Sjaap #ifdef NROFF
923884Sjaap #define GETCH gettch
1023884Sjaap #endif
1123884Sjaap #ifndef NROFF
1223884Sjaap #define GETCH getch
1323884Sjaap #endif
1423884Sjaap 
1523884Sjaap /*
1623906Sjaap  * troff7.c
1723906Sjaap  *
1823906Sjaap  * text
1923906Sjaap  */
2023884Sjaap 
2123884Sjaap #include <sgtty.h>
2223906Sjaap #include <ctype.h>
2323884Sjaap #include "ext.h"
2423884Sjaap int	brflg;
2523884Sjaap 
tbreak()2623884Sjaap tbreak()
2723884Sjaap {
2823884Sjaap 	register pad, k;
2923906Sjaap 	register tchar	*i, j;
3023906Sjaap 	register int resol = 0;
3123884Sjaap 
3223884Sjaap 	trap = 0;
3325595Sjaap 	if (nb) {
3429778Sjaap /*
3525595Sjaap 		if( dip == d && numtab[NL].val == -1)
3625595Sjaap 			newline(1);
3729778Sjaap 		else
3829778Sjaap */
3929778Sjaap 		return;
4025595Sjaap 	}
4123906Sjaap 	if (dip == d && numtab[NL].val == -1) {
4223884Sjaap 		newline(1);
4323884Sjaap 		return;
4423884Sjaap 	}
4523884Sjaap 	if (!nc) {
4623884Sjaap 		setnel();
4723884Sjaap 		if (!wch)
4823884Sjaap 			return;
4923884Sjaap 		if (pendw)
5023884Sjaap 			getword(1);
5123884Sjaap 		movword();
5223884Sjaap 	} else if (pendw && !brflg) {
5323884Sjaap 		getword(1);
5423884Sjaap 		movword();
5523884Sjaap 	}
5623884Sjaap 	*linep = dip->nls = 0;
5723884Sjaap #ifdef NROFF
5823884Sjaap 	if (dip == d)
5923884Sjaap 		horiz(po);
6023884Sjaap #endif
6123884Sjaap 	if (lnmod)
6223884Sjaap 		donum();
6323884Sjaap 	lastl = ne;
6423884Sjaap 	if (brflg != 1) {
6523884Sjaap 		totout = 0;
6623884Sjaap 	} else if (ad) {
6723906Sjaap 		if ((lastl = ll - un) < ne)
6823884Sjaap 			lastl = ne;
6923884Sjaap 	}
7023884Sjaap 	if (admod && ad && (brflg != 2)) {
7123884Sjaap 		lastl = ne;
7223884Sjaap 		adsp = adrem = 0;
7323884Sjaap 		if (admod == 1)
7423906Sjaap 			un +=  quant(nel / 2, HOR);
7523884Sjaap 		else if (admod == 2)
7623884Sjaap 			un += nel;
7723884Sjaap 	}
7823884Sjaap 	totout++;
7923884Sjaap 	brflg = 0;
8023906Sjaap 	if (lastl + un > dip->maxl)
8123906Sjaap 		dip->maxl = lastl + un;
8223884Sjaap 	horiz(un);
8323884Sjaap #ifdef NROFF
8423884Sjaap 	if (adrem % t.Adj)
8523906Sjaap 		resol = t.Hor;
8623884Sjaap 	else
8723906Sjaap 		resol = t.Adj;
8823906Sjaap #else
8923906Sjaap 	resol = HOR;
9023884Sjaap #endif
9123884Sjaap 	for (i = line; nc > 0; ) {
9223884Sjaap 		if ((cbits(j = *i++)) == ' ') {
9323884Sjaap 			pad = 0;
9423884Sjaap 			do {
9523884Sjaap 				pad += width(j);
9623884Sjaap 				nc--;
9723884Sjaap 			} while ((cbits(j = *i++)) == ' ');
9823884Sjaap 			i--;
9923884Sjaap 			pad += adsp;
10023884Sjaap 			--nwd;
10123884Sjaap 			if (adrem) {
10223884Sjaap 				if (adrem < 0) {
10323906Sjaap 					pad -= resol;
10423906Sjaap 					adrem += resol;
10523906Sjaap 				} else if ((totout & 01) || adrem / resol >= nwd) {
10623906Sjaap 					pad += resol;
10723906Sjaap 					adrem -= resol;
10823884Sjaap 				}
10923884Sjaap 			}
11023884Sjaap 			pchar((tchar) WORDSP);
11123884Sjaap 			horiz(pad);
11223884Sjaap 		} else {
11323884Sjaap 			pchar(j);
11423884Sjaap 			nc--;
11523884Sjaap 		}
11623884Sjaap 	}
11723884Sjaap 	if (ic) {
11823884Sjaap 		if ((k = ll - un - lastl + ics) > 0)
11923884Sjaap 			horiz(k);
12023884Sjaap 		pchar(ic);
12123884Sjaap 	}
12223884Sjaap 	if (icf)
12323884Sjaap 		icf++;
12423884Sjaap 	else
12523884Sjaap 		ic = 0;
12623884Sjaap 	ne = nwd = 0;
12723884Sjaap 	un = in;
12823884Sjaap 	setnel();
12923884Sjaap 	newline(0);
13023884Sjaap 	if (dip != d) {
13123884Sjaap 		if (dip->dnl > dip->hnl)
13223884Sjaap 			dip->hnl = dip->dnl;
13323884Sjaap 	} else {
13423906Sjaap 		if (numtab[NL].val > dip->hnl)
13523906Sjaap 			dip->hnl = numtab[NL].val;
13623884Sjaap 	}
13723884Sjaap 	for (k = ls - 1; k > 0 && !trap; k--)
13823884Sjaap 		newline(0);
13923884Sjaap 	spread = 0;
14023884Sjaap }
14123884Sjaap 
donum()14223884Sjaap donum()
14323884Sjaap {
14423884Sjaap 	register i, nw;
14523884Sjaap 	extern pchar();
14623884Sjaap 
14723884Sjaap 	nrbits = nmbits;
14823884Sjaap 	nw = width('1' | nrbits);
14923884Sjaap 	if (nn) {
15023884Sjaap 		nn--;
15123884Sjaap 		goto d1;
15223884Sjaap 	}
15323906Sjaap 	if (numtab[LN].val % ndf) {
15423906Sjaap 		numtab[LN].val++;
15523884Sjaap d1:
15623884Sjaap 		un += nw * (3 + nms + ni);
15723884Sjaap 		return;
15823884Sjaap 	}
15923884Sjaap 	i = 0;
16023906Sjaap 	if (numtab[LN].val < 100)
16123884Sjaap 		i++;
16223906Sjaap 	if (numtab[LN].val < 10)
16323884Sjaap 		i++;
16423884Sjaap 	horiz(nw * (ni + i));
16523884Sjaap 	nform = 0;
16623906Sjaap 	fnumb(numtab[LN].val, pchar);
16723884Sjaap 	un += nw * nms;
16823906Sjaap 	numtab[LN].val++;
16923884Sjaap }
17023884Sjaap 
17123884Sjaap 
text()17223884Sjaap text()
17323884Sjaap {
17423906Sjaap 	register tchar i;
17523884Sjaap 	static int	spcnt;
17623884Sjaap 
17723884Sjaap 	nflush++;
17823906Sjaap 	numtab[HP].val = 0;
17923906Sjaap 	if ((dip == d) && (numtab[NL].val == -1)) {
18023884Sjaap 		newline(1);
18123884Sjaap 		return;
18223884Sjaap 	}
18323884Sjaap 	setnel();
18423884Sjaap 	if (ce || !fi) {
18523884Sjaap 		nofill();
18623884Sjaap 		return;
18723884Sjaap 	}
18823884Sjaap 	if (pendw)
18923884Sjaap 		goto t4;
19023884Sjaap 	if (pendt)
19123884Sjaap 		if (spcnt)
19223884Sjaap 			goto t2;
19323884Sjaap 		else
19423884Sjaap 			goto t3;
19523884Sjaap 	pendt++;
19623884Sjaap 	if (spcnt)
19723884Sjaap 		goto t2;
19823906Sjaap 	while ((cbits(i = GETCH())) == ' ') {
19923884Sjaap 		spcnt++;
20023906Sjaap 		numtab[HP].val += sps;
20123906Sjaap 		widthp = sps;
20223906Sjaap 	}
20323884Sjaap 	if (nlflg) {
20423884Sjaap t1:
20523884Sjaap 		nflush = pendt = ch = spcnt = 0;
20623884Sjaap 		callsp();
20723884Sjaap 		return;
20823884Sjaap 	}
20923884Sjaap 	ch = i;
21023884Sjaap 	if (spcnt) {
21123884Sjaap t2:
21223884Sjaap 		tbreak();
21323884Sjaap 		if (nc || wch)
21423884Sjaap 			goto rtn;
21523884Sjaap 		un += spcnt * sps;
21623884Sjaap 		spcnt = 0;
21723884Sjaap 		setnel();
21823884Sjaap 		if (trap)
21923884Sjaap 			goto rtn;
22023884Sjaap 		if (nlflg)
22123884Sjaap 			goto t1;
22223884Sjaap 	}
22323884Sjaap t3:
22423884Sjaap 	if (spread)
22523884Sjaap 		goto t5;
22623884Sjaap 	if (pendw || !wch)
22723884Sjaap t4:
22823884Sjaap 		if (getword(0))
22923884Sjaap 			goto t6;
23023884Sjaap 	if (!movword())
23123884Sjaap 		goto t3;
23223884Sjaap t5:
23323884Sjaap 	if (nlflg)
23423884Sjaap 		pendt = 0;
23523884Sjaap 	adsp = adrem = 0;
23623884Sjaap 	if (ad) {
23723884Sjaap 		if (nwd == 1)
23823884Sjaap 			adsp = nel;
23923884Sjaap 		else
24023884Sjaap 			adsp = nel / (nwd - 1);
24123906Sjaap 		adsp = (adsp / HOR) * HOR;
24223906Sjaap 		adrem = nel - adsp*(nwd-1);
24323884Sjaap 	}
24423884Sjaap 	brflg = 1;
24523884Sjaap 	tbreak();
24623884Sjaap 	spread = 0;
24723884Sjaap 	if (!trap)
24823884Sjaap 		goto t3;
24923884Sjaap 	if (!nlflg)
25023884Sjaap 		goto rtn;
25123884Sjaap t6:
25223884Sjaap 	pendt = 0;
25323884Sjaap 	ckul();
25423884Sjaap rtn:
25523884Sjaap 	nflush = 0;
25623884Sjaap }
25723884Sjaap 
25823884Sjaap 
nofill()25923884Sjaap nofill()
26023884Sjaap {
26123884Sjaap 	register j;
26223906Sjaap 	register tchar i;
26323884Sjaap 
26423884Sjaap 	if (!pendnf) {
26523884Sjaap 		over = 0;
26623884Sjaap 		tbreak();
26723884Sjaap 		if (trap)
26823884Sjaap 			goto rtn;
26923884Sjaap 		if (nlflg) {
27023884Sjaap 			ch = nflush = 0;
27123884Sjaap 			callsp();
27223884Sjaap 			return;
27323884Sjaap 		}
27423884Sjaap 		adsp = adrem = 0;
27523884Sjaap 		nwd = 10000;
27623884Sjaap 	}
27723884Sjaap 	while ((j = (cbits(i = GETCH()))) != '\n') {
27823884Sjaap 		if (j == ohc)
27923884Sjaap 			continue;
28023884Sjaap 		if (j == CONT) {
28123884Sjaap 			pendnf++;
28223884Sjaap 			nflush = 0;
28323884Sjaap 			flushi();
28423884Sjaap 			ckul();
28523884Sjaap 			return;
28623884Sjaap 		}
28723906Sjaap 		j = width(i);
28823906Sjaap 		widthp = j;
28923906Sjaap 		numtab[HP].val += j;
29023906Sjaap 		storeline(i, j);
29123884Sjaap 	}
29223884Sjaap 	if (ce) {
29323884Sjaap 		ce--;
29423884Sjaap 		if ((i = quant(nel / 2, HOR)) > 0)
29523884Sjaap 			un += i;
29623884Sjaap 	}
29723884Sjaap 	if (!nc)
29823884Sjaap 		storeline((tchar)FILLER, 0);
29923884Sjaap 	brflg = 2;
30023884Sjaap 	tbreak();
30123884Sjaap 	ckul();
30223884Sjaap rtn:
30323884Sjaap 	pendnf = nflush = 0;
30423884Sjaap }
30523884Sjaap 
30623884Sjaap 
callsp()30723884Sjaap callsp()
30823884Sjaap {
30923884Sjaap 	register i;
31023884Sjaap 
31123884Sjaap 	if (flss)
31223884Sjaap 		i = flss;
31323884Sjaap 	else
31423884Sjaap 		i = lss;
31523884Sjaap 	flss = 0;
31623884Sjaap 	casesp(i);
31723884Sjaap }
31823884Sjaap 
31923884Sjaap 
ckul()32023884Sjaap ckul()
32123884Sjaap {
32223884Sjaap 	if (ul && (--ul == 0)) {
32323884Sjaap 		cu = 0;
32423884Sjaap 		font = sfont;
32523884Sjaap 		mchbits();
32623884Sjaap 	}
32723884Sjaap 	if (it && (--it == 0) && itmac)
32823884Sjaap 		control(itmac, 0);
32923884Sjaap }
33023884Sjaap 
33123884Sjaap 
storeline(c,w)33223884Sjaap storeline(c, w)
33323906Sjaap register tchar c;
33423884Sjaap {
33523884Sjaap 	if (linep >= line + lnsize - 1) {
33623884Sjaap 		if (!over) {
33723884Sjaap 			flusho();
33823906Sjaap 			errprint("Line overflow.");
33923884Sjaap 			over++;
34023884Sjaap 			c = LEFTHAND;
34123884Sjaap 			w = -1;
34223884Sjaap 			goto s1;
34323884Sjaap 		}
34423884Sjaap 		return;
34523884Sjaap 	}
34623884Sjaap s1:
34723884Sjaap 	if (w == -1)
34823884Sjaap 		w = width(c);
34923884Sjaap 	ne += w;
35023884Sjaap 	nel -= w;
35123884Sjaap 	*linep++ = c;
35223884Sjaap 	nc++;
35323884Sjaap }
35423884Sjaap 
35523884Sjaap 
newline(a)35623884Sjaap newline(a)
35723884Sjaap int	a;
35823884Sjaap {
35923884Sjaap 	register i, j, nlss;
36023884Sjaap 	int	opn;
36123884Sjaap 
36223884Sjaap 	if (a)
36323884Sjaap 		goto nl1;
36423884Sjaap 	if (dip != d) {
36523884Sjaap 		j = lss;
36623884Sjaap 		pchar1((tchar)FLSS);
36723884Sjaap 		if (flss)
36823884Sjaap 			lss = flss;
36923884Sjaap 		i = lss + dip->blss;
37023884Sjaap 		dip->dnl += i;
37123884Sjaap 		pchar1((tchar)i);
37223884Sjaap 		pchar1((tchar)'\n');
37323884Sjaap 		lss = j;
37423884Sjaap 		dip->blss = flss = 0;
37523884Sjaap 		if (dip->alss) {
37623884Sjaap 			pchar1((tchar)FLSS);
37723884Sjaap 			pchar1((tchar)dip->alss);
37823884Sjaap 			pchar1((tchar)'\n');
37923884Sjaap 			dip->dnl += dip->alss;
38023884Sjaap 			dip->alss = 0;
38123884Sjaap 		}
38223906Sjaap 		if (dip->ditrap && !dip->ditf && dip->dnl >= dip->ditrap && dip->dimac)
38323884Sjaap 			if (control(dip->dimac, 0)) {
38423884Sjaap 				trap++;
38523884Sjaap 				dip->ditf++;
38623884Sjaap 			}
38723884Sjaap 		return;
38823884Sjaap 	}
38923884Sjaap 	j = lss;
39023884Sjaap 	if (flss)
39123884Sjaap 		lss = flss;
39223884Sjaap 	nlss = dip->alss + dip->blss + lss;
39323906Sjaap 	numtab[NL].val += nlss;
39423884Sjaap #ifndef NROFF
39523884Sjaap 	if (ascii) {
39623884Sjaap 		dip->alss = dip->blss = 0;
39723884Sjaap 	}
39823884Sjaap #endif
39923884Sjaap 	pchar1((tchar)'\n');
40023884Sjaap 	flss = 0;
40123884Sjaap 	lss = j;
40223906Sjaap 	if (numtab[NL].val < pl)
40323884Sjaap 		goto nl2;
40423884Sjaap nl1:
40523906Sjaap 	ejf = dip->hnl = numtab[NL].val = 0;
40623884Sjaap 	ejl = frame;
40723884Sjaap 	if (donef) {
40823884Sjaap 		if ((!nc && !wch) || ndone)
40923884Sjaap 			done1(0);
41023884Sjaap 		ndone++;
41123884Sjaap 		donef = 0;
41223884Sjaap 		if (frame == stk)
41323884Sjaap 			nflush++;
41423884Sjaap 	}
41523906Sjaap 	opn = numtab[PN].val;
41623906Sjaap 	numtab[PN].val++;
41723884Sjaap 	if (npnflg) {
41823906Sjaap 		numtab[PN].val = npn;
41923884Sjaap 		npn = npnflg = 0;
42023884Sjaap 	}
42123884Sjaap nlpn:
42223906Sjaap 	if (numtab[PN].val == pfrom) {
42323884Sjaap 		print++;
42423884Sjaap 		pfrom = -1;
42523884Sjaap 	} else if (opn == pto) {
42623884Sjaap 		print = 0;
42723884Sjaap 		opn = -1;
42823884Sjaap 		chkpn();
42923884Sjaap 		goto nlpn;
43023884Sjaap 	}
43123884Sjaap 	if (print)
43223906Sjaap 		newpage(numtab[PN].val);	/* supposedly in a clean state so can pause */
433*29789Sjaap #ifdef NROFF
434*29789Sjaap 	if (print && *t.eject) {
435*29789Sjaap 		oputs(t.eject);
436*29789Sjaap 		flusho();
437*29789Sjaap 	}
438*29789Sjaap #endif
43923884Sjaap 	if (stop && print) {
44023884Sjaap 		dpn++;
44123884Sjaap 		if (dpn >= stop) {
44223884Sjaap 			dpn = 0;
44323884Sjaap 			dostop();
44423884Sjaap 		}
44523884Sjaap 	}
44623884Sjaap nl2:
44723884Sjaap 	trap = 0;
44823906Sjaap 	if (numtab[NL].val == 0) {
44923884Sjaap 		if ((j = findn(0)) != NTRAP)
45023884Sjaap 			trap = control(mlist[j], 0);
45123906Sjaap 	} else if ((i = findt(numtab[NL].val - nlss)) <= nlss) {
45223906Sjaap 		if ((j = findn1(numtab[NL].val - nlss + i)) == NTRAP) {
45323884Sjaap 			flusho();
45423906Sjaap 			errprint("Trap botch.");
45523884Sjaap 			done2(-5);
45623884Sjaap 		}
45723884Sjaap 		trap = control(mlist[j], 0);
45823884Sjaap 	}
45923884Sjaap }
46023884Sjaap 
46123884Sjaap 
findn1(a)46223884Sjaap findn1(a)
46323884Sjaap int	a;
46423884Sjaap {
46523884Sjaap 	register i, j;
46623884Sjaap 
46723884Sjaap 	for (i = 0; i < NTRAP; i++) {
46823884Sjaap 		if (mlist[i]) {
46923884Sjaap 			if ((j = nlist[i]) < 0)
47023884Sjaap 				j += pl;
47123884Sjaap 			if (j == a)
47223884Sjaap 				break;
47323884Sjaap 		}
47423884Sjaap 	}
47523884Sjaap 	return(i);
47623884Sjaap }
47723884Sjaap 
47823884Sjaap 
chkpn()47923884Sjaap chkpn()
48023884Sjaap {
48123884Sjaap 	pto = *(pnp++);
48223884Sjaap 	pfrom = pto>=0 ? pto : -pto;
48323884Sjaap 	if (pto == -32767) {
48423884Sjaap 		flusho();
48523884Sjaap 		done1(0);
48623884Sjaap 	}
48723884Sjaap 	if (pto < 0) {
48823884Sjaap 		pto = -pto;
48923884Sjaap 		print++;
49023884Sjaap 		pfrom = 0;
49123884Sjaap 	}
49223884Sjaap }
49323884Sjaap 
49423884Sjaap 
findt(a)49523884Sjaap findt(a)
49623884Sjaap int	a;
49723884Sjaap {
49823884Sjaap 	register i, j, k;
49923884Sjaap 
50023884Sjaap 	k = 32767;
50123884Sjaap 	if (dip != d) {
50223906Sjaap 		if (dip->dimac && (i = dip->ditrap - a) > 0)
50323884Sjaap 			k = i;
50423884Sjaap 		return(k);
50523884Sjaap 	}
50623884Sjaap 	for (i = 0; i < NTRAP; i++) {
50723884Sjaap 		if (mlist[i]) {
50823884Sjaap 			if ((j = nlist[i]) < 0)
50923884Sjaap 				j += pl;
51023906Sjaap 			if ((j -= a) <= 0)
51123884Sjaap 				continue;
51223884Sjaap 			if (j < k)
51323884Sjaap 				k = j;
51423884Sjaap 		}
51523884Sjaap 	}
51623884Sjaap 	i = pl - a;
51723884Sjaap 	if (k > i)
51823884Sjaap 		k = i;
51923884Sjaap 	return(k);
52023884Sjaap }
52123884Sjaap 
52223884Sjaap 
findt1()52323884Sjaap findt1()
52423884Sjaap {
52523884Sjaap 	register i;
52623884Sjaap 
52723884Sjaap 	if (dip != d)
52823884Sjaap 		i = dip->dnl;
52923884Sjaap 	else
53023906Sjaap 		i = numtab[NL].val;
53123884Sjaap 	return(findt(i));
53223884Sjaap }
53323884Sjaap 
53423884Sjaap 
53523884Sjaap eject(a)
53623884Sjaap struct s *a;
53723884Sjaap {
53823884Sjaap 	register savlss;
53923884Sjaap 
54023884Sjaap 	if (dip != d)
54123884Sjaap 		return;
54223884Sjaap 	ejf++;
54323884Sjaap 	if (a)
54423884Sjaap 		ejl = a;
54523884Sjaap 	else
54623884Sjaap 		ejl = frame;
54723884Sjaap 	if (trap)
54823884Sjaap 		return;
54923884Sjaap e1:
55023884Sjaap 	savlss = lss;
55123906Sjaap 	lss = findt(numtab[NL].val);
55223884Sjaap 	newline(0);
55323884Sjaap 	lss = savlss;
55423906Sjaap 	if (numtab[NL].val && !trap)
55523884Sjaap 		goto e1;
55623884Sjaap }
55723884Sjaap 
55823884Sjaap 
movword()55923884Sjaap movword()
56023884Sjaap {
56123884Sjaap 	register w;
56223906Sjaap 	register tchar i, *wp;
56323884Sjaap 	int	savwch, hys;
56423884Sjaap 
56523884Sjaap 	over = 0;
56623884Sjaap 	wp = wordp;
56723884Sjaap 	if (!nwd) {
56823906Sjaap 		while (cbits(i = *wp++) == ' ') {
56923884Sjaap 			wch--;
57023906Sjaap 			wne -= sps;
57123884Sjaap 		}
57223884Sjaap 		wp--;
57323884Sjaap 	}
57423906Sjaap 	if (wne > nel && !hyoff && hyf && (!nwd || nel > 3 * sps) &&
57523906Sjaap 	   (!(hyf & 02) || (findt1() > lss)))
57623884Sjaap 		hyphen(wp);
57723884Sjaap 	savwch = wch;
57823884Sjaap 	hyp = hyptr;
57923884Sjaap 	nhyp = 0;
58023906Sjaap 	while (*hyp && *hyp <= wp)
58123884Sjaap 		hyp++;
58223884Sjaap 	while (wch) {
58323906Sjaap 		if (hyoff != 1 && *hyp == wp) {
58423884Sjaap 			hyp++;
58523906Sjaap 			if (!wdstart || (wp > wdstart + 1 && wp < wdend &&
58623906Sjaap 			   (!(hyf & 04) || wp < wdend - 1) &&		/* 04 => last 2 */
58723906Sjaap 			   (!(hyf & 010) || wp > wdstart + 2))) {	/* 010 => 1st 2 */
58823884Sjaap 				nhyp++;
58923884Sjaap 				storeline((tchar)IMP, 0);
59023884Sjaap 			}
59123884Sjaap 		}
59223884Sjaap 		i = *wp++;
59323884Sjaap 		w = width(i);
59423884Sjaap 		wne -= w;
59523884Sjaap 		wch--;
59623884Sjaap 		storeline(i, w);
59723884Sjaap 	}
59823884Sjaap 	if (nel >= 0) {
59923884Sjaap 		nwd++;
60023906Sjaap 		return(0);	/* line didn't fill up */
60123884Sjaap 	}
60223906Sjaap #ifndef NROFF
60323906Sjaap 	xbits((tchar)HYPHEN, 1);
60423906Sjaap #endif
60523884Sjaap 	hys = width((tchar)HYPHEN);
60623884Sjaap m1:
60723884Sjaap 	if (!nhyp) {
60823884Sjaap 		if (!nwd)
60923884Sjaap 			goto m3;
61023884Sjaap 		if (wch == savwch)
61123884Sjaap 			goto m4;
61223884Sjaap 	}
61323884Sjaap 	if (*--linep != IMP)
61423884Sjaap 		goto m5;
61523884Sjaap 	if (!(--nhyp))
61623884Sjaap 		if (!nwd)
61723884Sjaap 			goto m2;
61823884Sjaap 	if (nel < hys) {
61923884Sjaap 		nc--;
62023884Sjaap 		goto m1;
62123884Sjaap 	}
62223884Sjaap m2:
62323906Sjaap 	if ((i = cbits(*(linep - 1))) != '-' && i != EMDASH) {
62423884Sjaap 		*linep = (*(linep - 1) & SFMASK) | HYPHEN;
62523884Sjaap 		w = width(*linep);
62623884Sjaap 		nel -= w;
62723884Sjaap 		ne += w;
62823884Sjaap 		linep++;
62923884Sjaap 	}
63023884Sjaap m3:
63123884Sjaap 	nwd++;
63223884Sjaap m4:
63323884Sjaap 	wordp = wp;
63423906Sjaap 	return(1);	/* line filled up */
63523884Sjaap m5:
63623884Sjaap 	nc--;
63723884Sjaap 	w = width(*linep);
63823884Sjaap 	ne -= w;
63923884Sjaap 	nel += w;
64023884Sjaap 	wne += w;
64123884Sjaap 	wch++;
64223884Sjaap 	wp--;
64323884Sjaap 	goto m1;
64423884Sjaap }
64523884Sjaap 
64623884Sjaap 
horiz(i)64723884Sjaap horiz(i)
64823884Sjaap int	i;
64923884Sjaap {
65023884Sjaap 	vflag = 0;
65123884Sjaap 	if (i)
65223884Sjaap 		pchar(makem(i));
65323884Sjaap }
65423884Sjaap 
65523884Sjaap 
setnel()65623884Sjaap setnel()
65723884Sjaap {
65823884Sjaap 	if (!nc) {
65923884Sjaap 		linep = line;
66023884Sjaap 		if (un1 >= 0) {
66123884Sjaap 			un = un1;
66223884Sjaap 			un1 = -1;
66323884Sjaap 		}
66423884Sjaap 		nel = ll - un;
66523884Sjaap 		ne = adsp = adrem = 0;
66623884Sjaap 	}
66723884Sjaap }
66823884Sjaap 
66923884Sjaap 
getword(x)67023884Sjaap getword(x)
67123884Sjaap int	x;
67223884Sjaap {
67323906Sjaap 	register int j, k;
67423906Sjaap 	register tchar i, *wp;
67523906Sjaap 	int noword;
67623884Sjaap 
67723884Sjaap 	noword = 0;
67823884Sjaap 	if (x)
67923884Sjaap 		if (pendw) {
68023884Sjaap 			*pendw = 0;
68123884Sjaap 			goto rtn;
68223884Sjaap 		}
68323884Sjaap 	if (wordp = pendw)
68423884Sjaap 		goto g1;
68523884Sjaap 	hyp = hyptr;
68623884Sjaap 	wordp = word;
68723884Sjaap 	over = wne = wch = 0;
68823884Sjaap 	hyoff = 0;
68923906Sjaap 	while (1) {	/* picks up 1st char of word */
69023884Sjaap 		j = cbits(i = GETCH());
69123884Sjaap 		if (j == '\n') {
69223884Sjaap 			wne = wch = 0;
69323884Sjaap 			noword = 1;
69423884Sjaap 			goto rtn;
69523884Sjaap 		}
69623884Sjaap 		if (j == ohc) {
69723906Sjaap 			hyoff = 1;	/* 1 => don't hyphenate */
69823884Sjaap 			continue;
69923884Sjaap 		}
70023884Sjaap 		if (j == ' ') {
70123906Sjaap 			numtab[HP].val += sps;
70223906Sjaap 			widthp = sps;
70323906Sjaap 			storeword(i, sps);
70423884Sjaap 			continue;
70523884Sjaap 		}
70623884Sjaap 		break;
70723884Sjaap 	}
70823906Sjaap 	storeword(' ' | chbits, sps);
70923884Sjaap 	if (spflg) {
71023906Sjaap 		storeword(' ' | chbits, sps);
71123884Sjaap 		spflg = 0;
71223884Sjaap 	}
71323884Sjaap g0:
71423884Sjaap 	if (j == CONT) {
71523884Sjaap 		pendw = wordp;
71623884Sjaap 		nflush = 0;
71723884Sjaap 		flushi();
71823884Sjaap 		return(1);
71923884Sjaap 	}
72023884Sjaap 	if (hyoff != 1) {
72123884Sjaap 		if (j == ohc) {
72223884Sjaap 			hyoff = 2;
72323884Sjaap 			*hyp++ = wordp;
72423884Sjaap 			if (hyp > (hyptr + NHYP - 1))
72523884Sjaap 				hyp = hyptr + NHYP - 1;
72623884Sjaap 			goto g1;
72723884Sjaap 		}
72823906Sjaap 		if (j == '-' || j == EMDASH)
72923884Sjaap 			if (wordp > word + 1) {
73023884Sjaap 				hyoff = 2;
73123884Sjaap 				*hyp++ = wordp + 1;
73223884Sjaap 				if (hyp > (hyptr + NHYP - 1))
73323884Sjaap 					hyp = hyptr + NHYP - 1;
73423884Sjaap 			}
73523884Sjaap 	}
73623906Sjaap 	j = width(i);
73723906Sjaap 	numtab[HP].val += j;
73823906Sjaap 	storeword(i, j);
73923884Sjaap g1:
74023884Sjaap 	j = cbits(i = GETCH());
74123884Sjaap 	if (j != ' ') {
74223906Sjaap 		static char *sentchar = ".?!";	/* sentence terminators */
74323884Sjaap 		if (j != '\n')
74423884Sjaap 			goto g0;
74523906Sjaap 		wp = wordp-1;	/* handle extra space at end of sentence */
74623906Sjaap 		while (wp >= word) {
74723906Sjaap 			j = cbits(*wp--);
74823906Sjaap 			if (j=='"' || j=='\'' || j==')' || j==']' || j=='*' || j==DAGGER)
74923906Sjaap 				continue;
75023906Sjaap 			for (k = 0; sentchar[k]; k++)
75123906Sjaap 				if (j == sentchar[k]) {
75223884Sjaap 					spflg++;
75323906Sjaap 					break;
75423906Sjaap 				}
75523906Sjaap 			break;
75623906Sjaap 		}
75723884Sjaap 	}
75823884Sjaap 	*wordp = 0;
75923906Sjaap 	numtab[HP].val += sps;
76023884Sjaap rtn:
76123906Sjaap 	for (wp = word; *wp; wp++) {
76223906Sjaap 		j = cbits(*wp);
76323906Sjaap 		if (j == ' ')
76423906Sjaap 			continue;
76523906Sjaap 		if (!isdigit(j) && j != '-')
76623906Sjaap 			break;
76723906Sjaap 	}
76823906Sjaap 	if (*wp == 0)	/* all numbers, so don't hyphenate */
76923906Sjaap 		hyoff = 1;
77023884Sjaap 	wdstart = 0;
77123884Sjaap 	wordp = word;
77223884Sjaap 	pendw = 0;
77323884Sjaap 	*hyp++ = 0;
77423884Sjaap 	setnel();
77523884Sjaap 	return(noword);
77623884Sjaap }
77723884Sjaap 
77823884Sjaap 
storeword(c,w)77923884Sjaap storeword(c, w)
78023906Sjaap register tchar c;
78123906Sjaap register int	w;
78223884Sjaap {
78323884Sjaap 
78423906Sjaap 	if (wordp >= &word[WDSIZE - 3]) {
78523884Sjaap 		if (!over) {
78623884Sjaap 			flusho();
78723906Sjaap 			errprint("Word overflow.");
78823884Sjaap 			over++;
78923884Sjaap 			c = LEFTHAND;
79023884Sjaap 			w = -1;
79123884Sjaap 			goto s1;
79223884Sjaap 		}
79323884Sjaap 		return;
79423884Sjaap 	}
79523884Sjaap s1:
79623884Sjaap 	if (w == -1)
79723884Sjaap 		w = width(c);
79823906Sjaap 	widthp = w;
79923884Sjaap 	wne += w;
80023884Sjaap 	*wordp++ = c;
80123884Sjaap 	wch++;
80223884Sjaap }
80323884Sjaap 
80423884Sjaap 
80523884Sjaap #ifdef NROFF
gettch()80623884Sjaap tchar gettch()
80723884Sjaap {
80823906Sjaap 	extern int c_isalnum;
80923884Sjaap 	tchar i;
81023884Sjaap 	int j;
81123884Sjaap 
81223884Sjaap 	i = getch();
81323884Sjaap 	j = cbits(i);
81423906Sjaap 	if (ismot(i) || fbits(i) != ulfont)
81523884Sjaap 		return(i);
81623906Sjaap 	if (cu) {
81723906Sjaap 		if (trtab[j] == ' ') {
81823906Sjaap 			setcbits(i, '_');
81923906Sjaap 			setfbits(i, FT);	/* default */
82023906Sjaap 		}
82123906Sjaap 		return(i);
82223884Sjaap 	}
82323906Sjaap 	/* should test here for characters that ought to be underlined */
82423906Sjaap 	/* in the old nroff, that was the 200 bit on the width! */
82523906Sjaap 	/* for now, just do letters, digits and certain special chars */
82623906Sjaap 	if (j <= 127) {
82723906Sjaap 		if (!isalnum(j))
82823906Sjaap 			setfbits(i, FT);
82923906Sjaap 	} else {
83023906Sjaap 		if (j < c_isalnum)
83123906Sjaap 			setfbits(i, FT);
83223906Sjaap 	}
83323884Sjaap 	return(i);
83423884Sjaap }
83523884Sjaap 
83623884Sjaap 
83723884Sjaap #endif
838