xref: /csrg-svn/old/roff/troff/t10.c (revision 48307)
1*48307Sbostic /*-
2*48307Sbostic  * %sccs.include.proprietary.c%
3*48307Sbostic  */
4*48307Sbostic 
59410Smckusick #ifndef lint
6*48307Sbostic static char sccsid[] = "@(#)t10.c	4.2 (Berkeley) 04/18/91";
7*48307Sbostic #endif /* not lint */
89410Smckusick 
99410Smckusick #include "tdef.h"
109410Smckusick extern
119410Smckusick #include "d.h"
129410Smckusick extern
139410Smckusick #include "v.h"
149410Smckusick /*
159410Smckusick troff10.c
169410Smckusick 
179410Smckusick CAT interface
189410Smckusick */
199410Smckusick 
209410Smckusick extern int *olinep;
219410Smckusick extern int oline[];
229410Smckusick extern int *pslp;
239410Smckusick extern int back;
249410Smckusick extern int xpts;
259410Smckusick extern int mpts;
269410Smckusick extern int po;
279410Smckusick extern int xflg;
289410Smckusick extern int line[];
299410Smckusick extern int lss;
309410Smckusick extern int xbitf;
319410Smckusick extern char obuf[];
329410Smckusick extern char *obufp;
339410Smckusick extern int esct;
349410Smckusick extern int trflg;
359410Smckusick extern int cs;
369410Smckusick extern int smnt;
379410Smckusick extern int mfont;
389410Smckusick extern int xfont;
399410Smckusick extern int code;
409410Smckusick extern int mcase;
419410Smckusick extern int esc;
429410Smckusick extern int lead;
439410Smckusick extern int paper;
449410Smckusick extern int cps;
459410Smckusick extern int psflg;
469410Smckusick extern int ptid;
479410Smckusick extern int verm;
489410Smckusick extern int escm;
499410Smckusick extern char pstab[], psctab[];
509410Smckusick extern int dpn;
519410Smckusick extern int ascii;
529410Smckusick int mrail = 0; /*0=LR,1=UR*/
539410Smckusick int mmag = 1; /*0=UM,1=LM*/
549410Smckusick extern int nofeed;
559410Smckusick extern int gflag;
569410Smckusick extern int fontlab[];
579410Smckusick int papflg;
589410Smckusick extern int pfont;
599410Smckusick extern int ppts;
609410Smckusick extern int oldbits;
619410Smckusick extern int bd;
629410Smckusick extern int vflag;
639410Smckusick extern int stopmesg;
649410Smckusick extern int xxx;
659410Smckusick 
ptinit()669410Smckusick ptinit(){
679410Smckusick 
689410Smckusick 	if(ascii || gflag)return;
699410Smckusick 	oput(T_INIT);
709410Smckusick 	esc = T_IESC;
719410Smckusick 	ptesc();
729410Smckusick 	esct = 0;
739410Smckusick 	esc = po;
749410Smckusick 	oput(0140); /*some initial lead*/
759410Smckusick }
ptout(i)769410Smckusick ptout(i)
779410Smckusick int i;
789410Smckusick {
799410Smckusick 	register *k, lw, *j;
809410Smckusick 	int ds, de, inith, temp, *slp, dv;
819410Smckusick 	int psl[16];
829410Smckusick 
839410Smckusick 	if((i & CMASK) != '\n'){
849410Smckusick 		*olinep++ = i;
859410Smckusick 		return;
869410Smckusick 	}
879410Smckusick 	if(olinep == oline){
889410Smckusick 		lead += lss;
899410Smckusick 		return;
909410Smckusick 	}
919410Smckusick 	pslp = psl;
929410Smckusick 	*pslp = lw = inith = dv = 0;
939410Smckusick 	for(k=oline; k<olinep; k++){
949410Smckusick 		trflg++;
959410Smckusick 		xbitf = 1;
969410Smckusick 		lw += width(*k);
979410Smckusick 		if((*k & (MOT | VMOT)) == (MOT | VMOT)){
989410Smckusick 			temp = *k & ~MOTV;
999410Smckusick 			if(*k & NMOT)temp = -temp;
1009410Smckusick 			dv += temp;
1019410Smckusick 		}
1029410Smckusick 		if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){
1039410Smckusick 			if(xpts == *j)break;
1049410Smckusick 			if(j == pslp){
1059410Smckusick 				*j = xpts;
1069410Smckusick 				*++pslp = 0;
1079410Smckusick 				break;
1089410Smckusick 			}
1099410Smckusick 		}
1109410Smckusick 	}
1119410Smckusick 	if(dv){
1129410Smckusick 		vflag++;
1139410Smckusick 		*olinep++ = makem(-dv);
1149410Smckusick 		vflag = 0;
1159410Smckusick 	}
1169410Smckusick 	if(xflg){
1179410Smckusick 	--pslp;
1189410Smckusick 		for(j=psl; j<=pslp; j++){
1199410Smckusick 			if(*j == mpts){
1209410Smckusick 				temp = *j;
1219410Smckusick 				*j = *pslp;
1229410Smckusick 				*pslp = temp;
1239410Smckusick 				break;
1249410Smckusick 			}
1259410Smckusick 		}
1269410Smckusick 	}
1279410Smckusick 	for(k=oline; k<olinep; k++){
1289410Smckusick 		if(!(*k & MOT) || (*k & VMOT))break;
1299410Smckusick 		*k &= ~MOT;
1309410Smckusick 		if(*k & NMOT){
1319410Smckusick 			*k &= ~NMOT;
1329410Smckusick 			*k = -*k;
1339410Smckusick 		}
1349410Smckusick 		inith += *k;
1359410Smckusick 	}
1369410Smckusick 	lead += dip->blss + lss;
1379410Smckusick 	dip->blss = 0;
1389410Smckusick 	slp = k;
1399410Smckusick scan:
1409410Smckusick 	temp = esct - po;
1419410Smckusick 	if(mpts & DBL)temp -= 55;
1429410Smckusick 	ds = temp - inith;
1439410Smckusick 	de = lw - temp;
1449410Smckusick 	if(de >= ds){
1459410Smckusick 		back = 0;
1469410Smckusick 		esc = -ds;
1479410Smckusick 		for(k=slp; k<olinep; k++)ptout0(*k);
1489410Smckusick 	}else{
1499410Smckusick 		back = 1;
1509410Smckusick 		esc = de;
1519410Smckusick 		for(k = olinep-1; k>=slp; --k)ptout0(*k);
1529410Smckusick 	}
1539410Smckusick 	if(xflg && (--pslp >= psl))goto scan;
1549410Smckusick 	olinep = oline;
1559410Smckusick 	lead += dip->alss;
1569410Smckusick 	dip->alss = 0;
1579410Smckusick }
ptout0(i)1589410Smckusick ptout0(i)
1599410Smckusick int i;
1609410Smckusick {
1619410Smckusick 	register j, k, w;
1629410Smckusick 	int z;
1639410Smckusick 
1649410Smckusick 	if(i & MOT){
1659410Smckusick 		j = i & ~MOTV;
1669410Smckusick 		if(i & NMOT)j = -j;
1679410Smckusick 		if(back)j = -j;
1689410Smckusick 		if(i & VMOT)lead += j;
1699410Smckusick 		else esc += j;
1709410Smckusick 		return;
1719410Smckusick 	}
1729410Smckusick 	xbitf = 2;
1739410Smckusick 	if((i>>BYTE) == oldbits){
1749410Smckusick 		xfont = pfont;
1759410Smckusick 		xpts = ppts;
1769410Smckusick 		xbitf = 0;
1779410Smckusick 	}else xbits(i);
1789410Smckusick 	if((k = (i & CMASK)) < 040){
1799410Smckusick 		return;
1809410Smckusick 	}
1819410Smckusick 	w = getcw(k-32);
1829410Smckusick 	if(cs){
1839410Smckusick 		if(bd)w += bd - 1;
1849410Smckusick 		j = (cs-w)/2;
1859410Smckusick 		w = cs - j;
1869410Smckusick 		if(bd)w -= bd - 1;
1879410Smckusick 	}else j = 0;
1889410Smckusick 	if(i & ZBIT){
1899410Smckusick 		if(cs)w = -j; else w = 0;
1909410Smckusick 		z = 1;
1919410Smckusick 	}else z = 0;
1929410Smckusick 	if(back){
1939410Smckusick 		k = j;
1949410Smckusick 		j = -w;
1959410Smckusick 		w = -k;
1969410Smckusick 	}
1979410Smckusick 	esc += j;
1989410Smckusick 	if((!xflg || (xpts == *pslp)) && (code & 077)){
1999410Smckusick 		if(code & 0200){
2009410Smckusick 			if(smnt)xfont = smnt -1;
2019410Smckusick 			else goto p1;
2029410Smckusick 		}
2039410Smckusick 		if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105);
2049410Smckusick 		if(xfont != mfont){
2059410Smckusick 			mfont = xfont;
2069410Smckusick 			if(mrail != (xfont&01))
2079410Smckusick 				oput(0101 + (mrail=xfont&01));
2089410Smckusick 			if(mmag != (xfont<2))
2099410Smckusick 				oput(0103 + (mmag=(xfont<2)));
2109410Smckusick 		}
2119410Smckusick 		if(xpts != mpts)ptps();
2129410Smckusick 		if(lead)ptlead();
2139410Smckusick 		if(esc)ptesc();
2149410Smckusick /*
2159410Smckusick 		oput(code & 077);
2169410Smckusick */
2179410Smckusick 		*obufp++ = code & 077;
2189410Smckusick 		if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
2199410Smckusick 		if(bd){
2209410Smckusick 			bd -= 1;
2219410Smckusick 			if(back && !z)bd = -bd;
2229410Smckusick 			if(esc += bd)ptesc();
2239410Smckusick 			oput(code & 077);
2249410Smckusick 			if(z)esc -= bd;
2259410Smckusick 		}
2269410Smckusick 	}else if(bd && !z){
2279410Smckusick 		bd -= 1;
2289410Smckusick 		if(back)bd = -bd;
2299410Smckusick 		esc += bd;
2309410Smckusick 	}
2319410Smckusick p1:
2329410Smckusick 	esc += w;
2339410Smckusick 	return;
2349410Smckusick }
ptps()2359410Smckusick ptps(){
2369410Smckusick 	register i, j, k;
2379410Smckusick 
2389410Smckusick 	if(psflg)return;
2399410Smckusick 	if(cps){
2409410Smckusick 		psflg++;
2419410Smckusick 		i = findps(cps);
2429410Smckusick 	}else i = xpts;
2439410Smckusick 	for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
2449410Smckusick 	j = psctab[j];
2459410Smckusick 	oput((j & ~0200) | 0120);
2469410Smckusick 	if((!(mpts & DBL))^(!(j & 0200))){
2479410Smckusick 		if(j & 0200)k = 55;
2489410Smckusick 			else k = -55;
2499410Smckusick 		esc += k;
2509410Smckusick 	}
2519410Smckusick 	mpts = i;
2529410Smckusick }
ptlead()2539410Smckusick ptlead(){
2549410Smckusick 	register i, k;
2559410Smckusick 
2569410Smckusick 	if(k = lead < 0)lead = -lead;
2579410Smckusick 	if(k^verm)oput(0112 + ((verm=k)<<1));
2589410Smckusick 	if(((k=lead)%3) == 2)k++;
2599410Smckusick 	k /= 3;
2609410Smckusick 	while(k > 0){
2619410Smckusick 		if((i=31) > k)i = k;
2629410Smckusick 		if(verm)paper -= i;
2639410Smckusick 			else paper += i;
2649410Smckusick 		oput(((~i) & 037) | 0140);
2659410Smckusick 		if((paper > (11*144*15)) && !papflg && ptid != 1){
2669410Smckusick 			prstr("Excessive paper use.\n");
2679410Smckusick 			papflg++;
2689410Smckusick 			if(ptid != 1){
2699410Smckusick 				lead = 0;
2709410Smckusick 				done2(0200);
2719410Smckusick 			}
2729410Smckusick 		}
2739410Smckusick 		k -= i;
2749410Smckusick 	}
2759410Smckusick 	lead = 0;
2769410Smckusick }
ptesc()2779410Smckusick ptesc(){
2789410Smckusick 	register i, j, k;
2799410Smckusick 
2809410Smckusick 	if(k = esc < 0)esc = -esc;
2819410Smckusick 	if(k^escm)oput(0107 + (escm=k));
2829410Smckusick 	k = esc;
2839410Smckusick 	while(k > 0){
2849410Smckusick 		if((i=127) > k)i = k;
2859410Smckusick 		if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) ||
2869410Smckusick 		   (j < 0))break;
2879410Smckusick /*
2889410Smckusick 		oput(~i);
2899410Smckusick */
2909410Smckusick 		*obufp++ = ~i;
2919410Smckusick 		if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
2929410Smckusick 		esct = j;
2939410Smckusick 		k -= i;
2949410Smckusick 	}
2959410Smckusick 	esc = 0;
2969410Smckusick }
dostop()2979410Smckusick dostop(){
2989410Smckusick 	register i;
2999410Smckusick 
3009410Smckusick 	if(ascii)return;
3019410Smckusick 	if(!nofeed && !gflag)lead += TRAILER;
3029410Smckusick 	ptlead();
3039410Smckusick 	flusho();
3049410Smckusick 	oput(T_INIT);
3059410Smckusick 	oput(T_STOP);
3069410Smckusick 	if(gflag){
3079410Smckusick 		oput('f');
3089410Smckusick 		for(i=0; i<4; i++){
3099410Smckusick 			oput(fontlab[i] & BMASK);
3109410Smckusick 			oput((fontlab[i]>>BYTE) & BMASK);
3119410Smckusick 		}
3129410Smckusick 	}else for(i=8; i>0; i--)oput(T_PAD);
3139410Smckusick 	flusho();
3149410Smckusick 	if(stopmesg)prstr("Pages finished.\n");
3159410Smckusick 	mcase = mpts = mfont = mrail = verm = escm = 0;
3169410Smckusick 	mmag = 1;
3179410Smckusick 	report();
3189410Smckusick 	paper = 0;
3199410Smckusick 	esc = T_IESC;
3209410Smckusick 	ptesc();
3219410Smckusick 	esct = 0;
3229410Smckusick 	esc = po;
3239410Smckusick }
324