📄 n7.c
字号:
#include "tdef.h"extern#include "d.h"extern#include "v.h"#ifdef NROFFextern#include "tw.h"#endif#include "s.h"#ifdef NROFF#define GETCH gettch#endif#ifndef NROFF#define GETCH getch#endif/*troff7.ctext*/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; i<NTRAP; i++){ if(mlist[i]){ if((j = nlist[i]) < 0)j += pl; if(j == a)break; } } return(i);}chkpn(){ pto = *(pnp++); pfrom = pto & ~MOT; if(pto == -1){ flusho(); done1(0); } if(pto & MOT){ pto &= ~MOT; print++; pfrom = 0; }}findt(a)int a;{ register i, j, k; k = 32767; if(dip != d){ if(dip->dimac && ((i = dip->ditrap -a) > 0))k = i; return(k); } for(i=0; i<NTRAP; i++){ if(mlist[i]){ if((j = nlist[i]) < 0)j += pl; if((j -= a) <= 0)continue; if(j < k)k = j; } } i = pl - a; if(k > 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,cwidth); 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,cwidth);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 NROFFextern 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -