chiark / gitweb /
mkrules: Handle multiple files with the same metrics.
[xfonts-traditional] / update-xfonts-traditional
index eb11b0fef49c5b87b5be4bd598316c0cdcf0cafd..65d1d086c333112bdeb5f0727f2e7a687fd49197 100755 (executable)
@@ -20,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;
@@ -50,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;
@@ -92,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);
@@ -101,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 $!;
@@ -119,7 +133,14 @@ sub processbdf ($$$$) {
 }
 
 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) {
@@ -127,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/^\#/;
@@ -143,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 $!;
@@ -218,10 +240,17 @@ sub processfontdir ($) {
     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*/
@@ -249,7 +278,7 @@ sub processfontdir ($) {
        die "$fontdir $dent" unless -f _;
        $anypcfs++;
 
-       my $stats = join ' ', ((stat _)[1,7,9,10]);
+       my $stats = statsummary();
        my $tdone = $olddone->{$dent};
        my $outdent = $fontprefix.$dent;
        if (defined $tdone && $tdone eq $stats) {