# footnote renumbering by order of occurance (Linux-Magazin 10/2008)
# (sys+cpu ~23%, mem ~28% of RLS' version)
# Author: Horst-W. Radners, utilizing a version by Randal L. Schwartz
my %mapping; # hash mapping old to new numbering
# read and print text-part line-by-line,
# changing note-refs to ascending new numbering on the fly
my $num_new = 0;
while (<>) {
last if /^\@footnote:/;
s/\[ (\d+) \]/'[' . ($mapping{$1} ||= ++$num_new) . ']'/egx;
print;
}
die(' *** missing footer') if eof;
print "\@footnote:\n";
# read and store footnotes in memory for reordered printing
my @fnote; # array of notes, indexed by new numbering
while (<>) {
my ( $num_old, $text ) = /^ \[ (\d+) \] \s* (.*)/x
or print, next;
my $num_new = $mapping{$num_old}
or warn(" *** ignoring unused note: $_"), next;
$fnote[$num_new] = $text;
}
# print footnotes, sorted by new numbering
foreach my $num ( 1 .. $#fnote ) {
unless ( defined $fnote[$num] ) {
warn(" *** ignoring dangling ref w/o note: $num");
next;
}
print "[$num] $fnote[$num]\n";
}