1*48302Sbostic /*- 2*48302Sbostic * Copyright (c) 1991 The Regents of the University of California. 3*48302Sbostic * All rights reserved. 4*48302Sbostic * 5*48302Sbostic * %sccs.include.proprietary.c% 6*48302Sbostic */ 7*48302Sbostic 87071Srrh #ifndef lint 9*48302Sbostic static char sccsid[] = "@(#)n7.c 4.5 (Berkeley) 04/18/91"; 10*48302Sbostic #endif /* not lint */ 117071Srrh 127071Srrh #include "tdef.h" 137071Srrh extern 147071Srrh #include "d.h" 157071Srrh extern 167071Srrh #include "v.h" 177071Srrh #ifdef NROFF 187071Srrh extern 197071Srrh #include "tw.h" 207071Srrh #endif 217071Srrh #include "sdef.h" 227071Srrh #ifdef NROFF 237071Srrh #define GETCH gettch 247071Srrh #endif 257071Srrh #ifndef NROFF 267071Srrh #define GETCH getch 277071Srrh #endif 287071Srrh 297071Srrh /* 307071Srrh troff7.c 317071Srrh 327071Srrh text 337071Srrh */ 347071Srrh 357071Srrh extern struct s *frame, *stk; 367071Srrh extern struct s *ejl; 377071Srrh 387071Srrh extern int pl; 397071Srrh extern int trap; 407071Srrh extern int flss; 417071Srrh extern int npnflg; 427071Srrh extern int npn; 437071Srrh extern int stop; 447071Srrh extern int nflush; 457071Srrh extern int ejf; 467071Srrh extern int ascii; 477071Srrh extern int donef; 487071Srrh extern int nc; 497071Srrh extern int wch; 507071Srrh extern int dpn; 517071Srrh extern int ndone; 527071Srrh extern int lss; 537071Srrh extern int pto; 547071Srrh extern int pfrom; 557071Srrh extern int print; 567071Srrh extern int nlist[NTRAP]; 577071Srrh extern int mlist[NTRAP]; 587071Srrh extern int *pnp; 597071Srrh extern int nb; 607071Srrh extern int ic; 617071Srrh extern int icf; 627071Srrh extern int ics; 637071Srrh extern int ne; 647071Srrh extern int ll; 657071Srrh extern int un; 667071Srrh extern int un1; 677071Srrh extern int in; 687071Srrh extern int ls; 697071Srrh extern int spread; 707071Srrh extern int totout; 717071Srrh extern int nwd; 727071Srrh extern int *pendw; 737071Srrh extern int *linep; 747071Srrh extern int line[]; 757071Srrh extern int lastl; 767071Srrh extern int ch; 777071Srrh extern int ce; 787071Srrh extern int fi; 797071Srrh extern int nlflg; 807071Srrh extern int pendt; 817071Srrh extern int sps; 827071Srrh extern int adsp; 837071Srrh extern int pendnf; 847071Srrh extern int over; 857071Srrh extern int adrem; 867071Srrh extern int nel; 877071Srrh extern int ad; 887071Srrh extern int ohc; 897071Srrh extern int hyoff; 907071Srrh extern int nhyp; 917071Srrh extern int spflg; 927071Srrh extern int word[]; 937071Srrh extern int *wordp; 947071Srrh extern int wne; 957071Srrh extern int chbits; 967071Srrh extern int cwidth; 977071Srrh extern int widthp; 987071Srrh extern int hyf; 997071Srrh extern int xbitf; 1007071Srrh extern int vflag; 1017071Srrh extern int ul; 1027071Srrh extern int cu; 1037071Srrh extern int font; 1047071Srrh extern int sfont; 1057071Srrh extern int it; 1067071Srrh extern int itmac; 1077071Srrh extern int *hyptr[NHYP]; 1087071Srrh extern int **hyp; 1097071Srrh extern int *wdstart, *wdend; 1107071Srrh extern int lnmod; 1117071Srrh extern int admod; 1127071Srrh extern int nn; 1137071Srrh extern int nms; 1147071Srrh extern int ndf; 1157071Srrh extern int ni; 1167071Srrh extern int nform; 1177071Srrh extern int lnsize; 1187071Srrh extern int po; 1197071Srrh extern int ulbit; 1207071Srrh extern int *vlist; 1217071Srrh extern int nrbits; 1227071Srrh extern int nmbits; 1237071Srrh extern char trtab[]; 1247071Srrh extern int xxx; 1257071Srrh int brflg; 1267071Srrh 1277071Srrh tbreak(){ 1287071Srrh register *i, j, pad; 1297071Srrh int res; 1307071Srrh 1317071Srrh trap = 0; 1327071Srrh if(nb)return; 1337071Srrh if((dip == d) && (v.nl == -1)){ 1347071Srrh newline(1); 1357071Srrh return; 1367071Srrh } 1377071Srrh if(!nc){ 1387071Srrh setnel(); 1397071Srrh if(!wch)return; 1407071Srrh if(pendw)getword(1); 1417071Srrh movword(); 1427071Srrh }else if(pendw && !brflg){ 1437071Srrh getword(1); 1447071Srrh movword(); 1457071Srrh } 1467071Srrh *linep = dip->nls = 0; 1477071Srrh #ifdef NROFF 1487071Srrh if(dip == d)horiz(po); 1497071Srrh #endif 1507071Srrh if(lnmod)donum(); 1517071Srrh lastl = ne; 1527071Srrh if(brflg != 1){ 1537071Srrh totout = 0; 1547071Srrh }else if(ad){ 1557071Srrh if((lastl = (ll - un)) < ne)lastl = ne; 1567071Srrh } 1577071Srrh if(admod && ad && (brflg != 2)){ 1587071Srrh lastl = ne; 1597071Srrh adsp = adrem = 0; 1607071Srrh #ifdef NROFF 1617071Srrh if(admod == 1)un += quant(nel/2,t.Adj); 1627071Srrh #endif 1637071Srrh #ifndef NROFF 1647071Srrh if(admod == 1)un += nel/2; 1657071Srrh #endif 1667071Srrh else if(admod ==2)un += nel; 1677071Srrh } 1687071Srrh totout++; 1697071Srrh brflg = 0; 1707071Srrh if((lastl+un) > dip->maxl)dip->maxl = (lastl+un); 1717071Srrh horiz(un); 1727071Srrh #ifdef NROFF 1737071Srrh if(adrem%t.Adj)res = t.Hor; else res = t.Adj; 1747071Srrh #endif 1757071Srrh for(i = line;nc > 0;){ 1767071Srrh if(((j = *i++) & CMASK) == ' '){ 1777071Srrh pad = 0; 1787071Srrh do{ 1797071Srrh pad += width(j); 1807071Srrh nc--; 1817071Srrh }while(((j = *i++) & CMASK) == ' '); 1827071Srrh i--; 1837071Srrh pad += adsp; 1847071Srrh --nwd; 1857071Srrh if(adrem){ 1867071Srrh if(adrem < 0){ 1877071Srrh #ifdef NROFF 1887071Srrh pad -= res; 1897071Srrh adrem += res; 1907071Srrh }else if((totout&01) || 1917071Srrh ((adrem/res)>=(nwd))){ 1927071Srrh pad += res; 1937071Srrh adrem -= res; 1947071Srrh #endif 1957071Srrh #ifndef NROFF 1967071Srrh pad--; 1977071Srrh adrem++; 1987071Srrh }else{ 1997071Srrh pad++; 2007071Srrh adrem--; 2017071Srrh #endif 2027071Srrh } 2037071Srrh } 2047071Srrh horiz(pad); 2057071Srrh }else{ 2067071Srrh pchar(j); 2077071Srrh nc--; 2087071Srrh } 2097071Srrh } 2107071Srrh if(ic){ 2117071Srrh if((j = ll - un - lastl + ics) > 0)horiz(j); 2127071Srrh pchar(ic); 2137071Srrh } 2147071Srrh if(icf)icf++; 2157071Srrh else ic = 0; 2167071Srrh ne = nwd = 0; 2177071Srrh un = in; 2187071Srrh setnel(); 2197071Srrh newline(0); 2207071Srrh if(dip != d){if(dip->dnl > dip->hnl)dip->hnl = dip->dnl;} 2217071Srrh else{if(v.nl > dip->hnl)dip->hnl = v.nl;} 2227071Srrh for(j=ls-1; (j >0) && !trap; j--)newline(0); 2237071Srrh spread = 0; 2247071Srrh } 2257071Srrh donum(){ 2267071Srrh register i, nw; 2277071Srrh extern pchar(); 2287071Srrh 2297071Srrh nrbits = nmbits; 2307071Srrh nw = width('1' | nrbits); 2317071Srrh if(nn){ 2327071Srrh nn--; 2337071Srrh goto d1; 2347071Srrh } 2357071Srrh if(v.ln%ndf){ 2367071Srrh v.ln++; 2377071Srrh d1: 2387071Srrh un += nw*(3+nms+ni); 2397071Srrh return; 2407071Srrh } 2417071Srrh i = 0; 2427071Srrh if(v.ln<100)i++; 2437071Srrh if(v.ln<10)i++; 2447071Srrh horiz(nw*(ni+i)); 2457071Srrh nform = 0; 2467071Srrh fnumb(v.ln,pchar); 2477071Srrh un += nw*nms; 2487071Srrh v.ln++; 2497071Srrh } 2507071Srrh text(){ 2517071Srrh register i; 2527071Srrh static int spcnt; 2537071Srrh 2547071Srrh nflush++; 2557071Srrh if((dip == d) && (v.nl == -1)){newline(1); return;} 2567071Srrh setnel(); 2577071Srrh if(ce || !fi){ 2587071Srrh nofill(); 2597071Srrh return; 2607071Srrh } 2617071Srrh if(pendw)goto t4; 2627071Srrh if(pendt)if(spcnt)goto t2; else goto t3; 2637071Srrh pendt++; 2647071Srrh if(spcnt)goto t2; 2657071Srrh while(((i = GETCH()) & CMASK) == ' ')spcnt++; 2667071Srrh if(nlflg){ 2677071Srrh t1: 2687071Srrh nflush = pendt = ch = spcnt = 0; 2697071Srrh callsp(); 2707071Srrh return; 2717071Srrh } 2727071Srrh ch = i; 2737071Srrh if(spcnt){ 2747071Srrh t2: 2757071Srrh tbreak(); 2767071Srrh if(nc || wch)goto rtn; 2777071Srrh un += spcnt*sps; 2787071Srrh spcnt = 0; 2797071Srrh setnel(); 2807071Srrh if(trap)goto rtn; 2817071Srrh if(nlflg)goto t1; 2827071Srrh } 2837071Srrh t3: 2847071Srrh if(spread)goto t5; 2857071Srrh if(pendw || !wch) 2867071Srrh t4: 2877071Srrh if(getword(0))goto t6; 2887071Srrh if(!movword())goto t3; 2897071Srrh t5: 2907071Srrh if(nlflg)pendt = 0; 2917071Srrh adsp = adrem = 0; 2927071Srrh if(ad){ 2937071Srrh /* jfr */ if (nwd==1) adsp=nel; else adsp=nel/(nwd-1); 2947071Srrh #ifdef NROFF 2957071Srrh adsp = (adsp/t.Adj)*t.Adj; 2967071Srrh #endif 2977071Srrh adrem = nel - adsp*(nwd-1); 2987071Srrh } 2997071Srrh brflg = 1; 3007071Srrh tbreak(); 3017071Srrh spread = 0; 3027071Srrh if(!trap)goto t3; 3037071Srrh if(!nlflg)goto rtn; 3047071Srrh t6: 3057071Srrh pendt = 0; 3067071Srrh ckul(); 3077071Srrh rtn: 3087071Srrh nflush = 0; 3097071Srrh } 3107071Srrh nofill(){ 3117071Srrh register i, j; 3127071Srrh 3137071Srrh if(!pendnf){ 3147071Srrh over = 0; 3157071Srrh tbreak(); 3167071Srrh if(trap)goto rtn; 3177071Srrh if(nlflg){ 3187071Srrh ch = nflush = 0; 3197071Srrh callsp(); 3207071Srrh return; 3217071Srrh } 3227071Srrh adsp = adrem = 0; 3237071Srrh nwd = 10000; 3247071Srrh } 3257071Srrh while((j = ((i = GETCH()) & CMASK)) != '\n'){ 3267071Srrh if(j == ohc)continue; 3277071Srrh if(j == CONT){ 3287071Srrh pendnf++; 3297071Srrh nflush = 0; 3307071Srrh flushi(); 3317071Srrh ckul(); 3327071Srrh return; 3337071Srrh } 3347071Srrh storeline(i,-1); 3357071Srrh } 3367071Srrh if(ce){ 3377071Srrh ce--; 3387071Srrh if((i=quant(nel/2,HOR)) > 0)un += i; 3397071Srrh } 3407071Srrh if(!nc)storeline(FILLER,0); 3417071Srrh brflg = 2; 3427071Srrh tbreak(); 3437071Srrh ckul(); 3447071Srrh rtn: 3457071Srrh pendnf = nflush = 0; 3467071Srrh } 3477071Srrh callsp(){ 3487071Srrh register i; 3497071Srrh 3507071Srrh if(flss)i = flss; else i = lss; 3517071Srrh flss = 0; 3527071Srrh casesp(i); 3537071Srrh } 3547071Srrh ckul(){ 3557071Srrh if(ul && (--ul == 0)){ 3567071Srrh cu = 0; 3577071Srrh font = sfont; 3587071Srrh mchbits(); 3597071Srrh } 3607071Srrh if(it && (--it == 0) && itmac)control(itmac,0); 3617071Srrh } 3627071Srrh storeline(c,w){ 3637071Srrh register i; 3647071Srrh 3657071Srrh if((c & CMASK) == JREG){ 3667071Srrh if((i=findr(c>>BYTE)) != -1)vlist[i] = ne; 3677071Srrh return; 3687071Srrh } 3697071Srrh if(linep >= (line + lnsize - 1)){ 3707071Srrh if(!over){ 3717071Srrh prstrfl("Line overflow.\n"); 3727071Srrh over++; 3737071Srrh c = 0343; 3747071Srrh w = -1; 3757071Srrh goto s1; 3767071Srrh } 3777071Srrh return; 3787071Srrh } 3797071Srrh s1: 3807071Srrh if(w == -1)w = width(c); 3817071Srrh ne += w; 3827071Srrh nel -= w; 3837071Srrh /* 3847071Srrh * if( cu && !(c & MOT) && (trtab[(c & CMASK)] == ' ')) 3857071Srrh * c = ((c & ~ulbit) & ~CMASK) | '_'; 3867071Srrh */ 3877071Srrh *linep++ = c; 3887071Srrh nc++; 3897071Srrh } 3907071Srrh newline(a) 3917071Srrh int a; 3927071Srrh { 3937071Srrh register i, j, nlss; 3947071Srrh int opn; 3957071Srrh 3967071Srrh if(a)goto nl1; 3977071Srrh if(dip != d){ 3987071Srrh j = lss; 3997071Srrh pchar1(FLSS); 4007071Srrh if(flss)lss = flss; 4017071Srrh i = lss + dip->blss; 4027071Srrh dip->dnl += i; 4037071Srrh pchar1(i); 4047071Srrh pchar1('\n'); 4057071Srrh lss = j; 4067071Srrh dip->blss = flss = 0; 4077071Srrh if(dip->alss){ 4087071Srrh pchar1(FLSS); 4097071Srrh pchar1(dip->alss); 4107071Srrh pchar1('\n'); 4117071Srrh dip->dnl += dip->alss; 4127071Srrh dip->alss = 0; 4137071Srrh } 4147071Srrh if(dip->ditrap && !dip->ditf && 4157071Srrh (dip->dnl >= dip->ditrap) && dip->dimac) 4167071Srrh if(control(dip->dimac,0)){trap++; dip->ditf++;} 4177071Srrh return; 4187071Srrh } 4197071Srrh j = lss; 4207071Srrh if(flss)lss = flss; 4217071Srrh nlss = dip->alss + dip->blss + lss; 4227071Srrh v.nl += nlss; 4237071Srrh #ifndef NROFF 4247071Srrh if(ascii){dip->alss = dip->blss = 0;} 4257071Srrh #endif 4267071Srrh pchar1('\n'); 4277071Srrh flss = 0; 4287071Srrh lss = j; 4297071Srrh if(v.nl < pl)goto nl2; 4307071Srrh nl1: 4317071Srrh ejf = dip->hnl = v.nl = 0; 4327071Srrh ejl = frame; 43332270Sbostic if(donef == 1){ 4347071Srrh if((!nc && !wch) || ndone)done1(0); 4357071Srrh ndone++; 4367071Srrh donef = 0; 4377071Srrh if(frame == stk)nflush++; 4387071Srrh } 4397071Srrh opn = v.pn; 4407071Srrh v.pn++; 4417071Srrh if(npnflg){ 4427071Srrh v.pn = npn; 4437071Srrh npn = npnflg = 0; 4447071Srrh } 4457071Srrh nlpn: 4467071Srrh if(v.pn == pfrom){ 4477071Srrh print++; 44833264Smckusick }else if(opn == pto || v.pn > pto){ 4497071Srrh print = 0; 4507071Srrh chkpn(); 4517071Srrh goto nlpn; 4527071Srrh } 4537071Srrh if(stop && print){ 4547071Srrh dpn++; 4557071Srrh if(dpn >= stop){ 4567071Srrh dpn = 0; 4577071Srrh dostop(); 4587071Srrh } 4597071Srrh } 4607071Srrh nl2: 4617071Srrh trap = 0; 4627071Srrh if(v.nl == 0){ 4637071Srrh if((j = findn(0)) != NTRAP) 4647071Srrh trap = control(mlist[j],0); 4657071Srrh } else if((i = findt(v.nl-nlss)) <= nlss){ 4667071Srrh if((j = findn1(v.nl-nlss+i)) == NTRAP){ 4677071Srrh prstrfl("Trap botch.\n"); 4687071Srrh done2(-5); 4697071Srrh } 4707071Srrh trap = control(mlist[j],0); 4717071Srrh } 4727071Srrh } 4737071Srrh findn1(a) 4747071Srrh int a; 4757071Srrh { 4767071Srrh register i, j; 4777071Srrh 4787071Srrh for(i=0; i<NTRAP; i++){ 4797071Srrh if(mlist[i]){ 4807071Srrh if((j = nlist[i]) < 0)j += pl; 4817071Srrh if(j == a)break; 4827071Srrh } 4837071Srrh } 4847071Srrh return(i); 4857071Srrh } 4867071Srrh chkpn(){ 48740363Smckusick pfrom = pto = *(pnp++); 4887071Srrh if(pto == -1){ 4897071Srrh flusho(); 4907071Srrh done1(0); 4917071Srrh } 49240363Smckusick if(pto == -2){ 4937071Srrh print++; 4947071Srrh pfrom = 0; 49540363Smckusick pto = 10000; 4967071Srrh } 49740363Smckusick else if(pto & MOT){ 49840363Smckusick print++; 49940363Smckusick pto &= ~MOT; 50040363Smckusick pfrom = 0; 50140363Smckusick } 5027071Srrh } 5037071Srrh findt(a) 5047071Srrh int a; 5057071Srrh { 5067071Srrh register i, j, k; 5077071Srrh 5087071Srrh k = 32767; 5097071Srrh if(dip != d){ 5107071Srrh if(dip->dimac && ((i = dip->ditrap -a) > 0))k = i; 5117071Srrh return(k); 5127071Srrh } 5137071Srrh for(i=0; i<NTRAP; i++){ 5147071Srrh if(mlist[i]){ 5157071Srrh if((j = nlist[i]) < 0)j += pl; 5167071Srrh if((j -= a) <= 0)continue; 5177071Srrh if(j < k)k = j; 5187071Srrh } 5197071Srrh } 5207071Srrh i = pl - a; 5217071Srrh if(k > i)k = i; 5227071Srrh return(k); 5237071Srrh } 5247071Srrh findt1(){ 5257071Srrh register i; 5267071Srrh 5277071Srrh if(dip != d)i = dip->dnl; 5287071Srrh else i = v.nl; 5297071Srrh return(findt(i)); 5307071Srrh } 5317071Srrh eject(a) 5327071Srrh struct s *a; 5337071Srrh { 5347071Srrh register savlss; 5357071Srrh 5367071Srrh if(dip != d)return; 5377071Srrh ejf++; 5387071Srrh if(a)ejl = a; 5397071Srrh else ejl = frame; 5407071Srrh if(trap)return; 5417071Srrh e1: 5427071Srrh savlss = lss; 5437071Srrh lss = findt(v.nl); 5447071Srrh newline(0); 5457071Srrh lss = savlss; 5467071Srrh if(v.nl && !trap)goto e1; 5477071Srrh } 5487071Srrh movword(){ 5497071Srrh register i, w, *wp; 5507071Srrh int savwch, hys; 5517071Srrh 5527071Srrh over = 0; 5537071Srrh wp = wordp; 5547071Srrh if(!nwd){ 5557071Srrh while(((i = *wp++) & CMASK) == ' '){ 5567071Srrh wch--; 5577071Srrh wne -= width(i); 5587071Srrh } 5597071Srrh wp--; 5607071Srrh } 5617071Srrh if((wne > nel) && 5627071Srrh !hyoff && hyf && 5637071Srrh (!nwd || (nel > 3*sps)) && 5647071Srrh (!(hyf & 02) || (findt1() > lss)) 5657071Srrh )hyphen(wp); 5667071Srrh savwch = wch; 5677071Srrh hyp = hyptr; 5687071Srrh nhyp = 0; 5697071Srrh while(*hyp && (*hyp <= wp))hyp++; 5707071Srrh while(wch){ 5717071Srrh if((hyoff != 1) && (*hyp == wp)){ 5727071Srrh hyp++; 5737071Srrh if(!wdstart || 5747071Srrh ((wp > (wdstart+1)) && 5757071Srrh (wp < wdend) && 5767071Srrh (!(hyf & 04) || (wp < (wdend-1))) && 5777071Srrh (!(hyf & 010) || (wp > (wdstart+2))) 5787071Srrh ) 5797071Srrh ){ 5807071Srrh nhyp++; 5817071Srrh storeline(IMP,0); 5827071Srrh } 5837071Srrh } 5847071Srrh i = *wp++; 5857071Srrh w = width(i); 5867071Srrh wne -= w; 5877071Srrh wch--; 5887071Srrh storeline(i,w); 5897071Srrh } 5907071Srrh if(nel >= 0){ 5917071Srrh nwd++; 5927071Srrh return(0); 5937071Srrh } 5947071Srrh xbitf = 1; 5957071Srrh hys = width(0200); /*hyphen*/ 5967071Srrh m1: 5977071Srrh if(!nhyp){ 5987071Srrh if(!nwd)goto m3; 5997071Srrh if(wch == savwch)goto m4; 6007071Srrh } 6017071Srrh if(*--linep != IMP)goto m5; 6027071Srrh if(!(--nhyp)) 6037071Srrh if(!nwd)goto m2; 6047071Srrh if(nel < hys){ 6057071Srrh nc--; 6067071Srrh goto m1; 6077071Srrh } 6087071Srrh m2: 6097071Srrh if(((i = *(linep-1) & CMASK) != '-') && 6107071Srrh (i != 0203) 6117071Srrh ){ 6127071Srrh *linep = (*(linep-1) & ~CMASK) | 0200; 6137071Srrh w = width(*linep); 6147071Srrh nel -= w; 6157071Srrh ne += w; 6167071Srrh linep++; 6177071Srrh /* 6187071Srrh hsend(); 6197071Srrh */ 6207071Srrh } 6217071Srrh m3: 6227071Srrh nwd++; 6237071Srrh m4: 6247071Srrh wordp = wp; 6257071Srrh return(1); 6267071Srrh m5: 6277071Srrh nc--; 6287071Srrh w = width(*linep); 6297071Srrh ne -= w; 6307071Srrh nel += w; 6317071Srrh wne += w; 6327071Srrh wch++; 6337071Srrh wp--; 6347071Srrh goto m1; 6357071Srrh } 6367071Srrh horiz(i) 6377071Srrh int i; 6387071Srrh { 6397071Srrh vflag = 0; 6407071Srrh if(i)pchar(makem(i)); 6417071Srrh } 6427071Srrh setnel(){ 6437071Srrh if(!nc){ 6447071Srrh linep = line; 6457071Srrh if(un1 >= 0){ 6467071Srrh un = un1; 6477071Srrh un1 = -1; 6487071Srrh } 6497071Srrh nel = ll - un; 6507071Srrh ne = adsp = adrem = 0; 6517071Srrh } 6527071Srrh } 6537071Srrh getword(x) 6547071Srrh int x; 6557071Srrh { 6567071Srrh register i, j, swp; 6577071Srrh int noword; 6587071Srrh 6597071Srrh noword = 0; 6607071Srrh if(x)if(pendw){ 6617071Srrh *pendw = 0; 6627071Srrh goto rtn; 6637071Srrh } 6647071Srrh if(wordp = pendw)goto g1; 6657071Srrh hyp = hyptr; 6667071Srrh wordp = word; 6677071Srrh over = wne = wch = 0; 6687071Srrh hyoff = 0; 6697071Srrh while(1){ 6707071Srrh j = (i = GETCH()) & CMASK; 6717071Srrh if(j == '\n'){ 6727071Srrh wne = wch = 0; 6737071Srrh noword = 1; 6747071Srrh goto rtn; 6757071Srrh } 6767071Srrh if(j == ohc){ 6777071Srrh hyoff = 1; 6787071Srrh continue; 6797071Srrh } 6807071Srrh if(j == ' '){ 6817071Srrh storeword(i,width(i)); /* XXX */ 6827071Srrh continue; 6837071Srrh } 6847071Srrh break; 6857071Srrh } 6867071Srrh swp = widthp; 6877071Srrh storeword(' ' | chbits, -1); 6887071Srrh if(spflg){ 6897071Srrh storeword(' ' | chbits, -1); 6907071Srrh spflg = 0; 6917071Srrh } 6927071Srrh widthp = swp; 6937071Srrh g0: 6947071Srrh if(j == CONT){ 6957071Srrh pendw = wordp; 6967071Srrh nflush = 0; 6977071Srrh flushi(); 6987071Srrh return(1); 6997071Srrh } 7007071Srrh if(hyoff != 1){ 7017071Srrh if(j == ohc){ 7027071Srrh hyoff = 2; 7037071Srrh *hyp++ = wordp; 7047071Srrh if(hyp > (hyptr+NHYP-1))hyp = hyptr+NHYP-1; 7057071Srrh goto g1; 7067071Srrh } 7077071Srrh if((j == '-') || 7087071Srrh (j == 0203) /*3/4 Em dash*/ 7097071Srrh )if(wordp > word+1){ 7107071Srrh hyoff = 2; 7117071Srrh *hyp++ = wordp + 1; 7127071Srrh if(hyp > (hyptr+NHYP-1))hyp = hyptr+NHYP-1; 7137071Srrh } 7147071Srrh } 7157071Srrh storeword(i,width(i)); /* XXX */ 7167071Srrh g1: 7177071Srrh j = (i = GETCH()) & CMASK; 7187071Srrh if(j != ' '){ 7197071Srrh if(j != '\n')goto g0; 7207071Srrh j = *(wordp-1) & CMASK; 7217071Srrh if((j == '.') || 7227071Srrh (j == '!') || 7237071Srrh (j == '?'))spflg++; 7247071Srrh } 7257071Srrh *wordp = 0; 7267071Srrh rtn: 7277071Srrh wdstart = 0; 7287071Srrh wordp = word; 7297071Srrh pendw = 0; 7307071Srrh *hyp++ = 0; 7317071Srrh setnel(); 7327071Srrh return(noword); 7337071Srrh } 7347071Srrh storeword(c,w) 7357071Srrh int c, w; 7367071Srrh { 7377071Srrh 7387071Srrh if(wordp >= &word[WDSIZE - 1]){ 7397071Srrh if(!over){ 7407071Srrh prstrfl("Word overflow.\n"); 7417071Srrh over++; 7427071Srrh c = 0343; 7437071Srrh w = -1; 7447071Srrh goto s1; 7457071Srrh } 7467071Srrh return; 7477071Srrh } 7487071Srrh s1: 7497071Srrh if(w == -1)w = width(c); 7507071Srrh wne += w; 7517071Srrh *wordp++ = c; 7527071Srrh wch++; 7537071Srrh } 7547071Srrh #ifdef NROFF 7557071Srrh extern char trtab[]; 7567071Srrh gettch(){ 7577071Srrh register int i, j; 7587071Srrh 7597071Srrh if(!((i = getch()) & MOT) && (i & ulbit)){ 7607071Srrh j = i&CMASK; 7617071Srrh if(cu && (trtab[j] == ' ')) 7627071Srrh i = ((i & ~ulbit)& ~CMASK) | '_'; 7637071Srrh if(!cu && (j>32) && (j<0370) && !(*t.codetab[j-32] & 0200)) 7647071Srrh i &= ~ulbit; 7657071Srrh } 7667071Srrh return(i); 7677071Srrh } 7687071Srrh #endif 769