#!/usr/bin/perl
#  ********************************************************************
#  * COPYRIGHT:
#  * Copyright (c) 2002-2005, International Business Machines Corporation and
#  * others. All Rights Reserved.
#  ********************************************************************

# Script to generate the icudata.jar and testdata.jar files.  This file is
# part of icu4j.  It is checked into CVS.  It is generated from
# locale data in the icu4c project.  See usage() notes (below)
# for more information.

# This script requires perl.  For Win32, I recommend www.activestate.com.

# Ram Viswanadha
# copied heavily from genrbjar.pl
use File::Find;
use File::Basename;
use IO::File;
use Cwd;
use File::Copy;
use Getopt::Long;
use File::Path;
use File::Copy;


main();

#------------------------------------------------------------------
sub main(){

GetOptions(
         "--icu-root=s" => \$icuRootDir,
         "--jar=s" => \$jarDir,
         "--icu4j-root=s" => \$icu4jDir,
         "--version=s" => \$version
         );
usage() unless defined $icuRootDir;
usage() unless defined $jarDir;
usage() unless defined $version;
  #usage() unless defined $icu4jRootDir;
  $icuswap = $icuRootDir."/bin/icuswap -tb";
  $tempDir =cwd();
  $tempDir .= "/temp";
  $version =~ s/\.//;
  $icu4jImpl = "com/ibm/icu/impl/data/";
  $icu4jDataDir = $icu4jImpl."/icudt".$version."b";
  $icu4jDevDataDir = "com/ibm/icu/dev/data/";
  $icu4jTestDataDir = "$icu4jDevDataDir/testdata";
  $icuDataDir =$icuRootDir."/source/data/out/build/icudt".$version.checkPlatform();
  $icuTestDataDir =$icuRootDir."/source/test/testdata/out/build/";
  convertData($icuDataDir, $icuswap, $tempDir, $icu4jDataDir);
  #convertData($icuDataDir."/coll/", $icuswap, $tempDir, $icu4jDataDir."/coll");
  createJar("$jarDir/jar", "icudata.jar", $tempDir, $icu4jDataDir);

  convertTestData($icuTestDataDir, $icuswap, $tempDir, $icu4jTestDataDir);
  createJar("$jarDir/jar", "testdata.jar", $tempDir, $icu4jTestDataDir);
  copyData();
}

#-----------------------------------------------------------------------
sub createJar{
    local($jar, $jarFile, $tempDir, $dirToJar) = @_;
    chdir($tempDir);
    $command = "$jar cvf $jarFile -C $tempDir $dirToJar";
    cmd($command);
}
#-----------------------------------------------------------------------
sub checkPlatform {
    my $is_big_endian = unpack("h*", pack("s", 1)) =~ /01/;
    if ($is_big_endian) {
        return "b";
    }else{
        return "l";
    }
}
#-----------------------------------------------------------------------
sub copyData{
  print("Copying: $tempDir/icudata.jar to $icu4jDir/src/$icu4jImpl");
  copy("$tempDir/icudata.jar", "$icu4jDir/src/$icu4jImpl"); 
  print("Copying: $tempDir/testData.jar $icu4jDir/src/$icu4jDevDataDir");
  copy("$tempDir/testData.jar","$icu4jDir/src/$icu4jDevDataDir");
}
#-----------------------------------------------------------------------
sub convertData{
    local($icuDataDir, $icuswap, $tempDir, $icu4jDataDir)  =@_;
    my $dir = $tempDir."/".$icu4jDataDir;
    # create the temp directory
    mkpath("$tempDir/$icu4jDataDir");
    # cd to the temp directory
    chdir($tempDir);

    my @list;
    opendir(DIR,$icuDataDir);
    print $icuDataDir;
    @list =  readdir(DIR);
    closedir(DIR);
    print "{Command: $op*.*}\n";
    my $op = $icuswap;
    $i=0;
    # now convert
    foreach $item (@list){
        next if($item eq "." || $item eq "..");
        next if($item =~ /^t_.*$\.res/ ||$item =~ /^translit_.*$\.res/   || $item =~ /$\.cnv/ ||
               $item=~/$\.crs/ || $item=~ /$\.txt/ || $item=~ /^zoneinfo/  ||
               $item=~/icudata\.res/ || $item=~/$\.exp/ || $item=~/$\.lib/ || $item=~/$\.obj/ ||
               $item=~/cnvalias\.icu/ || $item=~/$\.lst/);
        if(-d "$icuDataDir/$item"){
            convertData("$icuDataDir/$item/", $icuswap, $tempDir, "$icu4jDataDir./$item/");
            next;
        }
        $command = $icuswap." $icuDataDir/$item $tempDir/$icu4jDataDir/$item";
        cmd($command);

    }
    chdir("..");
    print "\nDONE\n";
}
#-----------------------------------------------------------------------
sub convertTestData{
    local($icuDataDir, $icuswap, $tempDir, $icu4jDataDir)  =@_;
    my $dir = $tempDir."/".$icu4jDataDir;
    # create the temp directory
    mkpath("$tempDir/$icu4jDataDir");
    # cd to the temp directory
    chdir($tempDir);
    print "{Command: $op*.*}\n";
    my $op = $icuswap;
    my @list;
    opendir(DIR,$icuDataDir);
    print $icuDataDir;
    @list =  readdir(DIR);
    closedir(DIR);

    $i=0;
    # now convert
    foreach $item (@list){
        next if($item eq "." || $item eq "..");
        next if($item =~ /$\.cnv/ || item=~/$\.crs/ || $item=~ /$\.txt/ ||
                $item=~/$\.exp/ || $item=~/$\.lib/ || $item=~/$\.obj/ ||
                $item=~/$\.mak/ || $item=~/test\.icu/ || $item=~/$\.lst/);
        
        if($item =~ /^testdata_/){
            $file = $item;
            $file =~ s/testdata_//g;
            $command = "$icuswap $icuDataDir/$item $tempDir/$icu4jDataDir/$file";
            cmd($command);
        }

    }
    chdir("..");
    print "\nDONE\n";
}
#------------------------------------------------------------------------------------------------
sub cmd {
    my $cmd = shift;
    my $prompt = shift;
    $prompt = "Command: $cmd.." unless ($prompt);
    print $prompt."\n";
    system($cmd);
    my $exit_value  = $? >> 8;
    #my $signal_num  = $? & 127;
    #my $dumped_core = $? & 128;
    if ($exit_value == 0) {
        print "ok\n";
    } else {
        ++$errCount;
        print "ERROR ($exit_value)\n";
        exit(1);
    }
}
#-----------------------------------------------------------------------
sub usage {
    print << "END";
Usage:
gendtjar.pl
Options:
        --icu-root=<directory where icu4c lives>
        --jar=<directory where jar.exe lives>
        --icu4j-root=<directory>
        --version=<ICU4C version>
e.g:
gendtjar.pl --icu-root=\\work\\icu --jar=\\jdk1.4.1\\bin --icu4j-root=\\work\\icu4j --version=3.0
END
  exit(0);
}

