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