/usr/local/CPAN/Encode-InCharset/Makefile.PL


use 5.007003;
use strict;
use ExtUtils::MakeMaker;
use File::Spec;
use File::Basename;

my $Name = 'InCharset';
my $ucmdir = shift;
if ($ucmdir =~ s/^UCMDIR=//o){
    opendir my $dh, $ucmdir or die "$ucmdir:$!";
    for my $ucm (sort grep /\.ucm$/o, readdir($dh)){
	mkInCharset(File::Spec->catdir($ucmdir, $ucm));
    }
}

my %inpm;
my $PM;
opendir my $dh, "$Name" or die "$Name:  $!";
for my $pm (sort grep /\.pm$/o, readdir($dh)){
    open my $fh, "$Name/$pm" or die "$Name/$pm:$!"; 
    $PM->{"$Name/$pm"} = "\$(INST_LIBDIR)/$Name/$pm";
    $pm =~ s/\.pm$//o;
    while(<$fh>){
	if (/^sub (\w+)/){
	    $inpm{$1} = "Encode\::$Name\::$pm";
	}
    }
}
$PM->{"$Name/Config.pm"} = "\$(INST_LIBDIR)/$Name/Config.pm";
$PM->{"$Name.pm"} = "\$(INST_LIBDIR)/$Name.pm";

open my $fh, ">$Name/Config.pm" or die ">$Name/Config.pm";
print $fh <<"EOT";
#
# This file is auto-generated; do not edit by hand!
#
package Encode\::$Name\::Config;
use strict;
our %InPM = (
EOT

for my $sub (sort keys %inpm){
    printf $fh qq(\t%-24s => "%s",\n), $sub, $inpm{$sub};
}

print $fh <<"EOT";
);
1;
EOT


WriteMakefile(
    'NAME'		=> "Encode\::$Name",
    'VERSION_FROM'	=> "$Name.pm", # finds $VERSION
    'PREREQ_PM'		=> {}, # e.g., Module::Name => 1.1
    'PM'                => $PM,
    ($] >= 5.005 ?    ## Add these new keywords supported since 5.005
      (ABSTRACT_FROM => "$Name.pm", # retrieve abstract from module
       AUTHOR     => '& <dankogai@dan.co.jp>') : ()),
);



sub mkInCharset{
    my $file = shift;
    my $modname = basename($file); 
    $modname =~ s/\.ucm$//o; $modname =~ s/\-/_/g;
    my $subname;
    my $count = 0;
    my %hex = ();
    $| = 1;
    open my $srcfh, $file or die "$file:$!";
    while(<$srcfh>){
	if (m/^<code_set_name>\s+"([^\"]+)"/o){
	    $subname =  ucfirst($1);
	    $subname =~ s/\b([a-z])/uc($1)/gie;
	    $subname =~ s/-raw$//io;
	    $subname =~ /Adobe|Mac|Next|Johab|Symbol|Dingbats|Roman/io 
		or $subname = uc($subname);
	    $subname =~ s/SHIFTJIS/Shift_JIS/o;
	    $subname =~ s/-/_/g; 
	    $subname = 'In' . $subname;
	    print "Making $modname => $subname...";
	    next;
	}
	m/^<U([0-9A-Za-z]+)>/o or next;
	$subname or die "Can't find code_set_name for $file!";
	$hex{hex($1)}++; $count++;
    }
    my @range; 
    my $start = -1;  my $oldord = -1;
    for my $ord (sort { $a <=> $b } keys %hex){
	if ($start < 0){
	    $start = $oldord = $ord;
	    next;
	}
	unless ($oldord + 1 == $ord){
	    my $range = $start == $oldord ? 
		sprintf("%X", $start) : 
		sprintf("%X\t%X", $start, $oldord);
	    push @range, $range;
	    $start = $ord;
	}
	$oldord = $ord;
    }
    my $range = $start == $oldord ? 
	sprintf("%X", $start) : 
	sprintf("%X\t%X", $start, $oldord);
    push @range, $range;
    printf "$count chars, %d ranges\n", scalar @range;
    -d "InCharset" or mkdir "InCharset", 0755 or die "InCharset:$!";
    my $dstfile = File::Spec->catdir("InCharset", "$modname.pm");
    open my $dstfh, ">$dstfile" or die "$!";
    print $dstfh
	join("\n" =>
	     qq/# This is auto-generated.  Do not edit by hand!/,
	     qq/package Encode::InCharset::$modname;/,
             q[our $VERSION = do {my @r = (q$Revision: 0.1 $ =~ /\d+/g);] .
	     q[ sprintf "%d."."%02d"x$#r, @r};],
	     qq/sub $subname\{/,
	     qq/\treturn <<\'END\';/,
	     @range,
	     qq/END/,
	     qq/\}/,
	     qq/1;/,
	     qq/__END__/,
	     ), "\n";
}