Alexandre Julliard : libwine: Add support for generating l_intl.nls, based on a patch by Andrey Turkin.

Alexandre Julliard julliard at winehq.org
Fri May 7 09:41:13 CDT 2010


Module: wine
Branch: master
Commit: 930a13dd86613e79fd6d011edcfd27b340dce6b6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=930a13dd86613e79fd6d011edcfd27b340dce6b6

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May  6 20:50:14 2010 +0200

libwine: Add support for generating l_intl.nls, based on a patch by Andrey Turkin.

---

 libs/wine/cpmap.pl |   86 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/l_intl.nls   |  Bin 0 -> 5958 bytes
 2 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/libs/wine/cpmap.pl b/libs/wine/cpmap.pl
index c67c4aa..7037ff9 100755
--- a/libs/wine/cpmap.pl
+++ b/libs/wine/cpmap.pl
@@ -1058,6 +1058,91 @@ sub DUMP_CASE_TABLE($@)
 
 
 ################################################################
+# dump a binary case mapping table in l_intl.nls format
+sub dump_binary_case_table(@)
+{
+    my (@table) = @_;
+
+    my %difftables_hash = ();
+    my @difftables;
+    my %offtables2_hash = ();
+    my @offtables2 = ();
+    
+    my @offtable = ();
+    for (my $i = 0; $i < 256; $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
+        }
+    }
+
+    my $len = 1 + scalar @output + scalar @difftables;
+    return pack "S<*", $len, @output, @difftables;
+}
+
+
+################################################################
+# dump case mappings for l_intl.nls
+sub dump_intl_nls($)
+{
+    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 );
+    close OUTPUT;
+    save_file($filename);
+}
+
+
+################################################################
 # dump the ctype tables
 sub DUMP_CTYPE_TABLES($)
 {
@@ -1470,6 +1555,7 @@ DUMP_SORTKEYS( "collation.c", READ_SORTKEYS_FILE() );
 DUMP_COMPOSE_TABLES( "compose.c" );
 DUMP_CTYPE_TABLES( "wctype.c" );
 dump_mirroring( "../../dlls/usp10/mirror.c" );
+dump_intl_nls("../tools/l_intl.nls");
 
 foreach my $file (@allfiles) { HANDLE_FILE( @{$file} ); }
 
diff --git a/tools/l_intl.nls b/tools/l_intl.nls
new file mode 100644
index 0000000..4939fb2
Binary files /dev/null and b/tools/l_intl.nls differ




More information about the wine-cvs mailing list