📄 t10.c
字号:
#include "tdef.h"extern#include "d.h"extern#include "v.h"/*troff10.cCAT interface*/extern int *olinep;extern int oline[];extern int *pslp;extern int back;extern int xpts;extern int mpts;extern int po;extern int xflg;extern int line[];extern int lss;extern int xbitf;extern char obuf[];extern char *obufp;extern int esct;extern int trflg;extern int cs;extern int smnt;extern int mfont;extern int xfont;extern int code;extern int mcase;extern int esc;extern int lead;extern int paper;extern int cps;extern int psflg;extern int ptid;extern int verm;extern int escm;extern char pstab[], psctab[];extern int dpn;extern int ascii;int mrail = 0; /*0=LR,1=UR*/int mmag = 1; /*0=UM,1=LM*/extern int nofeed;extern int gflag;extern int fontlab[];int papflg;extern int pfont;extern int ppts;extern int oldbits;extern int bd;extern int vflag;extern int stopmesg;extern int xxx;ptinit(){ if(ascii || gflag)return; oput(T_INIT); esc = T_IESC; ptesc(); esct = 0; esc = po; oput(0140); /*some initial lead*/}ptout(i)int i;{ register *k, lw, *j; int ds, de, inith, temp, *slp, dv; int psl[16]; if((i & CMASK) != '\n'){ *olinep++ = i; return; } if(olinep == oline){ lead += lss; return; } pslp = psl; *pslp = lw = inith = dv = 0; for(k=oline; k<olinep; k++){ trflg++; xbitf = 1; lw += width(*k); if((*k & (MOT | VMOT)) == (MOT | VMOT)){ temp = *k & ~MOTV; if(*k & NMOT)temp = -temp; dv += temp; } if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){ if(xpts == *j)break; if(j == pslp){ *j = xpts; *++pslp = 0; break; } } } if(dv){ vflag++; *olinep++ = makem(-dv); vflag = 0; } if(xflg){ --pslp; for(j=psl; j<=pslp; j++){ if(*j == mpts){ temp = *j; *j = *pslp; *pslp = temp; break; } } } for(k=oline; k<olinep; k++){ if(!(*k & MOT) || (*k & VMOT))break; *k &= ~MOT; if(*k & NMOT){ *k &= ~NMOT; *k = -*k; } inith += *k; } lead += dip->blss + lss; dip->blss = 0; slp = k;scan: temp = esct - po; if(mpts & DBL)temp -= 55; ds = temp - inith; de = lw - temp; if(de >= ds){ back = 0; esc = -ds; for(k=slp; k<olinep; k++)ptout0(*k); }else{ back = 1; esc = de; for(k = olinep-1; k>=slp; --k)ptout0(*k); } if(xflg && (--pslp >= psl))goto scan; olinep = oline; lead += dip->alss; dip->alss = 0;}ptout0(i)int i;{ register j, k, w; int z; if(i & MOT){ j = i & ~MOTV; if(i & NMOT)j = -j; if(back)j = -j; if(i & VMOT)lead += j; else esc += j; return; } xbitf = 2; if((i>>BYTE) == oldbits){ xfont = pfont; xpts = ppts; xbitf = 0; }else xbits(i); if((k = (i & CMASK)) < 040){ return; } w = getcw(k-32); if(cs){ if(bd)w += bd - 1; j = (cs-w)/2; w = cs - j; if(bd)w -= bd - 1; }else j = 0; if(i & ZBIT){ if(cs)w = -j; else w = 0; z = 1; }else z = 0; if(back){ k = j; j = -w; w = -k; } esc += j; if((!xflg || (xpts == *pslp)) && (code & 077)){ if(code & 0200){ if(smnt)xfont = smnt -1; else goto p1; } if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105); if(xfont != mfont){ mfont = xfont; if(mrail != (xfont&01)) oput(0101 + (mrail=xfont&01)); if(mmag != (xfont<2)) oput(0103 + (mmag=(xfont<2))); } if(xpts != mpts)ptps(); if(lead)ptlead(); if(esc)ptesc();/* oput(code & 077);*/ *obufp++ = code & 077; if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); if(bd){ bd -= 1; if(back && !z)bd = -bd; if(esc += bd)ptesc(); oput(code & 077); if(z)esc -= bd; } }else if(bd && !z){ bd -= 1; if(back)bd = -bd; esc += bd; }p1: esc += w; return;}ptps(){ register i, j, k; if(psflg)return; if(cps){ psflg++; i = findps(cps); }else i = xpts; for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;} j = psctab[j]; oput((j & ~0200) | 0120); if((!(mpts & DBL))^(!(j & 0200))){ if(j & 0200)k = 55; else k = -55; esc += k; } mpts = i;}ptlead(){ register i, k; if(k = lead < 0)lead = -lead; if(k^verm)oput(0112 + ((verm=k)<<1)); if(((k=lead)%3) == 2)k++; k /= 3; while(k > 0){ if((i=31) > k)i = k; if(verm)paper -= i; else paper += i; oput(((~i) & 037) | 0140); if((paper > (11*144*15)) && !papflg && ptid != 1){ prstr("Excessive paper use.\n"); papflg++; if(ptid != 1){ lead = 0; done2(0200); } } k -= i; } lead = 0;}ptesc(){ register i, j, k; if(k = esc < 0)esc = -esc; if(k^escm)oput(0107 + (escm=k)); k = esc; while(k > 0){ if((i=127) > k)i = k; if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) || (j < 0))break;/* oput(~i);*/ *obufp++ = ~i; if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); esct = j; k -= i; } esc = 0;}dostop(){ register i; if(ascii)return; if(!nofeed && !gflag)lead += TRAILER; ptlead(); flusho(); oput(T_INIT); oput(T_STOP); if(gflag){ oput('f'); for(i=0; i<4; i++){ oput(fontlab[i] & BMASK); oput((fontlab[i]>>BYTE) & BMASK); } }else for(i=8; i>0; i--)oput(T_PAD); flusho(); if(stopmesg)prstr("Pages finished.\n"); mcase = mpts = mfont = mrail = verm = escm = 0; mmag = 1; report(); paper = 0; esc = T_IESC; ptesc(); esct = 0; esc = po;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -