diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/utilities/tfmpktest |
Initial commit
Diffstat (limited to 'fonts/utilities/tfmpktest')
-rw-r--r-- | fonts/utilities/tfmpktest/README | 9 | ||||
-rw-r--r-- | fonts/utilities/tfmpktest/tfmpktest.pl | 429 |
2 files changed, 438 insertions, 0 deletions
diff --git a/fonts/utilities/tfmpktest/README b/fonts/utilities/tfmpktest/README new file mode 100644 index 0000000000..79e7a491e4 --- /dev/null +++ b/fonts/utilities/tfmpktest/README @@ -0,0 +1,9 @@ + +TFMPKtest.pl + +tfmpktest.pl : control the checksum of pk font (use the tfm font). +Can delete bad pk font with checksum missmatch and recreate it +with mktexpk. Can also control TFM files by generating new TFM +with the MF files and mf. TFMPKtest.pl need pktype, tftopl and mf. + + diff --git a/fonts/utilities/tfmpktest/tfmpktest.pl b/fonts/utilities/tfmpktest/tfmpktest.pl new file mode 100644 index 0000000000..60d1165938 --- /dev/null +++ b/fonts/utilities/tfmpktest/tfmpktest.pl @@ -0,0 +1,429 @@ +#!/usr/local/bin/perl5 +# +# TFMPKtest.pl : control the checksum of pk font (use the tfm font). +# Can delete bad pk font with checksum missmatch and recreate it with mktexpk. +# Can also control TFM files by generating new TFM with the MF files and mf. +# TFMPKtest.pl need pktype, tftopl and mf. +# +# License: LaTeX Project Public License (lppl) +# (CTAN:/help/Catalogue/licenses.lppl.html) +# +# Dominique Larchey (e-mail: larchey@loria.fr web: http://www.loria.fr/~larchey) +# Denis Roegel (e-mail: roegel@loria.fr web: http://www.loria.fr/~roegel) +# Christian Rossi (e-mail: rossi@loria.fr web: http://www.loria.fr/~rossi) +# +# This perl script is on the web : http://www.loria.fr/~rossi/tfmpktest.pl +# +# (La)TEX Navigator (http://www.loria.fr/services/tex/) +# CTAN Navigator (http://ctan.loria.fr/) +# LORIA (http://www.loria.fr/) - Nancy - France +# 2000/07/08 + +# options + +use Getopt::Long; +GetOptions('dir=s',\@dir,'c!','control!','d!','del!','t!','tfm!','v!','verbose!','h!','help!'); + +# if -h or --h or -help or --help + +if (($opt_h) || ($opt_help)) + { + print "tfmpktest.pl v. 0.11 by DL/DR/CR - LORIA\n"; + print "Usage: tfmpktest.pl [OPTIONS] \n\n"; + print "--help for more information\n"; + print "--control control pkfont (default)\n"; + print "--del delete pkfont with checksum\n"; + print " mismatch and create the new pk\n"; + print "--tfm control TFM files\n"; + print "--dir DIR1 [, DIR2...] pk font directories\n"; + print "--verbose verbose\n"; + print "\n"; + print "TFMPKtest.pl : control the checksum of pk font (use the tfm font).\n"; + print "Can delete bad pk font with checksum missmatch and recreate it with mktexpk.\n"; + print "Can also control TFM files by generating new TFM with the MF files and mf.\n"; + print "TFMPKtest.pl need pktype and tftopl for pk control and TFM control need mf.\n"; + print "\n"; + exit; + } + +# pid for the logfile name +$pid = $$; +if (($opt_tfm) || ($opt_t)) + { + $logfile="/tmp/tfmtest." . $pid . ".log"; + } else + { + $logfile="/tmp/pktest." . $pid . ".log"; + } + +print "PKtest v0.1 by DL/DR/CR - LORIA\n\n"; +print "Logfile : $logfile \n"; + +open(LOGFILE,">$logfile"); + +# no buffer for the print command on the logfile and on stdout + +select(LOGFILE); +$| = 1; +select(STDOUT); +$| = 1; + +# dir for the tfm font +if (($opt_tfm) || ($opt_t)) + { + $testmkdir = mkdir("/tmp/tfmtest.$pid",0777); + if (! $testmkdir) { + print "Cannot mkdir /tmp/tfmtest.$pid\n"; + } + $currentpwd = `pwd`; + chdir("/tmp/tfmtest.$pid"); + } + +# test if -dir or --dir option for the pk font directories + +$numberofdir=@dir; + +# if no -dir use kpsewhich to find the font directories + +if ( $numberofdir == 0 ) + { + $vartexfonts=`kpsewhich -expand-var '\$VARTEXFONTS'`; + $texmf=`kpsewhich -expand-var '\$TEXMF'`; + $texmf =~ s/[{}!! \n]//g; + @dir_list = split(/,/,$texmf); + @new_dir_list = (); + + # add strings /fonts/pk to $TEXMF + + foreach $path (@dir_list) + { + if (($opt_tfm) || ($opt_t)) + { + $path = $path . "/fonts/tfm"; + } else + { + $path = $path . "/fonts/tk"; + } + @new_dir_list = (@new_dir_list,$path); + } + # add /pk to $vartexfonts + chop($vartexfonts); + $ext=pk; + if (($opt_tfm) || ($opt_t)) { + $ext=tfm; + } + @new_dir_list = ("$vartexfonts/$ext",@new_dir_list); + } +else + { + @new_dir_list = @dir; + } + +# main loop +foreach $path (@new_dir_list) + { + $dir = $path; + print "\nDirectory: $dir\n"; + print LOGFILE "\n\nDirectory: $dir\n\n"; + $numberfont = 0; + $notfm = 0; + $mismatch = 0; + $nodelete = 0; + $nbdifftfm = 0; + $mfnotfound = 0; + $newtfmnotok = 0; + # number of file + + open(LISTE,"du -a $dir|"); + # loop for each file or directory of du + while (<LISTE>) + { + # use only ligne with .pk at the end + if (($opt_tfm) || ($opt_t)) + { + if (/\.tfm$/) + { + $tab[$numberfont]=$_; + $numberfont = $numberfont + 1; + } + } + else { + if (/\..*pk$/) + { + $tab[$numberfont]=$_; + $numberfont = $numberfont + 1; + } + } + } + + print "Number of files: $numberfont \n"; + + # inc to use for the display of % + + $inc = $numberfont / 100; + $incint= int($inc) + 1; + + $i=0; + $j=0; + $val = 0; + print " 0% "; + + for ($indice=0; $indice < $numberfont ; $indice++) + { + $longname=$tab[$indice]; + ($block,$filename) = split(/\t/,$longname); + + # work only with the file *.pk or *.tfm + $tfm_test = (($opt_tfm) || ($opt_t)); + + if (((! $tfm_test) && ($filename =~ /\..*pk$/)) || (($tfm_test) && ($filename =~ /\.tfm$/))) + { + $i = $i + 1; + $res = $i % $incint; + # need to display the % ? + if (! $res) + { + $j= $j + 1; + $val = $j; + if (($val > 9) && ! (($val) % 10)) + { + print "\n"; + } + if ($val < 10) + {print " $val% ";} + else{ + print "$val% "; + } + } + + if ($tfm_test) + { + + &chk_font_tfm($filename); + + } else + { + $dpi=""; + $shortnamepk=""; + $fontname=""; + + @field=split(/\//,$filename); + + $numberfield=@field; + # name of printer + $previous=""; + foreach $n (reverse @field) { + if ($n eq pk) { + $printer=$previous; + } + $previous=$n; + } + # try to find dpi + $shortnamepk = $field[$numberfield - 1]; + split(/\//,$filename); + chop($shortnamepk); + ($fontname,$dpi)=split(/\./,$shortnamepk); + $dpi =~ s/pk//; + + if (! $dpi) + { + @dir=split(/\//,$longname); + $number = @dir; + $number = $number - 2; + $dpi=$dir[$number]; + $dpi =~ s/dpi//; + } + # now check each font + if ($dpi) + { + &chk_font_pk($shortnamepk,$fontname); + } + } + } + + } + # display the last % + for ($inc = $val + 1 ; $inc < 100; $inc++) { + if (($inc > 9) && ! (($inc) % 10)) + { + print "\n"; + } + if ($inc < 10) + { + print " $inc% "; + } + else + { + print "$inc% "; + } + } + # result of the check + print "100%\n"; + if ($tfm_test) + { + print "\n---> TFM font that differ: $nbdifftfm - MF file not found: $mfnotfound - TFM not generated: $newtfmnotok\n"; + print LOGFILE "\n---> TFM font that differ: $nbdifftfm - MF file not found: $mfnotfound - TFM not generated: $newtfmnotok\n"; + } else { + print "\n---> TFM font not found: $notfm - Checksum mismatch: $mismatch"; + print LOGFILE "\n---> TFM font not found: $notfm - checksum mismatch: $mismatch"; + if ($nodelete) + { + print " - Impossible delete: $nodelete\n"; + print LOGFILE " - Impossible delete: $nodelete\n"; + } else + { + print LOGFILE "\n"; + print "\n"; + } + } + } + +chdir("$currentpwd"); +print "\n"; +print "Logfile: $logfile \n"; +print LOGFILE "\n"; +print "\n"; + +#----------------------------------------------------------------------- +# chk_font_pk - test the Checksum of the pk and tfm files +# +#----------------------------------------------------------------------- + +sub chk_font_pk + { + + local($fontpk,$fonttfm); + + ($fontpk,$fonttfm) = @_; + + $chk_pk = `pktype $fontpk 2>/dev/null | grep Checksum`; + $chk_tfm = `tftopl $fonttfm 2>/dev/null | grep CHECKSUM`; + + $_ = $chk_pk; + /^Checksum = (.*)/; + $chk_pk = sprintf("0%lo", $1); + + $_ = $chk_tfm; + /^[^\d]*(\d*).*/; + $chk_tfm = sprintf("0%s", $1); + + if ($chk_pk != $chk_tfm) { + if ($chk_tfm == 0) + { + if (($opt_v == 1) || ($opt_verbose == 1)) + { + print "TFM file doesn't exist: $fonttfm.tfm\n"; + } + print LOGFILE "TFM file doesn't exist: $fonttfm.tfm \n"; + $notfm = $notfm + 1 ; + } + else + { + $bdpi=600; + if (($opt_d == 1) || ($opt_del == 1)) + { + chop($filename); + $testrm=unlink($filename); + if ($testrm) + { + if (($opt_v == 1) || ($opt_verbose == 1)) + { + print "Delete file: $filename \n"; + } + print LOGFILE "Delete file: $filename\n"; + $result=`mktexpk --mfmode $printer --bdpi $bdpi --mag ${dpi}/${bdpi} --dpi $dpi $fonttfm 2>&1`; + (($opt_v == 1) || ($opt_verbose == 1)) and print "$result\n"; + print LOGFILE "$result\n"; + } else + { + print LOGFILE "Impossible delete: $filename \n"; + $nodelete = $nodelete + 1; + if (($opt_v == 1) || ($opt_verbose == 1)) + { + print "Impossible delete: : $filename \n"; + } + } + } + else + { + $longfonttfm=`kpsewhich $fonttfm.tfm`; + chop($longfonttfm); + if (($opt_v == 1) || ($opt_verbose == 1)) + { + print "Cheksum missmatch: $shortnamepk and $longfonttfm \n"; + } + chop($filename); + print LOGFILE "Cheksum missmatch: $filename and $longfonttfm \n"; + } + $mismatch = $mismatch + 1; + } + + } + } + +#----------------------------------------------------------------------- +# chk_font_tfm - test the Checksum of the mf and tfm files +# +#----------------------------------------------------------------------- + +sub chk_font_tfm + { + + local($fonttfm); + ($fonttfm) = @_; + @field=split(/\//,$fonttfm); + $numberfield = @field; + $shortnametfm = $field[$numberfield - 1]; + ($name,$extfile) = split(/\./,$shortnametfm); + + $testkpse = system("kpsewhich $name.mf >/dev/null 2>&1"); + if (! $testkpse) + { + $resulttfm=`mf '\\mode=localfont;input $name' -interaction=nonstopmode 2>&1`; + if (-f "/tmp/tfmtest.$pid/$name.tfm") + { + if (($opt_v == 1) || ($opt_verbose == 1)) + { + #print "$resulttfm\n"; + } + #print LOGFILE "$resulttfm\n"; + chop($shortnametfm); + $usename = "/tmp/tfmtest." . $pid . "/" . $shortnametfm; + #$testdiff=system("cmp -s $usename $fonttfm");; + + if ($testdiff) + { + if (($opt_v == 1) || ($opt_verbose == 1)) + { + print "TFM file differ: $shortnametfm\n"; + } + + print LOGFILE "TFM file differ: $fonttfm"; + $nbdifftfm = $nbdifftfm + 1; + } + unlink("/tmp/tfmtest.$pid/$name.tfm"); + unlink("/tmp/tfmtest.$pid/$name.log"); + unlink("/tmp/tfmtest.$pid/$name.600gf"); + } + else + { + if (($opt_v == 1) || ($opt_verbose == 1)) + { + print "TFM file not generated: $name.tfm\n"; + } + print LOGFILE "TFM file not generated: $name.tfm\n"; + $newtfmnotok = $newtmfnotok + 1; + unlink("/tmp/tfmtest.$pid/$name.log"); + unlink("/tmp/tfmtest.$pid/$name.600gf"); + } + } + else + { + if (($opt_v == 1) || ($opt_verbose == 1)) + { + print "MF file not found: $name.mf\n"; + } + print LOGFILE "MF file not found: $name.mf\n"; + $mfnotfound = $mfnotfound + 1; + } + } |