xref: /plan9-contrib/sys/src/cmd/troff/t10.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
13e12c5d1SDavid du Colombier #include "tdef.h"
23e12c5d1SDavid du Colombier #include "fns.h"
33e12c5d1SDavid du Colombier #include "ext.h"
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier /*
63e12c5d1SDavid du Colombier  * troff10.c
73e12c5d1SDavid du Colombier  *
83e12c5d1SDavid du Colombier  * typesetter interface
93e12c5d1SDavid du Colombier  */
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier int	vpos	 = 0;	/* absolute vertical position on page */
123e12c5d1SDavid du Colombier int	hpos	 = 0;	/* ditto horizontal */
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier extern Font fonts[MAXFONTS+1];
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier int	Inch;
173e12c5d1SDavid du Colombier int	Hor;
183e12c5d1SDavid du Colombier int	Vert;
193e12c5d1SDavid du Colombier int	Unitwidth;
203e12c5d1SDavid du Colombier int	nfonts;
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier 
t_ptinit(void)243e12c5d1SDavid du Colombier void t_ptinit(void)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier 	int i;
273e12c5d1SDavid du Colombier 	char buf[100], *p;
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier 	hmot = t_hmot;
303e12c5d1SDavid du Colombier 	makem = t_makem;
313e12c5d1SDavid du Colombier 	setabs = t_setabs;
323e12c5d1SDavid du Colombier 	setch = t_setch;
333e12c5d1SDavid du Colombier 	sethl = t_sethl;
343e12c5d1SDavid du Colombier 	setht = t_setht;
353e12c5d1SDavid du Colombier 	setslant = t_setslant;
363e12c5d1SDavid du Colombier 	vmot = t_vmot;
373e12c5d1SDavid du Colombier 	xlss = t_xlss;
383e12c5d1SDavid du Colombier 	findft = t_findft;
393e12c5d1SDavid du Colombier 	width = t_width;
403e12c5d1SDavid du Colombier 	mchbits = t_mchbits;
413e12c5d1SDavid du Colombier 	ptlead = t_ptlead;
423e12c5d1SDavid du Colombier 	ptout = t_ptout;
433e12c5d1SDavid du Colombier 	ptpause = t_ptpause;
443e12c5d1SDavid du Colombier 	setfont = t_setfont;
453e12c5d1SDavid du Colombier 	setps = t_setps;
463e12c5d1SDavid du Colombier 	setwd = t_setwd;
473e12c5d1SDavid du Colombier 
483e12c5d1SDavid du Colombier 	/* open table for device, */
493e12c5d1SDavid du Colombier 	/* read in resolution, size info, font info, etc., set params */
504d44ba9bSDavid du Colombier 	if ((p = getenv("TYPESETTER")) != 0){
514d44ba9bSDavid du Colombier 		strncpy(devname, p, sizeof devname);
524d44ba9bSDavid du Colombier 		devname[sizeof devname-1] = 0;
534d44ba9bSDavid du Colombier 	}
543e12c5d1SDavid du Colombier 	if (termtab[0] == 0)
55219b2ee8SDavid du Colombier 		strcpy(termtab, DWBfontdir);
563e12c5d1SDavid du Colombier 	if (fontdir[0] == 0)
57219b2ee8SDavid du Colombier 		strcpy(fontdir, DWBfontdir);
583e12c5d1SDavid du Colombier 	if (devname[0] == 0)
593e12c5d1SDavid du Colombier 		strcpy(devname, TDEVNAME);
603e12c5d1SDavid du Colombier 	hyf = 1;
613e12c5d1SDavid du Colombier 	lg = 1;
623e12c5d1SDavid du Colombier 
634d44ba9bSDavid du Colombier 	snprintf(buf, sizeof buf, "/dev%s/DESC", devname);
643e12c5d1SDavid du Colombier 	strcat(termtab, buf);
653e12c5d1SDavid du Colombier 	if (getdesc(termtab) < 0) {
663e12c5d1SDavid du Colombier 		ERROR "can't open DESC file %s", termtab WARN;
673e12c5d1SDavid du Colombier 		done3(1);
683e12c5d1SDavid du Colombier 	}
693e12c5d1SDavid du Colombier 	if (!ascii) {
703e12c5d1SDavid du Colombier 		OUT "x T %s\n", devname PUT;
713e12c5d1SDavid du Colombier 		OUT "x res %d %d %d\n", Inch, Hor, Vert PUT;
723e12c5d1SDavid du Colombier 		OUT "x init\n" PUT;
733e12c5d1SDavid du Colombier 	}
743e12c5d1SDavid du Colombier 	for (i = 1; i <= nfonts; i++)
753e12c5d1SDavid du Colombier 		setfp(i, fontlab[i], (char *) 0, 0);
763e12c5d1SDavid du Colombier 	sps = EM/3;	/* space size */
773e12c5d1SDavid du Colombier 	ics = EM;	/* insertion character space */
78219b2ee8SDavid du Colombier 	for (i = 0; i < (NTAB - 1) && DTAB * (i + 1) < TABMASK; i++)
793e12c5d1SDavid du Colombier 		tabtab[i] = DTAB * (i + 1);
809f2726c3SDavid du Colombier 	tabtab[NTAB-1] = 0;
813e12c5d1SDavid du Colombier 	pl = 11 * INCH;			/* paper length */
823e12c5d1SDavid du Colombier 	po = PO;		/* page offset */
833e12c5d1SDavid du Colombier 	spacesz = SS;
843e12c5d1SDavid du Colombier 	lss = lss1 = VS;
853e12c5d1SDavid du Colombier 	ll = ll1 = lt = lt1 = LL;
863e12c5d1SDavid du Colombier 	t_specnames();	/* install names like "hyphen", etc. */
873e12c5d1SDavid du Colombier }
883e12c5d1SDavid du Colombier 
t_specnames(void)893e12c5d1SDavid du Colombier void t_specnames(void)
903e12c5d1SDavid du Colombier {
913e12c5d1SDavid du Colombier 	int	i;
923e12c5d1SDavid du Colombier 
933e12c5d1SDavid du Colombier 	for (i = 0; spnames[i].n; i++)
943e12c5d1SDavid du Colombier 		*spnames[i].n = chadd(spnames[i].v, Troffchar, Install);
953e12c5d1SDavid du Colombier }
963e12c5d1SDavid du Colombier 
t_ptout(Tchar i)973e12c5d1SDavid du Colombier void t_ptout(Tchar i)
983e12c5d1SDavid du Colombier {
993e12c5d1SDavid du Colombier 	int dv;
1003e12c5d1SDavid du Colombier 	Tchar *k;
1013e12c5d1SDavid du Colombier 	int temp, a, b;
102219b2ee8SDavid du Colombier 	int diff;
1033e12c5d1SDavid du Colombier 
1043e12c5d1SDavid du Colombier 	if (cbits(i) != '\n') {
105219b2ee8SDavid du Colombier 		if (olinep >= oline + olnsize) {
106219b2ee8SDavid du Colombier 			diff = olinep - oline;
107219b2ee8SDavid du Colombier 			olnsize += OLNSIZE;
108219b2ee8SDavid du Colombier 			if ((oline = (Tchar *)realloc((char *)oline, olnsize * sizeof(Tchar))) != NULL) {
109219b2ee8SDavid du Colombier 				if (diff && olinep)
110219b2ee8SDavid du Colombier 					olinep = oline + diff;
111219b2ee8SDavid du Colombier 			} else {
1123e12c5d1SDavid du Colombier 				ERROR "Output line overflow." WARN;
1133e12c5d1SDavid du Colombier 				done(2);
1143e12c5d1SDavid du Colombier 			}
115219b2ee8SDavid du Colombier 		}
1163e12c5d1SDavid du Colombier 		*olinep++ = i;
1173e12c5d1SDavid du Colombier 		return;
1183e12c5d1SDavid du Colombier 	}
1193e12c5d1SDavid du Colombier 	if (olinep == oline) {
1203e12c5d1SDavid du Colombier 		lead += lss;
1213e12c5d1SDavid du Colombier 		return;
1223e12c5d1SDavid du Colombier 	}
1233e12c5d1SDavid du Colombier 
1243e12c5d1SDavid du Colombier 	hpos = po;	/* ??? */
1253e12c5d1SDavid du Colombier 	esc = 0;	/* ??? */
1263e12c5d1SDavid du Colombier 	ptesc();	/* the problem is to get back to the left end of the line */
1273e12c5d1SDavid du Colombier 	dv = 0;
1283e12c5d1SDavid du Colombier 	for (k = oline; k < olinep; k++) {
1293e12c5d1SDavid du Colombier 		if (ismot(*k) && isvmot(*k)) {
1303e12c5d1SDavid du Colombier 			temp = absmot(*k);
1313e12c5d1SDavid du Colombier 			if (isnmot(*k))
1323e12c5d1SDavid du Colombier 				temp = -temp;
1333e12c5d1SDavid du Colombier 			dv += temp;
1343e12c5d1SDavid du Colombier 		}
1353e12c5d1SDavid du Colombier 	}
1363e12c5d1SDavid du Colombier 	if (dv) {
1373e12c5d1SDavid du Colombier 		vflag++;
1383e12c5d1SDavid du Colombier 		*olinep++ = makem(-dv);
1393e12c5d1SDavid du Colombier 		vflag = 0;
1403e12c5d1SDavid du Colombier 	}
1413e12c5d1SDavid du Colombier 
1423e12c5d1SDavid du Colombier 	b = dip->blss + lss;
1433e12c5d1SDavid du Colombier 	lead += dip->blss + lss;
1443e12c5d1SDavid du Colombier 	dip->blss = 0;
1453e12c5d1SDavid du Colombier 	for (k = oline; k < olinep; )
1463e12c5d1SDavid du Colombier 		k += ptout0(k);	/* now passing a pointer! */
1473e12c5d1SDavid du Colombier 	olinep = oline;
1483e12c5d1SDavid du Colombier 	lead += dip->alss;
1493e12c5d1SDavid du Colombier 	a = dip->alss;
1503e12c5d1SDavid du Colombier 	dip->alss = 0;
1513e12c5d1SDavid du Colombier 	/*
1523e12c5d1SDavid du Colombier 	OUT "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos PUT;
1533e12c5d1SDavid du Colombier */
1543e12c5d1SDavid du Colombier 	OUT "n%d %d\n", b, a PUT;	/* be nice to chuck */
1553e12c5d1SDavid du Colombier }
1563e12c5d1SDavid du Colombier 
ptout0(Tchar * pi)1573e12c5d1SDavid du Colombier int ptout0(Tchar *pi)
1583e12c5d1SDavid du Colombier {
159*14f51593SDavid du Colombier 	int j, k, w, z, dx, dy, dx2, dy2, n;
1603e12c5d1SDavid du Colombier 	int outsize;	/* size of object being printed */
161*14f51593SDavid du Colombier 	Tchar i;
1623e12c5d1SDavid du Colombier 
163*14f51593SDavid du Colombier 	w = 0;
1643e12c5d1SDavid du Colombier 	outsize = 1;	/* default */
1653e12c5d1SDavid du Colombier 	i = *pi;
1663e12c5d1SDavid du Colombier 	k = cbits(i);
1673e12c5d1SDavid du Colombier 	if (ismot(i)) {
1683e12c5d1SDavid du Colombier 		j = absmot(i);
1693e12c5d1SDavid du Colombier 		if (isnmot(i))
1703e12c5d1SDavid du Colombier 			j = -j;
1713e12c5d1SDavid du Colombier 		if (isvmot(i))
1723e12c5d1SDavid du Colombier 			lead += j;
1733e12c5d1SDavid du Colombier 		else
1743e12c5d1SDavid du Colombier 			esc += j;
1753e12c5d1SDavid du Colombier 		return(outsize);
1763e12c5d1SDavid du Colombier 	}
1773e12c5d1SDavid du Colombier 	if (k == CHARHT) {
178219b2ee8SDavid du Colombier 		xpts = fbits(i);	/* sneaky, font bits as size bits */
1793e12c5d1SDavid du Colombier 		if (xpts != mpts)
1803e12c5d1SDavid du Colombier 			ptps();
1813e12c5d1SDavid du Colombier 		OUT "x H %d\n", sbits(i) PUT;
1823e12c5d1SDavid du Colombier 		return(outsize);
1833e12c5d1SDavid du Colombier 	}
1843e12c5d1SDavid du Colombier 	if (k == SLANT) {
1853e12c5d1SDavid du Colombier 		OUT "x S %d\n", sfbits(i)-180 PUT;
1863e12c5d1SDavid du Colombier 		return(outsize);
1873e12c5d1SDavid du Colombier 	}
1883e12c5d1SDavid du Colombier 	if (k == WORDSP) {
1893e12c5d1SDavid du Colombier 		oput('w');
1903e12c5d1SDavid du Colombier 		return(outsize);
1913e12c5d1SDavid du Colombier 	}
1923e12c5d1SDavid du Colombier 	if (sfbits(i) == oldbits) {
1933e12c5d1SDavid du Colombier 		xfont = pfont;
1943e12c5d1SDavid du Colombier 		xpts = ppts;
1953e12c5d1SDavid du Colombier 	} else
1963e12c5d1SDavid du Colombier 		xbits(i, 2);
1973e12c5d1SDavid du Colombier 	if (k == XON) {
1983e12c5d1SDavid du Colombier 		extern int xon;
1993e12c5d1SDavid du Colombier 		ptflush();	/* guarantee that everything is out */
2003e12c5d1SDavid du Colombier 		if (esc)
2013e12c5d1SDavid du Colombier 			ptesc();
2023e12c5d1SDavid du Colombier 		if (xfont != mfont)
2033e12c5d1SDavid du Colombier 			ptfont();
2043e12c5d1SDavid du Colombier 		if (xpts != mpts)
2053e12c5d1SDavid du Colombier 			ptps();
2063e12c5d1SDavid du Colombier 		if (lead)
2073e12c5d1SDavid du Colombier 			ptlead();
2083e12c5d1SDavid du Colombier 		OUT "x X " PUT;
2093e12c5d1SDavid du Colombier 		xon++;
2103e12c5d1SDavid du Colombier 		for (j = 1; cbits(pi[j]) != XOFF; j++)
2113e12c5d1SDavid du Colombier 			outascii(pi[j]);
2123e12c5d1SDavid du Colombier 		oput('\n');
2133e12c5d1SDavid du Colombier 		xon--;
2143e12c5d1SDavid du Colombier 		return j+1;
2153e12c5d1SDavid du Colombier 	}
216219b2ee8SDavid du Colombier 	if (k < 040 && k != DRAWFCN)
2173e12c5d1SDavid du Colombier 		return(outsize);
2183e12c5d1SDavid du Colombier 	j = z = 0;
2193e12c5d1SDavid du Colombier 	if (k != DRAWFCN) {
2203e12c5d1SDavid du Colombier 		if (widcache[k].fontpts == (xfont<<8) + xpts  && !setwdf) {
2213e12c5d1SDavid du Colombier 			w = widcache[k].width;
2223e12c5d1SDavid du Colombier 			bd = 0;
2233e12c5d1SDavid du Colombier 			cs = 0;
2243e12c5d1SDavid du Colombier 		} else
2253e12c5d1SDavid du Colombier 			w = getcw(k);
2263e12c5d1SDavid du Colombier 		if (cs) {
2273e12c5d1SDavid du Colombier 			if (bd)
2283e12c5d1SDavid du Colombier 				w += (bd - 1) * HOR;
2293e12c5d1SDavid du Colombier 			j = (cs - w) / 2;
2303e12c5d1SDavid du Colombier 			w = cs - j;
2313e12c5d1SDavid du Colombier 			if (bd)
2323e12c5d1SDavid du Colombier 				w -= (bd - 1) * HOR;
2333e12c5d1SDavid du Colombier 		}
2343e12c5d1SDavid du Colombier 		if (iszbit(i)) {
2353e12c5d1SDavid du Colombier 			if (cs)
2363e12c5d1SDavid du Colombier 				w = -j;
2373e12c5d1SDavid du Colombier 			else
2383e12c5d1SDavid du Colombier 				w = 0;
2393e12c5d1SDavid du Colombier 			z = 1;
2403e12c5d1SDavid du Colombier 		}
2413e12c5d1SDavid du Colombier 	}
2423e12c5d1SDavid du Colombier 	esc += j;
2433e12c5d1SDavid du Colombier 	if (xfont != mfont)
2443e12c5d1SDavid du Colombier 		ptfont();
2453e12c5d1SDavid du Colombier 	if (xpts != mpts)
2463e12c5d1SDavid du Colombier 		ptps();
2473e12c5d1SDavid du Colombier 	if (lead)
2483e12c5d1SDavid du Colombier 		ptlead();
2493e12c5d1SDavid du Colombier 	/* put out the real character here */
2503e12c5d1SDavid du Colombier 	if (k == DRAWFCN) {
2513e12c5d1SDavid du Colombier 		if (esc)
2523e12c5d1SDavid du Colombier 			ptesc();
2533e12c5d1SDavid du Colombier 		w = 0;
2543e12c5d1SDavid du Colombier 		dx = absmot(pi[3]);
2553e12c5d1SDavid du Colombier 		if (isnmot(pi[3]))
2563e12c5d1SDavid du Colombier 			dx = -dx;
2573e12c5d1SDavid du Colombier 		dy = absmot(pi[4]);
2583e12c5d1SDavid du Colombier 		if (isnmot(pi[4]))
2593e12c5d1SDavid du Colombier 			dy = -dy;
2603e12c5d1SDavid du Colombier 		switch (cbits(pi[1])) {
2613e12c5d1SDavid du Colombier 		case DRAWCIRCLE:	/* circle */
2623e12c5d1SDavid du Colombier 			OUT "D%c %d\n", DRAWCIRCLE, dx PUT;	/* dx is diameter */
2633e12c5d1SDavid du Colombier 			hpos += dx;
2643e12c5d1SDavid du Colombier 			break;
2653e12c5d1SDavid du Colombier 		case DRAWELLIPSE:
2663e12c5d1SDavid du Colombier 			OUT "D%c %d %d\n", DRAWELLIPSE, dx, dy PUT;
2673e12c5d1SDavid du Colombier 			hpos += dx;
2683e12c5d1SDavid du Colombier 			break;
269219b2ee8SDavid du Colombier 		case DRAWBUILD:
270219b2ee8SDavid du Colombier 			k = cbits(pi[2]);
271219b2ee8SDavid du Colombier 			OUT "D%c %d ", DRAWBUILD, dx PUT;
272219b2ee8SDavid du Colombier 			if (k < ALPHABET)
273219b2ee8SDavid du Colombier 				OUT "%c\n", k PUT;
274219b2ee8SDavid du Colombier 			else
275219b2ee8SDavid du Colombier 				ptchname(k);
276219b2ee8SDavid du Colombier 			hpos += dx;
277219b2ee8SDavid du Colombier 			break;
2783e12c5d1SDavid du Colombier 		case DRAWLINE:	/* line */
2793e12c5d1SDavid du Colombier 			k = cbits(pi[2]);
2803e12c5d1SDavid du Colombier 			OUT "D%c %d %d ", DRAWLINE, dx, dy PUT;
2813e12c5d1SDavid du Colombier 			if (k < ALPHABET)
2823e12c5d1SDavid du Colombier 				OUT "%c\n", k PUT;
2833e12c5d1SDavid du Colombier 			else
2843e12c5d1SDavid du Colombier 				ptchname(k);
2853e12c5d1SDavid du Colombier 			hpos += dx;
2863e12c5d1SDavid du Colombier 			vpos += dy;
2873e12c5d1SDavid du Colombier 			break;
2883e12c5d1SDavid du Colombier 		case DRAWARC:	/* arc */
2893e12c5d1SDavid du Colombier 			dx2 = absmot(pi[5]);
2903e12c5d1SDavid du Colombier 			if (isnmot(pi[5]))
2913e12c5d1SDavid du Colombier 				dx2 = -dx2;
2923e12c5d1SDavid du Colombier 			dy2 = absmot(pi[6]);
2933e12c5d1SDavid du Colombier 			if (isnmot(pi[6]))
2943e12c5d1SDavid du Colombier 				dy2 = -dy2;
2953e12c5d1SDavid du Colombier 			OUT "D%c %d %d %d %d\n", DRAWARC,
2963e12c5d1SDavid du Colombier 				dx, dy, dx2, dy2 PUT;
2973e12c5d1SDavid du Colombier 			hpos += dx + dx2;
2983e12c5d1SDavid du Colombier 			vpos += dy + dy2;
2993e12c5d1SDavid du Colombier 			break;
3003e12c5d1SDavid du Colombier 
3013e12c5d1SDavid du Colombier 		case 's':	/* using 's' internally to avoid .tr ~ */
3023e12c5d1SDavid du Colombier 			pi[1] = '~';
3033e12c5d1SDavid du Colombier 		case DRAWSPLINE:	/* spline */
3043e12c5d1SDavid du Colombier 		default:	/* something else; copy it like spline */
3053e12c5d1SDavid du Colombier 			OUT "D%c %d %d", cbits(pi[1]), dx, dy PUT;
3063e12c5d1SDavid du Colombier 			hpos += dx;
3073e12c5d1SDavid du Colombier 			vpos += dy;
3083e12c5d1SDavid du Colombier 			if (cbits(pi[3]) == DRAWFCN || cbits(pi[4]) == DRAWFCN) {
3093e12c5d1SDavid du Colombier 				/* it was somehow defective */
3103e12c5d1SDavid du Colombier 				OUT "\n" PUT;
3113e12c5d1SDavid du Colombier 				break;
3123e12c5d1SDavid du Colombier 			}
3133e12c5d1SDavid du Colombier 			for (n = 5; cbits(pi[n]) != DRAWFCN; n += 2) {
3143e12c5d1SDavid du Colombier 				dx = absmot(pi[n]);
3153e12c5d1SDavid du Colombier 				if (isnmot(pi[n]))
3163e12c5d1SDavid du Colombier 					dx = -dx;
3173e12c5d1SDavid du Colombier 				dy = absmot(pi[n+1]);
3183e12c5d1SDavid du Colombier 				if (isnmot(pi[n+1]))
3193e12c5d1SDavid du Colombier 					dy = -dy;
3203e12c5d1SDavid du Colombier 				OUT " %d %d", dx, dy PUT;
3213e12c5d1SDavid du Colombier 				hpos += dx;
3223e12c5d1SDavid du Colombier 				vpos += dy;
3233e12c5d1SDavid du Colombier 			}
3243e12c5d1SDavid du Colombier 			OUT "\n" PUT;
3253e12c5d1SDavid du Colombier 			break;
3263e12c5d1SDavid du Colombier 		}
3273e12c5d1SDavid du Colombier 		for (n = 3; cbits(pi[n]) != DRAWFCN; n++)
3283e12c5d1SDavid du Colombier 			;
3293e12c5d1SDavid du Colombier 		outsize = n + 1;
3303e12c5d1SDavid du Colombier 	} else if (k < ALPHABET) {
3313e12c5d1SDavid du Colombier 		/* try to go faster and compress output */
3323e12c5d1SDavid du Colombier 		/* by printing nnc for small positive motion followed by c */
3333e12c5d1SDavid du Colombier 		/* kludgery; have to make sure set all the vars too */
3343e12c5d1SDavid du Colombier 		if (esc > 0 && esc < 100) {
3353e12c5d1SDavid du Colombier 			oput(esc / 10 + '0');
3363e12c5d1SDavid du Colombier 			oput(esc % 10 + '0');
3373e12c5d1SDavid du Colombier 			oput(k);
3383e12c5d1SDavid du Colombier 			hpos += esc;
3393e12c5d1SDavid du Colombier 			esc = 0;
3403e12c5d1SDavid du Colombier 		} else {
3413e12c5d1SDavid du Colombier 			if (esc)
3423e12c5d1SDavid du Colombier 				ptesc();
3433e12c5d1SDavid du Colombier 			oput('c');
3443e12c5d1SDavid du Colombier 			oput(k);
3453e12c5d1SDavid du Colombier 			oput('\n');
3463e12c5d1SDavid du Colombier 		}
3473e12c5d1SDavid du Colombier 	} else {
3483e12c5d1SDavid du Colombier 		if (esc)
3493e12c5d1SDavid du Colombier 			ptesc();
3503e12c5d1SDavid du Colombier 		ptchname(k);
3513e12c5d1SDavid du Colombier 	}
3523e12c5d1SDavid du Colombier 	if (bd) {
3533e12c5d1SDavid du Colombier 		bd -= HOR;
3543e12c5d1SDavid du Colombier 		if (esc += bd)
3553e12c5d1SDavid du Colombier 			ptesc();
3563e12c5d1SDavid du Colombier 		if (k < ALPHABET)
3573e12c5d1SDavid du Colombier 			OUT "c%c\n", k PUT;
3583e12c5d1SDavid du Colombier 		else
3593e12c5d1SDavid du Colombier 			ptchname(k);
3603e12c5d1SDavid du Colombier 		if (z)
3613e12c5d1SDavid du Colombier 			esc -= bd;
3623e12c5d1SDavid du Colombier 	}
3633e12c5d1SDavid du Colombier 	esc += w;
3643e12c5d1SDavid du Colombier 	return(outsize);
3653e12c5d1SDavid du Colombier }
3663e12c5d1SDavid du Colombier 
ptchname(int k)3673e12c5d1SDavid du Colombier void ptchname(int k)
3683e12c5d1SDavid du Colombier {
3693e12c5d1SDavid du Colombier 	char *chn = chname(k);
3703e12c5d1SDavid du Colombier 
3713e12c5d1SDavid du Colombier 	switch (chn[0]) {
3723e12c5d1SDavid du Colombier 	case MBchar:
3733e12c5d1SDavid du Colombier 		OUT "c%s\n", chn+1 PUT;	/* \n not needed? */
3743e12c5d1SDavid du Colombier 		break;
3753e12c5d1SDavid du Colombier 	case Number:
3763e12c5d1SDavid du Colombier 		OUT "N%s\n", chn+1 PUT;
3773e12c5d1SDavid du Colombier 		break;
3783e12c5d1SDavid du Colombier 	case Troffchar:
3793e12c5d1SDavid du Colombier 		OUT "C%s\n", chn+1 PUT;
3803e12c5d1SDavid du Colombier 		break;
3813e12c5d1SDavid du Colombier 	default:
3823e12c5d1SDavid du Colombier 		ERROR "illegal char type %s", chn WARN;
3833e12c5d1SDavid du Colombier 		break;
3843e12c5d1SDavid du Colombier 	}
3853e12c5d1SDavid du Colombier }
3863e12c5d1SDavid du Colombier 
ptflush(void)3873e12c5d1SDavid du Colombier void ptflush(void)	/* get us to a clean output state */
3883e12c5d1SDavid du Colombier {
3893e12c5d1SDavid du Colombier 	if (TROFF) {
3903e12c5d1SDavid du Colombier 		/* ptesc(); but always H, no h */
3913e12c5d1SDavid du Colombier 		hpos += esc;
3923e12c5d1SDavid du Colombier 		OUT "\nH%d\n", hpos PUT;
3933e12c5d1SDavid du Colombier 		esc = 0;
3943e12c5d1SDavid du Colombier 		ptps();
3953e12c5d1SDavid du Colombier 		ptfont();
3963e12c5d1SDavid du Colombier 		ptlead();
3973e12c5d1SDavid du Colombier 	}
3983e12c5d1SDavid du Colombier }
3993e12c5d1SDavid du Colombier 
ptps(void)4003e12c5d1SDavid du Colombier void ptps(void)
4013e12c5d1SDavid du Colombier {
4023e12c5d1SDavid du Colombier 	int i, j, k;
4033e12c5d1SDavid du Colombier 
4043e12c5d1SDavid du Colombier 	i = xpts;
4053e12c5d1SDavid du Colombier 	for (j = 0; i > (k = pstab[j]); j++)
4063e12c5d1SDavid du Colombier 		if (!k) {
4073e12c5d1SDavid du Colombier 			k = pstab[--j];
4083e12c5d1SDavid du Colombier 			break;
4093e12c5d1SDavid du Colombier 		}
410219b2ee8SDavid du Colombier 	if (!ascii)
4113e12c5d1SDavid du Colombier 		OUT "s%d\n", k PUT;	/* really should put out string rep of size */
4123e12c5d1SDavid du Colombier 	mpts = i;
4133e12c5d1SDavid du Colombier }
4143e12c5d1SDavid du Colombier 
ptfont(void)4153e12c5d1SDavid du Colombier void ptfont(void)
4163e12c5d1SDavid du Colombier {
4173e12c5d1SDavid du Colombier 	mfont = xfont;
418219b2ee8SDavid du Colombier 	if (ascii)
419219b2ee8SDavid du Colombier 		return;
4203e12c5d1SDavid du Colombier 	if (xfont > nfonts) {
4213e12c5d1SDavid du Colombier 		ptfpcmd(0, fonts[xfont].longname, 0);	/* Put the desired font in the
4223e12c5d1SDavid du Colombier 					 * fontcache of the filter */
4233e12c5d1SDavid du Colombier 		OUT "f0\n" PUT;	/* make sure that it gets noticed */
4243e12c5d1SDavid du Colombier 	} else
4253e12c5d1SDavid du Colombier 		OUT "f%d\n", xfont PUT;
4263e12c5d1SDavid du Colombier }
4273e12c5d1SDavid du Colombier 
ptfpcmd(int f,char * s,char * longname)4283e12c5d1SDavid du Colombier void ptfpcmd(int f, char *s, char *longname)
4293e12c5d1SDavid du Colombier {
4303e12c5d1SDavid du Colombier 	if (f > nfonts)		/* a bit risky? */
4313e12c5d1SDavid du Colombier 		f = 0;
4323e12c5d1SDavid du Colombier 	if (longname) {
4333e12c5d1SDavid du Colombier 		OUT "x font %d %s %s\n", f, s, longname PUT;
4343e12c5d1SDavid du Colombier 	} else {
4353e12c5d1SDavid du Colombier 		OUT "x font %d %s\n", f, s PUT;
4363e12c5d1SDavid du Colombier 	}
4373e12c5d1SDavid du Colombier /*	OUT "f%d\n", xfont PUT;	/* need this for buggy version of adobe transcript */
4383e12c5d1SDavid du Colombier 				/* which apparently believes that x font means */
4393e12c5d1SDavid du Colombier 				/* to set the font, not just the position. */
4403e12c5d1SDavid du Colombier }
4413e12c5d1SDavid du Colombier 
t_ptlead(void)4423e12c5d1SDavid du Colombier void t_ptlead(void)
4433e12c5d1SDavid du Colombier {
4443e12c5d1SDavid du Colombier 	vpos += lead;
4453e12c5d1SDavid du Colombier 	if (!ascii)
4463e12c5d1SDavid du Colombier 		OUT "V%d\n", vpos PUT;
4473e12c5d1SDavid du Colombier 	lead = 0;
4483e12c5d1SDavid du Colombier }
4493e12c5d1SDavid du Colombier 
ptesc(void)4503e12c5d1SDavid du Colombier void ptesc(void)
4513e12c5d1SDavid du Colombier {
4523e12c5d1SDavid du Colombier 	hpos += esc;
453219b2ee8SDavid du Colombier 	if (!ascii)
4543e12c5d1SDavid du Colombier 		if (esc > 0) {
4553e12c5d1SDavid du Colombier 			oput('h');
4563e12c5d1SDavid du Colombier 			if (esc>=10 && esc<100) {
4573e12c5d1SDavid du Colombier 				oput(esc/10 + '0');
4583e12c5d1SDavid du Colombier 				oput(esc%10 + '0');
4593e12c5d1SDavid du Colombier 			} else
4603e12c5d1SDavid du Colombier 				OUT "%d", esc PUT;
4613e12c5d1SDavid du Colombier 		} else
4623e12c5d1SDavid du Colombier 			OUT "H%d\n", hpos PUT;
4633e12c5d1SDavid du Colombier 	esc = 0;
4643e12c5d1SDavid du Colombier }
4653e12c5d1SDavid du Colombier 
ptpage(int n)4663e12c5d1SDavid du Colombier void ptpage(int n)	/* called at end of each output page, we hope */
4673e12c5d1SDavid du Colombier {
4683e12c5d1SDavid du Colombier 	int i;
4693e12c5d1SDavid du Colombier 
4703e12c5d1SDavid du Colombier 	if (NROFF)
4713e12c5d1SDavid du Colombier 		return;
4723e12c5d1SDavid du Colombier 	ptlead();
4733e12c5d1SDavid du Colombier 	vpos = 0;
4743e12c5d1SDavid du Colombier 	if (ascii)
4753e12c5d1SDavid du Colombier 		return;
4763e12c5d1SDavid du Colombier 	OUT "p%d\n", n PUT;	/* new page */
4773e12c5d1SDavid du Colombier 	for (i = 0; i <= nfonts; i++)
4783e12c5d1SDavid du Colombier 		if (fontlab[i]) {
4793e12c5d1SDavid du Colombier 			if (fonts[i].truename)
4803e12c5d1SDavid du Colombier 				OUT "x font %d %s %s\n", i, fonts[i].longname, fonts[i].truename PUT;
4813e12c5d1SDavid du Colombier 			else
4823e12c5d1SDavid du Colombier 				OUT "x font %d %s\n", i, fonts[i].longname PUT;
4833e12c5d1SDavid du Colombier 		}
4843e12c5d1SDavid du Colombier 	ptps();
4853e12c5d1SDavid du Colombier 	ptfont();
4863e12c5d1SDavid du Colombier }
4873e12c5d1SDavid du Colombier 
pttrailer(void)4883e12c5d1SDavid du Colombier void pttrailer(void)
4893e12c5d1SDavid du Colombier {
4903e12c5d1SDavid du Colombier 	if (TROFF)
4913e12c5d1SDavid du Colombier 		OUT "x trailer\n" PUT;
4923e12c5d1SDavid du Colombier }
4933e12c5d1SDavid du Colombier 
ptstop(void)4943e12c5d1SDavid du Colombier void ptstop(void)
4953e12c5d1SDavid du Colombier {
4963e12c5d1SDavid du Colombier 	if (TROFF)
4973e12c5d1SDavid du Colombier 		OUT "x stop\n" PUT;
4983e12c5d1SDavid du Colombier }
4993e12c5d1SDavid du Colombier 
t_ptpause(void)5003e12c5d1SDavid du Colombier void t_ptpause(void)
5013e12c5d1SDavid du Colombier {
5023e12c5d1SDavid du Colombier 	if (ascii)
5033e12c5d1SDavid du Colombier 		return;
5043e12c5d1SDavid du Colombier 	ptlead();
5053e12c5d1SDavid du Colombier 	vpos = 0;
5063e12c5d1SDavid du Colombier 	pttrailer();
5073e12c5d1SDavid du Colombier 	ptlead();
5083e12c5d1SDavid du Colombier 	OUT "x pause\n" PUT;
5093e12c5d1SDavid du Colombier 	flusho();
5103e12c5d1SDavid du Colombier 	mpts = mfont = 0;
5113e12c5d1SDavid du Colombier 	ptesc();
5123e12c5d1SDavid du Colombier 	esc = po;
5133e12c5d1SDavid du Colombier 	hpos = vpos = 0;	/* probably in wrong place */
5143e12c5d1SDavid du Colombier }
515