#! /usr/local/bin/perl
use Time::Local;
use strict;

# This parses the list of IPv6 global unicast assignments made to the RIRs
# by IANA on http://www.iana.org/assignments/ipv6-unicast-address-assignments

my %month = BuildMonth();
my $data;
my @events;
Parse();
#AddRfc();
PrintEvents();

sub Parse {
    while (<>) {
      last if /^Global Unicast Prefix Assignment/;
    }

    while (<>) {
        next if /^-/;
	next if /^\s*$/;
	last if /^Notes/;

	s/RIPE NCC/RIPE/;
	my ($block, $org, $day, $month, $year, @rest) = split /\s+/;
	my $time = GetTime($year, $month, $day);

	my $name = $org;
	my $type = "allocated";

	if ($block eq "2001:0000::/23") {
	  $name = "IANA experimental";
	  $type = "special-use";
	}
	elsif ($block eq "2001:0C00::/23") {
#	  $org = "IANA";
	  $name = "critical infrastructure, experimental allocations, and non-routable documentation (2001:0DB8::/32)";
	  $type = "special-use";
	}
	elsif ($org eq "6to4") {
	  $org = "IANA";
	  $type = "special-use";
	}
	elsif ($org eq "6BONE") {
	  $org = "IANA";
	  $type = "special-use";
	}
	elsif ($org eq "RESERVED" && $block eq "2001:3C00::/22") {
	  $org = "IANA";
	  $name = "reserved for RIPE";
	  $type = "reserved";
	}

	AddEvent($block, $time, $type, $org, $name);
    }
}

sub AddEvent {
    my ($block, $date, $type, $org, $name) = @_;
    push @events, {
	"block" => $block,
	"date" => $date,
	"type" => $type,
	"org" => $org,
	"name" => $name
	};
}

sub PrintEvents {
    foreach my $event ( sort {
	    if ($a->{date} == $b->{date}) {
		return $a->{block}<=>$b->{block}
	    }
	    $a->{date}<=>$b->{date}
	    } @events) {
	my ($block, $date, $type, $org, $name) = (
	    $event->{"block"},$event->{"date"}, $event->{"type"},
	    $event->{"org"}, $event->{"name"});
	printf "%-19s| %-9s| %-10s| %-10s| %s\n", 
	    $block, $date, $type, $org, $name;
    }
}

sub BuildMonth {
    my %month;
    my $index = 1;
    foreach my $mon (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)) {
	$month{$mon} = $index++;
    }
    return %month;
}

sub GetTime {
    my ($year, $month, $day) = @_;
    if ($year < 50) {
	$year += 2000;
    } else {
	$year += 1900;
    }
    return sprintf("%04d%02d%02d", $year, $month{$month}, $day);
}
