xref: /original-bsd/old/roff/troff/t10.c (revision 836b5e86)
1*836b5e86Sbostic /*-
2*836b5e86Sbostic  * %sccs.include.proprietary.c%
3*836b5e86Sbostic  */
4*836b5e86Sbostic 
548aa087fSmckusick #ifndef lint
6*836b5e86Sbostic static char sccsid[] = "@(#)t10.c	4.2 (Berkeley) 04/18/91";
7*836b5e86Sbostic #endif /* not lint */
848aa087fSmckusick 
948aa087fSmckusick #include "tdef.h"
1048aa087fSmckusick extern
1148aa087fSmckusick #include "d.h"
1248aa087fSmckusick extern
1348aa087fSmckusick #include "v.h"
1448aa087fSmckusick /*
1548aa087fSmckusick troff10.c
1648aa087fSmckusick 
1748aa087fSmckusick CAT interface
1848aa087fSmckusick */
1948aa087fSmckusick 
2048aa087fSmckusick extern int *olinep;
2148aa087fSmckusick extern int oline[];
2248aa087fSmckusick extern int *pslp;
2348aa087fSmckusick extern int back;
2448aa087fSmckusick extern int xpts;
2548aa087fSmckusick extern int mpts;
2648aa087fSmckusick extern int po;
2748aa087fSmckusick extern int xflg;
2848aa087fSmckusick extern int line[];
2948aa087fSmckusick extern int lss;
3048aa087fSmckusick extern int xbitf;
3148aa087fSmckusick extern char obuf[];
3248aa087fSmckusick extern char *obufp;
3348aa087fSmckusick extern int esct;
3448aa087fSmckusick extern int trflg;
3548aa087fSmckusick extern int cs;
3648aa087fSmckusick extern int smnt;
3748aa087fSmckusick extern int mfont;
3848aa087fSmckusick extern int xfont;
3948aa087fSmckusick extern int code;
4048aa087fSmckusick extern int mcase;
4148aa087fSmckusick extern int esc;
4248aa087fSmckusick extern int lead;
4348aa087fSmckusick extern int paper;
4448aa087fSmckusick extern int cps;
4548aa087fSmckusick extern int psflg;
4648aa087fSmckusick extern int ptid;
4748aa087fSmckusick extern int verm;
4848aa087fSmckusick extern int escm;
4948aa087fSmckusick extern char pstab[], psctab[];
5048aa087fSmckusick extern int dpn;
5148aa087fSmckusick extern int ascii;
5248aa087fSmckusick int mrail = 0; /*0=LR,1=UR*/
5348aa087fSmckusick int mmag = 1; /*0=UM,1=LM*/
5448aa087fSmckusick extern int nofeed;
5548aa087fSmckusick extern int gflag;
5648aa087fSmckusick extern int fontlab[];
5748aa087fSmckusick int papflg;
5848aa087fSmckusick extern int pfont;
5948aa087fSmckusick extern int ppts;
6048aa087fSmckusick extern int oldbits;
6148aa087fSmckusick extern int bd;
6248aa087fSmckusick extern int vflag;
6348aa087fSmckusick extern int stopmesg;
6448aa087fSmckusick extern int xxx;
6548aa087fSmckusick 
ptinit()6648aa087fSmckusick ptinit(){
6748aa087fSmckusick 
6848aa087fSmckusick 	if(ascii || gflag)return;
6948aa087fSmckusick 	oput(T_INIT);
7048aa087fSmckusick 	esc = T_IESC;
7148aa087fSmckusick 	ptesc();
7248aa087fSmckusick 	esct = 0;
7348aa087fSmckusick 	esc = po;
7448aa087fSmckusick 	oput(0140); /*some initial lead*/
7548aa087fSmckusick }
ptout(i)7648aa087fSmckusick ptout(i)
7748aa087fSmckusick int i;
7848aa087fSmckusick {
7948aa087fSmckusick 	register *k, lw, *j;
8048aa087fSmckusick 	int ds, de, inith, temp, *slp, dv;
8148aa087fSmckusick 	int psl[16];
8248aa087fSmckusick 
8348aa087fSmckusick 	if((i & CMASK) != '\n'){
8448aa087fSmckusick 		*olinep++ = i;
8548aa087fSmckusick 		return;
8648aa087fSmckusick 	}
8748aa087fSmckusick 	if(olinep == oline){
8848aa087fSmckusick 		lead += lss;
8948aa087fSmckusick 		return;
9048aa087fSmckusick 	}
9148aa087fSmckusick 	pslp = psl;
9248aa087fSmckusick 	*pslp = lw = inith = dv = 0;
9348aa087fSmckusick 	for(k=oline; k<olinep; k++){
9448aa087fSmckusick 		trflg++;
9548aa087fSmckusick 		xbitf = 1;
9648aa087fSmckusick 		lw += width(*k);
9748aa087fSmckusick 		if((*k & (MOT | VMOT)) == (MOT | VMOT)){
9848aa087fSmckusick 			temp = *k & ~MOTV;
9948aa087fSmckusick 			if(*k & NMOT)temp = -temp;
10048aa087fSmckusick 			dv += temp;
10148aa087fSmckusick 		}
10248aa087fSmckusick 		if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){
10348aa087fSmckusick 			if(xpts == *j)break;
10448aa087fSmckusick 			if(j == pslp){
10548aa087fSmckusick 				*j = xpts;
10648aa087fSmckusick 				*++pslp = 0;
10748aa087fSmckusick 				break;
10848aa087fSmckusick 			}
10948aa087fSmckusick 		}
11048aa087fSmckusick 	}
11148aa087fSmckusick 	if(dv){
11248aa087fSmckusick 		vflag++;
11348aa087fSmckusick 		*olinep++ = makem(-dv);
11448aa087fSmckusick 		vflag = 0;
11548aa087fSmckusick 	}
11648aa087fSmckusick 	if(xflg){
11748aa087fSmckusick 	--pslp;
11848aa087fSmckusick 		for(j=psl; j<=pslp; j++){
11948aa087fSmckusick 			if(*j == mpts){
12048aa087fSmckusick 				temp = *j;
12148aa087fSmckusick 				*j = *pslp;
12248aa087fSmckusick 				*pslp = temp;
12348aa087fSmckusick 				break;
12448aa087fSmckusick 			}
12548aa087fSmckusick 		}
12648aa087fSmckusick 	}
12748aa087fSmckusick 	for(k=oline; k<olinep; k++){
12848aa087fSmckusick 		if(!(*k & MOT) || (*k & VMOT))break;
12948aa087fSmckusick 		*k &= ~MOT;
13048aa087fSmckusick 		if(*k & NMOT){
13148aa087fSmckusick 			*k &= ~NMOT;
13248aa087fSmckusick 			*k = -*k;
13348aa087fSmckusick 		}
13448aa087fSmckusick 		inith += *k;
13548aa087fSmckusick 	}
13648aa087fSmckusick 	lead += dip->blss + lss;
13748aa087fSmckusick 	dip->blss = 0;
13848aa087fSmckusick 	slp = k;
13948aa087fSmckusick scan:
14048aa087fSmckusick 	temp = esct - po;
14148aa087fSmckusick 	if(mpts & DBL)temp -= 55;
14248aa087fSmckusick 	ds = temp - inith;
14348aa087fSmckusick 	de = lw - temp;
14448aa087fSmckusick 	if(de >= ds){
14548aa087fSmckusick 		back = 0;
14648aa087fSmckusick 		esc = -ds;
14748aa087fSmckusick 		for(k=slp; k<olinep; k++)ptout0(*k);
14848aa087fSmckusick 	}else{
14948aa087fSmckusick 		back = 1;
15048aa087fSmckusick 		esc = de;
15148aa087fSmckusick 		for(k = olinep-1; k>=slp; --k)ptout0(*k);
15248aa087fSmckusick 	}
15348aa087fSmckusick 	if(xflg && (--pslp >= psl))goto scan;
15448aa087fSmckusick 	olinep = oline;
15548aa087fSmckusick 	lead += dip->alss;
15648aa087fSmckusick 	dip->alss = 0;
15748aa087fSmckusick }
ptout0(i)15848aa087fSmckusick ptout0(i)
15948aa087fSmckusick int i;
16048aa087fSmckusick {
16148aa087fSmckusick 	register j, k, w;
16248aa087fSmckusick 	int z;
16348aa087fSmckusick 
16448aa087fSmckusick 	if(i & MOT){
16548aa087fSmckusick 		j = i & ~MOTV;
16648aa087fSmckusick 		if(i & NMOT)j = -j;
16748aa087fSmckusick 		if(back)j = -j;
16848aa087fSmckusick 		if(i & VMOT)lead += j;
16948aa087fSmckusick 		else esc += j;
17048aa087fSmckusick 		return;
17148aa087fSmckusick 	}
17248aa087fSmckusick 	xbitf = 2;
17348aa087fSmckusick 	if((i>>BYTE) == oldbits){
17448aa087fSmckusick 		xfont = pfont;
17548aa087fSmckusick 		xpts = ppts;
17648aa087fSmckusick 		xbitf = 0;
17748aa087fSmckusick 	}else xbits(i);
17848aa087fSmckusick 	if((k = (i & CMASK)) < 040){
17948aa087fSmckusick 		return;
18048aa087fSmckusick 	}
18148aa087fSmckusick 	w = getcw(k-32);
18248aa087fSmckusick 	if(cs){
18348aa087fSmckusick 		if(bd)w += bd - 1;
18448aa087fSmckusick 		j = (cs-w)/2;
18548aa087fSmckusick 		w = cs - j;
18648aa087fSmckusick 		if(bd)w -= bd - 1;
18748aa087fSmckusick 	}else j = 0;
18848aa087fSmckusick 	if(i & ZBIT){
18948aa087fSmckusick 		if(cs)w = -j; else w = 0;
19048aa087fSmckusick 		z = 1;
19148aa087fSmckusick 	}else z = 0;
19248aa087fSmckusick 	if(back){
19348aa087fSmckusick 		k = j;
19448aa087fSmckusick 		j = -w;
19548aa087fSmckusick 		w = -k;
19648aa087fSmckusick 	}
19748aa087fSmckusick 	esc += j;
19848aa087fSmckusick 	if((!xflg || (xpts == *pslp)) && (code & 077)){
19948aa087fSmckusick 		if(code & 0200){
20048aa087fSmckusick 			if(smnt)xfont = smnt -1;
20148aa087fSmckusick 			else goto p1;
20248aa087fSmckusick 		}
20348aa087fSmckusick 		if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105);
20448aa087fSmckusick 		if(xfont != mfont){
20548aa087fSmckusick 			mfont = xfont;
20648aa087fSmckusick 			if(mrail != (xfont&01))
20748aa087fSmckusick 				oput(0101 + (mrail=xfont&01));
20848aa087fSmckusick 			if(mmag != (xfont<2))
20948aa087fSmckusick 				oput(0103 + (mmag=(xfont<2)));
21048aa087fSmckusick 		}
21148aa087fSmckusick 		if(xpts != mpts)ptps();
21248aa087fSmckusick 		if(lead)ptlead();
21348aa087fSmckusick 		if(esc)ptesc();
21448aa087fSmckusick /*
21548aa087fSmckusick 		oput(code & 077);
21648aa087fSmckusick */
21748aa087fSmckusick 		*obufp++ = code & 077;
21848aa087fSmckusick 		if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
21948aa087fSmckusick 		if(bd){
22048aa087fSmckusick 			bd -= 1;
22148aa087fSmckusick 			if(back && !z)bd = -bd;
22248aa087fSmckusick 			if(esc += bd)ptesc();
22348aa087fSmckusick 			oput(code & 077);
22448aa087fSmckusick 			if(z)esc -= bd;
22548aa087fSmckusick 		}
22648aa087fSmckusick 	}else if(bd && !z){
22748aa087fSmckusick 		bd -= 1;
22848aa087fSmckusick 		if(back)bd = -bd;
22948aa087fSmckusick 		esc += bd;
23048aa087fSmckusick 	}
23148aa087fSmckusick p1:
23248aa087fSmckusick 	esc += w;
23348aa087fSmckusick 	return;
23448aa087fSmckusick }
ptps()23548aa087fSmckusick ptps(){
23648aa087fSmckusick 	register i, j, k;
23748aa087fSmckusick 
23848aa087fSmckusick 	if(psflg)return;
23948aa087fSmckusick 	if(cps){
24048aa087fSmckusick 		psflg++;
24148aa087fSmckusick 		i = findps(cps);
24248aa087fSmckusick 	}else i = xpts;
24348aa087fSmckusick 	for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
24448aa087fSmckusick 	j = psctab[j];
24548aa087fSmckusick 	oput((j & ~0200) | 0120);
24648aa087fSmckusick 	if((!(mpts & DBL))^(!(j & 0200))){
24748aa087fSmckusick 		if(j & 0200)k = 55;
24848aa087fSmckusick 			else k = -55;
24948aa087fSmckusick 		esc += k;
25048aa087fSmckusick 	}
25148aa087fSmckusick 	mpts = i;
25248aa087fSmckusick }
ptlead()25348aa087fSmckusick ptlead(){
25448aa087fSmckusick 	register i, k;
25548aa087fSmckusick 
25648aa087fSmckusick 	if(k = lead < 0)lead = -lead;
25748aa087fSmckusick 	if(k^verm)oput(0112 + ((verm=k)<<1));
25848aa087fSmckusick 	if(((k=lead)%3) == 2)k++;
25948aa087fSmckusick 	k /= 3;
26048aa087fSmckusick 	while(k > 0){
26148aa087fSmckusick 		if((i=31) > k)i = k;
26248aa087fSmckusick 		if(verm)paper -= i;
26348aa087fSmckusick 			else paper += i;
26448aa087fSmckusick 		oput(((~i) & 037) | 0140);
26548aa087fSmckusick 		if((paper > (11*144*15)) && !papflg && ptid != 1){
26648aa087fSmckusick 			prstr("Excessive paper use.\n");
26748aa087fSmckusick 			papflg++;
26848aa087fSmckusick 			if(ptid != 1){
26948aa087fSmckusick 				lead = 0;
27048aa087fSmckusick 				done2(0200);
27148aa087fSmckusick 			}
27248aa087fSmckusick 		}
27348aa087fSmckusick 		k -= i;
27448aa087fSmckusick 	}
27548aa087fSmckusick 	lead = 0;
27648aa087fSmckusick }
ptesc()27748aa087fSmckusick ptesc(){
27848aa087fSmckusick 	register i, j, k;
27948aa087fSmckusick 
28048aa087fSmckusick 	if(k = esc < 0)esc = -esc;
28148aa087fSmckusick 	if(k^escm)oput(0107 + (escm=k));
28248aa087fSmckusick 	k = esc;
28348aa087fSmckusick 	while(k > 0){
28448aa087fSmckusick 		if((i=127) > k)i = k;
28548aa087fSmckusick 		if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) ||
28648aa087fSmckusick 		   (j < 0))break;
28748aa087fSmckusick /*
28848aa087fSmckusick 		oput(~i);
28948aa087fSmckusick */
29048aa087fSmckusick 		*obufp++ = ~i;
29148aa087fSmckusick 		if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
29248aa087fSmckusick 		esct = j;
29348aa087fSmckusick 		k -= i;
29448aa087fSmckusick 	}
29548aa087fSmckusick 	esc = 0;
29648aa087fSmckusick }
dostop()29748aa087fSmckusick dostop(){
29848aa087fSmckusick 	register i;
29948aa087fSmckusick 
30048aa087fSmckusick 	if(ascii)return;
30148aa087fSmckusick 	if(!nofeed && !gflag)lead += TRAILER;
30248aa087fSmckusick 	ptlead();
30348aa087fSmckusick 	flusho();
30448aa087fSmckusick 	oput(T_INIT);
30548aa087fSmckusick 	oput(T_STOP);
30648aa087fSmckusick 	if(gflag){
30748aa087fSmckusick 		oput('f');
30848aa087fSmckusick 		for(i=0; i<4; i++){
30948aa087fSmckusick 			oput(fontlab[i] & BMASK);
31048aa087fSmckusick 			oput((fontlab[i]>>BYTE) & BMASK);
31148aa087fSmckusick 		}
31248aa087fSmckusick 	}else for(i=8; i>0; i--)oput(T_PAD);
31348aa087fSmckusick 	flusho();
31448aa087fSmckusick 	if(stopmesg)prstr("Pages finished.\n");
31548aa087fSmckusick 	mcase = mpts = mfont = mrail = verm = escm = 0;
31648aa087fSmckusick 	mmag = 1;
31748aa087fSmckusick 	report();
31848aa087fSmckusick 	paper = 0;
31948aa087fSmckusick 	esc = T_IESC;
32048aa087fSmckusick 	ptesc();
32148aa087fSmckusick 	esct = 0;
32248aa087fSmckusick 	esc = po;
32348aa087fSmckusick }
324