diff --git a/icu4c/source/tools/genrb/genrbjar.pl b/icu4c/source/tools/genrb/genrbjar.pl new file mode 100755 index 0000000000..dae7324caa --- /dev/null +++ b/icu4c/source/tools/genrb/genrbjar.pl @@ -0,0 +1,294 @@ +#!/usr/bin/perl +#line 14 + +# Script to generate the ICULocaleData.jar file. 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 Unixes, I recommend www.activestate.com. + +# Alan Liu + +use File::Path; + +usage() unless (@ARGV >= 3); +my $ICU_ROOT = shift; +my $ICU4J_ROOT = shift; +my $ldVar = shift; + +# Step 1. Run genrb. +my $genrb = "$ICU_ROOT/source/tools/genrb/genrb"; +my $dataDir = "$ICU_ROOT/source/data/locales"; +my $javaRootDir = "$dataDir/java"; +my $pkg = "com/ibm/icu/impl/data"; +my $javaDir = "$javaRootDir/$pkg"; +chdir($dataDir); +mkpath($javaDir); +my $op = "$ldVar=$ICU_ROOT/source/common:$ICU_ROOT/source/i18n:$ICU_ROOT/source/tools/toolutil:$ICU_ROOT/source/data/out:$ICU_ROOT/source/data: $genrb -s. -d$javaDir -j -p com.ibm.icu.impl.data -b LocaleElements "; +print "Command: $op*.txt\n"; +print "Directory: $dataDir\n"; +my @list; +if (@ARGV) { + @list = @ARGV; + foreach (@list) { $_ .= ".txt" unless (/\.txt$/i); } +} else { + @list = glob("*.txt"); +} +my $count = 0; +my $errCount = 0; +foreach (sort @list) { + cmd("$op $_", " $_..."); + ++$count; +} + +print "Processed $count locale file(s)\n"; + +# Step 2. Create LocaleElements_index.java. +chdir("$ICU_ROOT/source/data/out/build"); +cmd("$op res_index.txt"); +chdir($javaDir); +my $f = "LocaleElements_index.java"; +unlink $f if (-e $f); +rename "LocaleElements_res_index.java", $f; +patchIndex("LocaleElements_index.java"); + +# Step 3. Find %%ALIAS tags. +# Assume that it looks like this: +# public LocaleElements_no_NO_NY () { +# contents = new Object[][] { +# { +# "%%ALIAS", +# "nn_NO", +# }, +# }; +# } +print "Scanning for %%ALIAS tags\n"; +print "Directory: $javaDir\n"; +chdir($javaDir); +@list = glob("LocaleElements*.java"); +my %aliases; +foreach my $file (sort @list) { + my $aliasOf = ''; + open(IN, $file) or die; + while () { + if (/^\s*\"\%\%ALIAS\"/) { + # This is an alias of the locale on the next line + $aliasOf = ; + die "Can't parse $aliasOf" unless + ($aliasOf =~ s/^\s*\"(.+?)\",\s*$/$1/); + last; + } + } + close(IN); + + if ($aliasOf) { + my $me = $file; + $me =~ s/^LocaleElements_(.+)\.java$/$1/i; + $aliases{$me} = $aliasOf; + print " $me is an alias of $aliasOf\n"; + } +} + +# Step 4. Fix %%ALIAS tags. +my %patched; # Record any locales that we patch +foreach my $loc (sort keys %aliases) { + # $loc is an alias of $aliases{$loc} + # Make $loc point to package private static _contents of $aliases{$loc} + my $aliasee = $aliases{$loc}; + if (!exists($patched{$alias})) { + # Patch the alias + patchAliasee($aliasee); + $patched{$aliasee} = 1; + } + patchAlias($loc, $aliasee); +} + +# Step 5. Patch transliteration resources. +# ICU resources have TransliterateLATIN but ICU4J resources expect Transliterate_LATIN +foreach my $file (sort @list) { + my $hasTrans = 0; + open(IN, $file) or die; + while () { + # Ignore files that are already patched + if (/^\s*\"Transliterate[^_].*\"/) { + $hasTrans = 1; + last; + } + } + close(IN); + + patchTrans($file) if ($hasTrans); +} + +# Step 6. Compile .java files +my $cmd = "javac -classpath $ICU4J_ROOT/classes:$javaRootDir:%CLASSPATH% $pkg/*.java"; +chdir($javaRootDir); +print "Compiling .java files.."; +print "Directory: $javaRootDir\n"; +cmd($cmd); + +# Step 7. Create .jar file. Since we don't yet generate correct +# CollationElement_*.res files, leave those as they are. Do a +# "jar u" -- update the existing file. +my $jarFile = "$ICU4J_ROOT/src/$pkg/ICULocaleData.jar"; +my $cmd = "jar uf $jarFile $pkg/*.class $pkg/*.bin $pkg/*.res $pkg/*.utf8"; +# Do jar command +print "Directory: $javaRootDir\n"; +chdir($javaRootDir); +if (! -e "$jarFile.orig") { + cmd("copy $jarFile $jarFile.orig"); +} +cmd($cmd); + +# Done! +print "All done.\n"; +exit(0); + +#----------------------------------------------------------------------- +# Execute a command +# Param: Command +# Param: Display line, or '' to display command +sub cmd { + my $cmd = shift; + my $prompt = shift; + $prompt = "Command: $cmd.." unless ($prompt); + print $prompt; + 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); + } +} + +#----------------------------------------------------------------------- +# Patch the file that an %%ALIAS tag points to +sub patchAliasee { + my $loc = shift; + my $file = "LocaleElements_$loc.java"; + my $omitNextBrace = 0; + open(IN, $file) or die; + open(OUT, ">$file.new") or die; + while () { + # if (/^\s*contents\s*=\s*new\s+Object/) { + # print OUT " contents = _contents;\n"; + # print OUT " };\n"; + # print OUT ' static final Object[][] _contents =', "\n"; + # s/^\s*contents\s*=\s*/ /; + # print OUT; + # } elsif (/^\s*\}\s*;/) { + # # Omit the "}" after this + # print OUT; + # $omitNextBrace = 1; + # } elsif ($omitNextBrace && /^\s*\}\s*$/) { + # # Omit it + # $omitNextBrace = 0; + # } else { + print OUT; + # } + } + close(IN); + close(OUT); + unlink($file); + rename("$file.new", $file); + print " $file patched (aliasee)\n"; +} + +#----------------------------------------------------------------------- +# Patch the file that contains the %%ALIAS tag +sub patchAlias { + my $loc = shift; + my $aliasee = shift; + my $file = "LocaleElements_$loc.java"; + open(IN, $file) or die; + open(OUT, ">$file.new") or die; + while () { + if (/^\s*contents\s*=\s*new\s+Object/) { + # Consume the next 5 lines + ; + ; + ; + ; + ; + # Output our new data + print OUT " contents = LocaleElements_$aliasee._contents;\n"; + } else { + print OUT; + } + } + close(IN); + close(OUT); + unlink($file); + rename("$file.new", $file); + print " $file patched (alias)\n"; +} + +#----------------------------------------------------------------------- +# Patch a file with a transliteration resource. +sub patchTrans { + my $file = shift; + open(IN, $file) or die; + open(OUT, ">$file.new") or die; + while () { + # This should look like "TransliterateFOO" but if underscores + # have crept in, ignore them. + s/^(\s*\"Transliterate)_*(.+?\")/$1_$2/; + print OUT; + } + close(IN); + close(OUT); + unlink($file); + rename("$file.new", $file); + print " $file patched (trans)\n"; +} + +#----------------------------------------------------------------------- +# Patch the index file, renaming res_index to index +sub patchIndex { + my $file = shift; + open(IN, $file) or die; + open(OUT, ">$file.new") or die; + while () { + s/res_(index)/$1/; + print OUT; + } + close(IN); + close(OUT); + unlink($file); + rename("$file.new", $file); + print " $file patched (index)\n"; +} + +#----------------------------------------------------------------------- +sub usage { + print << "END"; +Usage: genrbjar.pl [+] + +genrbjar creates the ICULocaleData.jar file in the icu4j project. It +uses locale data files in the icu4c directory and processes them with +genrb to generate Java source. It makes necessary edits to the Java +source, then compiles the Java to .class files, then creates a .jar +file. The ICULocaleData.jar file is created in its correct location +within the icu4j directory structure. + +Optionally, one or more locales may be specified on the command line. +If this is done, only those locales will be processed. If no locales +are listed, all locales are processed. + +Before running this tool, a JDK must be installed and the javac and +jar binaries for that JDK must be on the system path. +e.g: + i) on MacOSX: ./genrbjar.pl /Users/build/ICU_MACOSX/icu /Users/build/icu4j DYN_LD_LIBRARY_PATH + ii) on Linux: ./genrbjar.pl /Users/build/ICU_MACOSX/icu /Users/build/icu4j LD_LIBRARY_PATH +END + exit(0); +} + +__END__ +:endofperl diff --git a/icu4c/source/tools/genrb/wrtjava.c b/icu4c/source/tools/genrb/wrtjava.c index 3d0a8403e4..68fe7cd314 100644 --- a/icu4c/source/tools/genrb/wrtjava.c +++ b/icu4c/source/tools/genrb/wrtjava.c @@ -352,16 +352,10 @@ string_write_java(struct SResource *res,UErrorCode *status) { write_tabs(out); - T_FileStream_write(out, openBrace, (int32_t)uprv_strlen(openBrace)); - tabCount++; - write_tabs(out); T_FileStream_write(out, type, (int32_t)uprv_strlen(type)); T_FileStream_write(out, "\"", 1); T_FileStream_write(out, file, (int32_t)uprv_strlen(file)); T_FileStream_write(out, "\")\n", 3); - tabCount--; - write_tabs(out); - T_FileStream_write(out, "},\n", 3); datFile=T_FileStream_open(fileName,"w"); if(!dest){