xref: /titanic_51/usr/src/cmd/troff/troff.d/t10.c (revision e5190c108bde19ca4d7c03b1d1eab7b00bd3a1ed)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  * Copyright 1989 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
287c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate /*
317c478bd9Sstevel@tonic-gate  * University Copyright- Copyright (c) 1982, 1986, 1988
327c478bd9Sstevel@tonic-gate  * The Regents of the University of California
337c478bd9Sstevel@tonic-gate  * All Rights Reserved
347c478bd9Sstevel@tonic-gate  *
357c478bd9Sstevel@tonic-gate  * University Acknowledgment- Portions of this document are derived from
367c478bd9Sstevel@tonic-gate  * software developed by the University of California, Berkeley, and its
377c478bd9Sstevel@tonic-gate  * contributors.
387c478bd9Sstevel@tonic-gate  */
397c478bd9Sstevel@tonic-gate 
40*e5190c10Smuffin #pragma ident	"%Z%%M%	%I%	%E% SMI"
41*e5190c10Smuffin 
427c478bd9Sstevel@tonic-gate #include "tdef.h"
437c478bd9Sstevel@tonic-gate #include <ctype.h>
447c478bd9Sstevel@tonic-gate #include "ext.h"
457c478bd9Sstevel@tonic-gate /*
467c478bd9Sstevel@tonic-gate  * troff10.c
477c478bd9Sstevel@tonic-gate  *
487c478bd9Sstevel@tonic-gate  * typesetter interface
497c478bd9Sstevel@tonic-gate  */
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate int	vpos	 = 0;	/* absolute vertical position on page */
527c478bd9Sstevel@tonic-gate int	hpos	 = 0;	/* ditto horizontal */
537c478bd9Sstevel@tonic-gate 
547c478bd9Sstevel@tonic-gate short	*chtab;
557c478bd9Sstevel@tonic-gate char	*chname;
567c478bd9Sstevel@tonic-gate char	*fontab[NFONT+1];
577c478bd9Sstevel@tonic-gate char	*kerntab[NFONT+1];
587c478bd9Sstevel@tonic-gate char	*fitab[NFONT+1];
597c478bd9Sstevel@tonic-gate char	*codetab[NFONT+1];
607c478bd9Sstevel@tonic-gate 
617c478bd9Sstevel@tonic-gate int	Inch;
627c478bd9Sstevel@tonic-gate int	Hor;
637c478bd9Sstevel@tonic-gate int	Vert;
647c478bd9Sstevel@tonic-gate int	Unitwidth;
657c478bd9Sstevel@tonic-gate int	nfonts;
667c478bd9Sstevel@tonic-gate int	nsizes;
677c478bd9Sstevel@tonic-gate int	nchtab;
687c478bd9Sstevel@tonic-gate 
697c478bd9Sstevel@tonic-gate /* these characters are used as various signals or values
707c478bd9Sstevel@tonic-gate  * in miscellaneous places.
717c478bd9Sstevel@tonic-gate  * values are set in specnames in t10.c
727c478bd9Sstevel@tonic-gate  */
737c478bd9Sstevel@tonic-gate 
747c478bd9Sstevel@tonic-gate int	c_hyphen;
757c478bd9Sstevel@tonic-gate int	c_emdash;
767c478bd9Sstevel@tonic-gate int	c_rule;
777c478bd9Sstevel@tonic-gate int	c_minus;
787c478bd9Sstevel@tonic-gate int	c_fi;
797c478bd9Sstevel@tonic-gate int	c_fl;
807c478bd9Sstevel@tonic-gate int	c_ff;
817c478bd9Sstevel@tonic-gate int	c_ffi;
827c478bd9Sstevel@tonic-gate int	c_ffl;
837c478bd9Sstevel@tonic-gate int	c_acute;
847c478bd9Sstevel@tonic-gate int	c_grave;
857c478bd9Sstevel@tonic-gate int	c_under;
867c478bd9Sstevel@tonic-gate int	c_rooten;
877c478bd9Sstevel@tonic-gate int	c_boxrule;
887c478bd9Sstevel@tonic-gate int	c_lefthand;
897c478bd9Sstevel@tonic-gate int	c_dagger;
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate #include "dev.h"
927c478bd9Sstevel@tonic-gate struct dev dev;
937c478bd9Sstevel@tonic-gate struct Font *fontbase[NFONT+1];
947c478bd9Sstevel@tonic-gate 
957c478bd9Sstevel@tonic-gate tchar *ptout0();
967c478bd9Sstevel@tonic-gate 
977c478bd9Sstevel@tonic-gate 
98*e5190c10Smuffin int
997c478bd9Sstevel@tonic-gate ptinit()
1007c478bd9Sstevel@tonic-gate {
1017c478bd9Sstevel@tonic-gate 	int	i, fin, nw;
1027c478bd9Sstevel@tonic-gate 	char	*setbrk(), *filebase, *p;
1037c478bd9Sstevel@tonic-gate 
1047c478bd9Sstevel@tonic-gate 	/* open table for device,
1057c478bd9Sstevel@tonic-gate 	 * read in resolution, size info, font info, etc.
1067c478bd9Sstevel@tonic-gate 	 * and set params
1077c478bd9Sstevel@tonic-gate 	 */
1087c478bd9Sstevel@tonic-gate 	strcat(termtab, "/dev");
1097c478bd9Sstevel@tonic-gate 	strcat(termtab, devname);
1107c478bd9Sstevel@tonic-gate 	strcat(termtab, "/DESC.out");	/* makes "..../devXXX/DESC.out" */
1117c478bd9Sstevel@tonic-gate 	if ((fin = open(termtab, 0)) < 0) {
1127c478bd9Sstevel@tonic-gate 		errprint(gettext("can't open tables for %s"), termtab);
1137c478bd9Sstevel@tonic-gate 		done3(1);
1147c478bd9Sstevel@tonic-gate 	}
1157c478bd9Sstevel@tonic-gate 	read(fin, (char *) &dev, sizeof(struct dev ));
1167c478bd9Sstevel@tonic-gate 	Inch = dev.res;
1177c478bd9Sstevel@tonic-gate 	Hor = dev.hor;
1187c478bd9Sstevel@tonic-gate 	Vert = dev.vert;
1197c478bd9Sstevel@tonic-gate 	Unitwidth = dev.unitwidth;
1207c478bd9Sstevel@tonic-gate 	nfonts = dev.nfonts;
1217c478bd9Sstevel@tonic-gate 	nsizes = dev.nsizes;
1227c478bd9Sstevel@tonic-gate 	nchtab = dev.nchtab;
1237c478bd9Sstevel@tonic-gate 	if (nchtab >= NCHARS - 128) {
1247c478bd9Sstevel@tonic-gate 		errprint(gettext("too many special characters in file %s"),
1257c478bd9Sstevel@tonic-gate 			termtab);
1267c478bd9Sstevel@tonic-gate 		done3(1);
1277c478bd9Sstevel@tonic-gate 	}
1287c478bd9Sstevel@tonic-gate 	filebase = setbrk(dev.filesize + 2*EXTRAFONT);	/* enough room for whole file */
1297c478bd9Sstevel@tonic-gate 	read(fin, filebase, dev.filesize);	/* all at once */
1307c478bd9Sstevel@tonic-gate 	pstab = (short *) filebase;
1317c478bd9Sstevel@tonic-gate 	chtab = pstab + nsizes + 1;
1327c478bd9Sstevel@tonic-gate 	chname = (char *) (chtab + dev.nchtab);
1337c478bd9Sstevel@tonic-gate 	p = chname + dev.lchname;
1347c478bd9Sstevel@tonic-gate 	for (i = 1; i <= nfonts; i++) {
1357c478bd9Sstevel@tonic-gate 		fontbase[i] = (struct Font *) p;
1367c478bd9Sstevel@tonic-gate 		nw = *p & BYTEMASK;	/* 1st thing is width count */
1377c478bd9Sstevel@tonic-gate 		fontlab[i] = PAIR(fontbase[i]->namefont[0], fontbase[i]->namefont[1]);
1387c478bd9Sstevel@tonic-gate 		/* for now, still 2 char names */
1397c478bd9Sstevel@tonic-gate 		if (smnt == 0 && fontbase[i]->specfont == 1)
1407c478bd9Sstevel@tonic-gate 			smnt = i;	/* first special font */
1417c478bd9Sstevel@tonic-gate 		p += sizeof(struct Font);	/* that's what's on the beginning */
1427c478bd9Sstevel@tonic-gate 		fontab[i] = p;
1437c478bd9Sstevel@tonic-gate 		kerntab[i] = p + nw;
1447c478bd9Sstevel@tonic-gate 		codetab[i] = p + 2 * nw;
1457c478bd9Sstevel@tonic-gate 		fitab[i] = p + 3 * nw;	/* skip width, kern, code */
1467c478bd9Sstevel@tonic-gate 		p += 3 * nw + dev.nchtab + 128 - 32;
1477c478bd9Sstevel@tonic-gate 	}
1487c478bd9Sstevel@tonic-gate 	fontbase[0] = (struct Font *) p;	/* the last shall be first */
1497c478bd9Sstevel@tonic-gate 	fontbase[0]->nwfont = EXTRAFONT - dev.nchtab - (128-32) - sizeof (struct Font);
1507c478bd9Sstevel@tonic-gate 	fontab[0] = p + sizeof (struct Font);
1517c478bd9Sstevel@tonic-gate 	close(fin);
1527c478bd9Sstevel@tonic-gate 	/* there are a lot of things that used to be constant
1537c478bd9Sstevel@tonic-gate 	 * that now require code to be executed.
1547c478bd9Sstevel@tonic-gate 	 */
1557c478bd9Sstevel@tonic-gate 	sps = SPS;
1567c478bd9Sstevel@tonic-gate 	ics = ICS;
1577c478bd9Sstevel@tonic-gate 	for (i = 0; i < 16; i++)
1587c478bd9Sstevel@tonic-gate 		tabtab[i] = DTAB * (i + 1);
1597c478bd9Sstevel@tonic-gate 	pl = 11 * INCH;
1607c478bd9Sstevel@tonic-gate 	po = PO;
1617c478bd9Sstevel@tonic-gate 	spacesz = SS;
1627c478bd9Sstevel@tonic-gate 	lss = lss1 = VS;
1637c478bd9Sstevel@tonic-gate 	ll = ll1 = lt = lt1 = LL;
1647c478bd9Sstevel@tonic-gate 	specnames();	/* install names like "hyphen", etc. */
1657c478bd9Sstevel@tonic-gate 	if (ascii)
166*e5190c10Smuffin 		return (0);
1677c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x T %s\n", devname);
1687c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x res %d %d %d\n", Inch, Hor, Vert);
1697c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x init\n");	/* do initialization for particular device */
1707c478bd9Sstevel@tonic-gate   /*
1717c478bd9Sstevel@tonic-gate 	for (i = 1; i <= nfonts; i++)
1727c478bd9Sstevel@tonic-gate 		fdprintf(ptid, "x font %d %s\n", i, fontbase[i]->namefont);
1737c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x xxx fonts=%d sizes=%d unit=%d\n", nfonts, nsizes, Unitwidth);
1747c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x xxx nchtab=%d lchname=%d nfitab=%d\n",
1757c478bd9Sstevel@tonic-gate 		dev.nchtab, dev.lchname, dev.nchtab+128-32);
1767c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x xxx sizes:\nx xxx ");
1777c478bd9Sstevel@tonic-gate 	for (i = 0; i < nsizes; i++)
1787c478bd9Sstevel@tonic-gate 		fdprintf(ptid, " %d", pstab[i]);
1797c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "\nx xxx chars:\nx xxx ");
1807c478bd9Sstevel@tonic-gate 	for (i = 0; i < dev.nchtab; i++)
1817c478bd9Sstevel@tonic-gate 		fdprintf(ptid, " %s", &chname[chtab[i]]);
1827c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "\nx xxx\n");
1837c478bd9Sstevel@tonic-gate   */
184*e5190c10Smuffin 
185*e5190c10Smuffin 	return (0);
1867c478bd9Sstevel@tonic-gate }
1877c478bd9Sstevel@tonic-gate 
188*e5190c10Smuffin int
1897c478bd9Sstevel@tonic-gate specnames()
1907c478bd9Sstevel@tonic-gate {
1917c478bd9Sstevel@tonic-gate 	static struct {
1927c478bd9Sstevel@tonic-gate 		int	*n;
1937c478bd9Sstevel@tonic-gate 		char	*v;
1947c478bd9Sstevel@tonic-gate 	} spnames[] = {
1957c478bd9Sstevel@tonic-gate 		&c_hyphen, "hy",
1967c478bd9Sstevel@tonic-gate 		&c_emdash, "em",
1977c478bd9Sstevel@tonic-gate 		&c_rule, "ru",
1987c478bd9Sstevel@tonic-gate 		&c_minus, "\\-",
1997c478bd9Sstevel@tonic-gate 		&c_fi, "fi",
2007c478bd9Sstevel@tonic-gate 		&c_fl, "fl",
2017c478bd9Sstevel@tonic-gate 		&c_ff, "ff",
2027c478bd9Sstevel@tonic-gate 		&c_ffi, "Fi",
2037c478bd9Sstevel@tonic-gate 		&c_ffl, "Fl",
2047c478bd9Sstevel@tonic-gate 		&c_acute, "aa",
2057c478bd9Sstevel@tonic-gate 		&c_grave, "ga",
2067c478bd9Sstevel@tonic-gate 		&c_under, "ul",
2077c478bd9Sstevel@tonic-gate 		&c_rooten, "rn",
2087c478bd9Sstevel@tonic-gate 		&c_boxrule, "br",
2097c478bd9Sstevel@tonic-gate 		&c_lefthand, "lh",
2107c478bd9Sstevel@tonic-gate 		&c_dagger, "dg",
2117c478bd9Sstevel@tonic-gate 		0, 0
2127c478bd9Sstevel@tonic-gate 	};
2137c478bd9Sstevel@tonic-gate 	int	i;
2147c478bd9Sstevel@tonic-gate 
2157c478bd9Sstevel@tonic-gate 	for (i = 0; spnames[i].n; i++)
2167c478bd9Sstevel@tonic-gate 		*spnames[i].n = findch(spnames[i].v);
217*e5190c10Smuffin 
218*e5190c10Smuffin 	return (0);
2197c478bd9Sstevel@tonic-gate }
2207c478bd9Sstevel@tonic-gate 
221*e5190c10Smuffin int
2227c478bd9Sstevel@tonic-gate findch(s)	/* find char s in chname */
223*e5190c10Smuffin char	*s;
2247c478bd9Sstevel@tonic-gate {
225*e5190c10Smuffin 	int	i;
2267c478bd9Sstevel@tonic-gate 
2277c478bd9Sstevel@tonic-gate 	for (i = 0; i < nchtab; i++)
2287c478bd9Sstevel@tonic-gate 		if (strcmp(s, &chname[chtab[i]]) == 0)
2297c478bd9Sstevel@tonic-gate 			return(i + 128);
2307c478bd9Sstevel@tonic-gate 	return(0);
2317c478bd9Sstevel@tonic-gate }
2327c478bd9Sstevel@tonic-gate 
233*e5190c10Smuffin int
2347c478bd9Sstevel@tonic-gate ptout(i)
235*e5190c10Smuffin tchar	i;
2367c478bd9Sstevel@tonic-gate {
237*e5190c10Smuffin 	int	dv;
238*e5190c10Smuffin 	tchar	*k;
2397c478bd9Sstevel@tonic-gate 	int temp, a, b;
2407c478bd9Sstevel@tonic-gate 
2417c478bd9Sstevel@tonic-gate 	if (cbits(i) != '\n') {
2427c478bd9Sstevel@tonic-gate 		*olinep++ = i;
243*e5190c10Smuffin 		return (0);
2447c478bd9Sstevel@tonic-gate 	}
2457c478bd9Sstevel@tonic-gate 	if (olinep == oline) {
2467c478bd9Sstevel@tonic-gate 		lead += lss;
247*e5190c10Smuffin 		return (0);
2487c478bd9Sstevel@tonic-gate 	}
2497c478bd9Sstevel@tonic-gate 
2507c478bd9Sstevel@tonic-gate 	hpos = po;	/* ??? */
2517c478bd9Sstevel@tonic-gate 	esc = 0;	/* ??? */
2527c478bd9Sstevel@tonic-gate 	ptesc();	/* the problem is to get back to the left end of the line */
2537c478bd9Sstevel@tonic-gate 	dv = 0;
2547c478bd9Sstevel@tonic-gate 	for (k = oline; k < olinep; k++) {
2557c478bd9Sstevel@tonic-gate 		if (ismot(*k) && isvmot(*k)) {
2567c478bd9Sstevel@tonic-gate 			temp = absmot(*k);
2577c478bd9Sstevel@tonic-gate 			if (isnmot(*k))
2587c478bd9Sstevel@tonic-gate 				temp = -temp;
2597c478bd9Sstevel@tonic-gate 			dv += temp;
2607c478bd9Sstevel@tonic-gate 		}
2617c478bd9Sstevel@tonic-gate 	}
2627c478bd9Sstevel@tonic-gate 	if (dv) {
2637c478bd9Sstevel@tonic-gate 		vflag++;
2647c478bd9Sstevel@tonic-gate 		*olinep++ = makem(-dv);
2657c478bd9Sstevel@tonic-gate 		vflag = 0;
2667c478bd9Sstevel@tonic-gate 	}
2677c478bd9Sstevel@tonic-gate 
2687c478bd9Sstevel@tonic-gate 	b = dip->blss + lss;
2697c478bd9Sstevel@tonic-gate 	lead += dip->blss + lss;
2707c478bd9Sstevel@tonic-gate 	dip->blss = 0;
2717c478bd9Sstevel@tonic-gate 	for (k = oline; k < olinep; )
2727c478bd9Sstevel@tonic-gate 		k = ptout0(k);	/* now passing a pointer! */
2737c478bd9Sstevel@tonic-gate 	olinep = oline;
2747c478bd9Sstevel@tonic-gate 	lead += dip->alss;
2757c478bd9Sstevel@tonic-gate 	a = dip->alss;
2767c478bd9Sstevel@tonic-gate 	dip->alss = 0;
2777c478bd9Sstevel@tonic-gate 	/*
2787c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos);
2797c478bd9Sstevel@tonic-gate */
2807c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "n%d %d\n", b, a);	/* be nice to chuck */
281*e5190c10Smuffin 
282*e5190c10Smuffin 	return (0);
2837c478bd9Sstevel@tonic-gate }
2847c478bd9Sstevel@tonic-gate 
2857c478bd9Sstevel@tonic-gate tchar *
2867c478bd9Sstevel@tonic-gate ptout0(pi)
2877c478bd9Sstevel@tonic-gate tchar	*pi;
2887c478bd9Sstevel@tonic-gate {
289*e5190c10Smuffin 	short j, k, w;
2907c478bd9Sstevel@tonic-gate 	short	z, dx, dy, dx2, dy2, n;
291*e5190c10Smuffin 	tchar	i;
2927c478bd9Sstevel@tonic-gate 	int outsize;	/* size of object being printed */
2937c478bd9Sstevel@tonic-gate 
2947c478bd9Sstevel@tonic-gate 	outsize = 1;	/* default */
2957c478bd9Sstevel@tonic-gate 	i = *pi;
2967c478bd9Sstevel@tonic-gate 	k = cbits(i);
2977c478bd9Sstevel@tonic-gate 	if (ismot(i)) {
2987c478bd9Sstevel@tonic-gate 		j = absmot(i);
2997c478bd9Sstevel@tonic-gate 		if (isnmot(i))
3007c478bd9Sstevel@tonic-gate 			j = -j;
3017c478bd9Sstevel@tonic-gate 		if (isvmot(i))
3027c478bd9Sstevel@tonic-gate 			lead += j;
3037c478bd9Sstevel@tonic-gate 		else
3047c478bd9Sstevel@tonic-gate 			esc += j;
3057c478bd9Sstevel@tonic-gate 		return(pi+outsize);
3067c478bd9Sstevel@tonic-gate 	}
3077c478bd9Sstevel@tonic-gate 	if (k == XON) {
3087c478bd9Sstevel@tonic-gate 		if (xfont != mfont)
3097c478bd9Sstevel@tonic-gate 			ptfont();
3107c478bd9Sstevel@tonic-gate 		if (xpts != mpts)
3117c478bd9Sstevel@tonic-gate 			ptps();
3127c478bd9Sstevel@tonic-gate 		if (lead)
3137c478bd9Sstevel@tonic-gate 			ptlead();
3147c478bd9Sstevel@tonic-gate 		fdprintf(ptid, "x X ");
3157c478bd9Sstevel@tonic-gate 		/*
3167c478bd9Sstevel@tonic-gate 	     * not guaranteed of finding a XOFF if a word overflow
3177c478bd9Sstevel@tonic-gate 		 * error occured, so also bound this loop by olinep
3187c478bd9Sstevel@tonic-gate 		 */
3197c478bd9Sstevel@tonic-gate 		pi++;
3207c478bd9Sstevel@tonic-gate 		while( cbits(*pi) != XOFF && pi < olinep )
3217c478bd9Sstevel@tonic-gate 			outascii(*pi++);
3227c478bd9Sstevel@tonic-gate 		oput('\n');
3237c478bd9Sstevel@tonic-gate 		if ( cbits(*pi) == XOFF )
3247c478bd9Sstevel@tonic-gate 			pi++;
3257c478bd9Sstevel@tonic-gate 		return pi;
3267c478bd9Sstevel@tonic-gate 	}
3277c478bd9Sstevel@tonic-gate 			;
3287c478bd9Sstevel@tonic-gate 	if (k == CHARHT) {
3297c478bd9Sstevel@tonic-gate 		if (xpts != mpts)
3307c478bd9Sstevel@tonic-gate 			ptps();
3317c478bd9Sstevel@tonic-gate 		fdprintf(ptid, "x H %d\n", sbits(i));
3327c478bd9Sstevel@tonic-gate 		return(pi+outsize);
3337c478bd9Sstevel@tonic-gate 	}
3347c478bd9Sstevel@tonic-gate 	if (k == SLANT) {
3357c478bd9Sstevel@tonic-gate 		fdprintf(ptid, "x S %d\n", sfbits(i)-180);
3367c478bd9Sstevel@tonic-gate 		return(pi+outsize);
3377c478bd9Sstevel@tonic-gate 	}
3387c478bd9Sstevel@tonic-gate 	if (k == WORDSP) {
3397c478bd9Sstevel@tonic-gate 		oput('w');
3407c478bd9Sstevel@tonic-gate 		return(pi+outsize);
3417c478bd9Sstevel@tonic-gate 	}
3427c478bd9Sstevel@tonic-gate 	if (k == FONTPOS) {
3437c478bd9Sstevel@tonic-gate 		char temp[3];
3447c478bd9Sstevel@tonic-gate 		n = i >> 16;
3457c478bd9Sstevel@tonic-gate 		temp[0] = n & BYTEMASK;
3467c478bd9Sstevel@tonic-gate 		temp[1] = n >> BYTE;
3477c478bd9Sstevel@tonic-gate 		temp[2] = 0;
3487c478bd9Sstevel@tonic-gate 		ptfpcmd(0, temp);
3497c478bd9Sstevel@tonic-gate 		return(pi+outsize);
3507c478bd9Sstevel@tonic-gate 	}
3517c478bd9Sstevel@tonic-gate 	if (sfbits(i) == oldbits) {
3527c478bd9Sstevel@tonic-gate 		xfont = pfont;
3537c478bd9Sstevel@tonic-gate 		xpts = ppts;
3547c478bd9Sstevel@tonic-gate 	} else
3557c478bd9Sstevel@tonic-gate 		xbits(i, 2);
3567c478bd9Sstevel@tonic-gate 	if (k < 040 && k != DRAWFCN)
3577c478bd9Sstevel@tonic-gate 		return(pi+outsize);
3587c478bd9Sstevel@tonic-gate 	if (k >= 32) {
3597c478bd9Sstevel@tonic-gate 		if (widcache[k-32].fontpts == (xfont<<8) + xpts  && !setwdf) {
3607c478bd9Sstevel@tonic-gate 			w = widcache[k-32].width;
3617c478bd9Sstevel@tonic-gate 			bd = 0;
3627c478bd9Sstevel@tonic-gate 			cs = 0;
3637c478bd9Sstevel@tonic-gate 		} else
3647c478bd9Sstevel@tonic-gate 			w = getcw(k-32);
3657c478bd9Sstevel@tonic-gate 	}
3667c478bd9Sstevel@tonic-gate 	j = z = 0;
3677c478bd9Sstevel@tonic-gate 	if (k != DRAWFCN) {
3687c478bd9Sstevel@tonic-gate 		if (cs) {
3697c478bd9Sstevel@tonic-gate 			if (bd)
3707c478bd9Sstevel@tonic-gate 				w += (bd - 1) * HOR;
3717c478bd9Sstevel@tonic-gate 			j = (cs - w) / 2;
3727c478bd9Sstevel@tonic-gate 			w = cs - j;
3737c478bd9Sstevel@tonic-gate 			if (bd)
3747c478bd9Sstevel@tonic-gate 				w -= (bd - 1) * HOR;
3757c478bd9Sstevel@tonic-gate 		}
3767c478bd9Sstevel@tonic-gate 		if (iszbit(i)) {
3777c478bd9Sstevel@tonic-gate 			if (cs)
3787c478bd9Sstevel@tonic-gate 				w = -j;
3797c478bd9Sstevel@tonic-gate 			else
3807c478bd9Sstevel@tonic-gate 				w = 0;
3817c478bd9Sstevel@tonic-gate 			z = 1;
3827c478bd9Sstevel@tonic-gate 		}
3837c478bd9Sstevel@tonic-gate 	}
3847c478bd9Sstevel@tonic-gate 	esc += j;
3857c478bd9Sstevel@tonic-gate 	if (xfont != mfont)
3867c478bd9Sstevel@tonic-gate 		ptfont();
3877c478bd9Sstevel@tonic-gate 	if (xpts != mpts)
3887c478bd9Sstevel@tonic-gate 		ptps();
3897c478bd9Sstevel@tonic-gate 	if (lead)
3907c478bd9Sstevel@tonic-gate 		ptlead();
3917c478bd9Sstevel@tonic-gate 	/* put out the real character here */
3927c478bd9Sstevel@tonic-gate 	if (k == DRAWFCN) {
3937c478bd9Sstevel@tonic-gate 		if (esc)
3947c478bd9Sstevel@tonic-gate 			ptesc();
3957c478bd9Sstevel@tonic-gate 		dx = absmot(pi[3]);
3967c478bd9Sstevel@tonic-gate 		if (isnmot(pi[3]))
3977c478bd9Sstevel@tonic-gate 			dx = -dx;
3987c478bd9Sstevel@tonic-gate 		dy = absmot(pi[4]);
3997c478bd9Sstevel@tonic-gate 		if (isnmot(pi[4]))
4007c478bd9Sstevel@tonic-gate 			dy = -dy;
4017c478bd9Sstevel@tonic-gate 		switch (cbits(pi[1])) {
4027c478bd9Sstevel@tonic-gate 		case DRAWCIRCLE:	/* circle */
4037c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "D%c %d\n", DRAWCIRCLE, dx);	/* dx is diameter */
4047c478bd9Sstevel@tonic-gate 			w = 0;
4057c478bd9Sstevel@tonic-gate 			hpos += dx;
4067c478bd9Sstevel@tonic-gate 			break;
4077c478bd9Sstevel@tonic-gate 		case DRAWELLIPSE:
4087c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "D%c %d %d\n", DRAWELLIPSE, dx, dy);
4097c478bd9Sstevel@tonic-gate 			w = 0;
4107c478bd9Sstevel@tonic-gate 			hpos += dx;
4117c478bd9Sstevel@tonic-gate 			break;
4127c478bd9Sstevel@tonic-gate 		case DRAWLINE:	/* line */
4137c478bd9Sstevel@tonic-gate 			k = cbits(pi[2]);
4147c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "D%c %d %d ", DRAWLINE, dx, dy);
4157c478bd9Sstevel@tonic-gate 			if (k < 128)
4167c478bd9Sstevel@tonic-gate 				fdprintf(ptid, "%c\n", k);
4177c478bd9Sstevel@tonic-gate 			else
4187c478bd9Sstevel@tonic-gate 				fdprintf(ptid, "%s\n", &chname[chtab[k - 128]]);
4197c478bd9Sstevel@tonic-gate 			w = 0;
4207c478bd9Sstevel@tonic-gate 			hpos += dx;
4217c478bd9Sstevel@tonic-gate 			vpos += dy;
4227c478bd9Sstevel@tonic-gate 			break;
4237c478bd9Sstevel@tonic-gate 		case DRAWARC:	/* arc */
4247c478bd9Sstevel@tonic-gate 			dx2 = absmot(pi[5]);
4257c478bd9Sstevel@tonic-gate 			if (isnmot(pi[5]))
4267c478bd9Sstevel@tonic-gate 				dx2 = -dx2;
4277c478bd9Sstevel@tonic-gate 			dy2 = absmot(pi[6]);
4287c478bd9Sstevel@tonic-gate 			if (isnmot(pi[6]))
4297c478bd9Sstevel@tonic-gate 				dy2 = -dy2;
4307c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "D%c %d %d %d %d\n", DRAWARC,
4317c478bd9Sstevel@tonic-gate 				dx, dy, dx2, dy2);
4327c478bd9Sstevel@tonic-gate 			w = 0;
4337c478bd9Sstevel@tonic-gate 			hpos += dx + dx2;
4347c478bd9Sstevel@tonic-gate 			vpos += dy + dy2;
4357c478bd9Sstevel@tonic-gate 			break;
4367c478bd9Sstevel@tonic-gate 		case DRAWSPLINE:	/* spline */
4377c478bd9Sstevel@tonic-gate 		default:	/* something else; copy it like spline */
4387c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "D%c %d %d", cbits(pi[1]), dx, dy);
4397c478bd9Sstevel@tonic-gate 			w = 0;
4407c478bd9Sstevel@tonic-gate 			hpos += dx;
4417c478bd9Sstevel@tonic-gate 			vpos += dy;
4427c478bd9Sstevel@tonic-gate 			if (cbits(pi[3]) == DRAWFCN || cbits(pi[4]) == DRAWFCN) {
4437c478bd9Sstevel@tonic-gate 				/* it was somehow defective */
4447c478bd9Sstevel@tonic-gate 				fdprintf(ptid, "\n");
4457c478bd9Sstevel@tonic-gate 				break;
4467c478bd9Sstevel@tonic-gate 			}
4477c478bd9Sstevel@tonic-gate 			for (n = 5; cbits(pi[n]) != DRAWFCN; n += 2) {
4487c478bd9Sstevel@tonic-gate 				dx = absmot(pi[n]);
4497c478bd9Sstevel@tonic-gate 				if (isnmot(pi[n]))
4507c478bd9Sstevel@tonic-gate 					dx = -dx;
4517c478bd9Sstevel@tonic-gate 				dy = absmot(pi[n+1]);
4527c478bd9Sstevel@tonic-gate 				if (isnmot(pi[n+1]))
4537c478bd9Sstevel@tonic-gate 					dy = -dy;
4547c478bd9Sstevel@tonic-gate 				fdprintf(ptid, " %d %d", dx, dy);
4557c478bd9Sstevel@tonic-gate 				hpos += dx;
4567c478bd9Sstevel@tonic-gate 				vpos += dy;
4577c478bd9Sstevel@tonic-gate 			}
4587c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "\n");
4597c478bd9Sstevel@tonic-gate 			break;
4607c478bd9Sstevel@tonic-gate 		}
4617c478bd9Sstevel@tonic-gate 		for (n = 3; cbits(pi[n]) != DRAWFCN; n++)
4627c478bd9Sstevel@tonic-gate 			;
4637c478bd9Sstevel@tonic-gate 		outsize = n + 1;
4647c478bd9Sstevel@tonic-gate 	} else if (k < 128) {
4657c478bd9Sstevel@tonic-gate 		/* try to go faster and compress output */
4667c478bd9Sstevel@tonic-gate 		/* by printing nnc for small positive motion followed by c */
4677c478bd9Sstevel@tonic-gate 		/* kludgery; have to make sure set all the vars too */
4687c478bd9Sstevel@tonic-gate 		if (esc > 0 && esc < 100) {
4697c478bd9Sstevel@tonic-gate 			oput(esc / 10 + '0');
4707c478bd9Sstevel@tonic-gate 			oput(esc % 10 + '0');
4717c478bd9Sstevel@tonic-gate 			oput(k);
4727c478bd9Sstevel@tonic-gate 			hpos += esc;
4737c478bd9Sstevel@tonic-gate 			esc = 0;
4747c478bd9Sstevel@tonic-gate 		} else {
4757c478bd9Sstevel@tonic-gate 			if (esc)
4767c478bd9Sstevel@tonic-gate 				ptesc();
4777c478bd9Sstevel@tonic-gate 			oput('c');
4787c478bd9Sstevel@tonic-gate 			oput(k);
4797c478bd9Sstevel@tonic-gate 			oput('\n');
4807c478bd9Sstevel@tonic-gate 		}
4817c478bd9Sstevel@tonic-gate 	} else {
4827c478bd9Sstevel@tonic-gate 		if (esc)
4837c478bd9Sstevel@tonic-gate 			ptesc();
4847c478bd9Sstevel@tonic-gate 		if (k >= nchtab + 128)
4857c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "N%d\n", k - (nchtab+128));
4867c478bd9Sstevel@tonic-gate 		else
4877c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "C%s\n", &chname[chtab[k - 128]]);
4887c478bd9Sstevel@tonic-gate 	}
4897c478bd9Sstevel@tonic-gate 	if (bd) {
4907c478bd9Sstevel@tonic-gate 		bd -= HOR;
4917c478bd9Sstevel@tonic-gate 		if (esc += bd)
4927c478bd9Sstevel@tonic-gate 			ptesc();
4937c478bd9Sstevel@tonic-gate 		if (k < 128) {
4947c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "c%c\n", k);
4957c478bd9Sstevel@tonic-gate 		} else if (k >= nchtab + 128) {
4967c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "N%d\n", k - (nchtab+128));
4977c478bd9Sstevel@tonic-gate 		} else
4987c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "C%s\n", &chname[chtab[k - 128]]);
4997c478bd9Sstevel@tonic-gate 		if (z)
5007c478bd9Sstevel@tonic-gate 			esc -= bd;
5017c478bd9Sstevel@tonic-gate 	}
5027c478bd9Sstevel@tonic-gate 	esc += w;
5037c478bd9Sstevel@tonic-gate 	return(pi+outsize);
5047c478bd9Sstevel@tonic-gate }
5057c478bd9Sstevel@tonic-gate 
506*e5190c10Smuffin int
5077c478bd9Sstevel@tonic-gate ptps()
5087c478bd9Sstevel@tonic-gate {
509*e5190c10Smuffin 	int	i, j, k;
5107c478bd9Sstevel@tonic-gate 
5117c478bd9Sstevel@tonic-gate 	i = xpts;
5127c478bd9Sstevel@tonic-gate 	for (j = 0; i > (k = pstab[j]); j++)
5137c478bd9Sstevel@tonic-gate 		if (!k) {
5147c478bd9Sstevel@tonic-gate 			k = pstab[--j];
5157c478bd9Sstevel@tonic-gate 			break;
5167c478bd9Sstevel@tonic-gate 		}
5177c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "s%d\n", k);	/* really should put out string rep of size */
5187c478bd9Sstevel@tonic-gate 	mpts = i;
519*e5190c10Smuffin 
520*e5190c10Smuffin 	return (0);
5217c478bd9Sstevel@tonic-gate }
5227c478bd9Sstevel@tonic-gate 
523*e5190c10Smuffin int
5247c478bd9Sstevel@tonic-gate ptfont()
5257c478bd9Sstevel@tonic-gate {
5267c478bd9Sstevel@tonic-gate 	mfont = xfont;
5277c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "f%d\n", xfont);
528*e5190c10Smuffin 
529*e5190c10Smuffin 	return (0);
5307c478bd9Sstevel@tonic-gate }
5317c478bd9Sstevel@tonic-gate 
532*e5190c10Smuffin int
5337c478bd9Sstevel@tonic-gate ptfpcmd(f, s)
5347c478bd9Sstevel@tonic-gate int	f;
5357c478bd9Sstevel@tonic-gate char	*s;
5367c478bd9Sstevel@tonic-gate {
5377c478bd9Sstevel@tonic-gate 	if (ascii)
538*e5190c10Smuffin 		return (0);
5397c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x font %d %s\n", f, s);
5407c478bd9Sstevel@tonic-gate 	ptfont();	/* make sure that it gets noticed */
541*e5190c10Smuffin 
542*e5190c10Smuffin 	return (0);
5437c478bd9Sstevel@tonic-gate }
5447c478bd9Sstevel@tonic-gate 
545*e5190c10Smuffin int
5467c478bd9Sstevel@tonic-gate ptlead()
5477c478bd9Sstevel@tonic-gate {
5487c478bd9Sstevel@tonic-gate 	vpos += lead;
5497c478bd9Sstevel@tonic-gate 	if (!ascii)
5507c478bd9Sstevel@tonic-gate 		fdprintf(ptid, "V%d\n", vpos);
5517c478bd9Sstevel@tonic-gate 	lead = 0;
552*e5190c10Smuffin 
553*e5190c10Smuffin 	return (0);
5547c478bd9Sstevel@tonic-gate }
5557c478bd9Sstevel@tonic-gate 
556*e5190c10Smuffin 
557*e5190c10Smuffin int
5587c478bd9Sstevel@tonic-gate ptesc()
5597c478bd9Sstevel@tonic-gate {
5607c478bd9Sstevel@tonic-gate 	hpos += esc;
5617c478bd9Sstevel@tonic-gate 	if (esc > 0) {
5627c478bd9Sstevel@tonic-gate 		oput('h');
5637c478bd9Sstevel@tonic-gate 		if (esc>=10 && esc<100) {
5647c478bd9Sstevel@tonic-gate 			oput(esc/10 + '0');
5657c478bd9Sstevel@tonic-gate 			oput(esc%10 + '0');
5667c478bd9Sstevel@tonic-gate 		} else
5677c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "%d", esc);
5687c478bd9Sstevel@tonic-gate 	} else
5697c478bd9Sstevel@tonic-gate 		fdprintf(ptid, "H%d\n", hpos);
5707c478bd9Sstevel@tonic-gate 	esc = 0;
571*e5190c10Smuffin 
572*e5190c10Smuffin 	return (0);
5737c478bd9Sstevel@tonic-gate }
5747c478bd9Sstevel@tonic-gate 
575*e5190c10Smuffin 
576*e5190c10Smuffin int
5777c478bd9Sstevel@tonic-gate newpage(n)	/* called at end of each output page (we hope) */
5787c478bd9Sstevel@tonic-gate {
5797c478bd9Sstevel@tonic-gate 	int i;
5807c478bd9Sstevel@tonic-gate 
5817c478bd9Sstevel@tonic-gate 	ptlead();
5827c478bd9Sstevel@tonic-gate 	vpos = 0;
5837c478bd9Sstevel@tonic-gate 	if (ascii)
584*e5190c10Smuffin 		return (0);
5857c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "p%d\n", n);	/* new page */
5867c478bd9Sstevel@tonic-gate 	for (i = 0; i <= nfonts; i++)
5877c478bd9Sstevel@tonic-gate 		if (fontbase[i]->namefont && fontbase[i]->namefont[0])
5887c478bd9Sstevel@tonic-gate 			fdprintf(ptid, "x font %d %s\n", i, fontbase[i]->namefont);
5897c478bd9Sstevel@tonic-gate 	ptps();
5907c478bd9Sstevel@tonic-gate 	ptfont();
591*e5190c10Smuffin 
592*e5190c10Smuffin 	return (0);
5937c478bd9Sstevel@tonic-gate }
5947c478bd9Sstevel@tonic-gate 
595*e5190c10Smuffin int
5967c478bd9Sstevel@tonic-gate pttrailer()
5977c478bd9Sstevel@tonic-gate {
5987c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x trailer\n");
599*e5190c10Smuffin 
600*e5190c10Smuffin 	return (0);
6017c478bd9Sstevel@tonic-gate }
6027c478bd9Sstevel@tonic-gate 
603*e5190c10Smuffin int
6047c478bd9Sstevel@tonic-gate ptstop()
6057c478bd9Sstevel@tonic-gate {
6067c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x stop\n");
607*e5190c10Smuffin 
608*e5190c10Smuffin 	return (0);
6097c478bd9Sstevel@tonic-gate }
6107c478bd9Sstevel@tonic-gate 
611*e5190c10Smuffin int
6127c478bd9Sstevel@tonic-gate dostop()
6137c478bd9Sstevel@tonic-gate {
6147c478bd9Sstevel@tonic-gate 	if (ascii)
615*e5190c10Smuffin 		return (0);
6167c478bd9Sstevel@tonic-gate 	ptlead();
6177c478bd9Sstevel@tonic-gate 	vpos = 0;
6187c478bd9Sstevel@tonic-gate 	/* fdprintf(ptid, "x xxx end of page\n");*/
6197c478bd9Sstevel@tonic-gate 	if (!nofeed)
6207c478bd9Sstevel@tonic-gate 		pttrailer();
6217c478bd9Sstevel@tonic-gate 	ptlead();
6227c478bd9Sstevel@tonic-gate 	fdprintf(ptid, "x pause\n");
6237c478bd9Sstevel@tonic-gate 	flusho();
6247c478bd9Sstevel@tonic-gate 	mpts = mfont = 0;
6257c478bd9Sstevel@tonic-gate 	ptesc();
6267c478bd9Sstevel@tonic-gate 	esc = po;
6277c478bd9Sstevel@tonic-gate 	hpos = vpos = 0;	/* probably in wrong place */
628*e5190c10Smuffin 
629*e5190c10Smuffin 	return (0);
6307c478bd9Sstevel@tonic-gate }
631