[comp.sources.unix] v20i037: Troff upgrade for PostScript, DiTroff compatibility, Part05/06

rsalz@uunet.uu.net (Rich Salz) (10/18/89)

Submitted-by: Chris Lewis <eci386!clewis@uunet.uu.net>
Posting-number: Volume 20, Issue 37
Archive-name: psroff/part05

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 5 (of 6)."
# Contents:  dt.c ps.c
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'dt.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dt.c'\"
else
echo shar: Extracting \"'dt.c'\" \(16363 characters\)
sed "s/^X//" >'dt.c' <<'END_OF_FILE'
X/*	Copyright 1985, 1986, 1987, 1988 Chris Lewis
X		All Rights Reserved
X
X    Permission to copy and further distribute is freely given provided 
X    this copyright notice remains intact and that this software is not 
X    sold for profit.
X
X	Project:	Generic Troff drivers
X	Module:		dt.c
X	Author: 	Chris Lewis
X	Specs:		Ditroff driver
X */
X
X#include "defs.h"
X
X#ifdef	DT
X#include "dt.h"
X
Xint currentPage = 0;
X
X#ifndef	SVR3
X#ifndef	lint
Xstatic char SCCSid[] = "@(#)dt.c: 1.5 Copyright 89/07/04 16:59:46 Chris Lewis";
X#endif
X#else
X#ident  "@(#)dt.c: 1.5 Copyright 89/07/04 16:59:46 Chris Lewis" /*(SVR3)*/
X#endif
X
X#define	MAXFONT	50
X
X#define	USED	01
X
Xstruct dtFts {
X    char *troffName;
X    char *ascName;
X    int	 flags;
X} dtFts[MAXFONT+1];
X
Xstruct dtFts *t2dtf[8];
X
Xstruct troff2befont dtStdFont[108] = {
X
X/*          +-------------------------------- Troff character number
X	    |
X            |    +--------------------------- U: standard fonts
X            |    |                            S: symbol font
X            |    |                            D: draw macro
X            |    |                            n: new font
X            |    |
X            |    |  +------------------------ X-shift (scaled by point)
X            |    |  |                         Note: positive is right.
X            |    |  |
X            |    |  |  +--------------------- Y-shift (scaled by point)
X            |    |  |  |                      Note: positive is up.
X            |    |  |  |
X            |    |  |  |  +------------------ Point scale factor
X            |    |  |  |  |
X            |    |  |  |  |   +-------------- Sequence
X            |    |  |  |  |   |
X            |    |  |  |  |   |               Printable sequence title
X            |    |  |  |  |   |                 |
X            |    |  |  |  |   |                 |
X            v    v  v  v  v   v                 v                    */
X	/*  1*/	{U, 0, 0, 1, "h",		"h"},
X	/*  2*/	{U, 0, 0, 1, "t",		"t"},
X	/*  3*/	{U, 0, 0, 1, "n",		"n"},
X	/*  4*/	{U, 0, 0, 1, "m",		"m"},
X	/*  5*/	{U, 0, 0, 1, "l",		"l"},
X	/*  6*/	{U, 0, 0, 1, "i",		"i"},
X	/*  7*/	{U, 0, 0, 1, "z",		"z"},
X	/*  8*/	{U, 0, 0, 1, "s",		"s"},
X	/*  9*/	{U, 0, 0, 1, "d",		"d"},
X	/* 10*/	{U, 0, 0, 1, "b",		"b"},
X	/* 11*/	{U, 0, 0, 1, "x",		"x"},
X	/* 12*/	{U, 0, 0, 1, "f",		"f"},
X	/* 13*/	{U, 0, 0, 1, "j",		"j"},
X	/* 14*/	{U, 0, 0, 1, "u",		"u"},
X	/* 15*/	{U, 0, 0, 1, "k",		"k"},
X	/* 16*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 17*/	{U, 0, 0, 1, "p",		"p"},
X	/* 18*/	{U, 0, 0, 1, "em",		"3/4 em"},
X	/* 19*/	{U, 0, 0, 1, ";",		";"},
X	/* 20*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 21*/	{U, 0, 0, 1, "a",		"a"},
X	/* 22*/	{U, 0, 0, 1, "ru",		"horizontal rule"},
X	/* 23*/	{U, 0, 0, 1, "c",		"c"},
X	/* 24*/	{U, 0, 0, 1, "`",		"` open"},
X	/* 25*/	{U, 0, 0, 1, "e",		"e"},
X	/* 26*/	{U, 0, 0, 1, "'",		"' close"},
X	/* 27*/	{U, 0, 0, 1, "o",		"o"},
X	/* 28*/	{U, 0, 0, 1, "14",		"1/4"},
X	/* 29*/	{U, 0, 0, 1, "r",		"r"},
X	/* 30*/	{U, 0, 0, 1, "12",		"1/2"},
X	/* 31*/	{U, 0, 0, 1, "v",		"v"},
X	/* 32*/	{U, 0, 0, 1, "hy",		"- hyphen"},
X	/* 33*/	{U, 0, 0, 1, "w",		"w"},
X	/* 34*/	{U, 0, 0, 1, "q",		"q"},
X	/* 35*/	{U, 0, 0, 1, "/",		"/"},
X	/* 36*/	{U, 0, 0, 1, ".",		"."},
X	/* 37*/	{U, 0, 0, 1, "g",		"g"},
X	/* 38*/	{U, 0, 0, 1, "34",		"3/4"},
X	/* 39*/	{U, 0, 0, 1, ",",		","},
X	/* 40*/	{U, 0, 0, 1, "&",		"&"},
X	/* 41*/	{U, 0, 0, 1, "y",		"y"},
X	/* 42*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 43*/	{U, 0, 0, 1, "%",		"%"},
X	/* 44*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 45*/	{U, 0, 0, 1, "Q",		"Q"},
X	/* 46*/	{U, 0, 0, 1, "T",		"T"},
X	/* 47*/	{U, 0, 0, 1, "O",		"O"},
X	/* 48*/	{U, 0, 0, 1, "H",		"H"},
X	/* 49*/	{U, 0, 0, 1, "N",		"N"},
X	/* 50*/	{U, 0, 0, 1, "M",		"M"},
X	/* 51*/	{U, 0, 0, 1, "L",		"L"},
X	/* 52*/	{U, 0, 0, 1, "R",		"R"},
X	/* 53*/	{U, 0, 0, 1, "G",		"G"},
X	/* 54*/	{U, 0, 0, 1, "I",		"I"},
X	/* 55*/	{U, 0, 0, 1, "P",		"P"},
X	/* 56*/	{U, 0, 0, 1, "C",		"C"},
X	/* 57*/	{U, 0, 0, 1, "V",		"V"},
X	/* 58*/	{U, 0, 0, 1, "E",		"E"},
X	/* 59*/	{U, 0, 0, 1, "Z",		"Z"},
X	/* 60*/	{U, 0, 0, 1, "D",		"D"},
X	/* 61*/	{U, 0, 0, 1, "B",		"B"},
X	/* 62*/	{U, 0, 0, 1, "S",		"S"},
X	/* 63*/	{U, 0, 0, 1, "Y",		"Y"},
X	/*from here on are actually code 1-45, upper half of font */
X	/* 64*/	{U, 0, 0, 1, "F",		"F"},
X	/* 65*/	{U, 0, 0, 1, "X",		"X"},
X	/* 66*/	{U, 0, 0, 1, "A",		"A"},
X	/* 67*/	{U, 0, 0, 1, "W",		"W"},
X	/* 68*/	{U, 0, 0, 1, "J",		"J"},
X	/* 69*/	{U, 0, 0, 1, "U",		"U"},
X	/* 70*/	{U, 0, 0, 1, "K",		"K"},
X	/* 71*/	{U, 0, 0, 1, "0",		"0"},
X	/* 72*/	{U, 0, 0, 1, "1",		"1"},
X	/* 73*/	{U, 0, 0, 1, "2",		"2"},
X	/* 74*/	{U, 0, 0, 1, "3",		"3"},
X	/* 75*/	{U, 0, 0, 1, "4",		"4"},
X	/* 76*/	{U, 0, 0, 1, "5",		"5"},
X	/* 77*/	{U, 0, 0, 1, "6",		"6"},
X	/* 78*/	{U, 0, 0, 1, "7",		"7"},
X	/* 79*/	{U, 0, 0, 1, "8",		"8"},
X	/* 80*/	{U, 0, 0, 1, "9",		"9"},
X	/* 81*/	{U, 0, 0, 1, "*",		"*"},
X	/* 82*/	{U, 0, 0, 1, "-",		"minus"},
X	/* 83*/	{U, 0, 0, 1, "fi",		"fi"},
X	/* 84*/	{U, 0, 0, 1, "fl",		"fl"},
X	/* 85*/	{U, 0, 0, 1, "ff",		"ff"},
X	/* 86*/	{U, 0, 0, 1, "ct",		"cent sign"},
X	/* 87*/	{U, 0, 0, 1, "Fl",		"ffl"},
X	/* 88*/	{U, 0, 0, 1, "Fi",		"ffi"},
X	/* 89*/	{U, 0, 0, 1, "(",		"("},
X	/* 90*/	{U, 0, 0, 1, ")",		")"},
X	/* 91*/	{U, 0, 0, 1, "[",		"["},
X	/* 92*/	{U, 0, 0, 1, "]",		"]"},
X	/* 93*/	{U, 0, 0, 1, "de",		"degree"},
X	/* 94*/	{U, 0, 0, 1, "dg",		"dagger"},
X	/* 95*/	{U, 0, 0, 1, "=",		"="},
X	/* 96*/	{U, 0, 0, 1, "rg",		"registered"},
X	/* 97*/	{U, 0, 0, 1, ":",		":"},
X	/* 98*/	{U, 0, 0, 1, "+",		"+"},
X	/* 99*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/*100*/	{U, 0, 0, 1, "!",		"!"},
X	/*101*/	{U, 0, 0, 1, "bu",		"bullet"},
X	/*102*/	{U, 0, 0, 1, "?",		"?"},
X	/*103*/	{U, 0, 0, 1, "fm",		"foot mark (minute)"},
X	/*104*/	{U, 0, 0, 1, "|",		"|"},
X	/*105*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/*106*/	{U, 0, 0, 1, "co",		"copyright"},
X	/*107*/	{U, 0, 0, 1, "sq",		"square"},
X	/*108*/	{U, 0, 0, 1, "$",		"$"}
X};
X
Xstruct troff2befont dtSymFont[] = {
X/*          +-------------------------------- Troff character number
X	    |
X            |    +--------------------------- U: standard fonts
X            |    |                            S: symbol font
X            |    |                            D: draw macro
X            |    |
X            |    |  +------------------------ X-shift (scaled by point)
X            |    |  |                         Note: positive is right.
X            |    |  |
X            |    |  |  +--------------------- Y-shift (scaled by point)
X            |    |  |  |                      Note: positive is up.
X            |    |  |  |
X            |    |  |  |  +------------------ Point scale factor
X            |    |  |  |  |
X            |    |  |  |  |   +-------------- Sequence
X            |    |  |  |  |   |
X            |    |  |  |  |   |               Printable sequence title
X            |    |  |  |  |   |                 |
X            |    |  |  |  |   |                 |
X            v    v  v  v  v   v                 v                    */
X	/*  1*/	{S, 0, 0, 1, "*q",		"psi"},
X	/*  2*/	{S, 0, 0, 1, "*h",		"theta"},
X	/*  3*/	{S, 0, 0, 1, "*n",		"nu"},
X	/*  4*/	{S, 0, 0, 1, "*m",		"mu"},
X	/*  5*/	{S, 0, 0, 1, "*l",		"lambda"},
X	/*  6*/	{S, 0, 0, 1, "*i",		"iota"},
X	/*  7*/	{S, 0, 0, 1, "*z",		"zeta"},
X	/*  8*/	{S, 0, 0, 1, "*s",		"sigma"},
X	/*  9*/	{S, 0, 0, 1, "*d",		"delta"},
X	/* 10*/	{S, 0, 0, 1, "*b",		"beta"},
X	/* 11*/	{S, 0, 0, 1, "*c",		"xi"},
X	/* 12*/	{S, 0, 0, 1, "*y",		"eta"},
X	/* 13*/	{S, 0, 0, 1, "*f",		"phi"},
X	/* 14*/	{S, 0, 0, 1, "*u",		"upsilon"},
X	/* 15*/	{S, 0, 0, 1, "*k",		"kappa"},
X	/* 16*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 17*/	{S, 0, 0, 1, "*p",		"pi"},
X	/* 18*/	{S, 0, 0, 1, "@",		"@"},
X	/* 19*/	{S, 0, 0, 1, "da",		"down arrow"},
X	/* 20*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 21*/	{S, 0, 0, 1, "*a",		"alpha"},
X	/* 22*/	{S, 0, 0, 1, "or",		"or (was star)"},
X	/* 23*/	{S, 0, 0, 1, "*x",		"chi"},
X	/* 24*/	{U, 0, 0, 1, "\"",		"double quote"},
X	/* 25*/	{S, 0, 0, 1, "*e",		"epsilon"},
X	/* 26*/	{S, 0, 0, 1, "eq",		"equation equal"},
X	/* 27*/	{S, 0, 0, 1, "*o",		"omicron"},
X	/* 28*/	{S, 0, 0, 1, "<-",		"left arrow"},
X	/* 29*/	{S, 0, 0, 1, "*r",		"rho"},
X	/* 30*/	{S, 0, 0, 1, "ua",		"up arrow"},
X	/* 31*/	{S, 0, 0, 1, "*t",		"tau"},
X	/* 32*/	{S, 0, 0, 1, "ul",		"underline"},
X	/* 33*/	{U, 0, 0, 1, "\\",		"back slash"},
X	/* 34*/	{S, 0, 0, 1, "*Q",		"Psi"},
X	/* 35*/	{S, 0, 0, 1, "?",		"bell system sign"},
X	/* 36*/	{S, 0, 0, 1, "if",		"infinity"},
X	/* 37*/	{S, 0, 0, 1, "*g",		"gamma"},
X	/* 38*/	{S, 0, 0, 1, "ip",		"improper superset"},
X	/* 39*/	{S, 0, 0, 1, "pt",		"proportional to"},
X	/* 40*/	{S, 0, 0, 1, "rh",		"right hand"},
X	/* 41*/	{S, 0, 0, 1, "*w",		"omega"},
X	/* 42*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 43*/	{S, 0, 0, 1, "gr",		"gradient"},
X	/* 44*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 45*/	{S, 0, 0, 1, "*F",		"Phi"},
X	/* 46*/	{S, 0, 0, 1, "*H",		"Theta"},
X	/* 47*/	{S, 0, 0, 1, "*W",		"Omega"},
X	/* 48*/	{S, 0, 0, 1, "cu",		"union"},
X	/* 49*/	{S, 0, 0, 1, "rn",		"root en"},
X	/* 50*/	{S, 0, 0, 1, "ts",		"terminal sigma (was root em)"},
X	/* 51*/	{S, 0, 0, 1, "*L",		"Lambda"},
X	/* 52*/	{S, 0, 0, 1, "mi",		"equation minus"},
X	/* 53*/	{S, 0, 0, 1, "*G",		"Gamma"},
X	/* 54*/	{S, 0, 0, 1, "is",		"integral sign"},
X	/* 55*/	{S, 0, 0, 1, "*P",		"Pi"},
X	/* 56*/	{S, 0, 0, 1, "sb",		"subset of"},
X	/* 57*/	{S, 0, 0, 1, "sp",		"superset of"},
X	/* 58*/	{S, 0, 0, 1, "ap",		"approximates"},
X	/* 59*/	{S, 0, 0, 1, "pd",		"partial derivative"},
X	/* 60*/	{S, 0, 0, 1, "*D",		"Delta"},
X	/* 61*/	{S, 0, 0, 1, "sr",		"square root"},
X	/* 62*/	{S, 0, 0, 1, "*S",		"Sigma"},
X	/* 63*/	{S, 0, 0, 1, "~=",		"approx ="},
X	/* 64*/	{S, 0, 0, 1, ">",		">"},
X	/* 65*/	{S, 0, 0, 1, "*C",		"Xi"},
X	/* 66*/	{S, 0, 0, 1, "<",		"<"},
X	/* 67*/	{S, 0, 0, 1, "/",		"slash"},
X	/* 68*/	{S, 0, 0, 1, "ca",		"intersect"},
X	/* 69*/	{S, 0, 0, 1, "*U",		"Upsilon"},
X	/* 70*/	{S, 0, 0, 1, "no",		"logical not"},
X	/* 71*/	{S, 0, 0, 1, "rc",		"right ceiling"},
X	/* 72*/	{S, 0, 0, 1, "lt",		"left top brace"},
X	/* 73*/	{S, 0, 0, 1, "bv",		"bold vertical"},
X	/* 74*/	{S, 0, 0, 1, "lk",		"left ctr brace"},
X	/* 75*/	{S, 0, 0, 1, "lb",		"left bot brace"},
X	/* 76*/	{S, 0, 0, 1, "rt",		"right top brace"},
X	/* 77*/	{S, 0, 0, 1, "rk",		"right ctr brace"},
X	/* 78*/	{S, 0, 0, 1, "rb",		"right bot brace"},
X	/* 79*/	{S, 0, 0, 1, "rf",		"right floor"},
X	/* 80*/	{S, 0, 0, 1, "lf",		"left floor"},
X	/* 81*/	{S, 0, 0, 1, "lc",		"left ceiling"},
X	/* 82*/	{S, 0, 0, 1, "mu",		"multiply"},
X	/* 83*/	{S, 0, 0, 1, "di",		"divide"},
X	/* 84*/	{S, 0, 0, 1, "+-",		"plus-minus"},
X	/* 85*/	{S, 0, 0, 1, "<=",		"<="},
X	/* 86*/	{S, 0, 0, 1, ">=",		">="},
X	/* 87*/	{S, 0, 0, 1, "==",		"identically equal"},
X	/* 88*/	{S, 0, 0, 1, "!=",		"not equal"},
X	/* 89*/	{S, 0, 0, 1, "{",		"{"},
X	/* 90*/	{S, 0, 0, 1, "}",		"}"},
X	/* 91*/	{U, 0, 0, 1, "aa",		"acute accent"},
X	/* 92*/	{U, 0, 0, 1, "ga",		"grave accent"},
X	/* 93*/	{S, 0, 0, 1, "^",		"^"},
X	/* 94*/	{S, 0, 0, 1, "#",		"#"},
X	/* 95*/	{S, 0, 0, 1, "lh",		"left hand"},
X	/* 96*/	{S, 0, 0, 1, "mo",		"member of"},
X	/* 97*/	{U, 0, 0, 1, "~",		"~"},
X	/* 98*/	{S, 0, 0, 1, "es",		"empty set"},
X	/* 99*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/*100*/	{U, 0, 0, 1, "dd",		"dbl dagger"},
X	/*101*/	{S, 0, 0, 1, "br",		"box rule (was parallel sign)"},
X	/*102*/	{S, 0, 0, 1, "**",		"math * "},
X	/*103*/	{S, 0, 0, 1, "ib",		"improper subset"},
X	/*104*/	{S, 0, 0, 1, "ci",		"circle"},
X	/*105*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/*106*/	{S, 0, 0, 1, "pl",		"equation plus"},
X	/*107*/	{S, 0, 0, 1, "->",		"right arrow"},
X	/*108*/	{U, 0, 0, 1, "sc",		"section"}
X};
X
XdtPage() {
X    pagePending = 1;
X}
X
Xstatic
XdoPageStart(e) {
X    currentPage++;
X    pagePending = 0;
X    printf("p%d\n", currentPage);
X}
X
Xstatic int lastFont = (-1), lastPoints = (-1);
X
XdtSetFont(font, points)
Xint font, points; {
X    if (lastPoints != points || font != lastFont) {
X	if (!(dtFts[font].flags)&USED)
X	    printf("x font %d %s\n", font+1, dtFts[font].troffName);
X	dtFts[font].flags |= USED;
X	printf("f%d\n", font+1);
X	printf("s%d\n", points);
X	lastPoints = points;
X	lastFont = font;
X    }
X}
X
XdtChar(x, y, font, points, troffChar) 
Xint x, y, font, points, troffChar; {
X	static double lasty = (-1);
X	register double nx = TROFF2DTX(x), ny = TROFF2DTY(y);
X	register struct troff2befont *rp;
X	register char *sequence = "a";
X	if (pagePending) {
X	    lasty = lastFont = lastPoints = (-1);
X	    doPageStart();
X	}
X
X	DEBUGPRINTF("x,y=%d,%d; font=%d, points=%d, tc=%d\n",
X	    x, y, font, points, troffChar);
X
X	if (font == 3) {
X	    rp = &be->besymfont[troffChar];
X	} else {
X	    rp = &be->bestdfont[troffChar];
X	}
X
X	switch(rp->t2b_font) {
X	    /* Only fonts with "U" are subject to font translation */
X	    case U: 
X		if (font == 3)
X		    font = 0;	/* Special chars are Courier */
X		else {
X		    DEBUGPRINTF("dtSetChar %d->%s (%s)\n", font, 
X			t2dtf[font]->troffName,
X			t2dtf[font]->ascName);
X		    font = t2dtf[font] - dtFts;
X		}
X		break;
X	    case S: 
X		font = 3;
X		break;
X	    case D:
X		break;
X	    default:
X		/* Typically used when the main fonts don't have the
X		   character desired.  Eg: right-hand is in the
X		   ZapfDingbats font */
X		font = rp->t2b_font;
X		break;
X	}
X
X	sequence = rp->t2b_charseq;
X
X	if (!sequence) {
X	    fprintf(stderr, "No coding for %d\n", troffChar);
X	    return;
X	}
X
X	/*	We're committed now */
X
X	points *= rp->t2b_scale;
X	nx += points * rp->t2b_xc;
X	ny += points * rp->t2b_yc;
X	dtSetFont(font, points);
X#ifdef	NOTYET
X	if (rp->t2b_font == D)
X	    printf("H%d\nV%d\nc%s\n", (int) nx, (int) ny, sequence);
X	else {
X#endif
X	    printf("H%d\n", (int) nx);
X	    if (lasty != ny) {
X		printf("V%d\n", (int) ny);
X		lasty = ny;
X	    }
X	    if (sequence[1])
X		printf("C%s\n", sequence);
X	    else
X		printf("c%s\n", sequence);
X#ifdef	NOTYET
X    }
X#endif
X}
X
XdtProlog() {
X    extern char *getlogin(), *ctime();
X    extern char *strchr();
X    extern char nodename[];
X    extern char *device;
X    char buf2[512];
X    char buffer[512];
X    FILE *library;
X    int c;
X    long curtime;
X
X    currentPage = 0;
X    pagePending = 1;
X
X    for (c = 0; c < 8; c++)
X	t2dtf[c] = &dtFts[c];
X
X    sprintf(buf2, "%s.%s", DTFONTS, be->bename);
X
X    if ((library = fopen(buf2, "r")) == NULL) {
X	sprintf(buffer, "%s/%s", LIBDIR, buf2);
X	if ((library = fopen(buffer, "r")) == NULL) {
X	    fprintf(stderr, "Cannot open PostScript font definitions %s\n",
X		buffer);
X	    exit(1);
X	}
X    }
X
X    loadfontdefs(library);
X    fclose(library);
X
X    time(&curtime);
X    strcpy(buffer, ctime(&curtime));
X    *strchr(buffer, '\n') = '\0';
X
X    getnodename();
X
X    printf("#Title: (stdin)\n");
X    printf("#Creator: %s %s %s\n", getlogin(), progname, T2VERSION);
X    printf("#CreationDate: %s\n", buffer);
X    printf("#For: %s\n", getlogin());
X    printf("#Pages: (atend)\n");
X    printf("#DocumentFonts: (atend)\n");
X    printf("#EndComments\n");
X    printf("x T %s\n", device);
X    printf("x res %d %d %d\n", DTRESOLUTION, 1, 1);
X    printf("x init\n");
X
X}
X
XdtEpilog() {
X    printf("x trailer\n");
X    printf("x stop\n");
X}
X
XdtFontSel(from, to)
Xchar from, *to; {
X#ifdef	DEBUG
X    register int i;
X    register struct dtFts *p;
X#endif
X    DEBUGPRINTF("dtFontSel: %c -> %s\n", from, to);
X    if (from < '1' || from > '8') {
X	fprintf(stderr, "Bad arguments to dtFontSel: %c %s\n", from, to);
X	return;
X    }
X
X    for (p = dtFts; p->troffName; p++)
X	if (strcmp(p->troffName, to) == 0) {
X	    t2dtf[from - '1'] = p;
X	    break;
X	}
X    if (!p->troffName) {
X	fprintf(stderr, "Could not translate font %c (%s)\n", from, to);
X    }
X#ifdef	DEBUG
X    for (i = 0; i < 8; i++)
X	DEBUGPRINTF("Font %d->%s\n", i+1, t2dtf[i]->ascName);
X#endif
X}
X
X/*struct troff2befont *
XdtGetFontTables(which)
Xint which; {
X    return(which? symbolFont: standardFont);
X}*/
X
Xstatic
Xloadfontdefs(f)
XFILE *f; {
X    struct dtFts *p = dtFts;
X    extern char *malloc();
X    int flags;
X    char rbuf[512], nbuf[512], dtbuf[512];
X    while(fgets(rbuf, sizeof(rbuf), f)) {
X	if (rbuf[0] == '#')
X	    continue;
X	switch(sscanf(rbuf, "%s%s", nbuf, dtbuf)) {
X	    default:
X		break;
X	    case 2:
X		if (nbuf[0] == '#')
X		    break;
X		if (p - dtFts >= MAXFONT) {
X		    fprintf(stderr, "Too many font definitions in %s\n",
X			be->bename);
X		    exit(1);
X		}
X		p->troffName = malloc(strlen(nbuf) + 1);
X		strcpy(p->troffName, nbuf);
X		p->ascName = malloc(strlen(dtbuf) + 1);
X		strcpy(p->ascName, dtbuf);
X		p->flags = 0;
X		p++;
X	}
X    }
X#ifdef	DEBUG
X    for (p = dtFts; p->troffName; p++)
X	DEBUGPRINTF("%s -> %s\n", p->troffName, p->ascName);
X#endif
X}
X#endif /* DT */
END_OF_FILE
if test 16363 -ne `wc -c <'dt.c'`; then
    echo shar: \"'dt.c'\" unpacked with wrong size!
