#include "tdef.h" extern #include "d.h" extern #include "v.h" /* troff10.c CAT 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; kblss + 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=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; }