#!/usr/bin/perl -w open IN, $ARGV[0] or die "Can't read '$ARGV[0]': $!"; open OUT, ">$ARGV[1]" or die "Can't write to '$ARGV[1]': $!"; binmode OUT; my $c = 0; my %countries; while( ) { my( $fromip, $toip, $from, $to, $ccode, $country ) = map { /^"(.*)"$/; $1 } split /,/, $_; die "$_: $from, $c\n" if( $from < $c ); # unordered or overlapping ranges die if( length $ccode != 2 ); # malformed country code if( $from > $c ) { print OUT pack 'N', ($c>>1); print OUT '??'; $c = $from; } print OUT pack 'N', ($c>>1); print OUT $ccode; $c = $to+1; $countries{$ccode} = 1; } close IN; # end of final range print OUT pack 'N', ($c>>1); print OUT '??'; # end of entire IP range (255.255.255.255) print OUT pack 'N', (0xffffffff>>1); print OUT '??'; close OUT; print "There are ".scalar( keys %countries )." countries:\n"; print join ", ", sort keys %countries; print "\n";