fi
# end of 'dt.c'
fi
if test -f 'ps.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ps.c'\"
else
echo shar: Extracting \"'ps.c'\" \(19066 characters\)
sed "s/^X//" >'ps.c' <<'END_OF_FILE'
X/*	Copyright 1985, 1986, 1987, 1988 Chris Lewis
X		All Rights Reserved
X
X    Permission to copy and further distribute is freely given provided 
X    this copyright notice remains intact and that this software is not 
X    sold for profit.
X
X	Project:	Generic Troff drivers
X	Module:		ps.c
X	Author: 	Chris Lewis
X	Specs:		PostScript driver
X */
X
X#include "defs.h"
X
X#ifdef	PS
X#include "ps.h"
X
X#ifndef	SVR3
X#ifndef	lint
Xstatic char SCCSid[] = "@(#)ps.c: 1.24 Copyright 89/08/28 17:11:47 Chris Lewis";
X#endif
X#else
X#ident  "@(#)ps.c: 1.24 Copyright 89/08/28 17:11:47 Chris Lewis" /*(SVR3)*/
X#endif
X
X#define	METRICS
Xstatic charCount;
X
X#ifdef	FORM
Xstatic char Overlay[100] = {""};
X#endif
X
X#ifdef	BIN
Xstatic char Bin = 'D';
X#endif
X
X#define	MAXFONT	50
X
X#define	USED	01
X
Xstruct psFts {
X    char *troffName;
X    char *fontName;
X    int	 flags;
X} psFts[MAXFONT+1];
X
Xstruct psFts *t2psf[8];
X
Xstruct troff2befont psStdFont[108] = {
X
X/*          +-------------------------------- Troff character number
X	    |
X            |    +--------------------------- U: standard fonts
X            |    |                            S: symbol font
X            |    |                            D: draw macro
X            |    |                            n: new font
X            |    |
X            |    |  +------------------------ X-shift (scaled by point)
X            |    |  |                         Note: positive is right.
X            |    |  |
X            |    |  |  +--------------------- Y-shift (scaled by point)
X            |    |  |  |                      Note: positive is up.
X            |    |  |  |
X            |    |  |  |  +------------------ Point scale factor
X            |    |  |  |  |
X            |    |  |  |  |   +-------------- Sequence
X            |    |  |  |  |   |
X            |    |  |  |  |   |               Printable sequence title
X            |    |  |  |  |   |                 |
X            |    |  |  |  |   |                 |
X            v    v  v  v  v   v                 v                    */
X	/*  1*/	{U, 0, 0, 1, "h",		"h"},
X	/*  2*/	{U, 0, 0, 1, "t",		"t"},
X	/*  3*/	{U, 0, 0, 1, "n",		"n"},
X	/*  4*/	{U, 0, 0, 1, "m",		"m"},
X	/*  5*/	{U, 0, 0, 1, "l",		"l"},
X	/*  6*/	{U, 0, 0, 1, "i",		"i"},
X	/*  7*/	{U, 0, 0, 1, "z",		"z"},
X	/*  8*/	{U, 0, 0, 1, "s",		"s"},
X	/*  9*/	{U, 0, 0, 1, "d",		"d"},
X	/* 10*/	{U, 0, 0, 1, "b",		"b"},
X	/* 11*/	{U, 0, 0, 1, "x",		"x"},
X	/* 12*/	{U, 0, 0, 1, "f",		"f"},
X	/* 13*/	{U, 0, 0, 1, "j",		"j"},
X	/* 14*/	{U, 0, 0, 1, "u",		"u"},
X	/* 15*/	{U, 0, 0, 1, "k",		"k"},
X	/* 16*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 17*/	{U, 0, 0, 1, "p",		"p"},
X	/* 18*/	{D, 0, 0, 1, "do34em",		"3/4 em"},
X	/* 19*/	{U, 0, 0, 1, ";",		";"},
X	/* 20*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 21*/	{U, 0, 0, 1, "a",		"a"},
X	/* 22*/	{D, 0, 0, 1, "doru",		"horizontal rule"},
X	/* 23*/	{U, 0, 0, 1, "c",		"c"},
X	/* 24*/	{U, 0, 0, 1, "`",		"` open"},
X	/* 25*/	{U, 0, 0, 1, "e",		"e"},
X	/* 26*/	{U, 0, 0, 1, "'",		"' close"},
X	/* 27*/	{U, 0, 0, 1, "o",		"o"},
X	/* 28*/	{D, 0, 0, 1, "do14",		"1/4"},
X	/* 29*/	{U, 0, 0, 1, "r",		"r"},
X	/* 30*/	{D, 0, 0, 1, "do12",		"1/2"},
X	/* 31*/	{U, 0, 0, 1, "v",		"v"},
X	/* 32*/	{U, 0, 0, 1, "-",		"- hyphen"},
X	/* 33*/	{U, 0, 0, 1, "w",		"w"},
X	/* 34*/	{U, 0, 0, 1, "q",		"q"},
X	/* 35*/	{U, 0, 0, 1, "/",		"/"},
X	/* 36*/	{U, 0, 0, 1, ".",		"."},
X	/* 37*/	{U, 0, 0, 1, "g",		"g"},
X	/* 38*/	{D, 0, 0, 1, "do34",		"3/4"},
X	/* 39*/	{U, 0, 0, 1, ",",		","},
X	/* 40*/	{U, 0, 0, 1, "&",		"&"},
X	/* 41*/	{U, 0, 0, 1, "y",		"y"},
X	/* 42*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 43*/	{U, 0, 0, 1, "\%",		"%"},
X	/* 44*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 45*/	{U, 0, 0, 1, "Q",		"Q"},
X	/* 46*/	{U, 0, 0, 1, "T",		"T"},
X	/* 47*/	{U, 0, 0, 1, "O",		"O"},
X	/* 48*/	{U, 0, 0, 1, "H",		"H"},
X	/* 49*/	{U, 0, 0, 1, "N",		"N"},
X	/* 50*/	{U, 0, 0, 1, "M",		"M"},
X	/* 51*/	{U, 0, 0, 1, "L",		"L"},
X	/* 52*/	{U, 0, 0, 1, "R",		"R"},
X	/* 53*/	{U, 0, 0, 1, "G",		"G"},
X	/* 54*/	{U, 0, 0, 1, "I",		"I"},
X	/* 55*/	{U, 0, 0, 1, "P",		"P"},
X	/* 56*/	{U, 0, 0, 1, "C",		"C"},
X	/* 57*/	{U, 0, 0, 1, "V",		"V"},
X	/* 58*/	{U, 0, 0, 1, "E",		"E"},
X	/* 59*/	{U, 0, 0, 1, "Z",		"Z"},
X	/* 60*/	{U, 0, 0, 1, "D",		"D"},
X	/* 61*/	{U, 0, 0, 1, "B",		"B"},
X	/* 62*/	{U, 0, 0, 1, "S",		"S"},
X	/* 63*/	{U, 0, 0, 1, "Y",		"Y"},
X	/*from here on are actually code 1-45, upper half of font */
X	/* 64*/	{U, 0, 0, 1, "F",		"F"},
X	/* 65*/	{U, 0, 0, 1, "X",		"X"},
X	/* 66*/	{U, 0, 0, 1, "A",		"A"},
X	/* 67*/	{U, 0, 0, 1, "W",		"W"},
X	/* 68*/	{U, 0, 0, 1, "J",		"J"},
X	/* 69*/	{U, 0, 0, 1, "U",		"U"},
X	/* 70*/	{U, 0, 0, 1, "K",		"K"},
X	/* 71*/	{U, 0, 0, 1, "0",		"0"},
X	/* 72*/	{U, 0, 0, 1, "1",		"1"},
X	/* 73*/	{U, 0, 0, 1, "2",		"2"},
X	/* 74*/	{U, 0, 0, 1, "3",		"3"},
X	/* 75*/	{U, 0, 0, 1, "4",		"4"},
X	/* 76*/	{U, 0, 0, 1, "5",		"5"},
X	/* 77*/	{U, 0, 0, 1, "6",		"6"},
X	/* 78*/	{U, 0, 0, 1, "7",		"7"},
X	/* 79*/	{U, 0, 0, 1, "8",		"8"},
X	/* 80*/	{U, 0, 0, 1, "9",		"9"},
X	/* 81*/	{U, 0, 0, 1, "*",		"*"},
X	/* 82*/	{S, 0, 0, 1, "\\055",		"minus"},
X	/* 83*/	{U, 0, 0, 1, "\\256",		"fi"},
X	/* 84*/	{U, 0, 0, 1, "\\257",		"fl"},
X	/* 85*/	{D, 0, 0, 1, "doff",		"ff"},
X	/* 86*/	{S, 0, 0, 1, "\\242",		"cent sign"},
X	/* 87*/	{D, 0, 0, 1, "doFl",		"ffl"},
X	/* 88*/	{D, 0, 0, 1, "doFi",		"ffi"},
X	/* 89*/	{U, 0, 0, 1, "\\(",		"("},
X	/* 90*/	{U, 0, 0, 1, "\\)",		")"},
X	/* 91*/	{U, 0, 0, 1, "[",		"["},
X	/* 92*/	{U, 0, 0, 1, "]",		"]"},
X	/* 93*/	{S, 0, 0, 1, "\\260",		"degree"},
X	/* 94*/	{U, 0, 0, 1, "\\262",		"dagger"},
X	/* 95*/	{U, 0, 0, 1, "=",		"="},
X	/* 96*/	{S, 0, 0, 1, "\\322",		"registered"},
X	/* 97*/	{U, 0, 0, 1, ":",		":"},
X	/* 98*/	{U, 0, 0, 1, "+",		"+"},
X	/* 99*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/*100*/	{U, 0, 0, 1, "!",		"!"},
X	/*101*/	{U, 0, -.1, 1.5, "\\267",	"bullet"},
X	/*102*/	{U, 0, 0, 1, "?",		"?"},
X	/*103*/	{S, 0, 0, 1, "\\242",		"foot mark (minute)"},
X	/*104*/	{U, -.1, 0, 1, "|",		"|"},
X	/*105*/	{U, 0, 0, 1, NOCODE,		"unassigned"},
X	/*106*/	{S, 0, 0, 1, "\\323",		"copyright"},
X	/*107*/	{D, 0, 0, 1, "dosq",		"square"},
X	/*108*/	{U, 0, 0, 1, "$",		"$"}
X    };
X
X    struct troff2befont psSymFont[] = {
X/*          +-------------------------------- Troff character number
X	    |
X            |    +--------------------------- U: standard fonts
X            |    |                            S: symbol font
X            |    |                            D: draw macro
X            |    |                            n: new font
X            |    |
X            |    |  +------------------------ X-shift (scaled by point)
X            |    |  |                         Note: positive is right.
X            |    |  |
X            |    |  |  +--------------------- Y-shift (scaled by point)
X            |    |  |  |                      Note: positive is up.
X            |    |  |  |
X            |    |  |  |  +------------------ Point scale factor
X            |    |  |  |  |
X            |    |  |  |  |   +-------------- Sequence
X            |    |  |  |  |   |
X            |    |  |  |  |   |               Printable sequence title
X            |    |  |  |  |   |                 |
X            |    |  |  |  |   |                 |
X            v    v  v  v  v   v                 v                    */
X	/*  1*/	{S, 0, 0, 1, "\\171",		"psi"},
X	/*  2*/	{S, 0, 0, 1, "\\161",		"theta"},
X	/*  3*/	{S, 0, 0, 1, "\\156",		"nu"},
X	/*  4*/	{S, 0, 0, 1, "\\155",		"mu"},
X	/*  5*/	{S, 0, 0, 1, "\\154",		"lambda"},
X	/*  6*/	{S, 0, 0, 1, "\\151",		"iota"},
X	/*  7*/	{S, 0, 0, 1, "\\172",		"zeta"},
X	/*  8*/	{S, 0, 0, 1, "\\163",		"sigma"},
X	/*  9*/	{S, 0, 0, 1, "\\144",		"delta"},
X	/* 10*/	{S, 0, 0, 1, "\\142",		"beta"},
X	/* 11*/	{S, 0, 0, 1, "\\170",		"xi"},
X	/* 12*/	{S, 0, 0, 1, "\\150",		"eta"},
X	/* 13*/	{S, 0, 0, 1, "\\146",		"phi"},
X	/* 14*/	{S, 0, 0, 1, "\\165",		"upsilon"},
X	/* 15*/	{S, 0, 0, 1, "\\153",		"kappa"},
X	/* 16*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 17*/	{S, 0, 0, 1, "\\160",		"pi"},
X	/* 18*/	{U, 0, 0, 1, "@",		"@"},
X	/* 19*/	{S, 0, 0, 1, "\\257",		"down arrow"},
X	/* 20*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 21*/	{S, 0, 0, 1, "\\141",		"alpha"},
X	/* 22*/	{S, 0, 0, 1, "\\174",		"or (was star)"},
X	/* 23*/	{S, 0, 0, 1, "\\143",		"chi"},
X	/* 24*/	{U, 0, 0, 1, "\\042",		"double quote"},
X	/* 25*/	{S, 0, 0, 1, "\\145",		"epsilon"},
X	/* 26*/	{S, 0, 0, 1, "\\075",		"equation equal"},
X	/* 27*/	{S, 0, 0, 1, "\\157",		"omicron"},
X	/* 28*/	{S, 0, 0, 1, "\\254",		"left arrow"},
X	/* 29*/	{S, 0, 0, 1, "\\162",		"rho"},
X	/* 30*/	{S, 0, 0, 1, "\\255",		"up arrow"},
X	/* 31*/	{S, 0, 0, 1, "\\164",		"tau"},
X	/* 32*/	{4, 0, 0, 1, "O",		"underline"},
X	/* 33*/	{U, 0, 0, 1, "\\134",		"\\\\"},
X	/* 34*/	{S, 0, 0, 1, "\\131",		"Psi"},
X	/* 35*/	{D, 0, 0, 1, "BellSymbol",	"bell system sign"},
X	/* 36*/	{S, 0, 0, 1, "\\245",		"infinity"},
X	/* 37*/	{S, 0, 0, 1, "\\147",		"gamma"},
X	/* 38*/	{S, 0, 0, 1, "\\312",		"improper superset"},
X	/* 39*/	{S, 0, 0, 1, "\\265",		"proportional to"},
X	/* 40*/	{S, 0, 0, 1, "\\336",		"right hand"},
X	/* 41*/	{S, 0, 0, 1, "\\167",		"omega"},
X	/* 42*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 43*/	{S, 0, 0, 1, "\\321",		"gradient"},
X	/* 44*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/* 45*/	{S, 0, 0, 1, "\\106",		"Phi"},
X	/* 46*/	{S, 0, 0, 1, "\\121",		"Theta"},
X	/* 47*/	{S, 0, 0, 1, "\\127",		"Omega"},
X	/* 48*/	{S, 0, 0, 1, "\\310",		"union"},
X	/* 49*/	{4, 0, 0, 1, "M",		"root en"},
X	/* 50*/	{S, 0, 0, 1, "\\123",		"terminal sigma (was root em)"},
X	/* 51*/	{S, 0, 0, 1, "\\114",		"Lambda"},
X	/* 52*/	{S, 0, 0, 1, "\\055",		"equation minus"},
X	/* 53*/	{S, 0, 0, 1, "\\107",		"Gamma"},
X	/* 54*/	{S, 0, 0, 1, "\\362",		"integral sign"},
X	/* 55*/	{S, 0, 0, 1, "\\120",		"Pi"},
X	/* 56*/	{S, 0, 0, 1, "\\314",		"subset of"},
X	/* 57*/	{S, 0, 0, 1, "\\311",		"superset of"},
X	/* 58*/	{U, 0, 0, 1, "\\176",		"approximates"},
X	/* 59*/	{S, 0, 0, 1, "\\266",		"partial derivative"},
X	/* 60*/	{S, 0, 0, 1, "\\104",		"Delta"},
X	/* 61*/	{S, .35, 0, 1, "\\326",		"square root"},
X	/* 62*/	{S, 0, 0, 1, "\\123",		"Sigma"},
X	/* 63*/	{S, 0, 0, 1, "\\273",		"approx ="},
X	/* 64*/	{S, 0, 0, 1, "\\076",		">"},
X	/* 65*/	{S, 0, 0, 1, "\\130",		"Xi"},
X	/* 66*/	{S, 0, 0, 1, "\\074",		"<"},
X	/* 67*/	{S, 0, 0, 1, "\\244",		"long slash (longer)"},
X	/* 68*/	{S, 0, 0, 1, "\\307",		"intersect"},
X	/* 69*/	{S, 0, 0, 1, "\\125",		"Upsilon"},
X	/* 70*/	{S, 0, 0, 1, "\\330",		"logical not"},
X	/* 71*/	{4, 0, 0, 1, "J",		"right ceiling"},
X	/* 72*/	{4, 0, 0, 1, "B",		"left top brace"},
X	/* 73*/	{4, 0, 0, 1, "A",		"bold vertical"},
X	/* 74*/	{4, 0, 0, 1, "C",		"left ctr brace"},
X	/* 75*/	{4, 0, 0, 1, "D",		"left bot brace"},
X	/* 76*/	{4, 0, 0, 1, "E",		"right top brace"},
X	/* 77*/	{4, 0, 0, 1, "F",		"right ctr brace"},
X	/* 78*/	{4, 0, 0, 1, "G",		"right bot brace"},
X	/* 79*/	{4, 0, 0, 1, "K",		"right floor"},
X	/* 80*/	{4, 0, 0, 1, "I",		"left floor"},
X	/* 81*/	{4, 0, 0, 1, "H",		"left ceiling"},
X	/* 82*/	{S, 0, 0, 1, "\\264",		"multiply"},
X	/* 83*/	{S, 0, 0, 1, "\\270",		"divide"},
X	/* 84*/	{S, 0, 0, 1, "\\261",		"plus-minus"},
X	/* 85*/	{S, 0, 0, 1, "\\243",		"<="},
X	/* 86*/	{S, 0, 0, 1, "\\263",		">="},
X	/* 87*/	{S, 0, 0, 1, "\\272",		"identically equal"},
X	/* 88*/	{S, 0, 0, 1, "\\271",		"not equal"},
X	/* 89*/	{S, 0, 0, 1, "\\173",		"{"},
X	/* 90*/	{S, 0, 0, 1, "\\175",		"}"},
X	/* 91*/	{U, 0, 0, 1, "\\302",		"acute accent"},
X	/* 92*/	{U, 0, 0, 1, "\\301",		"grave accent"},
X	/* 93*/	{U, 0, 0, 1, "\\303",		"^"},
X	/* 94*/	{U, 0, 0, 1, "\\043",		"#"},
X	/* 95*/	{S, 0, 0, 1, "\\334",		"left hand"},
X	/* 96*/	{S, 0, 0, 1, "\\316",		"member of"},
X	/* 97*/	{U, 0, 0, 1, "\\304",		"~"},
X	/* 98*/	{S, 0, 0, 1, "\\306",		"empty set"},
X	/* 99*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/*100*/	{U, 0, 0, 1, "\\263",		"dbl dagger"},
X	/*101*/	{4, 0, 0, 1, "L",		"box rule (was parallel sign)"},
X	/*102*/	{S, 0, 0, 1, "\\052",		"math * "},
X	/*103*/	{S, 0, 0, 1, "\\315",		"improper subset"},
X	/*104*/	{4, 0, 0, 1, "N",		"circle"},
X	/*105*/	{S, 0, 0, 1, NOCODE,		"unassigned"},
X	/*106*/	{S, 0, 0, 1, "\\053",		"equation plus"},
X	/*107*/	{S, 0, 0, 1, "\\256",		"right arrow"},
X	/*108*/	{U, 0, 0, 1, "\\247",		"section"}
X};
X
XpsPage() {
X	EMITPS("ShowPage\n");
X	EMITPS("PageSave restore\n");
X	pagePending = 1;
X}
X
Xstatic
XdoPageStart(e) {
X    currentPage++;
X    EMITPS("%%%%Page: ? %d\n", currentPage);
X#ifdef	BIN
X    switch(Bin) {
X	case 'M':
X	    EMITPS("/manualfeed true def\n");
X	    break;
X	default:
X	    fprintf(stderr, 
X		"%s: bad bin selection %c - set to default\n", progname, 
X		Bin);
X	    Bin = 'D';
X	case 'D':
X	    EMITPS("/manualfeed false def\n");
X	    break;
X    }
X#endif
X#ifdef	FORM
X    EMITPS("/Form { %s } def\n", Overlay);
X#endif
X    EMITPS("/PageSave save def\n");
X    pagePending = 0;
X    EMITPS("StartPage\n");
X}
X
Xstatic int lastFont = (-1), lastPoints = (-1);
X
XpsSetFont(font, points)
Xint font, points; {
X	if (lastPoints != points || font != lastFont) {
X	    psFts[font].flags |= USED;
X#ifdef	FONTMACRO
X	    EMITPS("/%s %d SetFont\n", psFts[font].fontName, points);
X#else
X	    EMITPS("/%s dup /curFont exch def findfont\n", 
X		psFts[font].fontName);
X	    EMITPS("%d dup /curPoints exch def scalefont setfont\n", points);
X#endif
X	    lastPoints = points;
X	    lastFont = font;
X	}
X}
X
XpsChar(x, y, font, points, troffChar) 
Xint x, y, font, points, troffChar; {
X	static double lasty = (-1);
X	register double nx = TROFF2PSX(x), ny = TROFF2PSY(y);
X	register struct troff2befont *rp;
X	register char *sequence = "a";
X	if (pagePending) {
X	    lasty = lastFont = lastPoints = (-1);
X	    doPageStart();
X	}
X
X	charCount++;
X
X	DEBUGPRINTF("x,y=%d,%d; font=%d, points=%d, tc=%d\n",
X	    x, y, font, points, troffChar);
X
X	if (font == 3) {
X	    rp = &be->besymfont[troffChar];
X	} else {
X	    rp = &be->bestdfont[troffChar];
X	}
X
X	switch(rp->t2b_font) {
X	    /* Only fonts with "U" are subject to font translation */
X	    case U: 
X		if (font == 3)
X		    font = 0;	/* Special chars are Courier */
X		else {
X		    DEBUGPRINTF("psSetChar %d->%s (%s)\n", font, 
X			t2psf[font]->troffName,
X			t2psf[font]->fontName);
X		    font = t2psf[font] - psFts;
X		}
X		break;
X	    case S: 
X		font = 3;
X		break;
X	    case D:
X		break;
X	    default:
X		/* Typically used when the main fonts don't have the
X		   character desired.  Eg: right-hand is in the
X		   ZapfDingbats font */
X		font = rp->t2b_font;
X		break;
X	}
X
X	sequence = rp->t2b_charseq;
X
X	if (!sequence) {
X	    fprintf(stderr, "No coding for %d\n", troffChar);
X	    return;
X	}
X
X	/*	We're committed now */
X
X	points *= rp->t2b_scale;
X	nx += points * rp->t2b_xc;
X	ny += points * rp->t2b_yc;
X	psSetFont(font, points);
X	if (rp->t2b_font == D)
X	    EMITPS("%g %g %s\n", nx, ny, sequence);
X	else {
X	    emitnum(nx);
X	    if (lasty != ny) {
X		EMITPS(" ");
X		emitnum(ny);
X		EMITPS("(%s)Y\n", sequence);
X		lasty = ny;
X	    } else
X		EMITPS("(%s)X\n",sequence);
X	}
X}
X
Xemitnum(val)
Xdouble val; {
X    static char buffer[30];
X    register char *p;
X    sprintf(buffer, "%g", val);
X    p = strchr(buffer, '.');
X    if (p)
X	*(p+2) = '\0';
X    EMITPS(buffer);
X}
X
X
Xstatic
Xloadfontdefs(f)
XFILE *f; {
X    struct psFts *p = psFts;
X    extern char *malloc();
X    char rbuf[512], nbuf[512], psbuf[512];
X    while(fgets(rbuf, sizeof(rbuf), f)) {
X	switch(sscanf(rbuf, "%s%s", nbuf, psbuf)) {
X	    default:
X		break;
X	    case 2:
X		if (nbuf[0] == '#')
X		    break;
X		if (p - psFts >= MAXFONT) {
X		    fprintf(stderr, "Too many font definitions in %s\n",
X			PSFONTS);
X		    exit(1);
X		}
X		p->troffName = malloc(strlen(nbuf) + 1);
X		strcpy(p->troffName, nbuf);
X		p->fontName = malloc(strlen(psbuf) + 1);
X		strcpy(p->fontName, psbuf);
X		p++;
X	}
X    }
X#ifdef	DEBUG
X    for (p = psFts; p->troffName; p++)
X	DEBUGPRINTF("%s -> %s\n", p->troffName, p->fontName);
X#endif
X}
X
Xextern char nodename[];
X
XpsProlog() {
X    extern char *getlogin(), *ctime();
X    extern char *strchr();
X    char buffer[512];
X    char *lognm;
X    FILE *library;
X    int c;
X    long curtime;
X
X    currentPage = 0;
X    pagePending = 1;
X
X    for (c = 0; c < 8; c++)
X	t2psf[c] = &psFts[c];
X    if ((library = fopen(PSFONTS, "r")) == NULL) {
X	sprintf(buffer, "%s/%s", LIBDIR, PSFONTS);
X	if ((library = fopen(buffer, "r")) == NULL) {
X	    fprintf(stderr, "Cannot open PostScript font definitions %s\n",
X		buffer);
X	    exit(1);
X	}
X    }
X
X    loadfontdefs(library);
X    fclose(library);
X
X    if ((library = fopen(PSLIB, "r")) == NULL) {
X	sprintf(buffer, "%s/%s", LIBDIR, PSLIB);
X	if ((library = fopen(buffer, "r")) == NULL) {
X	    fprintf(stderr, "Cannot open %s\n", buffer);
X	    exit(1);
X	}
X    }
X
X    time(&curtime);
X    strcpy(buffer, ctime(&curtime));
X    *strchr(buffer, '\n') = '\0';
X    getnodename();
X
X    lognm = getlogin();
X    if (!lognm || !*lognm)
X	lognm = "unknown";
X
X    EMITPS("%%!PS-Adobe-1.0\n");
X    EMITPS("%%%%Title: (stdin)\n");
X    EMITPS("%%%%Creator: %s %s %s\n", lognm, progname, T2VERSION);
X    EMITPS("%%%%CreationDate: %s\n", buffer);
X    EMITPS("%%%%For: %s\n", lognm);
X    EMITPS("%%%%Pages: (atend)\n");
X    EMITPS("%%%%DocumentFonts: (atend)\n");
X    EMITPS("%%%%EndComments\n");
X    EMITPS("(%s@%s %s %s %s\n) print\n", lognm, nodename, buffer, 
X	progname, T2VERSION);
X    psXlate(library);
X    EMITPS("/GlobalSave save def\n");
X    EMITPS("%%%%EndProlog\n");
X    fclose(library);
X}
X
XpsEpilog() {
X    int i;
X#ifdef	METRICS
X    int curpos = 720;		/* ten inches from bottom of page */
X#define	XD	36
X#define	CH	16
X    if (metrics) {
X	psBin("");
X	psOverlay("");
X	doPageStart();
X	lastFont = -1;	/* force the font change nomatter what */
X	psSetFont(0, 16);
X	EMITPS("%d %d(%s Execution Summary:)Y\n", progname, XD, curpos);
X	curpos -= CH;
X	EMITPS("%d %d(Font cache hits: )Y Hits show\n",
X	    XD + 18, curpos);
X	curpos -= CH;
X	EMITPS("%d %d(Font cache misses: )Y Misses show\n",
X	    XD + 18, curpos);
X	curpos -= CH;
X	EMITPS("%d %d(Character Count: %d)Y\n",
X	    charCount, XD + 18, curpos);
X	psPage();
X    }
X#endif
X    EMITPS("%%%%Trailer\n");
X    EMITPS("GlobalSave restore\n");
X    EMITPS("%%%%DocumentFonts:");
X    for (i = 0; i < MAXFONT; i++)
X	if (psFts[i].flags&USED)
X	    EMITPS(" %s", psFts[i].fontName);
X    EMITPS("\n");
X    EMITPS("%%%%Pages: %d\n", currentPage);
X    putchar('\004');
X}
X
XpsFontSel(from, to)
Xchar from, *to; {
X#ifdef	DEBUG
X    register int i;
X    register struct psFts *p;
X#endif
X    DEBUGPRINTF("psFontSel: %c -> %s\n", from, to);
X    if (from < '1' || from > '8') {
X	fprintf(stderr, "Bad arguments to psFontSel: %c %s\n", from, to);
X	return;
X    }
X
X    for (p = psFts; p->troffName; p++)
X	if (strcmp(p->troffName, to) == 0) {
X	    t2psf[from - '1'] = p;
X	    break;
X	}
X    if (!p->troffName) {
X	fprintf(stderr, "Could not translate font %c (%s)\n", from, to);
X    }
X#ifdef	DEBUG
X    for (i = 0; i < 8; i++)
X	DEBUGPRINTF("Font %d->%s\n", i+1, t2psf[i]->fontName);
X#endif
X}
X
X/*struct troff2befont *
XpsGetFontTables(which)
Xint which; {
X    return(which? symbolFont: standardFont);
X}*/
X
XpsXlate(library)
XFILE *library; {
X    char buf[512];
X    while (fgets(buf, sizeof(buf), library))
X	if (0 == strncmp(buf, "%%%", 3))
X	    interp(&buf[3], psXlate, ".ps");
X	else
X	    fputs(buf, stdout);
X}
X
XpsOverlay(overlay)
Xchar *overlay; {
X#ifdef	FORM
X    strcpy(Overlay, overlay);
X    EMITPS("%%%%%%Form set: %s\n", Overlay);
X#endif
X}
X
XpsBin(bin)
Xchar *bin; {
X#ifdef	BIN
X    Bin = *bin;
X#endif
X}
X
X#endif /* PS */
END_OF_FILE
if test 19066 -ne `wc -c <'ps.c'`; then
    echo shar: \"'ps.c'\" unpacked with wrong size!
fi
# end of 'ps.c'
fi
echo shar: End of archive 5 \(of 6\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 archives.
    echo "Read README to install psroff"
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.