Hi Deri, At 2022-08-21T01:12:07+0100, Deri wrote: > Gropdf is different, it takes into account all download files found, > so there is no need to duplicate entries into the site-font download > file. You could organise your fonts into separate families, each with > its own separate download file just for that family, and then list the > directories separated by a ":" in GROFF_FONT_PATH.
It looks to me that the way gropdf does this is by loading _all_ download files it can find, and the last one to declare a font file for the corresponding foundry and font name "wins". sub LoadDownload { my $f; my $found=0; my (@dirs)=split($cfg{RT_SEP},$fontdir); foreach my $dir (@dirs) { $f=undef; OpenFile(\$f,$dir,"download"); next if !defined($f); $found++; while (<$f>) { chomp; s/#.*$//; next if $_ eq ''; my ($foundry,$name,$file)=split(/\t+/); if (substr($file,0,1) eq '*') { next if !$embedall; $file=substr($file,1); } $download{"$foundry $name"}=$file; } close($f); } Die("failed to open 'download' file") if !$found; } I have two possible concerns about this. 1. As noted above, the "last one wins"; this is even more different from other groff path-searching behavior than continuing to search if an initially matching resource is found to be invalid. 2. There _is_ no validity check; the `download` hash is populated without checking to see if the font file exists or is readable. I think it _might_ be better to (a) perform that check (with the `-r` operator, I reckon), only adding $file to the hash if that succeeds and (b) skipping the validity check and hash update if the key ("$foundry $name") is already present. Algorithmically, this would be faster, if that helps anyone.[1] What do you think? Whatever we settle on, we should make grops work similarly. As I recall, string-keyed associative arrays were an early example in the very _first_ edition of Stroustrup's C++ book, so porting the code over might be an amusing exercise. :) (groff _almost_ does not use the STL at all.) Regards, Branden [1] On the other hand, we'd be guaranteed disk I/O for every entry that can't be prediscarded. You win some and you lose some.
signature.asc
Description: PGP signature