#include "tdef.h" #include "t.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 *dip; 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 xxx; static char Sccsid[] "@(#)t10.c 1.3 of 4/26/77"; 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){ 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(); mcase = mpts = mfont = mrail = verm = escm = 0; mmag = 1; report(); paper = 0; esc = T_IESC; ptesc(); esct = 0; esc = po; }