Alexandre Julliard : unicode: Use existing helpers to build the l_intl.nls file.
Alexandre Julliard
julliard at winehq.org
Thu Jan 23 15:48:50 CST 2020
Module: wine
Branch: master
Commit: bd9d83b73aafb67a943f6e330baf033287cbc3af
URL: https://source.winehq.org/git/wine.git/?a=commit;h=bd9d83b73aafb67a943f6e330baf033287cbc3af
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jan 23 16:45:02 2020 +0100
unicode: Use existing helpers to build the l_intl.nls file.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
tools/make_unicode | 74 ++++++++++++------------------------------------------
1 file changed, 16 insertions(+), 58 deletions(-)
diff --git a/tools/make_unicode b/tools/make_unicode
index 1aaeff38a4..f8d81f64e6 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -1983,66 +1983,21 @@ sub dump_two_level_mapping($$@)
sub dump_binary_case_table(@)
{
my (@table) = @_;
+ my $max_char = 0x10000;
+ my $level1 = $max_char / 16;
+ my $level2 = $level1 / 16;
- my %difftables_hash = ();
- my @difftables;
- my %offtables2_hash = ();
- my @offtables2 = ();
-
- my @offtable = ();
- for (my $i = 0; $i < 256; $i++)
+ my @difftable;
+ for (my $i = 0; $i < @table; $i++)
{
- my @offtable2 = ();
- for(my $j = 0; $j < 16; $j++) # offset table for xx00-xxFF characters
- {
- my @difftable;
- for (my $k = 0; $k < 16; $k++) # case map table for xxx0-xxxF characters
- {
- my $char = ($i<<8) + ($j<<4) + $k;
- $difftable[$k] = (defined $table[$char]) ? (($table[$char]-$char) & 0xffff) : 0;
- }
-
- my $diff_key = pack "S*", @difftable;
- my $offset3 = $difftables_hash{$diff_key};
- if (!defined $offset3)
- {
- $offset3 = scalar @difftables;
- $difftables_hash{$diff_key} = $offset3;
- push @difftables, @difftable;
- }
- $offtable2[$j] = $offset3;
- }
-
- my $offtable2_key = pack "S*", @offtable2;
- my $offset2 = $offtables2_hash{$offtable2_key};
- if (!defined $offset2)
- {
- $offset2 = scalar @offtables2;
- $offtables2_hash{$offtable2_key} = $offset2;
- push @offtables2, \@offtable2;
- }
- $offtable[$i] = $offset2;
- }
-
- my @output;
- my $offset = 0x100; # offset of first subtable in words
- foreach (@offtable)
- {
- push @output, 0x10 * $_ + $offset; # offset of subtable in words
- }
-
- $offset = 0x100 + 0x10 * scalar @offtables2; # offset of first difftable in words
- foreach(@offtables2)
- {
- my $table = $_;
- foreach(@$table)
- {
- push @output, $_ + $offset; # offset of difftable in words
- }
+ next unless defined $table[$i];
+ $difftable[$i] = ($table[$i] - $i) & 0xffff;
}
- my $len = 1 + scalar @output + scalar @difftables;
- return pack "S<*", $len, @output, @difftables;
+ my @row_array = compress_array( $level1, 0, @difftable[0..$max_char-1] );
+ my @array = compress_array( $level2, 0, @row_array[0..$level1-1] );
+ for (my $i = $level2; $i < @array; $i++) { $array[$i] += @array - $level1; }
+ return @array, @row_array[$level1..$#row_array];
}
@@ -2050,14 +2005,17 @@ sub dump_binary_case_table(@)
# dump case mappings for l_intl.nls
sub dump_intl_nls($)
{
+ my @upper = dump_binary_case_table( @toupper_table );
+ my @lower = dump_binary_case_table( @tolower_table );
+
my $filename = shift;
open OUTPUT,">$filename.new" or die "Cannot create $filename";
printf "Building $filename\n";
binmode OUTPUT;
print OUTPUT pack "S<", 1; # version
- print OUTPUT dump_binary_case_table( @toupper_table );
- print OUTPUT dump_binary_case_table( @tolower_table );
+ print OUTPUT pack "S<*", 1 + scalar @upper, @upper;
+ print OUTPUT pack "S<*", 1 + scalar @lower, @lower;
close OUTPUT;
save_file($filename);
}
More information about the wine-cvs
mailing list