#!/usr/bin/env perl
# fast reimplementation, only handle order in text, buffering.
use strict;

my %mapping;                    # mapping of digits
my @definitions;

my $counter = 1;
my $buffer = '';
while (<>) {
 $buffer .= $_;
 my $last = /^\@footnotes?/;
 if( 16 * 1024 < length $buffer or $last ) {
   $buffer =~ s/\[(\d+)\]/'['.($mapping{$1} ||= $counter++).']'/ge;
   syswrite STDOUT, $buffer;
   $buffer = '';
   last if $last;
 }
}
die "missing footer" if eof;
while (<>) {
 unless( /^ \[ (\d+) \] (.*)/x ) {
   $buffer .= $_;
   next;
 }
 exists $mapping{$1} or
   warn("ignoring unused note: $_"), next;
 $definitions[$mapping{$1}] = $2;
}

for my $i ( 1..$#definitions ) {
 $buffer .= "[$i]$definitions[$i]\n";
 if( 16 * 1024 < length $buffer ) {
   syswrite STDOUT, $buffer;
   $buffer = '';
 }
}
syswrite STDOUT, $buffer;