1*9410Smckusick #ifndef lint 2*9410Smckusick static char sccsid[] = "@(#)t10.c 4.1 (Berkeley) 82/12/03"; 3*9410Smckusick #endif 4*9410Smckusick 5*9410Smckusick #include "tdef.h" 6*9410Smckusick extern 7*9410Smckusick #include "d.h" 8*9410Smckusick extern 9*9410Smckusick #include "v.h" 10*9410Smckusick /* 11*9410Smckusick troff10.c 12*9410Smckusick 13*9410Smckusick CAT interface 14*9410Smckusick */ 15*9410Smckusick 16*9410Smckusick extern int *olinep; 17*9410Smckusick extern int oline[]; 18*9410Smckusick extern int *pslp; 19*9410Smckusick extern int back; 20*9410Smckusick extern int xpts; 21*9410Smckusick extern int mpts; 22*9410Smckusick extern int po; 23*9410Smckusick extern int xflg; 24*9410Smckusick extern int line[]; 25*9410Smckusick extern int lss; 26*9410Smckusick extern int xbitf; 27*9410Smckusick extern char obuf[]; 28*9410Smckusick extern char *obufp; 29*9410Smckusick extern int esct; 30*9410Smckusick extern int trflg; 31*9410Smckusick extern int cs; 32*9410Smckusick extern int smnt; 33*9410Smckusick extern int mfont; 34*9410Smckusick extern int xfont; 35*9410Smckusick extern int code; 36*9410Smckusick extern int mcase; 37*9410Smckusick extern int esc; 38*9410Smckusick extern int lead; 39*9410Smckusick extern int paper; 40*9410Smckusick extern int cps; 41*9410Smckusick extern int psflg; 42*9410Smckusick extern int ptid; 43*9410Smckusick extern int verm; 44*9410Smckusick extern int escm; 45*9410Smckusick extern char pstab[], psctab[]; 46*9410Smckusick extern int dpn; 47*9410Smckusick extern int ascii; 48*9410Smckusick int mrail = 0; /*0=LR,1=UR*/ 49*9410Smckusick int mmag = 1; /*0=UM,1=LM*/ 50*9410Smckusick extern int nofeed; 51*9410Smckusick extern int gflag; 52*9410Smckusick extern int fontlab[]; 53*9410Smckusick int papflg; 54*9410Smckusick extern int pfont; 55*9410Smckusick extern int ppts; 56*9410Smckusick extern int oldbits; 57*9410Smckusick extern int bd; 58*9410Smckusick extern int vflag; 59*9410Smckusick extern int stopmesg; 60*9410Smckusick extern int xxx; 61*9410Smckusick 62*9410Smckusick ptinit(){ 63*9410Smckusick 64*9410Smckusick if(ascii || gflag)return; 65*9410Smckusick oput(T_INIT); 66*9410Smckusick esc = T_IESC; 67*9410Smckusick ptesc(); 68*9410Smckusick esct = 0; 69*9410Smckusick esc = po; 70*9410Smckusick oput(0140); /*some initial lead*/ 71*9410Smckusick } 72*9410Smckusick ptout(i) 73*9410Smckusick int i; 74*9410Smckusick { 75*9410Smckusick register *k, lw, *j; 76*9410Smckusick int ds, de, inith, temp, *slp, dv; 77*9410Smckusick int psl[16]; 78*9410Smckusick 79*9410Smckusick if((i & CMASK) != '\n'){ 80*9410Smckusick *olinep++ = i; 81*9410Smckusick return; 82*9410Smckusick } 83*9410Smckusick if(olinep == oline){ 84*9410Smckusick lead += lss; 85*9410Smckusick return; 86*9410Smckusick } 87*9410Smckusick pslp = psl; 88*9410Smckusick *pslp = lw = inith = dv = 0; 89*9410Smckusick for(k=oline; k<olinep; k++){ 90*9410Smckusick trflg++; 91*9410Smckusick xbitf = 1; 92*9410Smckusick lw += width(*k); 93*9410Smckusick if((*k & (MOT | VMOT)) == (MOT | VMOT)){ 94*9410Smckusick temp = *k & ~MOTV; 95*9410Smckusick if(*k & NMOT)temp = -temp; 96*9410Smckusick dv += temp; 97*9410Smckusick } 98*9410Smckusick if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){ 99*9410Smckusick if(xpts == *j)break; 100*9410Smckusick if(j == pslp){ 101*9410Smckusick *j = xpts; 102*9410Smckusick *++pslp = 0; 103*9410Smckusick break; 104*9410Smckusick } 105*9410Smckusick } 106*9410Smckusick } 107*9410Smckusick if(dv){ 108*9410Smckusick vflag++; 109*9410Smckusick *olinep++ = makem(-dv); 110*9410Smckusick vflag = 0; 111*9410Smckusick } 112*9410Smckusick if(xflg){ 113*9410Smckusick --pslp; 114*9410Smckusick for(j=psl; j<=pslp; j++){ 115*9410Smckusick if(*j == mpts){ 116*9410Smckusick temp = *j; 117*9410Smckusick *j = *pslp; 118*9410Smckusick *pslp = temp; 119*9410Smckusick break; 120*9410Smckusick } 121*9410Smckusick } 122*9410Smckusick } 123*9410Smckusick for(k=oline; k<olinep; k++){ 124*9410Smckusick if(!(*k & MOT) || (*k & VMOT))break; 125*9410Smckusick *k &= ~MOT; 126*9410Smckusick if(*k & NMOT){ 127*9410Smckusick *k &= ~NMOT; 128*9410Smckusick *k = -*k; 129*9410Smckusick } 130*9410Smckusick inith += *k; 131*9410Smckusick } 132*9410Smckusick lead += dip->blss + lss; 133*9410Smckusick dip->blss = 0; 134*9410Smckusick slp = k; 135*9410Smckusick scan: 136*9410Smckusick temp = esct - po; 137*9410Smckusick if(mpts & DBL)temp -= 55; 138*9410Smckusick ds = temp - inith; 139*9410Smckusick de = lw - temp; 140*9410Smckusick if(de >= ds){ 141*9410Smckusick back = 0; 142*9410Smckusick esc = -ds; 143*9410Smckusick for(k=slp; k<olinep; k++)ptout0(*k); 144*9410Smckusick }else{ 145*9410Smckusick back = 1; 146*9410Smckusick esc = de; 147*9410Smckusick for(k = olinep-1; k>=slp; --k)ptout0(*k); 148*9410Smckusick } 149*9410Smckusick if(xflg && (--pslp >= psl))goto scan; 150*9410Smckusick olinep = oline; 151*9410Smckusick lead += dip->alss; 152*9410Smckusick dip->alss = 0; 153*9410Smckusick } 154*9410Smckusick ptout0(i) 155*9410Smckusick int i; 156*9410Smckusick { 157*9410Smckusick register j, k, w; 158*9410Smckusick int z; 159*9410Smckusick 160*9410Smckusick if(i & MOT){ 161*9410Smckusick j = i & ~MOTV; 162*9410Smckusick if(i & NMOT)j = -j; 163*9410Smckusick if(back)j = -j; 164*9410Smckusick if(i & VMOT)lead += j; 165*9410Smckusick else esc += j; 166*9410Smckusick return; 167*9410Smckusick } 168*9410Smckusick xbitf = 2; 169*9410Smckusick if((i>>BYTE) == oldbits){ 170*9410Smckusick xfont = pfont; 171*9410Smckusick xpts = ppts; 172*9410Smckusick xbitf = 0; 173*9410Smckusick }else xbits(i); 174*9410Smckusick if((k = (i & CMASK)) < 040){ 175*9410Smckusick return; 176*9410Smckusick } 177*9410Smckusick w = getcw(k-32); 178*9410Smckusick if(cs){ 179*9410Smckusick if(bd)w += bd - 1; 180*9410Smckusick j = (cs-w)/2; 181*9410Smckusick w = cs - j; 182*9410Smckusick if(bd)w -= bd - 1; 183*9410Smckusick }else j = 0; 184*9410Smckusick if(i & ZBIT){ 185*9410Smckusick if(cs)w = -j; else w = 0; 186*9410Smckusick z = 1; 187*9410Smckusick }else z = 0; 188*9410Smckusick if(back){ 189*9410Smckusick k = j; 190*9410Smckusick j = -w; 191*9410Smckusick w = -k; 192*9410Smckusick } 193*9410Smckusick esc += j; 194*9410Smckusick if((!xflg || (xpts == *pslp)) && (code & 077)){ 195*9410Smckusick if(code & 0200){ 196*9410Smckusick if(smnt)xfont = smnt -1; 197*9410Smckusick else goto p1; 198*9410Smckusick } 199*9410Smckusick if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105); 200*9410Smckusick if(xfont != mfont){ 201*9410Smckusick mfont = xfont; 202*9410Smckusick if(mrail != (xfont&01)) 203*9410Smckusick oput(0101 + (mrail=xfont&01)); 204*9410Smckusick if(mmag != (xfont<2)) 205*9410Smckusick oput(0103 + (mmag=(xfont<2))); 206*9410Smckusick } 207*9410Smckusick if(xpts != mpts)ptps(); 208*9410Smckusick if(lead)ptlead(); 209*9410Smckusick if(esc)ptesc(); 210*9410Smckusick /* 211*9410Smckusick oput(code & 077); 212*9410Smckusick */ 213*9410Smckusick *obufp++ = code & 077; 214*9410Smckusick if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); 215*9410Smckusick if(bd){ 216*9410Smckusick bd -= 1; 217*9410Smckusick if(back && !z)bd = -bd; 218*9410Smckusick if(esc += bd)ptesc(); 219*9410Smckusick oput(code & 077); 220*9410Smckusick if(z)esc -= bd; 221*9410Smckusick } 222*9410Smckusick }else if(bd && !z){ 223*9410Smckusick bd -= 1; 224*9410Smckusick if(back)bd = -bd; 225*9410Smckusick esc += bd; 226*9410Smckusick } 227*9410Smckusick p1: 228*9410Smckusick esc += w; 229*9410Smckusick return; 230*9410Smckusick } 231*9410Smckusick ptps(){ 232*9410Smckusick register i, j, k; 233*9410Smckusick 234*9410Smckusick if(psflg)return; 235*9410Smckusick if(cps){ 236*9410Smckusick psflg++; 237*9410Smckusick i = findps(cps); 238*9410Smckusick }else i = xpts; 239*9410Smckusick for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;} 240*9410Smckusick j = psctab[j]; 241*9410Smckusick oput((j & ~0200) | 0120); 242*9410Smckusick if((!(mpts & DBL))^(!(j & 0200))){ 243*9410Smckusick if(j & 0200)k = 55; 244*9410Smckusick else k = -55; 245*9410Smckusick esc += k; 246*9410Smckusick } 247*9410Smckusick mpts = i; 248*9410Smckusick } 249*9410Smckusick ptlead(){ 250*9410Smckusick register i, k; 251*9410Smckusick 252*9410Smckusick if(k = lead < 0)lead = -lead; 253*9410Smckusick if(k^verm)oput(0112 + ((verm=k)<<1)); 254*9410Smckusick if(((k=lead)%3) == 2)k++; 255*9410Smckusick k /= 3; 256*9410Smckusick while(k > 0){ 257*9410Smckusick if((i=31) > k)i = k; 258*9410Smckusick if(verm)paper -= i; 259*9410Smckusick else paper += i; 260*9410Smckusick oput(((~i) & 037) | 0140); 261*9410Smckusick if((paper > (11*144*15)) && !papflg && ptid != 1){ 262*9410Smckusick prstr("Excessive paper use.\n"); 263*9410Smckusick papflg++; 264*9410Smckusick if(ptid != 1){ 265*9410Smckusick lead = 0; 266*9410Smckusick done2(0200); 267*9410Smckusick } 268*9410Smckusick } 269*9410Smckusick k -= i; 270*9410Smckusick } 271*9410Smckusick lead = 0; 272*9410Smckusick } 273*9410Smckusick ptesc(){ 274*9410Smckusick register i, j, k; 275*9410Smckusick 276*9410Smckusick if(k = esc < 0)esc = -esc; 277*9410Smckusick if(k^escm)oput(0107 + (escm=k)); 278*9410Smckusick k = esc; 279*9410Smckusick while(k > 0){ 280*9410Smckusick if((i=127) > k)i = k; 281*9410Smckusick if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) || 282*9410Smckusick (j < 0))break; 283*9410Smckusick /* 284*9410Smckusick oput(~i); 285*9410Smckusick */ 286*9410Smckusick *obufp++ = ~i; 287*9410Smckusick if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); 288*9410Smckusick esct = j; 289*9410Smckusick k -= i; 290*9410Smckusick } 291*9410Smckusick esc = 0; 292*9410Smckusick } 293*9410Smckusick dostop(){ 294*9410Smckusick register i; 295*9410Smckusick 296*9410Smckusick if(ascii)return; 297*9410Smckusick if(!nofeed && !gflag)lead += TRAILER; 298*9410Smckusick ptlead(); 299*9410Smckusick flusho(); 300*9410Smckusick oput(T_INIT); 301*9410Smckusick oput(T_STOP); 302*9410Smckusick if(gflag){ 303*9410Smckusick oput('f'); 304*9410Smckusick for(i=0; i<4; i++){ 305*9410Smckusick oput(fontlab[i] & BMASK); 306*9410Smckusick oput((fontlab[i]>>BYTE) & BMASK); 307*9410Smckusick } 308*9410Smckusick }else for(i=8; i>0; i--)oput(T_PAD); 309*9410Smckusick flusho(); 310*9410Smckusick if(stopmesg)prstr("Pages finished.\n"); 311*9410Smckusick mcase = mpts = mfont = mrail = verm = escm = 0; 312*9410Smckusick mmag = 1; 313*9410Smckusick report(); 314*9410Smckusick paper = 0; 315*9410Smckusick esc = T_IESC; 316*9410Smckusick ptesc(); 317*9410Smckusick esct = 0; 318*9410Smckusick esc = po; 319*9410Smckusick } 320