diff options
Diffstat (limited to 'Build/source/texk/dvipsk/contrib/MakeTeXPK.pl')
-rw-r--r-- | Build/source/texk/dvipsk/contrib/MakeTeXPK.pl | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/Build/source/texk/dvipsk/contrib/MakeTeXPK.pl b/Build/source/texk/dvipsk/contrib/MakeTeXPK.pl new file mode 100644 index 00000000000..5e0b8dd5b3d --- /dev/null +++ b/Build/source/texk/dvipsk/contrib/MakeTeXPK.pl @@ -0,0 +1,198 @@ +#!/usr/local/bin/perl +# +# MakeTeXPK.pl +# +# v1.0 - modified by John Stoffel (john@wpi.wpi.edu) from the original +# shell script written by Tomas Rokicki (rokicki@cs.stanford.edu). +# please feel free to make any modifications you would like to this +# script, but please acknowledge myself and tom when you make +# changes. +# +# - This was orignally modified to write the fonts to a seperate +# directory because the fonts were stored on a read-only NFS +# server. New fonts were then stored in a second location that +# was world writeable, so fonts could be created automatically. +# +# 1. checks both directories before hand for the font's existence. +# 2. creates the font, then moves it to the writeable directory. +# 3. changes the ownership and protection so users can't write +# the font directly. +# +# - this script should NOT be used directly, but run through +# suidscript.pl first and then used as directed. +# +# todo: +# - add automagic support for write-white and write-black printers. +# now I have two seperate version of the same program. This would +# mean adding in either a new parameter, or possibly a -w or -b +# switch. Default could be customizable. What do you think tom? +# +# - cleanup the code a little more and write it in better perl. +# +# ------------------------------------------------------------------------ +# +# This script file makes a new TeX PK font, because one wasn't +# found. Parameters are: +# +# name dpi bdpi magnification [[mode] subdir] +# +# `name' is the name of the font, such as `cmr10'. `dpi' is +# the resolution the font is needed at. `bdpi' is the base +# resolution, useful for figuring out the mode to make the font +# in. `magnification' is a string to pass to MF as the +# magnification. `mode', if supplied, is the mode to use. +# +# Note that this file must execute Metafont, and then gftopk, +# and place the result in the correct location for the PostScript +# driver to find it subsequently. If this doesn't work, it will +# be evident because MF will be invoked over and over again. +# +# Of course, it needs to be set up for your site. +# +# ------------------------------------------------------------------------- + +# setup the environment variables before hand. + +$ENV{'PATH'} = '/bin:/usr/bin:/usr/ucb:/usr/local/bin'; +$ENV{'SHELL'} = '/bin/sh' if $ENV{'SHELL'} ne ''; +$ENV{'IFS'} = '' if $ENV{'IFS'} ne ''; +$path = $ENV{'PATH'}; +umask(0022); + +# set who the owner and group of the created fonts will be. + +$OWNER = "root.tex"; + +# check number of arguements. + +die "Not enough arguments!\n" if ($#ARGV < 3); + +# make sure the user doesn't try to give us any control characters as +# as arguements. + +$NAME=&untaint($ARGV[0]); +$DPI=&untaint($ARGV[1]); +$BDPI=&untaint($ARGV[2]); +$MAG=&untaint($ARGV[3]); +$MODE=&untaint($ARGV[4]) if (defined($ARGV[4])); +$PK=&untaint($ARGV[5]) if (defined($ARGV[5])); + +# texdir and local dir can be the same if $TEXDIR is world writeable, or +# different if $TEXDIR is read-only and $LOCALDIR is read-write. + +$TEXDIR="/usr/local/lib/tex"; +$LOCALDIR="/shared/tex/fonts"; +$DESTDIR="$LOCALDIR/white/pk"; + +# TEMPDIR needs to be unique for each process because of the possibility +# of simultaneous processes running this script. + +if ($TMPDIR eq '') { + $TEMPDIR="/tmp/mtpk.$$"; + } +else { + $TEMPDIR="$TMPDIR/mtpk.$$"; + } + +if ($MODE eq "") { + if ($BDPI eq "300") { $MODE='imagen'; } + elsif ($BDPI eq "200") { $MODE='FAX'; } + elsif ($BDPI eq "360") { $MODE='nextII'; } + elsif ($BDPI eq "400") { $MODE='nexthi'; } + elsif ($BDPI eq "100") { $MODE='nextscreen'; } + elsif ($BDPI eq "635") { $MODE='linolo'; } + elsif ($BDPI eq "1270") { $MODE='linohi'; } + elsif ($BDPI eq "2540") { $MODE='linosuper'; } + else { + die "I don't know the $MODE for $BDPI\nHave your system admin update MakeTeXPK.pl\n" + } +} + +# Something like the following is useful at some sites. +# DESTDIR=/usr/local/lib/tex/fonts/pk.$MODE + +$GFNAME="$NAME.$DPI"."gf"; +$PKNAME="$NAME.$DPI"."pk"; + +# Clean up on normal or abnormal exit + +chdir("/") || die "Couldn't cd to /: $!\n"; + +if (-d $TEMPDIR) { + rmdir($TEMPDIR) || die "Couldn't remove $TEMPDIR: $!\n"; +} +if (-e "$DESTDIR/pktmp.$$") { + unlink("$DESTDIR/pktmp.$$") || die "Couldn't rm $DESTDIR/pktmp.$$: $!\n"; +} + +if (! -d $DESTDIR) { + mkdir($DESTDIR,0755) || die "Couldn't make $DESTDIR: $!\n"; +} + +if ($PK ne '') { + $DESTDIR = $DESTDIR . $PK; + if (! -d $DESTDIR) { + mkdir($DESTDIR,0755) || die "Couldn't make $DESTDIR: $!\n"; + } +} + +mkdir($TEMPDIR,0755) || die "Couldn't make $TEMPDIR: $!\n"; + +chdir($TEMPDIR) || die "Couldn't cd to $TEMPDIR: $!\n"; + +if (-e "$DESTDIR/$PKNAME") { + die "$DESTDIR/$PKNAME already exists!\n"; +} + +# check also in the standard place + +if ($PK eq '') { + if (-e "$TEXDIR/fonts/white/pk/$PKNAME") { + die "$TEXDIR/fonts/white/pk/$PKNAME already exists!\n"; + } + elsif (-e "$TEXDIR/fonts/white/pk/$PK$PKNAME") { + die "$TEXDIR/fonts/white/pk/$PK$PKNAME already exists!\n"; + } +} + +# print out the command string we will use, then actually do the command, +# printing it's results. + +print "mf \"\\mode:=$MODE; mag:=$MAG; scrollmode; input $NAME\" </dev/null\n"; +system("mf \"\\mode:=$MODE; mag:=$MAG; scrollmode; input $NAME\" </dev/null"); + +# check that $GFNAME was created correctly. + +if (! -e $GFNAME ) { die "Metafont failed for some reason on $GFNAME\n";} + +print `gftopk -v ./$GFNAME ./$PKNAME`; + +# Install the PK file carefully, since others may be doing the same +# as us simultaneously. + +`mv $PKNAME $DESTDIR/pktmp.$$`; +chdir($DESTDIR) || die "Couldn't cd to $DESTDIR: $!\n"; +`mv pktmp.$$ $PKNAME`; + +# now we want to make sure only proper people can change this new font. + +`/etc/chown $OWNER $PKNAME`; +`/bin/chmod 664 $PKNAME`; + +# this subroutine makes sure there are no funny control characters in +# the arguements that have been passed to the program. + +sub untaint { + local($temp) = @_; + $temp =~ /^([-\/\(\)\.\w]*)$/ || die "Invalid arguement: $temp\n"; + $temp = $1; + return($temp); +} + + + + + + + + |