X-Git-Url: https://git.distorted.org.uk/~mdw/xfonts-traditional/blobdiff_plain/71e1fff3fdd26d849f5f0a9bf34354c3d020e848..be65f15aacb3b55f504a18f7eecac9356d71e2ce:/update-xfonts-traditional diff --git a/update-xfonts-traditional b/update-xfonts-traditional index 9d05e3a..65d1d08 100755 --- a/update-xfonts-traditional +++ b/update-xfonts-traditional @@ -6,11 +6,12 @@ use Getopt::Long; use File::Glob qw(:glob); use Data::Dumper; use IO::Pipe; +use File::Find; our $prefix="/usr/local"; our $package='xfonts-traditional'; our $sharedir="$prefix/share/$package"; -our @fontparentdirs=qw(/usr/share/fonts/X11 /usr/local/share/fonts/X11); +our @fonttrees=qw(/usr/share/fonts/X11 /usr/local/share/fonts/X11); our $donefile="$package.done"; our $logfile="$package.log"; our $fontprefix="trad--"; @@ -19,12 +20,18 @@ our $mode; our %foundrymap; our $verbose=0; our $reportfh; +our $foundryinfo; +our %props; sub reportloaded { return unless $verbose; print $reportfh @_,"\n" or die $!; } +sub statsummary () { + return join ' ', ((stat _)[1,7,9,10]); +} + sub loadrules ($) { my ($key) = @_; our %cache; @@ -49,6 +56,7 @@ sub processbdf ($$$$) { my ($foundry,$font); my ($w,$h,$xo,$yo,$y,$bitmap,$glyph); my $modified=0; + %props = (); while (<$inbdf>) { if ($state eq 'bitmap' && $y==$h) { $glyph = uc $glyph; @@ -91,6 +99,10 @@ sub processbdf ($$$$) { $state='startchar'; $w=undef; } + if (($state eq 'idle' || $state eq 'startchar') && + m/^([A-Z_]+)\s+(.*\S)\s+$/) { + $props{$1}=$2; + } if ($state eq 'startchar') { if (m/^BBX\s+(\+?\d+)\s+(\+?\d+)\s+([-+]?\d+)\s+([-+]?\d+)\s+$/) { ($w,$h,$xo,$yo) = ($1,$2,$3,$4); @@ -100,6 +112,9 @@ sub processbdf ($$$$) { $y=0; $glyph=''; $state='bitmap'; + $props{' 7bit'}= + ($props{'CHARSET_REGISTRY'} =~ m/iso8859|utf|iso10646/i && + $props{'ENCODING'} <= 127); } } print $outbdf $_ or die $!; @@ -117,22 +132,15 @@ sub processbdf ($$$$) { return $modified; } -our (@options)=( - 'R|rules-include=s@' => \@rulespath, - 'share-dir=s' => \$sharedir, - 'verbose|v+' => \$verbose, - ); - -sub define_mode ($$) { - my ($optname,$f) = @_; - push @options, $optname, sub { - die "only one mode may be specified\n" if defined $mode; - $mode=$f; - }; -} - sub loadfoundries () { + $foundryinfo = ''; foreach my $path (@rulespath) { + if (!stat $path) { + die "$path $!" unless $!==&ENOENT; + next; + } + $foundryinfo .= statsummary().' '.$path."\0\n"; + my $p = "$path/foundries"; my $f = new IO::File $p; if (!$f) { @@ -140,6 +148,7 @@ sub loadfoundries () { print $reportfh "foundries: none in $p\n" or die $! if $verbose; next; } + stat $f or die $!; while (<$f>) { s/^\s*//; s/\s+$//; next if m/^\#/; @@ -156,13 +165,13 @@ sub loadfoundries () { sub processpcfgz ($$$$) { my ($inpcfgz,$outpcfgz,$logfile,$what) = @_; - + print $reportfh "processing $inpcfgz to $outpcfgz\n" if $verbose>=2; my $current = new IO::File $inpcfgz, '<' or die "$inpcfgz $!"; my ($usread,$uswrite); my ($reader,$writer); my @children; - foreach my $proc (['zcat'], ['pcf2bdf'], [], - ['bdftopcf'],['',qw(gzip -1)]) { + foreach my $proc (['gunzip'], ['pcf2bdf'], [], + ['bdftopcf'],['',qw(gzip -1 -n)]) { my $isfinal = (@$proc && $proc->[0] eq ''); if (!$isfinal) { $reader = new IO::Handle or die $!; @@ -227,19 +236,28 @@ sub processfontdir ($) { die "$fontdir $!" unless $!==&ENOENT; return; } + my $changed = 0; my $olddone = do "$fontdir/$donefile"; if (!$olddone) { die "$fontdir $! $@ " unless $!==&ENOENT; + } elsif ($olddone->{''} ne $foundryinfo) { + our $repro_reported; + print $reportfh "reprocessing fonts (rules updated)\n" or die $! + unless $repro_reported++; + $olddone = undef; + } + if (!$olddone) { $olddone = { }; + $changed = 1; } - my $newdone = { }; + my $newdone = { '' => $foundryinfo }; my $log = new IO::File "$fontdir/$logfile", "w" or die "$fontdir/$logfile $!"; my %outfiles; # bitmask: 1 /*exists*/ | 2 /*wanted*/ - my $changed; my $updated=0; + my $reported=0; + my $anypcfs=0; - print $reportfh "processing $fontdir...\n" or die $!; flush $reportfh or die $!; while (my $dent = scalar readdir FD) { if ($dent =~ m/^\Q$fontprefix\E.*\.new$/) { @@ -247,6 +265,8 @@ sub processfontdir ($) { next; } next unless $dent =~ m/^[^.\/].*\.pcf\.gz$/; + print $reportfh "processing $fontdir...\n" or die $! + unless $reported++; if ($dent =~ m/^\Q$fontprefix/) { $outfiles{$dent} |= 1; next; @@ -256,7 +276,9 @@ sub processfontdir ($) { next; } die "$fontdir $dent" unless -f _; - my $stats = join ' ', ((stat _)[1,7,9,10]); + $anypcfs++; + + my $stats = statsummary(); my $tdone = $olddone->{$dent}; my $outdent = $fontprefix.$dent; if (defined $tdone && $tdone eq $stats) { @@ -276,9 +298,9 @@ sub processfontdir ($) { or die "$fontdir $outdent $!"; $updated++; $outfiles{$outdent} |= 3; - $changed = 1; } $newdone->{$dent} = $stats; + $changed = 1; } my $affected=0; foreach my $olddent (keys %outfiles) { @@ -289,13 +311,18 @@ sub processfontdir ($) { } unlink "$fontdir/$olddent" or die "$fontdir $olddent $!"; $changed = 1; + $updated++; + } + if (!stat "$fontdir/fonts.dir") { + $!==&ENOENT or die "$fontdir $!"; + } else { + $!=0; $?=0; system 'mkfontdir',$fontdir; + die "$fontdir $? $!" if $? or $!; } - if (!%$newdone) { + if (!$anypcfs) { unlink "$fontdir/$logfile" or die "$fontdir $!"; unlink "$fontdir/$donefile" or $!==&ENOENT or die "$fontdir $!"; } elsif ($changed) { - $!=0; $?=0; system 'mkfontdir',$fontdir; - die "$fontdir $? $!" if $? or $!; my $newdoneh = new IO::File "$fontdir/$donefile.new", 'w' or die "$fontdir $!"; print $newdoneh Dumper($newdone) or die "$fontdir $!"; @@ -303,8 +330,22 @@ sub processfontdir ($) { rename "$fontdir/$donefile.new","$fontdir/$donefile" or die "$fontdir $!"; } - printf " processed %s: %d pcfs, %d affected, %d updated.\n", - $fontdir, (scalar keys %$newdone), $affected, $updated; + if ($reported || %$newdone || $affected || $updated) { + printf " processed %s: %d pcfs, %d affected, %d updated.\n", + $fontdir, (scalar keys %$newdone), $affected, $updated; + } +} + +sub processfonttree ($) { + my ($tree) = @_; + find({ follow => 1, + dangling_symlinks => 0, + no_chdir => 1, + wanted => sub { + return unless -d _; + processfontdir($File::Find::name); + }}, + $tree); } our $stdin = new IO::File '<&STDIN' or die $!; @@ -312,6 +353,20 @@ our $stdout = new IO::File '>&STDOUT' or die $!; our $stderr = new IO::File '>&STDERR' or die $!; $reportfh = $stdout; +our (@options)=( + 'R|rules-include=s@' => \@rulespath, + 'share-dir=s' => \$sharedir, + 'verbose|v+' => \$verbose, + ); + +sub define_mode ($$) { + my ($optname,$f) = @_; + push @options, $optname, sub { + die "only one mode may be specified\n" if defined $mode; + $mode=$f; + }; +} + define_mode('bdf-filter', sub { die "no arguments allowed with --bdf-filter\n" if @ARGV; $reportfh = $stderr; @@ -333,7 +388,7 @@ define_mode('process-pcf', sub { } }); -define_mode('process-fontdir', sub { +define_mode('process-fontdirs', sub { die "need font dir(s)\n" unless @ARGV; loadfoundries(); foreach my $d (@ARGV) { @@ -341,6 +396,22 @@ define_mode('process-fontdir', sub { } }); +define_mode('process-fonttrees', sub { + die "need font tree(s)\n" unless @ARGV; + loadfoundries(); + foreach my $d (@ARGV) { + processfonttree($d); + } +}); + +define_mode('update', sub { + die "no arguments allowed with --postinst\n" unless !@ARGV; + loadfoundries(); + foreach my $d (@fonttrees) { + processfonttree($d); + } +}); + Getopt::Long::Configure(qw(bundling)); GetOptions(@options) or exit 127; @@ -349,12 +420,3 @@ push @rulespath, "$sharedir/rules"; die "need a mode\n" unless $mode; $mode->(); - -# 70 zcat /usr/share/fonts/X11/misc/6x13.pcf.gz |pcf2bdf >in.bdf -# 71 ./utility out.bdf -# 83 bdftopcf out.bdf >out.pcf -# 84 gzip out.pcf -# 85 cp out.pcf.gz /usr/share/fonts/X11/misc/ -# really mkfontdir /usr/share/fonts/X11/misc/ -# xset fp rehash -# xfontsel