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 => '& ') : ()), ); 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/^\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/^/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"; }