xref: /csrg-svn/old/roff/troff/t10.c (revision 9410)
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