#!/usr/local/bin/perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if 0; # not running under some shell #$Id: mkmapfile,v 1.23 1998/02/17 18:04:26 schwartz Exp $ # # mkmapfile - create character mapfile for Unicode::Map library # # See also usage() of this file. # # Copyright (C) 1998 Martin Schwartz. All rights reserved. # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # Contact: Martin Schwartz # my $PROGNAME = "mkmapfile"; my $VERSION = '1.24'; my $DATE = '2000-Jun-26'; use Getopt::Std; use Unicode::Map; my $Map; my $numErrors = 0; my $numWarnings = 0; main: { $|=1; $Map = new Unicode::Map ( ); if ( !$Map ) { print "Can't get Unicode::Map object!\n"; exit 1; } getopts ('fhM:oS:U'); usage() if $opt_h; if ($opt_U) { usage() if $opt_S; for ($Map->ids) { $numErrors++ unless _convert ( $_, $Map->src($_), $Map->mapping($_), $Map->style($_) ); } finish ( ); } usage() if !@ARGV; for ( @ARGV ) { $numErrors++ unless handle_file ( $_ ); } finish ( ); } sub finish { if ( $numWarnings==0 && $numErrors==0 ) { print "Ok. Everything went fine!\n"; } elsif ( $numErrors>0 ) { my $msg; $msg = "$numErrors error"; $msg .= "s" if $numErrors>1; $msg .= ", $numWarnings warning" if $numWarnings>0; $msg .= "s" if $numWarnings>1; $msg .= "."; print "Error! Encountered $msg\n"; } else { my $msg; $msg = "$numWarnings warning"; $msg .= "s" if $numWarnings>1; $msg .= "."; print "Warning! Possible trouble! $msg\n"; } exit $numErrors; } sub handle_file { my ( $path ) = @_; my $baseName = basename ( $path ); my $basePath = basepath ( $path ); my $csid = $Map -> id ( $baseName ) || "GENERIC"; my $outfile = $opt_M || $basePath . $baseName . ".map"; _convert ( $csid, "$path", "$outfile", $opt_S ); } sub _convert { my ($id, $from, $to, $style) = @_; print "Processing $id: "; if (!-f $from) { print ("Text mapfile '$from' not available.\n"); return 0; } if (!$opt_f) { if ( (stat($from))[9] <= (stat($to))[9] ) { my $s = "Mapping "; $s .= "\"$to\" " if $id=~/^generic$/i; $s .= "'$to' seems uptodate."; print "$s\n"; return 1; } } if (!$opt_o && -e $to) { $numWarnings++; print "Binary mapfile \"$to\" exists! Skipping. (Use -o to override)\n"; return 1; } if ( !_mkpath(basepath($to)) || !$Map -> read_text_mapping ($id, $from, $style) || !$Map -> write_binary_mapping ($id, $to) ) { print "Error for '$to': $!!\n"; return 0; } print "saved binary mapping as '$to'.\n"; 1} sub usage { print "$PROGNAME V$VERSION ($DATE) - create Unicode mapfiles\n" ."usage: $PROGNAME [-M mapfile.map] -U unicode.TXT \n" ."-M s Mapfile output. Write created mapping to this file.\n" ."-f force. Write new mapfiles even when they seem to be update.\n" ."-o overwrite. Existing files will be overwritten.\n" ."-S s Style. Textual input mapping is of style 'unicode' or 'keld'\n" ."-U Update mode. Update mapfiles according to REGISTRY file\n" ; exit 0; } sub basepath { substr($_[0], 0, rindex($_[0],'/')+1) } sub basename { (substr($_[0], rindex($_[0],'/')+1) =~ /(^[^.]*)/) && $1; } sub _mkpath { # # Creates one or a chain of directories # my ($path) = @_; my $current = ""; for ( split /\//, $path ) { $current .= "$_/"; next if -d $current; if (!mkdir $current, 0777) { print "Cannot create directory \"$current\"!\n"; } } 1} __END__ =head1 NAME mkmapfile - create Unicode mapfiles Very Alpha. =head1 SYNOPSIS Example: mkmapfile -M ./GB2312-80.map ~/Unicode/MAPPINGS/EASTASIA/GB/GB2312.TXT See "mkmapfile -h" for details. =head1 DESCRIPTION Creates the binary mapfiles that module Unicode::Map uses for converting from and to unicode character sets. =head1 SEE ALSO L =head1 AUTHOR Martin Schwartz EFE. =cut