xref: /original-bsd/old/roff/troff/t10.c (revision 53fb7652)
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