date and time created 82/12/03 19:06:08 by mckusick
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Sat, 4 Dec 1982 11:06:08 +0000 (03:06 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Sat, 4 Dec 1982 11:06:08 +0000 (03:06 -0800)
SCCS-vsn: old/roff/troff/t10.c 4.1

usr/src/old/roff/troff/t10.c [new file with mode: 0644]

diff --git a/usr/src/old/roff/troff/t10.c b/usr/src/old/roff/troff/t10.c
new file mode 100644 (file)
index 0000000..a378b47
--- /dev/null
@@ -0,0 +1,319 @@
+#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;
+}