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