#!/usr/bin/env perl
use strict;
$^W=1;

my $file_in = 'hyperref.dtx';

my $range_first = -1;
my $range_last = -1;
my $line = 0;
my $count = 0;
my $count_uc = 0;

my $ok = 1;

sub range_close () {
    return if $range_first < 0;
    print "* U+", sprintf("%04X", $range_first);
    if ($range_last > $range_first) {
        print "..U+", sprintf("%04X", $range_last);
    }
    print "\n";
    $range_first = -1;
    $range_last = -1;
}

sub range ($) {
    my $num = shift;
    $count++;
    $count_uc++ unless $num == $range_last;
    if ($num == $range_last or $num == $range_last + 1) {
        $range_last = $num;
        return;
    }
    range_close();
    $range_first = $num;
    $range_last = $num;
}

open(IN, '<', $file_in) or die "!!! Error: Cannot open `$file_in'!\n";
while (<IN>) {
    $line++;
    if (/\\(8[0-7]|9[0-7]{3})\\([0-7]{3}).{1,10}U\+([0-9A-F]{4})/) {
        my $high = $1;
        my $low = $2;
        my $uc = "$3";
        my $uc_num = hex($uc);
        my $oct_num = 256 * oct("0" . substr($high, 1)) + oct("0$low");
        if ($oct_num != $uc_num) {
            print "!!! Error (line $line): \\$high\\$low <> U+$uc!\n";
            $ok = 0;
        }
        else {
            range($uc_num);
        }
    }
}
range_close();
close(IN);

print "--> $count entries, $count_uc code points found.\n";

exit(1) unless $ok;
__END__
