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
ptinit()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 }
ptout(i)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 }
ptout0(i)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 }
ptps()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 }
ptlead()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 }
ptesc()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 }
dostop()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