From b9f79a9acec474228a08bc8eeab5b8597fd74439 Mon Sep 17 00:00:00 2001 From: CSRG Date: Fri, 6 Jun 1980 20:36:28 -0800 Subject: [PATCH] BSD 4_1_snap development Work on file usr/src/cmd/troff/n7.c Synthesized-from: CSRG/cd1/4.1.snap --- usr/src/cmd/troff/n7.c | 755 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 755 insertions(+) create mode 100644 usr/src/cmd/troff/n7.c diff --git a/usr/src/cmd/troff/n7.c b/usr/src/cmd/troff/n7.c new file mode 100644 index 0000000000..efef022a1a --- /dev/null +++ b/usr/src/cmd/troff/n7.c @@ -0,0 +1,755 @@ +#include "tdef.h" +extern +#include "d.h" +extern +#include "v.h" +#ifdef NROFF +extern +#include "tw.h" +#endif +#include "s.h" +#ifdef NROFF +#define GETCH gettch +#endif +#ifndef NROFF +#define GETCH getch +#endif + +/* +troff7.c + +text +*/ + +extern struct s *frame, *stk; +extern struct s *ejl; + +extern int pl; +extern int trap; +extern int flss; +extern int npnflg; +extern int npn; +extern int stop; +extern int nflush; +extern int ejf; +extern int ascii; +extern int donef; +extern int nc; +extern int wch; +extern int dpn; +extern int ndone; +extern int lss; +extern int pto; +extern int pfrom; +extern int print; +extern int nlist[NTRAP]; +extern int mlist[NTRAP]; +extern int *pnp; +extern int nb; +extern int ic; +extern int icf; +extern int ics; +extern int ne; +extern int ll; +extern int un; +extern int un1; +extern int in; +extern int ls; +extern int spread; +extern int totout; +extern int nwd; +extern int *pendw; +extern int *linep; +extern int line[]; +extern int lastl; +extern int ch; +extern int ce; +extern int fi; +extern int nlflg; +extern int pendt; +extern int sps; +extern int adsp; +extern int pendnf; +extern int over; +extern int adrem; +extern int nel; +extern int ad; +extern int ohc; +extern int hyoff; +extern int nhyp; +extern int spflg; +extern int word[]; +extern int *wordp; +extern int wne; +extern int chbits; +extern int cwidth; +extern int widthp; +extern int hyf; +extern int xbitf; +extern int vflag; +extern int ul; +extern int cu; +extern int font; +extern int sfont; +extern int it; +extern int itmac; +extern int *hyptr[NHYP]; +extern int **hyp; +extern int *wdstart, *wdend; +extern int lnmod; +extern int admod; +extern int nn; +extern int nms; +extern int ndf; +extern int ni; +extern int nform; +extern int lnsize; +extern int po; +extern int ulbit; +extern int *vlist; +extern int nrbits; +extern int nmbits; +extern char trtab[]; +extern int xxx; +int brflg; + +tbreak(){ + register *i, j, pad; + int res; + + trap = 0; + if(nb)return; + if((dip == d) && (v.nl == -1)){ + newline(1); + return; + } + if(!nc){ + setnel(); + if(!wch)return; + if(pendw)getword(1); + movword(); + }else if(pendw && !brflg){ + getword(1); + movword(); + } + *linep = dip->nls = 0; +#ifdef NROFF + if(dip == d)horiz(po); +#endif + if(lnmod)donum(); + lastl = ne; + if(brflg != 1){ + totout = 0; + }else if(ad){ + if((lastl = (ll - un)) < ne)lastl = ne; + } + if(admod && ad && (brflg != 2)){ + lastl = ne; + adsp = adrem = 0; +#ifdef NROFF + if(admod == 1)un += quant(nel/2,t.Adj); +#endif +#ifndef NROFF + if(admod == 1)un += nel/2; +#endif + else if(admod ==2)un += nel; + } + totout++; + brflg = 0; + if((lastl+un) > dip->maxl)dip->maxl = (lastl+un); + horiz(un); +#ifdef NROFF + if(adrem%t.Adj)res = t.Hor; else res = t.Adj; +#endif + for(i = line;nc > 0;){ + if(((j = *i++) & CMASK) == ' '){ + pad = 0; + do{ + pad += width(j); + nc--; + }while(((j = *i++) & CMASK) == ' '); + i--; + pad += adsp; + --nwd; + if(adrem){ + if(adrem < 0){ +#ifdef NROFF + pad -= res; + adrem += res; + }else if((totout&01) || + ((adrem/res)>=(nwd))){ + pad += res; + adrem -= res; +#endif +#ifndef NROFF + pad--; + adrem++; + }else{ + pad++; + adrem--; +#endif + } + } + horiz(pad); + }else{ + pchar(j); + nc--; + } + } + if(ic){ + if((j = ll - un - lastl + ics) > 0)horiz(j); + pchar(ic); + } + if(icf)icf++; + else ic = 0; + ne = nwd = 0; + un = in; + setnel(); + newline(0); + if(dip != d){if(dip->dnl > dip->hnl)dip->hnl = dip->dnl;} + else{if(v.nl > dip->hnl)dip->hnl = v.nl;} + for(j=ls-1; (j >0) && !trap; j--)newline(0); + spread = 0; +} +donum(){ + register i, nw; + extern pchar(); + + nrbits = nmbits; + nw = width('1' | nrbits); + if(nn){ + nn--; + goto d1; + } + if(v.ln%ndf){ + v.ln++; + d1: + un += nw*(3+nms+ni); + return; + } + i = 0; + if(v.ln<100)i++; + if(v.ln<10)i++; + horiz(nw*(ni+i)); + nform = 0; + fnumb(v.ln,pchar); + un += nw*nms; + v.ln++; +} +text(){ + register i; + static int spcnt; + + nflush++; + if((dip == d) && (v.nl == -1)){newline(1); return;} + setnel(); + if(ce || !fi){ + nofill(); + return; + } + if(pendw)goto t4; + if(pendt)if(spcnt)goto t2; else goto t3; + pendt++; + if(spcnt)goto t2; + while(((i = GETCH()) & CMASK) == ' ')spcnt++; + if(nlflg){ + t1: + nflush = pendt = ch = spcnt = 0; + callsp(); + return; + } + ch = i; + if(spcnt){ + t2: + tbreak(); + if(nc || wch)goto rtn; + un += spcnt*sps; + spcnt = 0; + setnel(); + if(trap)goto rtn; + if(nlflg)goto t1; + } +t3: + if(spread)goto t5; + if(pendw || !wch) + t4: + if(getword(0))goto t6; + if(!movword())goto t3; +t5: + if(nlflg)pendt = 0; + adsp = adrem = 0; + if(ad){ +/* jfr */ if (nwd==1) adsp=nel; else adsp=nel/(nwd-1); +#ifdef NROFF + adsp = (adsp/t.Adj)*t.Adj; +#endif + adrem = nel - adsp*(nwd-1); + } + brflg = 1; + tbreak(); + spread = 0; + if(!trap)goto t3; + if(!nlflg)goto rtn; +t6: + pendt = 0; + ckul(); +rtn: + nflush = 0; +} +nofill(){ + register i, j; + + if(!pendnf){ + over = 0; + tbreak(); + if(trap)goto rtn; + if(nlflg){ + ch = nflush = 0; + callsp(); + return; + } + adsp = adrem = 0; + nwd = 10000; + } + while((j = ((i = GETCH()) & CMASK)) != '\n'){ + if(j == ohc)continue; + if(j == CONT){ + pendnf++; + nflush = 0; + flushi(); + ckul(); + return; + } + storeline(i,-1); + } + if(ce){ + ce--; + if((i=quant(nel/2,HOR)) > 0)un += i; + } + if(!nc)storeline(FILLER,0); + brflg = 2; + tbreak(); + ckul(); +rtn: + pendnf = nflush = 0; +} +callsp(){ + register i; + + if(flss)i = flss; else i = lss; + flss = 0; + casesp(i); +} +ckul(){ + if(ul && (--ul == 0)){ + cu = 0; + font = sfont; + mchbits(); + } + if(it && (--it == 0) && itmac)control(itmac,0); +} +storeline(c,w){ + register i; + + if((c & CMASK) == JREG){ + if((i=findr(c>>BYTE)) != -1)vlist[i] = ne; + return; + } + if(linep >= (line + lnsize - 1)){ + if(!over){ + prstrfl("Line overflow.\n"); + over++; + c = 0343; + w = -1; + goto s1; + } + return; + } +s1: + if(w == -1)w = width(c); + ne += w; + nel -= w; +/* + * if( cu && !(c & MOT) && (trtab[(c & CMASK)] == ' ')) + * c = ((c & ~ulbit) & ~CMASK) | '_'; + */ + *linep++ = c; + nc++; +} +newline(a) +int a; +{ + register i, j, nlss; + int opn; + + if(a)goto nl1; + if(dip != d){ + j = lss; + pchar1(FLSS); + if(flss)lss = flss; + i = lss + dip->blss; + dip->dnl += i; + pchar1(i); + pchar1('\n'); + lss = j; + dip->blss = flss = 0; + if(dip->alss){ + pchar1(FLSS); + pchar1(dip->alss); + pchar1('\n'); + dip->dnl += dip->alss; + dip->alss = 0; + } + if(dip->ditrap && !dip->ditf && + (dip->dnl >= dip->ditrap) && dip->dimac) + if(control(dip->dimac,0)){trap++; dip->ditf++;} + return; + } + j = lss; + if(flss)lss = flss; + nlss = dip->alss + dip->blss + lss; + v.nl += nlss; +#ifndef NROFF + if(ascii){dip->alss = dip->blss = 0;} +#endif + pchar1('\n'); + flss = 0; + lss = j; + if(v.nl < pl)goto nl2; +nl1: + ejf = dip->hnl = v.nl = 0; + ejl = frame; + if(donef){ + if((!nc && !wch) || ndone)done1(0); + ndone++; + donef = 0; + if(frame == stk)nflush++; + } + opn = v.pn; + v.pn++; + if(npnflg){ + v.pn = npn; + npn = npnflg = 0; + } +nlpn: + if(v.pn == pfrom){ + print++; + pfrom = -1; + }else if(opn == pto){ + print = 0; + opn = -1; + chkpn(); + goto nlpn; + } + if(stop && print){ + dpn++; + if(dpn >= stop){ + dpn = 0; + dostop(); + } + } +nl2: + trap = 0; + if(v.nl == 0){ + if((j = findn(0)) != NTRAP) + trap = control(mlist[j],0); + } else if((i = findt(v.nl-nlss)) <= nlss){ + if((j = findn1(v.nl-nlss+i)) == NTRAP){ + prstrfl("Trap botch.\n"); + done2(-5); + } + trap = control(mlist[j],0); + } +} +findn1(a) +int a; +{ + register i, j; + + for(i=0; idimac && ((i = dip->ditrap -a) > 0))k = i; + return(k); + } + for(i=0; i i)k = i; + return(k); +} +findt1(){ + register i; + + if(dip != d)i = dip->dnl; + else i = v.nl; + return(findt(i)); +} +eject(a) +struct s *a; +{ + register savlss; + + if(dip != d)return; + ejf++; + if(a)ejl = a; + else ejl = frame; + if(trap)return; +e1: + savlss = lss; + lss = findt(v.nl); + newline(0); + lss = savlss; + if(v.nl && !trap)goto e1; +} +movword(){ + register i, w, *wp; + int savwch, hys; + + over = 0; + wp = wordp; + if(!nwd){ + while(((i = *wp++) & CMASK) == ' '){ + wch--; + wne -= width(i); + } + wp--; + } + if((wne > nel) && + !hyoff && hyf && + (!nwd || (nel > 3*sps)) && + (!(hyf & 02) || (findt1() > lss)) + )hyphen(wp); + savwch = wch; + hyp = hyptr; + nhyp = 0; + while(*hyp && (*hyp <= wp))hyp++; + while(wch){ + if((hyoff != 1) && (*hyp == wp)){ + hyp++; + if(!wdstart || + ((wp > (wdstart+1)) && + (wp < wdend) && + (!(hyf & 04) || (wp < (wdend-1))) && + (!(hyf & 010) || (wp > (wdstart+2))) + ) + ){ + nhyp++; + storeline(IMP,0); + } + } + i = *wp++; + w = width(i); + wne -= w; + wch--; + storeline(i,w); + } + if(nel >= 0){ + nwd++; + return(0); + } + xbitf = 1; + hys = width(0200); /*hyphen*/ +m1: + if(!nhyp){ + if(!nwd)goto m3; + if(wch == savwch)goto m4; + } + if(*--linep != IMP)goto m5; + if(!(--nhyp)) + if(!nwd)goto m2; + if(nel < hys){ + nc--; + goto m1; + } +m2: + if(((i = *(linep-1) & CMASK) != '-') && + (i != 0203) + ){ + *linep = (*(linep-1) & ~CMASK) | 0200; + w = width(*linep); + nel -= w; + ne += w; + linep++; +/* + hsend(); +*/ + } +m3: + nwd++; +m4: + wordp = wp; + return(1); +m5: + nc--; + w = width(*linep); + ne -= w; + nel += w; + wne += w; + wch++; + wp--; + goto m1; +} +horiz(i) +int i; +{ + vflag = 0; + if(i)pchar(makem(i)); +} +setnel(){ + if(!nc){ + linep = line; + if(un1 >= 0){ + un = un1; + un1 = -1; + } + nel = ll - un; + ne = adsp = adrem = 0; + } +} +getword(x) +int x; +{ + register i, j, swp; + int noword; + + noword = 0; + if(x)if(pendw){ + *pendw = 0; + goto rtn; + } + if(wordp = pendw)goto g1; + hyp = hyptr; + wordp = word; + over = wne = wch = 0; + hyoff = 0; + while(1){ + j = (i = GETCH()) & CMASK; + if(j == '\n'){ + wne = wch = 0; + noword = 1; + goto rtn; + } + if(j == ohc){ + hyoff = 1; + continue; + } + if(j == ' '){ + storeword(i,width(i)); /* XXX */ + continue; + } + break; + } + swp = widthp; + storeword(' ' | chbits, -1); + if(spflg){ + storeword(' ' | chbits, -1); + spflg = 0; + } + widthp = swp; +g0: + if(j == CONT){ + pendw = wordp; + nflush = 0; + flushi(); + return(1); + } + if(hyoff != 1){ + if(j == ohc){ + hyoff = 2; + *hyp++ = wordp; + if(hyp > (hyptr+NHYP-1))hyp = hyptr+NHYP-1; + goto g1; + } + if((j == '-') || + (j == 0203) /*3/4 Em dash*/ + )if(wordp > word+1){ + hyoff = 2; + *hyp++ = wordp + 1; + if(hyp > (hyptr+NHYP-1))hyp = hyptr+NHYP-1; + } + } + storeword(i,width(i)); /* XXX */ +g1: + j = (i = GETCH()) & CMASK; + if(j != ' '){ + if(j != '\n')goto g0; + j = *(wordp-1) & CMASK; + if((j == '.') || + (j == '!') || + (j == '?'))spflg++; + } + *wordp = 0; +rtn: + wdstart = 0; + wordp = word; + pendw = 0; + *hyp++ = 0; + setnel(); + return(noword); +} +storeword(c,w) +int c, w; +{ + + if(wordp >= &word[WDSIZE - 1]){ + if(!over){ + prstrfl("Word overflow.\n"); + over++; + c = 0343; + w = -1; + goto s1; + } + return; + } +s1: + if(w == -1)w = width(c); + wne += w; + *wordp++ = c; + wch++; +} +#ifdef NROFF +extern char trtab[]; +gettch(){ + register int i, j; + + if(!((i = getch()) & MOT) && (i & ulbit)){ + j = i&CMASK; + if(cu && (trtab[j] == ' ')) + i = ((i & ~ulbit)& ~CMASK) | '_'; + if(!cu && (j>32) && (j<0370) && !(*t.codetab[j-32] & 0200)) + i &= ~ulbit; + } + return(i); +} +#endif -- 2.20.1