+#ifndef lint
+static char sccsid[] = "@(#)t10.c 4.1 (Berkeley) 82/12/03";
+#endif
+
+#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; 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;
+}