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