Psroff 2.0 Part 07 of 16
Chris Lewis
clewis at ecicrl.UUCP
Sat Nov 17 15:58:39 AEST 1990
Submitted-by: Chris Lewis <clewis at ecicrl.uucp>
Archive-name: psroff2.0/Part07
#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix at uunet.uu.net if you want that tool.
# Contents: audit.S cattab.c defs.h lib/Makefile utils.c
# utils/calcfonts.S
# Wrapped by clewis at ecicrl on Fri Nov 16 23:36:15 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
echo If this archive is complete, you will see the following message:
echo ' "shar: End of archive 7 (of 16)."'
if test -f 'audit.S' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'audit.S'\"
else
echo shar: Extracting \"'audit.S'\" \(11054 characters\)
sed "s/^X//" >'audit.S' <<'END_OF_FILE'
X%%STARTSHELL%%
X# Psroff checking script 2.4 90/08/29
Xchkinst=false
Xfor i
Xdo
X case $i in
X install)
X chkinst=true
X ;;
X *)
X printerlist="$printerlist $i"
X ;;
X esac
Xdone
Xeval "`sed -n -e 's/[()]//g' \
X -e 's/^LIBDIR.*=[ ]*/LIBDIR=/p' \
X -e 's/^LJF.*=[ ]*/LJF=/p' \
X -e 's/^FONTDIR.*=[ ]*/FONTDIR=/p' \
X Makefile`"
Xecho "LIBDIR = $LIBDIR"
Xecho "LJF = $LJF"
Xecho "FONTDIR = $FONTDIR"
Xif [ -z "$FONTDIR" ]
Xthen
X echo "ERROR: That's odd, can't find a FONTDIR setting in Makefile"
Xelif [ ! -d $FONTDIR ]
Xthen
X echo "ERROR: That's really odd, no such directory $FONTDIR"
X echo " This is where CAT's width tables are supposed to be"
X echo " It is usually /usr/lib/font"
X FONTDIR=
Xfi
Xif [ -z "$LIBDIR" ]
Xthen
X echo "ERROR: Bad configuration - no LIBDIR setting"
X exit 1
Xelif [ ! -d $LIBDIR ]
Xthen
X echo "INFO: You've not installed psroff yet - no LIBDIR ($LIBDIR) exists"
X if $chkinst
X then
X echo "ERROR: Can't check installed version unless it's installed"
X exit 1
X fi
Xfi
X
Xif $chkinst
Xthen
X psrofflib=$LIBDIR/lib/psrofflib
X libbase=$LIBDIR/lib
Xelse
X psrofflib=lib/psrofflib
X libbase=lib
Xfi
X
Xif [ ! -r $psrofflib ]
Xthen
X echo "ERROR: no $psrofflib to check"
X exit 1
Xfi
X
Xeval `grep '^troff=' $psrofflib`
Xecho "INFO: Your troff setting in psrofflib is troff=$troff"
Xif [ -n "$troff" ]
Xthen
X # This should be -x, but Ultrix sh doesn't believe in it
X if [ ! -f $troff ]
X then
X echo "ERROR: troff setting in $psrofflib ($troff) doesn't exist"
X troff=
X fi
Xelse
X mpath=`echo $PATH | sed -e 's/^:/.:/' -e 's/:$/:./' -e 's/:/ /g'`
X echo "INFO: Your path is $mpath"
X for i in $mpath
X do
X if [ -f $i/troff ]
X then
X echo "INFO: Troff appears to be $i/troff"
X troff=$i/troff
X break
X fi
X done
X if [ -z "$troff" ]
X then
X echo "ERROR: Can't find troff!"
X exit 1
X fi
Xfi
X
Xeval `grep '^trofftype=' $psrofflib`
Xecho "INFO: Your trofftype setting in $psrofflib is trofftype='$trofftype'"
X
Xif [ ! -r $FONTDIR/ftR -o ! -r $FONTDIR/ftI -o ! -r $FONTDIR/ftB -o \
X ! -r $FONTDIR/ftS ]
Xthen
Xcat <<!
XWARNING: Missing one of the $FONTDIR/ft[RIBS] files.
X I was hoping that FONTDIR was pointing at the place where
X your version of troff keeps its width tables (by default
X /usr/lib/font). Since this is not true, I will not be able
X to tell with complete accuracy whether your trofftype setting
X works. Therefore, take any ERROR messages about trofftype with
X a grain of salt. You could always copy widths/widthps/ft[RIBS]
X (after make widths) into $FONTDIR, but, I NEED a ftR from
X your ORIGINAL troff distribution to test HEADERSIZE properly.
X!
Xfi
X
Xif [ -n "$FONTDIR" ]
Xthen
X arglist="-F$FONTDIR/./ftXX"
Xfi
Xfor i in $arglist -T. ''
Xdo
X echo "INFO: Testing '$i' trofftype setting"
X $troff -t $i < /dev/null > /dev/null
X rc=$?
X if [ $rc = 0 ]
X then
X echo "... $i worked"
X case $i in
X -F*)
X workingtype="-F$FONTDIR/\$width/ftXX"
X ;;
X -T*)
X if [ -n "$FONTDIR" -a "$FONTDIR" != /usr/lib/font ]
X then
X echo "ERROR: FONTDIR must be /usr/lib/font with this"
X echo " type of troff"
X fi
X workingtype="-T\$width"
X ;;
X *)
X echo "INFO: Poor you, your troff doesn't understand -T or -F."
X echo " This means that you'll have to put all of your"
X echo " width files directly in $FONTDIR, and you'll not"
X echo " be able to support multiple sets of width tables"
X workingtype=" "
X ;;
X esac
X break
X else
X echo "... $i didn't work"
X fi
Xdone
Xif [ -z "$workingtype" ]
Xthen
X echo "ERROR: Oh my, your troff doesn't seem to work AT ALL!"
X echo " It's giving me non-zero return codes when I try"
X echo " all of the known different ways of setting width table"
X echo " directory (including none!). Egads. Get Help!!!!!!!"
X exit 1
Xfi
X
Xif [ "$workingtype" != "$trofftype" ]
Xthen
X echo "ERROR: You should have trofftype='$workingtype' in $psrofflib"
X echo " Psroff won't work AT ALL without this fixed"
Xelse
X echo "INFO: Your trofftype setting ($trofftype) appears correct"
Xfi
X
Xif [ ! -r $FONTDIR/ftR ]
Xthen
X echo "INFO: There isn't a $FONTDIR/ftR (it should be if you've installed"
X echo " Troff on your system. Without it, I can't test HEADERSIZE"
Xelse
X hdrsize=`sed -n \
X -e 's/^#define[ ]*HEADERSIZE[ ]*\([0-9]*\).*/\1/p' defs.h`
X echo "INFO: You have HEADERSIZE defined as $hdrsize"
X bytecount=`wc -c $FONTDIR/ftR | sed -e 's/^[ ]*//g' -e 's/[ ].*//`
X case $bytecount in
X 224)
X echo "INFO: You appear to have a Xenix-like troff - width tables"
X echo " have no extraneous garbage. Lucky you!"
X acthdr=0
X ;;
X *)
X echo "INFO: H'mm, you don't have a Xenix-like troff - Assuming"
X echo " your troff puts a.out.h headers on width tables, I"
X echo " will try compiling a teensy program to find out how"
X echo " big a.out.h headers actually are...."
X cat > AUDITP.c <<\!
X#include <a.out.h>
X#ifdef X_EXEC
X/* Xenix I think.... */
X#define HEADERSIZE sizeof(struct xexec)
X#endif
X#ifdef F_LNNO
X/* COFF format headers */
X#define HEADERSIZE (-sizeof(struct filehdr))
X#endif
X#ifndef HEADERSIZE
X/* Generalized V7 or BSD - non-coff format headers */
X#define HEADERSIZE sizeof(struct exec)
X#endif
Xmain() {
Xprintf ("%d\n", HEADERSIZE);
X}
X!
X rm -f AUDITP
X if [ -z "$MAKE" ]
X then
X MAKE=make
X fi
X $MAKE AUDITP > /dev/null 2>&1
X if [ ! -f AUDITP ]
X then
X echo "INFO: H'm, Wouldn't compile ..."
X # Common for 32 bitters (Sun/Ultrix f'r instance)
X acthdr=-32
X else
X acthdr=`./AUDITP`
X fi
X rm -f AUDITP AUDITP.c
X case $acthdr in
X -*)
X echo 'INFO: The following HEADERSIZE is *purely* a guess:'
X acthdr=`echo $acthdr | sed -e 's/-//'`
X ;;
X esac
X echo "INFO: It looks like HEADERSIZE should be $acthdr"
X ;;
X esac
X if [ "$hdrsize" != "$acthdr" ]
X then
X echo "ERROR: HEADERSIZE should be set to $acthdr, not $hdrsize"
X else
X echo "INFO: HEADERSIZE appears to be set correctly to $hdrsize"
X fi
Xfi
X
XTopts="`sed -e '/^[a-zA-Z]/!d' -e '/^troff/d' \
X -e '/^trofftype/d' -e 's/[ ].*//' $psrofflib | sort -u`"
Xecho "INFO: Commencing psrofflib ($psrofflib) checking"
Xif $chkinst
Xthen
X msgtyp='ERROR '
X troff2ps=$LIBDIR/troff2ps
Xelse
X msgtyp='WARNING'
X troff2ps=./troff2ps
Xfi
X
Xif [ ! -f $troff2ps ]
Xthen
X echo "WARNING: Can't test drivers, because troff2ps isn't built"
Xfi
Xrm -f PRINTERLIST
X
Xfor type in $Topts
Xdo
X troff="<not set>"
X trofftype="<not set>"
X width="<not set>"
X t2arg="<not set>"
X lparg="<not set>"
X ptr="<not set>"
X# If your system has no awk (or a busted one), you may have to
X# comment out the "line=`awk ... $psrofflib" lines, and uncomment
X# the sed script. If you do, you won't be able to continue
X# psrofflib lines, so you'll have to "join" the entries in psrofflib
X# (remembering to delete the name fields in the continuation lines).
X line=`awk '
X $1 ~ /^#/ {next}
X $0 ~ /^troff/ { print $0 }
X $1 == "'$type'" {
X seen=1
X print "F='T'" substr($0, length($1) + 1)
X next
X }
X { if (seen) exit(0) }
X ' $psrofflib`
X eval "$line"
X echo "INFO: psroff -T$type settings:"
X echo " troff $troff"
X echo " trofftype $trofftype"
X echo " width $width"
X if [ -n "$FONTDIR" -a ! -d $FONTDIR/$width ]
X then
X echo " * $msgtyp: FONTDIR/$width not installed yet"
X echo " psroff -T$width won't work until you do"
X fi
X if [ ! -d widths/width${width} ]
X then
X echo " * WARNING: no widths/width${width} directory"
X fi
X echo " t2arg $t2arg"
X drivertype=`echo $t2arg | sed -n -e 's/.*-T\([^ ]*\).*/\1/p'`
X printertype=`echo $t2arg | sed -n -e 's/.*-p\([^ ]*\).*/\1/p'`
X if [ -z "$drivertype" ]
X then
X echo " * INFO : no -T in $psrofflib t2arg - assuming ps"
X drivertype=ps
X fi
X if [ -z "$printertype" ]
X then
X printertype=$drivertype
X fi
X echo " Driver type: $drivertype, library prefix: $printertype"
X if [ -f $troff2ps ]
X then
X $troff2ps -T$drivertype < /dev/null > /dev/null 2>&1
X if [ $? != 0 ]
X then
X echo " * ERROR : troff2ps driver $drivertype not" \
X "configured psroff -T$width will die"
X fi
X fi
X set +x
X echo " lparg $lparg"
X echo " ptr $ptr"
X if [ ! -r $libbase/$printertype.lib ]
X then
X echo " * WARNING: no $libbase/$printertype.lib (no prolog)"
X fi
X if [ ! -r $libbase/$printertype.fonts ]
X then
X echo " * ERROR : Can't find $libbase/$printertype.fonts"
X echo " Won't be able to give you list of fonts available"
X continue
X fi
X echo "See $printertype.fonts below for listing of fonts"
X echo $printertype >> PRINTERLIST
Xdone
X
Xif [ -z "$printerlist" -a -s PRINTERLIST ]
Xthen
X printerlist=`sort -u PRINTERLIST`
Xfi
Xrm -f PRINTERLIST
X
Xfor printertype in $printerlist
Xdo
X (
X if [ -n "$FONTDIR" -a -d "$FONTDIR/$printertype" ]
X then
X ls $FONTDIR/$printertype | sed -n -e 's/^.*ft//p' | sort -u
X fi
X echo "troff2ps"
X cat $libbase/$printertype.fonts
X ) | awk '
X BEGIN {
X fontdir = "'"$FONTDIR"'"
X printertype = "'"$printertype"'"
X catfonts[""] = 0
X fonts[""] = 0
X printf("\n\nPrinter type %s.fonts\n\n", printertype);
X printf("%-4s %-20s %-25s %s\n", "Cat", "English Name", "Sequence", \
X "Flags");
X printf("Name\n\n");
X ignoring = 0
X }
X $1 == "troff2ps" {
X startlisting = 1;
X next
X }
X $1 == "normal" || $1 == "symbol" {
X ignoring = 1
X }
X $1 !~ /^[A-Za-z][A-Za-z]*/ {
X next
X }
X NF >= 1 {
X if (ignoring)
X next
X if (startlisting) {
X english = ""
X sequence = ""
X flags = ""
X name = $1
X if (NF > 1)
X english = $2
X if (NF > 2)
X sequence = $3
X if (NF > 3)
X flags = $4
X printf("%-4s %-20s %-25s %s\n", name, english, sequence, flags);
X fonts[name] = 1
X } else {
X catfonts[$1] = 1
X ftdirfound = 1
X }
X }
X END {
X if (ftdirfound) {
X for (name in fonts) {
X if (name && !catfonts[name])
X printf(" FONT %s: do not use: %s/%s/ft%s not installed\n",\
X name, fontdir, printertype, name);
X }
X }
X for (name in catfonts) {
X if (name && !fonts[name]) {
X printf(" FONT %s: do not use: %s/%s/ft%s exists, but", \
X name, fontdir, printertype, name)
X printf(" not in %s.fonts\n", printertype)
X }
X }
X }'
X if [ -n "$LJF" -a -d "$LJF" -a "$printertype" = lj ]
X then
X echo "I'm checking $printertype.fonts file for missing font"
X echo "files, please have patience"
X sed -e '/^[A-Za-z][A-Za-z]*/!d' $libbase/$printertype.fonts |
X while read troffname english sequence flags
X do
X for i in 6 7 8 9 10 11 12 14 16 18 20 22 24 28 36
X do
X suffix=
X case $flags in
X n* | b*) ;;
X p*)
X suffix=pk
X ;;
X s*)
X suffix=sfp
X ;;
X esac
X if [ -n "$suffix" -a ! -r $LJF/$troffname.$i.$suffix ]
X then
X echo "ERROR: $LJF/$troffname.$i.$suffix missing"
X fi
X flags=`echo $flags | sed -e 's/.\(.*\)/\1/'`
X done
X done
X fi
Xdone
END_OF_FILE
if test 11054 -ne `wc -c <'audit.S'`; then
echo shar: \"'audit.S'\" unpacked with wrong size!
fi
# end of 'audit.S'
fi
if test -f 'cattab.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'cattab.c'\"
else
echo shar: Extracting \"'cattab.c'\" \(9903 characters\)
sed "s/^X//" >'cattab.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: cattab.c
X Author: Chris Lewis
X Specs: CAT Translation tables.
X
X Notes:
X - There are two tables, one for normal and one for symbol fonts.
X - The CAT code is calculated in the following way from the CAT
X flash codes (see cat(5L)):
X 1) if lower flash, the code is the flash code minus 1.
X 2) if upper flash, the code is the flash code + 62
X (codes go from 0 to 107)
X - Some CAT codes are not allocated - they are denoted as "NOC"
X in the backend translation tables, but NTC here.
X (the backend translation tables are indexed by CAT code).
X - CAT codes of "NTC" in this table are "pseudo characters" which
X are here so that a width entry index can be specified. For example,
X "-" and \(hy are really the *same* CAT code, but have different
X widths. Ditto _ and \ul. Another is that space isn't really
X a character, but you gotta put its width somewhere.
X - The width table index is the offset from the beginning of the
X table (eg: not including any headers that your troff may
X require).
X - This table is primarily used for debugging and auxiliary purposes
X and is scanned at most once per troff2ps run (-z dumps, during
X *.fonts loading, and possibly in LJ w.r.t. font downloading), but
X other programs use it more extensively. The backends have
X the tables that are referenced on each character to obtain
X printer-specific translations.
X */
X
X
X#ifndef lint
Xstatic char SCCSid[] =
X "@(#)cattab.c: 2.1 Copyright 90/07/18 16:52:56 Chris Lewis";
X#endif
X
X#include "defs.h"
X
X/* +------------------------------------ Troff character name
X | (NOC means no character only
X | used here to terminate list)
X |
X | +----------------------------- N: standard font
X | | S: symbol font
X | |
X | | +------------------------ CAT Output Code table index
X | | | (must be sorted on this field!)
X | | |
X | | | +------------------- Width table index
X | | | |
X | | | | +---------------- Dummy used by dit2catwid
X | | | | |
X | | | | | +------------ Character description.
X | | | | | |
X v v v v v v */
X
Xstruct cattab tabN[] = {
X {"h", N, 0, 72, 0, "h"},
X {"t", N, 1, 84, 0, "t"},
X {"n", N, 2, 78, 0, "n"},
X {"m", N, 3, 77, 0, "m"},
X {"l", N, 4, 76, 0, "l"},
X {"i", N, 5, 73, 0, "i"},
X {"z", N, 6, 90, 0, "z"},
X {"s", N, 7, 83, 0, "s"},
X {"d", N, 8, 68, 0, "d"},
X {"b", N, 9, 66, 0, "b"},
X {"x", N, 10, 88, 0, "x"},
X {"f", N, 11, 70, 0, "f"},
X {"j", N, 12, 74, 0, "j"},
X {"u", N, 13, 85, 0, "u"},
X {"k", N, 14, 75, 0, "k"},
X {"", N, 15, -1, 0, NOC},
X {"p", N, 16, 80, 0, "p"},
X {"em", N, 17, 99, 0, "3/4 em"},
X {";", N, 18, 27, 0, ";"},
X {"", N, 19, -1, 0, NOC},
X {"a", N, 20, 65, 0, "a"},
X {"ru", N, 21, 100, 0, "horizontal rule"},
X {"c", N, 22, 67, 0, "c"},
X {"`", N, 23, 64, 0, "` open"},
X {"e", N, 24, 69, 0, "e"},
X {"'", N, 25, 7, 0, "' close"},
X {"o", N, 26, 79, 0, "o"},
X {"14", N, 27, 101, 0, "1/4"},
X {"r", N, 28, 82, 0, "r"},
X {"12", N, 29, 102, 0, "1/2"},
X {"v", N, 30, 86, 0, "v"},
X {"hy", N, 31, 96, 0, "hy hyphen"},
X {"w", N, 32, 87, 0, "w"},
X {"q", N, 33, 81, 0, "q"},
X {"/", N, 34, 15, 0, "/"},
X {".", N, 35, 14, 0, "."},
X {"g", N, 36, 71, 0, "g"},
X {"34", N, 37, 103, 0, "3/4"},
X {",", N, 38, 12, 0, ","},
X {"&", N, 39, 6, 0, "&"},
X {"y", N, 40, 89, 0, "y"},
X {"", N, 41, -1, 0, NOC},
X {"%", N, 42, 5, 0, "%"},
X {"", N, 43, -1, 0, NOC},
X {"Q", N, 44, 49, 0, "Q"},
X {"T", N, 45, 52, 0, "T"},
X {"O", N, 46, 47, 0, "O"},
X {"H", N, 47, 40, 0, "H"},
X {"N", N, 48, 46, 0, "N"},
X {"M", N, 49, 45, 0, "M"},
X {"L", N, 50, 44, 0, "L"},
X {"R", N, 51, 50, 0, "R"},
X {"G", N, 52, 39, 0, "G"},
X {"I", N, 53, 41, 0, "I"},
X {"P", N, 54, 48, 0, "P"},
X {"C", N, 55, 35, 0, "C"},
X {"V", N, 56, 54, 0, "V"},
X {"E", N, 57, 37, 0, "E"},
X {"Z", N, 58, 58, 0, "Z"},
X {"D", N, 59, 36, 0, "D"},
X {"B", N, 60, 34, 0, "B"},
X {"S", N, 61, 51, 0, "S"},
X {"Y", N, 62, 57, 0, "Y"},
X {"F", N, 63, 38, 0, "F"},
X {"X", N, 64, 56, 0, "X"},
X {"A", N, 65, 33, 0, "A"},
X {"W", N, 66, 55, 0, "W"},
X {"J", N, 67, 42, 0, "J"},
X {"U", N, 68, 53, 0, "U"},
X {"K", N, 69, 43, 0, "K"},
X {"0", N, 70, 16, 0, "0"},
X {"1", N, 71, 17, 0, "1"},
X {"2", N, 72, 18, 0, "2"},
X {"3", N, 73, 19, 0, "3"},
X {"4", N, 74, 20, 0, "4"},
X {"5", N, 75, 21, 0, "5"},
X {"6", N, 76, 22, 0, "6"},
X {"7", N, 77, 23, 0, "7"},
X {"8", N, 78, 24, 0, "8"},
X {"9", N, 79, 25, 0, "9"},
X {"*", N, 80, 10, 0, "*"},
X {"\\-", N, 81, 104, 0, "minus"},
X {"fi", N, 82, 105, 0, "fi"},
X {"fl", N, 83, 106, 0, "fl"},
X {"ff", N, 84, 107, 0, "ff"},
X {"ct", N, 85, 192, 0, "cent sign"},
X {"Fl", N, 86, 109, 0, "ffl"},
X {"Fi", N, 87, 108, 0, "ffi"},
X {"(", N, 88, 8, 0, "("},
X {")", N, 89, 9, 0, ")"},
X {"[", N, 90, 59, 0, "["},
X {"]", N, 91, 61, 0, "]"},
X {"de", N, 92, 110, 0, "degree"},
X {"dg", N, 93, 111, 0, "dagger"},
X {"=", N, 94, 29, 0, "="},
X {"rg", N, 95, 189, 0, "registered"},
X {":", N, 96, 26, 0, ":"},
X {"+", N, 97, 11, 0, "+"},
X {"", N, 98, -1, 0, NOC},
X {"!", N, 99, 1, 0, "!"},
X {"bu", N, 100, 97, 0, "bullet"},
X {"?", N, 101, 31, 0, "?"},
X {"fm", N, 102, 113, 0, "foot mark (minute)"},
X {"|", N, 103, 92, 0, "|"},
X {"", N, 104, -1, 0, NOC},
X {"co", N, 105, 190, 0, "copyright"},
X {"sq", N, 106, 98, 0, "square"},
X {"$", N, 107, 4, 0, "$"},
X {" ", N, NTC, 0, 0, "space"},
X {"\\|", N, NTC, 95, 0, "narrow space"},
X {"\\^", N, NTC, 118, 0, "half narrow space"},
X {"-", N, NTC, 13, 0, "hyphen character"},
X {NOC}
X};
X
Xstruct cattab tabS[] = {
X {"*q", S, 0, 142, 0, "psi"},
X {"*h", S, 1, 127, 0, "theta"},
X {"*n", S, 2, 132, 0, "nu"},
X {"*m", S, 3, 131, 0, "mu"},
X {"*l", S, 4, 130, 0, "lambda"},
X {"*i", S, 5, 128, 0, "iota"},
X {"*z", S, 6, 125, 0, "zeta"},
X {"*s", S, 7, 137, 0, "sigma"},
X {"*d", S, 8, 123, 0, "delta"},
X {"*b", S, 9, 121, 0, "beta"},
X {"*c", S, 10, 133, 0, "xi"},
X {"*y", S, 11, 126, 0, "eta"},
X {"*f", S, 12, 140, 0, "phi"},
X {"*u", S, 13, 139, 0, "upsilon"},
X {"*k", S, 14, 129, 0, "kappa"},
X {"", S, 15, -1, 0, NOC},
X {"*p", S, 16, 135, 0, "pi"},
X {"@", S, 17, 32, 0, "@"},
X {"da", S, 18, 169, 0, "down arrow"},
X {"", S, 19, -1, 0, NOC},
X {"*a", S, 20, 120, 0, "alpha"},
X {"or", S, 21, 198, 0, "or (was star)"},
X {"*x", S, 22, 141, 0, "chi"},
X {"\"", S, 23, 2, 0, "double quote"},
X {"*e", S, 24, 124, 0, "epsilon"},
X {"eq", S, 25, 170, 0, "equation equal"},
X {"*o", S, 26, 134, 0, "omicron"},
X {"<-", S, 27, 167, 0, "left arrow"},
X {"*r", S, 28, 136, 0, "rho"},
X {"ua", S, 29, 168, 0, "up arrow"},
X {"*t", S, 30, 138, 0, "tau"},
X {"ul", S, 31, 116, 0, "ul"},
X {"\\", S, 32, 60, 0, "back slash"},
X {"*Q", S, 33, 154, 0, "Psi"},
X {"bs", S, 34, 197, 0, "bell system sign"},
X {"if", S, 35, 180, 0, "infinity"},
X {"*g", S, 36, 122, 0, "gamma"},
X {"ip", S, 37, 179, 0, "improper superset"},
X {"pt", S, 38, 185, 0, "proportional to"},
X {"rh", S, 39, 194, 0, "right hand"},
X {"*w", S, 40, 143, 0, "omega"},
X {"", S, 41, -1, 0, NOC},
X {"gr", S, 42, 182, 0, "gradient"},
X {"", S, 43, -1, 0, NOC},
X {"*F", S, 44, 153, 0, "Phi"},
X {"*H", S, 45, 146, 0, "Theta"},
X {"*W", S, 46, 155, 0, "Omega"},
X {"cu", S, 47, 174, 0, "union"},
X {"rn", S, 48, 158, 0, "root en"},
X {"ts", S, 49, 157, 0, "terminal sigma"},
X {"*L", S, 50, 147, 0, "Lambda"},
X {"mi", S, 51, 162, 0, "equation minus"},
X {"*G", S, 52, 144, 0, "Gamma"},
X {"is", S, 53, 184, 0, "integral sign"},
X {"*P", S, 54, 149, 0, "Pi"},
X {"sb", S, 55, 176, 0, "subset of"},
X {"sp", S, 56, 177, 0, "superset of"},
X {"ap", S, 57, 164, 0, "approximates"},
X {"pd", S, 58, 181, 0, "partial derivative"},
X {"*D", S, 59, 145, 0, "Delta"},
X {"sr", S, 60, 156, 0, "square root"},
X {"*S", S, 61, 150, 0, "Sigma"},
X {"~=", S, 62, 163, 0, "approx ="},
X {">", S, 63, 30, 0, ">"},
X {"*C", S, 64, 148, 0, "Xi"},
X {"<", S, 65, 28, 0, "<"},
X {"sl", S, 66, 117, 0, "slash"},
X {"ca", S, 67, 175, 0, "intersect"},
X {"*U", S, 68, 152, 0, "Upsilon"},
X {"no", S, 69, 183, 0, "logical not"},
X {"rc", S, 70, 210, 0, "right ceiling"},
X {"lt", S, 71, 200, 0, "left top brace"},
X {"bv", S, 72, 206, 0, "bold vertical"},
X {"lk", S, 73, 204, 0, "left ctr brace"},
X {"lb", S, 74, 201, 0, "left bot brace"},
X {"rt", S, 75, 202, 0, "right top brace"},
X {"rk", S, 76, 205, 0, "right ctr brace"},
X {"rb", S, 77, 203, 0, "right bot brace"},
X {"rf", S, 78, 208, 0, "right floor"},
X {"lf", S, 79, 207, 0, "left floor"},
X {"lc", S, 80, 209, 0, "left ceiling"},
X {"mu", S, 81, 171, 0, "multiply"},
X {"di", S, 82, 172, 0, "divide"},
X {"+-", S, 83, 173, 0, "plus-minus"},
X {"<=", S, 84, 160, 0, "<="},
X {">=", S, 85, 159, 0, ">="},
X {"==", S, 86, 161, 0, "identically equal"},
X {"!=", S, 87, 165, 0, "not equal"},
X {"{", S, 88, 91, 0, "{"},
X {"}", S, 89, 93, 0, "}"},
X {"aa", S, 90, 114, 0, "acute accent"},
X {"ga", S, 91, 115, 0, "grave accent"},
X {"^", S, 92, 62, 0, "^"},
X {"#", S, 93, 3, 0, "#"},
X {"lh", S, 94, 195, 0, "left hand"},
X {"mo", S, 95, 187, 0, "member of"},
X {"~", S, 96, 94, 0, "~"},
X {"es", S, 97, 186, 0, "empty set"},
X {"", S, 98, -1, 0, NOC},
X {"dd", S, 99, 193, 0, "dbl dagger"},
X {"br", S, 100, 191, 0, "box rule (was parallel sign)"},
X {"**", S, 101, 196, 0, "math *"},
X {"ib", S, 102, 178, 0, "improper subset"},
X {"ci", S, 103, 199, 0, "circle"},
X {"", S, 104, -1, 0, NOC},
X {"pl", S, 105, 188, 0, "equation plus"},
X {"->", S, 106, 166, 0, "right arrow"},
X {"sc", S, 107, 112, 0, "section"},
X {"_", S, NTC, 63, 0, "_"},
X {NOC}
X};
END_OF_FILE
if test 9903 -ne `wc -c <'cattab.c'`; then
echo shar: \"'cattab.c'\" unpacked with wrong size!
fi
# end of 'cattab.c'
fi
if test -f 'defs.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'defs.h'\"
else
echo shar: Extracting \"'defs.h'\" \(10777 characters\)
sed "s/^X//" >'defs.h' <<'END_OF_FILE'
X/* Copyright 1988, 1989 23:13:57 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: defs.h 2.10 90/11/16 23:13:57
X Author: Chris Lewis
X Specs: Main header file - contains some customization
X */
X
X/* Official Release and Patch level: */
X#define T2VERSION "@(#)PSROFF Copyright 90/11/16 Chris Lewis - R2 P5"
X
X#ifndef LIBDIR
X/* Don't touch this */
X#define LIBDIR "/usr/lib/troff2"
X#endif
X
X/* Configuration parameters:
X */
X
X#undef BSD /* Define if you are a V7 or BSD machine */
X /* strchr vs. index etc.... */
X
X#define ATT /* Define if you are some sort of SIII or SV system */
X
X#undef BCOPY /* Define if you don't have memcpy and friends - eg:
X oldish BSD systems */
X
X#undef BCOPYLIB /* Define if BCOPY is defined and you have */
X /* a bcopy in your library */
X
X#undef UNSIGNEDCHAR /* Define if chars are unsigned on your machine */
X
X/* The name of a routine that can be called thusly:
X VFPRINTF(stream, format, ap)
X FILE *stream;
X char *format;
X va_list ap;
X (eg: you have varargs.h and you have a routine functionally compatible
X with System V vfprintf. I think BSD has one too)
X
X undef if you don't got, and maybe my fakeout will work.
X */
X
X#define VFPRINTF vfprintf
X
X/* If you have the stand-alone pk2sfp distribution, do not touch
X anything from here on */
X
X/* Font width file configuration:
X
X - If HEADERSIZE defined, use that many bytes as a prefix to the
X compiled font width table. HEADERSIZE 0 is the correct definition
X for Xenix and most System V Troffs. HEADERSIZE=32 works for Ultrix.
X HEADERSIZE=0 works properly for Suns (I think).
X - If COFF is defined instead, use a COFF header on the beginning of
X the file. I personally know of no machine that supports these.
X - If neither are defined, use a BSD/V7 style a.out.h header, this
X is appropriate for V7 and BSD troffs
X
X The headers I write out do not have anything in them, so some
X troff's may blow. Please let me know if they work for you...
X If you do need the headers, and these doesn't work for you, enable
X the COMPILE option in gfnttab. I know of no troff that *needs*
X COMPILE on.
X
X */
X
X#define HEADERSIZE 0 /* size of header in bytes */
X#undef COFF /* systems using COFF headers */
X
X/* What do your CAT codes look like?
X
X If BSDHACK defined, the code to magnify the next lead by 64 replaces the
X codes to set the tilt (tilt used only on 8-font CATs, which most CAT troff
X programs don't support).
X
X Both FONT8 and BSDHACK code are *untested*. FONT8 probably does *not*
X work.
X */
X
X#undef BSDHACK /* Has magnify lead opcode - untested */
X#undef FONT8 /* 8 Font device - untested */
X#define FONT4 /* Normal 4 font device */
X
X /* define a command for decompressing an argument
X file to stdout - allows you to compress SFP's.
X undef if you don't got. The -d option may be
X undocumented, but means decompress. "-dc"
X is equivalent to zcat. -dc appears to be
X in most versions of compress (eg: v3 & v4) */
X#define COMPRESS "/usr/lbin/compress -dc"
X
X/* Some postscript printers don't accept control-D as job termination
X (DEC scriptwriters for instance). In that case, define this
X macro. Alternately, if you have a proper printer manager that
X does this sort of stuff, define it too.
X */
X#undef NOCONTROLD
X
X/* define if you don't want your Postscript printer talking to you */
X#undef NOCHATTER
X
X/* The only advantage to commenting-out one of these is to make the
X binary executable of troff2?? smaller.
X */
X
X/* Basic drivers: */
X#define PS /* Postscript */
X#define LJ /* Laserjet - psroff will not build with this undef'd */
X#define DT /* ditroff */
X
X/* Laserjet driver config: */
X#define PK /* enable PK font downloading (needs LJ) */
X
X#define SFP /* enable SFP incremental font downloading (needs PK).
X You can still use SFP's without this turned on, but
X you won't get incremental downloading */
X
X#define PARTIAL /* partial (not incremental) font downloading */
X
X#define INCR /* enable incremental font downloading (needs PARTIAL) */
X
X#define MDLF 16 /* Max # downloaded fonts permitted by your laserjet
X per *page*. 16 is correct for HPLJ+ and most II's.
X IIP's are 32 I think. Some newer ones have higher
X restrictions (don't put this too high even if
X your printer supports it, you may run out of
X memory) */
X
X#define PRELOAD 0 /* set to number of LJ fonts permanently
X downloaded to printer. The backend will
X make sure that you don't go over the number
X of fonts permitted by the printer */
X
X#define DEBUG /* Do you want the debugger in? If you encounter
X problems and you want help from me, you'll have
X to have this turned on */
X
X#define OPT /* Experimental code */
X
X#define DEFPL 11 /* Default page length (11 inches).
X DO NOT change unless you absolutely HAVE to.
X You should only need to change this if you
X desire your printer to use something different
X as default. If so, you'll HAVE to change
X your macro package to agree on the default - RT
X owners take note! (the man macros are wrong) */
X
X#define DEFOFF 0.5 /* Default page offset. DO NOT change unless you
X absolutely HAVE to. You should only need this
X if: your vendor has buggered your macros to
X have a different default .po offset (Xenix),
X and you aren't using the macro adapter
X libraries that come with psroff (eg: you're
X using troff2ps directly). See README/TROUBLE/
X psroff(1) (-O vs. -rO options) */
X
X#define DEFYOFF 0 /* Default page vertical offset. See README/TROUBLE/
X psroff(1) -Y options too */
X
X#define INSPECIAL /* enables ditroff graphics capability */
X
X#define NODECMD "uuname -l" /* command to print on stdout the node name
X of your machine. Use hostname on BSD-derived
X systems that don't have UUCP. You can always
X use "echo <nodename>" if necessary */
X
X/* Edit no more .... */
X
X#define MAXDLFONTS (MDLF - PRELOAD) /* # fonts troff2ps can download */
X
X/* configuration verification */
X
X#if defined(BSDHACK) && defined(FONT8)
X#include "BSDHACK and FONT8 cannot be defined at the same time"
X#endif
X#if defined(FONT4) && defined(FONT8)
X#include "FONT4 and FONT8 cannot be defined at the same time"
X#endif
X
X#if !defined(LJ) && defined(PK)
X#include "Pointless to define PK without LJ"
X#endif
X
X#if !defined(PK) && (defined(INCR) || defined(PARTIAL))
X#include "Pointless to define INCR or PARTIAL without PK"
X#endif
X
X#if defined(INCR) && !defined(PARTIAL)
X#include "Don't support INCR without PARTIAL"
X#endif
X
X#if defined(SFP) && !defined(PK)
X#include "Can't define SFP without PK"
X#endif
X
X#include <stdio.h>
X#include <ctype.h>
X
X#ifdef BSD
X#include <strings.h>
X#define strchr index
X#define strrchr rindex
X#else
X#include <string.h>
X#endif
X
X#ifdef BCOPY
X#define memcpy(to, from, len) bcopy(from, to, len)
X#define clrarray(array, len) bzero(array, len)
X#else
X#define clrarray(array, len) memset(array, '\0', len)
X#endif
X
X#ifdef UNSIGNEDCHAR
X/* Ah heck, and this is probably not ANSI C either... */
X#define SIGNED(x) (((x)&0x80) ? ((x) - 256) : (x))
X#endif
X
X#define ESC 0x80
X#define FLASH 0x00
X#define CONTROL 0x40
X#define LEAD 0x60
X#define SIZE 0x50
X
X#define DOWN 0
X#define UP 1
X#define LOWER 2
X#define UPPER 3
X#define FORWARD 4
X#define BACKWARD 5
X
X#define TROFFRESOLUTION 432
X
X#define SPECIAL /* define if you want to supports special directives */
X#define FORM /* define if you want the forms facility */
X
XFILE *diagFile;
X
X#ifdef DEBUG
X#define DBP(x) if (diagFile) dprintf x
Xextern dprintf();
X#else
X#define DBP(x)
X#endif
X
Xtypedef int(*FUNC)();
X
X#define FNULL (FUNC) NULL
X
Xstruct troff2befont {
X short t2b_font; /* font (troff nomenclature) S=don't change */
X short t2b_xc; /* X-shift */
X short t2b_yc; /* Y-shift */
X short t2b_scale; /* point size scale adjust */
X char *t2b_charseq; /* character sequence - may include PS */
X};
X
Xstruct cattab {
X char *ch_name;
X char ch_set;
X unsigned char ch_catidx;
X unsigned char ch_wididx;
X unsigned char ch_info; /* used by some auxiliary programs */
X char *ch_desc;
X};
X
Xstruct backend {
X char *bename;
X FUNC beprolog,
X beepilog,
X beputchar,
X bepage,
X befontsel, /* special function F */
X beoverlay, /* special function O */
X bepassthru, /* special function P */
X bexlat, /* Xlate function */
X bedraw; /* Ditroff draw emulation routine */
X struct troff2befont
X *bestdfont, /* standard font translate table */
X *besymfont; /* symbol font translate table */
X};
X
X#define MAXFONTS 50
X
Xstruct fonttable {
X char *tab[4];
X long flags;
X#ifdef INCR
X struct downmaps *map;
X#endif
X#ifdef OPT
X char *widthtable;
X#endif
X};
X
X/* Symbolic names for tab entries in fonttable */
X#define troffName tab[0] /* troff name */
X#define fontName tab[1] /* back-end name (if used) */
X#define fontSeq tab[2] /* sequence to emit to shift to it
X lj builtin's mostly */
X
X/* fontFlags is 16 characters that reflect the state of the font
X at a particular pointsize - mainly for lj */
X
X/* Use of flags:
X s: unloaded SFP
X S: loaded SFP
X p: unloaded PK
X P: loaded PK
X n: non-existant
X b: builtin.
X */
X#define fontFlags tab[3]
X
X
X
Xextern struct fonttable fonttable[MAXFONTS+1];
Xextern struct fonttable *xlatetable[8];
X
Xstruct backend *be;
X#define BNULL (struct backend *) NULL
X
Xextern char *skipblanks();
X
X/* Common Back-end definitions */
X
X#define N (unsigned char) (0xff) /* Use standard font */
X#define S (unsigned char) (0xfe) /* Use symbol font */
X#define D (unsigned char) (0xfd) /* Draw macro exists - use string directly */
X#define NTC (unsigned char) (0xfc) /* No font/Special flag */
X
X#define NOC NULL
X
Xextern int currentPage;
Xextern int pageoffset;
Xextern int pageyoffset;
Xextern int pagelength;
Xextern int pagePending;
X
X#ifdef OPT
Xextern char *widthtables;
Xextern char *widthptr;
Xextern int optimize;
X#endif
X
Xextern int lastFont, lastPoints;
Xextern int lastYPos, lastXPos, specXPos, specYPos;
Xextern char *progname, *printer, *device;
Xextern char **prologs;
X
Xint metrics;
X
XFILE *libopen();
X
X/* Encoding format for generating width tables from font files */
X/* Used by pk2ditwid and friends */
Xstruct enctab {
X char *e_name;
X char *e_seq;
X char e_wid;
X};
X
X/* Points in an inch */
X#define POINT 72.27
X
X#define min(a,b) ((a) < (b) ? (a) : (b))
X#define max(a,b) ((a) > (b) ? (a) : (b))
X
X/* debug flags */
X#define D_CAT 1
X#define D_SPEC 2
X#define D_CHAR 4
X#define D_FONT 8
X#define D_BEND 0x10
X#define D_PK 0x20
X#define D_VERB 0x40
X
Xextern int debug;
X
Xextern char username[];
X
Xextern char *mustmalloc();
X
Xextern char *version, *shortversion;
X
X#ifdef ALONE
X#undef PARTIAL
X#undef INCR
X#endif
END_OF_FILE
if test 10777 -ne `wc -c <'defs.h'`; then
echo shar: \"'defs.h'\" unpacked with wrong size!
fi
# end of 'defs.h'
fi
if test -f 'lib/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lib/Makefile'\"
else
echo shar: Extracting \"'lib/Makefile'\" \(363 characters\)
sed "s/^X//" >'lib/Makefile' <<'END_OF_FILE'
X#2.1 90/07/18
X
Xinclude ../makeincl
X
XLIBS = confid.ps lethead.ps \
X dj.fonts dj.lib \
X dt.fonts \
X jt.fonts \
X lj.fonts lj.lib \
X ps.fonts ps.lib \
X psrofflib
X
Xall: subst.done $(LIBS)
X
Xsubst.done: ../makeincl ../sedscript
X rm -f psrofflib
X touch subst.done
X
Xclean:
X rm -f psrofflib
X
Xinstall:
X cd $(LIBDIR)/lib ; rm -f $(LIBS)
X cp $(LIBS) $(LIBDIR)/lib
END_OF_FILE
if test 363 -ne `wc -c <'lib/Makefile'`; then
echo shar: \"'lib/Makefile'\" unpacked with wrong size!
fi
# end of 'lib/Makefile'
fi
if test -f 'utils.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'utils.c'\"
else
echo shar: Extracting \"'utils.c'\" \(9576 characters\)
sed "s/^X//" >'utils.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: utils.c
X Author: Chris Lewis
X Specs: Utility functions
X */
X
X#include "defs.h"
X
X#ifndef lint
Xstatic char SCCSid[] =
X "@(#)utils.c: 2.3 Copyright 90/10/24 13:37:08 Chris Lewis";
X#endif
X
Xextern struct cattab tabN[], tabS[];
X
Xint lastFont, lastPoints;
Xint lastYPos, lastXPos;
X
Xextern char *malloc();
X
Xchar *skipblanks(p)
Xregister char *p; {
X while (*p && isspace(*p)) p++;
X return(p);
X}
X
Xchar *gettok(p, bp)
Xregister char *p, *bp; {
X p = skipblanks(p);
X while(*p && !isspace(*p)) *bp++ = *p++;
X *bp = '\0';
X return(p);
X}
X
Xinterp(buf, xlator, suf)
Xchar *buf, *suf; FUNC xlator; {
X register char *p;
X char token[512];
X p = gettok(buf, token);
X if (0 == strcmp(token, "include") || 0 == strcmp(token, "binclude")) {
X int binary;
X FILE *inc;
X binary = (token[0] == 'b') ? 1: 0;
X p = gettok(p, token);
X DBP((D_SPEC, "Trying to include %s\n", token));
X if (!(inc = fopen(token, "r"))) {
X strcat(token, ".");
X strcat(token, suf);
X DBP((D_SPEC, "Trying to include %s\n", token));
X if (!(inc = fopen(token, "r"))) {
X char nbuf[512];
X if (token[0] != '/') {
X sprintf(nbuf, "%s/%s", LIBDIR, token);
X DBP((D_SPEC, "Trying to include %s\n", nbuf));
X inc = fopen(nbuf, "r");
X }
X }
X }
X if (!inc) {
X fprintf(stderr, "%s: cannot open file %s\n", progname, token);
X exit(1);
X } else {
X DBP((D_SPEC, "Successfull include\n"));
X if (binary || !xlator)
X while ((binary = fread(token, 1, sizeof(token), inc)) > 0)
X fwrite(token, 1, binary, stdout);
X else
X (*xlator)(inc);
X fclose(inc);
X }
X }
X
X else {
X fprintf(stderr, "%s: unknown directive: %s\n", progname, token);
X exit(1);
X }
X}
X
Xchar nodename[25];
Xgetnodename() {
X FILE *uuname;
X if ((uuname = popen(NODECMD, "r")) == NULL)
X strcpy(nodename, "<noname>");
X else {
X fscanf(uuname, "%s", nodename);
X if (pclose(uuname))
X strcpy(nodename, "<noname>");
X }
X}
X
Xstruct fonttable fonttable[MAXFONTS+1];
Xstruct fonttable *xlatetable[8];
X
X#define READFONT 0
X#define READNORM 1
X#define READSYMB 2
X
Xloadfont(normfont, symfont)
Xstruct troff2befont *normfont, *symfont; {
X
X char buffer[BUFSIZ];
X char buf[6][64];
X int tableindex;
X int state, i, count;
X register char *first;
X extern int atoi();
X struct cattab *tab;
X struct troff2befont *otab;
X int done;
X
X FILE *fontfile;
X
X for (tableindex = 0; tableindex < 8; tableindex++) {
X xlatetable[tableindex] = &fonttable[tableindex];
X }
X
X fontfile = libopen(printer, "fonts");
X
X tableindex = 0;
X
X state = READFONT;
X
X while(fgets(buffer, sizeof(buffer), fontfile)) {
X
X first = buffer;
X
X for(;*first && isspace(*first); first++);
X
X if (!*first || *first == '#')
X continue;
X
X switch(count = sscanf(first, "%s%s%s%s%s%s",
X buf[0], buf[1], buf[2], buf[3], buf[4], buf[5])) {
X case 1: buf[1][0] = '\0';
X case 2: buf[2][0] = '\0';
X case 3: buf[3][0] = '\0';
X case 4: buf[4][0] = '\0';
X case 5: buf[5][0] = '\0';
X case 6:
X if (strcmp(buf[0], "normal") == 0) {
X state = READNORM;
X break;
X } else if (strcmp(buf[0], "symbol") == 0) {
X state = READSYMB;
X break;
X }
X switch(state) {
X case READFONT:
X if (tableindex == MAXFONTS) {
X fprintf(stderr, "%s: Too many fonts for %s!\n",
X progname, printer);
X exit(1);
X }
X for(i = 0; i < 4; i++) {
X first = mustmalloc(strlen(buf[i])+1,
X "fonttable");
X strcpy(first, buf[i]);
X fonttable[tableindex].tab[i] = first;
X }
X#ifdef OPT
X fonttable[tableindex].widthtable = (char *) NULL;
X#endif
X tableindex++;
X break;
X case READNORM: case READSYMB:
X done = 0;
X if (count <= 1) {
X fprintf(stderr, "%s: bad font.%s line: %s\n",
X progname, printer, buffer);
X exit(1);
X }
X tab = (state == READNORM) ? tabN : tabS;
X otab = (state == READNORM) ? normfont : symfont;
X for (i = 0; tab[i].ch_name; i++) {
X if (strcmp(tab[i].ch_name, buf[0]) == 0) {
X switch(buf[1][0]) {
X case 'N':
X otab[i].t2b_font = N; break;
X case 'S':
X otab[i].t2b_font = S; break;
X case 'D':
X otab[i].t2b_font = D; break;
X case '0':
X case '1':
X case '2':
X case '3':
X case '4':
X case '5':
X case '6':
X case '7':
X case '8':
X case '9':
X otab[i].t2b_font = atoi(buf[1]);
X break;
X default:
X fprintf(stderr, "%s: bad font in %s\n",
X progname, buffer);
X exit(1);
X }
X switch(count) {
X case 6:
X otab[i].t2b_scale = atoi(buf[5]);
X case 5:
X otab[i].t2b_yc = atoi(buf[4]);
X case 4:
X otab[i].t2b_xc = atoi(buf[3]);
X case 3:
X octdecode(buf[2]);
X first = mustmalloc(strlen(buf[2]) + 1,
X "fonttable");
X strcpy(first, buf[2]);
X otab[i].t2b_charseq = first;
X }
X done = 1;
X break;
X }
X }
X if (!done) {
X fprintf(stderr, "%s: couldn't apply fonts.%s: %s\n",
X progname, printer, buffer);
X exit(1);
X }
X }
X }
X }
X fclose(fontfile);
X#ifdef OPT
X loadwidth(xlatetable[0]);
X loadwidth(xlatetable[1]);
X loadwidth(xlatetable[2]);
X loadwidth(xlatetable[3]);
X#endif
X}
X
X/* Translate any octal escapes *inplace* */
Xoctdecode(str)
Xregister char *str; {
X register char *from, *to;
X int tmp, i;
X from = to = str;
X while(*from) {
X if (*from != '\\')
X *to++ = *from++;
X else {
X tmp = 0;
X from++;
X i = 3;
X while(i-- > 0 && *from && *from >= '0' && *from <= '7')
X tmp = (tmp << 3) + *from++ - '0';
X *to++ = tmp&0xff;
X }
X }
X *to++ = '\0';
X}
X
X
Xdumpsequence(sequence)
Xregister char *sequence; {
X printf("\t");
X for(;*sequence;sequence++)
X if (isascii(*sequence) && isprint(*sequence))
X printf("%c", *sequence);
X else
X printf("\\%03o", (*sequence)&0xff);
X}
X
Xdumpline(name, tp)
Xregister char *name;
Xregister struct troff2befont *tp; {
X if (name != NOC) {
X printf("%s\t", name);
X switch(tp->t2b_font) {
X case N: printf("N"); break;
X case S: printf("S"); break;
X case D: printf("D"); break;
X default: printf("%d", tp->t2b_font); break;
X }
X dumpsequence(tp->t2b_charseq);
X printf("\t%d\t%d\t%d", tp->t2b_xc, tp->t2b_yc, tp->t2b_scale);
X printf("\n");
X }
X}
X
Xdumplist(namelist, tp)
Xregister struct cattab *namelist;
Xregister struct troff2befont *tp; {
X register int i;
X for (i = 0; namelist[i].ch_name && namelist[i].ch_catidx != NTC;
X i++, tp++) {
X if (strlen(namelist[i].ch_name) == 0)
X continue;
X if (strcmp(namelist[i].ch_name, "hy") == 0)
X dumpline("-", tp);
X dumpline(namelist[i].ch_name, tp);
X }
X}
X
Xdumptables(bep)
Xstruct backend *bep; {
X if (!bep) {
X fprintf(stderr, "%s: no backend selected for table dump\n", progname);
X exit(1);
X }
X printf("normal\n");
X dumplist(tabN, bep->bestdfont);
X printf("symbol\n");
X dumplist(tabS, bep->besymfont);
X}
X
XFontSel(from, to)
Xchar from, *to; {
X#ifdef DEBUG
X register int i;
X#endif
X register struct fonttable *p;
X DBP((D_SPEC, "FontSel: %c -> %s\n", from, to));
X if (from < '1' || from > '8') {
X fprintf(stderr, "Bad arguments to FontSel: %c %s\n", from, to);
X return;
X }
X
X for (p = fonttable; p->troffName; p++)
X if (strcmp(p->troffName, to) == 0) {
X xlatetable[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 OPT
X if (p->troffName && !p->widthtable)
X loadwidth(p);
X#endif
X
X#ifdef DEBUG
X for (i = 0; i < 8; i++)
X DBP((D_SPEC, "Font %d->%s\n", i+1, xlatetable[i]->fontName));
X#endif
X}
X
XFILE *libopen(pref, suf)
Xregister char *pref, *suf; {
X
X register char *buffer = mustmalloc(strlen(LIBDIR) + 50, "libopen");
X register FILE *library;
X
X sprintf(buffer, "%s.%s", pref, suf);
X if ((library = fopen(buffer, "r")) == NULL) {
X sprintf(buffer, "lib/%s.%s", pref, suf);
X if ((library = fopen(buffer, "r")) == NULL) {
X sprintf(buffer, "%s/%s.%s", LIBDIR, pref, suf);
X if ((library = fopen(buffer, "r")) == NULL) {
X fprintf(stderr, "Cannot find %s.%s in . or lib or %s\n", pref, suf,
X LIBDIR);
X exit(1);
X }
X }
X }
X free(buffer);
X return(library);
X}
X
XresetState() {
X lastFont = -1;
X lastPoints = -1;
X lastYPos = -1;
X lastXPos = -1;
X}
X
Xdoprologs() {
X if (!prologs)
X return;
X while(*prologs)
X dospecial(*prologs++);
X}
X
X#ifdef OPT
Xloadwidth(p)
Xstruct fonttable *p; {
X FILE *f;
X int c;
X if ((int) p->widthtable == 1)
X return;
X p->widthtable = mustmalloc(224, "widthtable");
X strcpy(widthptr, "ft");
X strcat(widthptr, p->troffName);
X DBP((D_SPEC, "Attempting to read font file %s\n", widthtables));
X if (f = fopen(widthtables, "r")) {
X for (c = 0; c < HEADERSIZE; c++) getc(f);
X if (224 != fread(p->widthtable, 1, 224, f)) {
X fprintf(stderr, "%s: badly formed width table %s\n",
X progname, widthtables);
X free(p->widthtable);
X p->widthtable = (char *) 1;
X DBP((D_SPEC, "Load of %s failed\n", widthtables));
X } else {
X for (c = 0; c < 224; c++)
X p->widthtable[c] &= 0x3f;
X DBP((D_SPEC, "Load of %s succeeded\n", widthtables));
X }
X } else {
X DBP((D_SPEC, "Failed to open widthtable %s\n", widthtables));
X free(p->widthtable);
X p->widthtable = (char *) 1;
X }
X}
X#endif
X
X#ifdef NULLCHECK
Xmab() {
X fprintf(stderr, "KABOOM\n");
X abort();
X}
X#endif
END_OF_FILE
if test 9576 -ne `wc -c <'utils.c'`; then
echo shar: \"'utils.c'\" unpacked with wrong size!
fi
# end of 'utils.c'
fi
if test -f 'utils/calcfonts.S' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'utils/calcfonts.S'\"
else
echo shar: Extracting \"'utils/calcfonts.S'\" \(9988 characters\)
sed "s/^X//" >'utils/calcfonts.S' <<'END_OF_FILE'
X#!/usr/bin/perl
Xeval "exec /usr/bin/perl -S $0 $*"
X if $running_under_some_shell;
X#Copyright 1990/07/18 Chris Lewis 2.1
X
X# Set to path of sfp2pk if you have it, otherwise NULL.
X$sfp2pk = '';
X# Threshold for acceptable point sizes (default 10%).
X$thresh = 1.1;
X# Place to build new fonts
X$newfonts = "/tmp/newfonts";
X# You might also want to adjust the "do gen"'s at the end.
X
X# Don't touch from here on.
X$basedir = `pwd`;
Xchop($basedir);
X at pointlist = (6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36);
X$verbose = 0;
X$dirlist = '';
X# If non-null, each font matching this pattern not needed to
X# build a particular size will be DELETED.
X$discardpat = "";
X
X$oldname = '';
X
Xsub discard {
X local($file) = $_[0];
X if ($discard && $file =~ $discardpat) {
X unlink($file);
X printf DISCARD ("deleted %s\n", $file);
X }
X}
X
Xsub gen {
X local($outf, $engname, $escape, $outtype) = ($_[0], $_[1], $_[2], $_[3]);
X if ($sfontonly && $outf ne 'S') {
X return;
X }
X @namelist = @_;
X shift(namelist);
X shift(namelist);
X shift(namelist);
X shift(namelist);
X unlink("$outf.build");
X foreach $pointsize (@pointlist) {
X $found[$pointsize] = 0;
X $missing = '';
X $cmdline = "$basedir/pk2sfp -m \\\n";
X $usedfonts = '';
X $looklist = '';
X for ($i = 0; $i <= $#namelist; $i++) {
X ($rnamelist, $map) = split(/\//, $namelist[$i]);
X $best = '';
X $bestratio = 1000;
X $tmplist = '';
X
X @alternates = split(/,/, $rnamelist);
X foreach $rname (@alternates) {
X $ratio = $ratios{$rname, $pointsize};
X if (!$ratio) {
X $looked = "$rname(notfound)";
X } else {
X ($np, $size) = split(/ /, $table{$rname, $pointsize});
X #$looked = sprintf("$rname$np.$size(%.2f)", $ratio);
X $looked = sprintf("%s(%.2f)", $path{$rname, $pointsize},
X $ratio);
X if ($ratio && $ratio <= $bestratio) {
X $best = $rname;
X $bestratio = $ratio;
X $bestentry = $looked;
X }
X }
X $looklist .= "$looked\n";
X $tmplist .= "$looked ";
X }
X if ($best && $bestratio <= $thresh) {
X $usedfonts .= "$bestentry\n";
X $tdir = $path{$best, $pointsize};
X if (!$map) {
X $map = $best;
X if (! -r "$md/$map.$outtype") {
X $map = $alternates[0];
X }
X }
X if (! -r "$md/$map.$outtype") {
X $missing .= sprintf("Map file $map (for entry %s)\n",
X $namelist[$i]);
X }
X $cmdline .= "\t$md/$map.$outtype $tdir\\\n";
X } else {
X $missing .= "($tmplist) ";
X }
X }
X if ($missing) {
X chop($missing);
X printf STDERR ("Missing $missing, won't generate $outf at $pointsize\n");
X printf STDERR ("Acceptable ones: $usedfonts\n");
X } else {
X $cmdline .= "\t\t> t";
X $found[$pointsize] = 1;
X chop($usedfonts);
X printf STDERR ("Generating $outf at $pointsize using $usedfonts\n");
X if (system($cmdline)) {
X printf STDERR ("failed ($!) $cmdline\n");
X exit(1);
X }
X if (system("$basedir/pk2sfp t > $newfonts/$outf.$pointsize.sfp")) {
X printf STDERR ("pk2sfp sort to build $outf.$pointsize.sfp failed\n");
X exit(1);
X }
X unlink('t');
X if ($sfp2pk) {
X if (system("$sfp2pk < $newfonts/$outf.$pointsize.sfp " .
X "> $newfonts/$outf.$pointsize.pk")) {
X printf STDERR ("sfp2pk < $outf.$pointsize.sfp failed\n");
X exit(1);
X }
X unlink("$newfonts/$outf.$pointsize.sfp");
X }
X close(GEN);
X }
X }
X open(TABLE, ">>lj.fonts.new");
X# The second field can be truncated, but none of the others.
X#HI Helvetica-Italic \033(8U\033(s1p1s-3b04T nnnnpnnnnnnnnnn
X#HB Helvetica-Bold \033(8U\033(s1p0s03b04T nnnnnnnnnnnnnnn
X printf TABLE ("%-2s %-16.16s %-23s ", $outf, $engname, $escape);
X foreach $pointsize (@pointlist) {
X if ($found[$pointsize]) {
X if ($sfp2pk) {
X printf TABLE 'p';
X } else {
X printf TABLE 's';
X }
X } else {
X printf TABLE 'n';
X }
X }
X printf TABLE "\n";
X close(TABLE);
X}
Xsub findcomplete {
X foreach $name (sort keys(listofnames)) {
X $complete{$name} = 0;
X foreach $p (@pointlist) {
X if ($ratios{$name, $p} <= $thresh) {
X $complete{$name}++;
X next;
X }
X }
X }
X foreach $name (sort keys(listofnames)) {
X printf STDERR ("I have %d reasonable sizes of %s\n", $complete{$name},
X $name);
X }
X}
X
X
Xsub dumplist {
X foreach $name (sort keys(listofnames)) {
X foreach $p (@pointlist) {
X ($rp, $rs) = split(/ /, $table{$name, $p});
X printf STDERR ("%-8s %4d %4d %4d %4.4g%% %s\n",
X $name, $p, $rp, $rs, (1 - $ratios{$name,$p}) * 100,
X $path{$name, $p});
X }
X }
X}
X
Xwhile($arg = shift(@ARGV)) {
X if ($arg eq '-v') {
X $verbose = 1;
X } elsif ($arg =~ /-S/) {
X $sfontonly = 1;
X } elsif ($arg =~ /^-D(.*)/) {
X $basedir = $1;
X } elsif ($arg =~ /^-s(.*)/) {
X $sfp2pk = $1;
X } elsif ($arg =~ /^-f(.*)/) {
X $newfonts = $1;
X } elsif ($arg !~ /^-/) {
X if (-d $arg) {
X $dirlist = "$dirlist $arg";
X } else {
X printf STDERR ("No directory %s, skipping\n", $arg);
X }
X } else {
X printf STDERR ("calcfonts: bad option %s\n", $arg);
X exit(1);
X }
X}
X
Xif ($sfp2pk && ! -x $sfp2pk) {
X printf STDERR
X ("sfp2pk ($sfp2pk) not found - will generate SFP's not PK's\n");
X $sfp2pk = '';
X}
X
Xif (!$dirlist) {
X printf STDERR ("No directories to search - aborting\n");
X exit(0);
X}
X
X$md = "$basedir/maps";
X$dirlist = "$basedir/fonts $dirlist";
X
Xunlink("$basedir/lj.fonts.new");
Xunlink("discard");
Xopen(DISCARD, ">discard");
X
X$cmdline =
X "find $dirlist -type f '(' -name '*pk' -o -name '*.sfp' ')' -print";
Xprintf STDERR ("Commandline: $cmdline\n");
Xopen(INLIST, "$cmdline|") || die "Cannot start $cmdline\n";
X
Xwhile(<INLIST>) {
X chop;
X #/([a-z]+)([0-9]+)\s*:\s*(.*)/;
X $path = $_;
X if (/^\S+\/([a-z]+)([0-9]+)\.([0-9]+)pk/) {
X $name = $1;
X $points = $2;
X $size = $3;
X } elsif (/^\S+\/[a-z]+([0-9]+)\/([a-z]+)([0-9]+)\.pk/) {
X $size = $1;
X $name = $2;
X $points = $3;
X } elsif (/^\S+\/([a-z]+)([0-9]+)\.pk/) {
X $size = 300;
X $name = $1;
X $points = $2;
X } elsif (/^\S+\/([a-z]+)([0-9]+)\.sfp/) {
X $size = 300;
X $name = $1;
X $points = $2;
X } else {
X printf STDERR ("Skipping %s\n", $path);
X do discard($path);
X next;
X }
X $listofnames{$name} = 1;
X $actpoints = $points * $size / 300;
X#printf("path: $path, name: $name, points: $points");
X#printf(" size: $size, actpoints: $actpoints\n");
X $foundany = 0;
X foreach $needpoint (@pointlist) {
X $ratio = $actpoints / $needpoint;
X if ($ratio < 1) {
X $ratio = 1 / $ratio;
X }
X#printf("ratio: (to get %d) %.2f\n", $needpoint, $ratio);
X if ($ratios{$name, $needpoint} eq '') {
X $ratios{$name, $needpoint} = 100;
X }
X
X if ($ratio <= $ratios{$name, $needpoint}) {
X $ratios{$name, $needpoint} = $ratio;
X $table{$name, $needpoint} = "$points $size";
X $refcnt{$path}++;
X if ($path{$name, $needpoint}) {
X $opath = $path{$name, $needpoint};
X $refcnt{$opath}--;
X if ($refcnt{$opath} == 0) {
X printf DISCARD "%s\n", $opath;
X do discard($opath);
X }
X }
X $path{$name, $needpoint} = $path;
X $foundany++;
X }
X }
X if (!$foundany) {
X do discard($path);
X printf DISCARD "%s\n", $path;
X }
X}
X
Xif ($verbose) {
X do findcomplete();
X do dumplist();
X}
X
X# Example of do gen call:
X# do gen(
X# 'R', Cat Troff name
X# 'Times-Roman', English name (useful only in debugging)
X# '\033(8U\033(s1p0s00b05T', Escape to emit if not present or builtin
X# 'ROMAN8', map suffix to use.
X# 'cmr,jmr', a font entry
X# 'cmsy,jmsy', a font entry
X# 'cmti,jmti', a font entry
X# 'cmtrf,jmtrf'); a font entry
X#
X# There can be any number of font entries, and it is of the following
X# generalized form:
X#
X# <font>,<font>,<font>..../<map prefix>
X#
X# Where: the list of fonts is a comma-separated list of
X# PK/SFP font name prefixes of fonts that would be acceptable
X# for merging with the other font entries to build the CAT font.
X# A font with that prefix closest to each desired point size will
X# be the one selected. In case of ties, the later one wins in the
X# list. The map prefix (along with the suffix) is used to select
X# which merge control file to use. See pk2sfp and utils/maps.
X# If omitted, the map prefix will default to the font prefix that
X# it used if present. If not present, it will default to the first
X# font prefix.
X# See LASERFONTS if you want more information on what the heck this
X# junk is doing.
X
Xdo gen('R', 'Times-Roman', '\033(8U\033(s1p0s00b05T', 'ROMAN8',
X 'cmr,jmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('I', 'Times-Italic', '\033(8U\033(s1p1s-3b05T', 'ROMAN8',
X 'cmsl,jmsl/cmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('B', 'Times-Bold', '\033(8U\033(s1p0s03b05T', 'ROMAN8',
X 'cmbx,jmbx/cmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
X# Shipped with psroff (as PK's):
Xdo gen('S', 'Symbol', '\033(8M\033(s1p0s00b05T', 'MATH8',
X 'cmr,jmr', 'cmsy,jmsy', 'cmmi,jmmi', 'cmtrf,jmtrf');
X
Xdo gen('C', 'Courier', '\033(8U\033(s0p0s00b03T', 'ROMAN8',
X 'cmtt,cmvtt,jmtt/cmtt', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('CI', 'Courier-Italic', '\033(8U\033(s1p1s-3b03T', 'ROMAN8',
X 'cmit,cmsltt,jmit,jmsltt/cmtt', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('H', 'Helvetica', '\033(8U\033(s1p0s00b04T', 'ROMAN8',
X 'cmss,lcmss,jmss/cmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('HI', 'Helvetica-Italic', '\033(8U\033(s1p1s-3b04T', 'ROMAN8',
X 'cmssi,lcmssi,jmssi/cmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('HB', 'Helvetica-Bold', '\033(8U\033(s1p0s03b04T', 'ROMAN8',
X 'cmssb,lcmssb,jmssbx/cmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('E', 'English', '\033(8U\033(s1p0s00b05T', 'ROMAN8',
X 'eufm/alnum', 'cmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
Xdo gen('EB', 'English-Bold', '\033(8U\033(s1p0s00b05T', 'ROMAN8',
X 'eufb/alnum', 'cmr', 'cmsy,jmsy', 'cmti,jmti', 'cmtrf,jmtrf');
X
X#"CI", "Courier-Italic", "\033(8U\033(s0p1s-3b03T", "ROMAN8",
X#"CB", "Courier-Bold", "\033(8U\033(s0p0s03b03T", "ROMAN8",
X#"L", "LinePrinter", "\033(8U\033(s0p0s00b00T", "ROMAN8",
X#"LI", "LinePrinter-Ital", "\033(8U\033(s0p1s-3b00T", "ROMAN8",
X#"LB", "LinePrinter-Bold", "\033(8U\033(s0p0s03b00T", "ROMAN8",
END_OF_FILE
if test 9988 -ne `wc -c <'utils/calcfonts.S'`; then
echo shar: \"'utils/calcfonts.S'\" unpacked with wrong size!
fi
# end of 'utils/calcfonts.S'
fi
echo shar: End of archive 7 \(of 16\).
cp /dev/null ark7isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 16 archives.
echo "Read the README to get started with psroff installation"
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still must unpack the following archives:
echo " " ${MISSING}
fi
exit 0
--
Chris Lewis, Phone: TBA
UUCP: uunet!utai!lsuc!ecicrl!clewis
Moderator of the Ferret Mailing List (ferret-request at eci386)
Psroff mailing list (psroff-request at eci386)
More information about the Alt.sources
mailing list