Alexandre Julliard : make_unicode: Move codepage file output code to a common routine and make default characters configurable .

Alexandre Julliard julliard at winehq.org
Wed Jun 26 16:40:31 CDT 2013


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jun 26 17:28:15 2013 +0200

make_unicode: Move codepage file output code to a common routine and make default characters configurable.

---

 tools/make_unicode |  156 +++++++++++++++++++++++++++------------------------
 1 files changed, 83 insertions(+), 73 deletions(-)

diff --git a/tools/make_unicode b/tools/make_unicode
index 59c75ab..8ac2411 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -310,6 +310,8 @@ my @joining_table = (0) x 65536;
 my @direction_table = ();
 my @decomp_table = ();
 my @compose_table = ();
+my $default_char;
+my $default_wchar;
 
 my %joining_forms =
 (
@@ -495,8 +497,30 @@ sub READ_DEFAULTS($)
 
 
 ################################################################
-# parse the input file
-sub READ_FILE($)
+# define a new lead byte
+sub add_lead_byte($)
+{
+    my $ch = shift;
+    push @lead_bytes, $ch;
+    $cp2uni[$ch] = 0;
+}
+
+################################################################
+# define a new char mapping
+sub add_mapping($$)
+{
+    my ($cp, $uni) = @_;
+    $cp2uni[$cp] = $uni unless defined($cp2uni[$cp]);
+    $uni2cp[$uni] = $cp unless defined($uni2cp[$uni]);
+    if ($cp > 0xff && !defined($cp2uni[$cp >> 8]))
+    {
+        add_lead_byte( $cp >> 8 );
+    }
+}
+
+################################################################
+# parse a standard codepage file
+sub read_codepage_file($)
 {
     my $name = shift;
     my $INPUT = open_data_file( $MAPPINGS, $name );
@@ -510,22 +534,13 @@ sub READ_FILE($)
 
         if (/^0x([0-9a-fA-F]+)\s+\#DBCS LEAD BYTE/)
         {
-            my $cp = hex $1;
-            push @lead_bytes,$cp;
-            $cp2uni[$cp] = 0;
+            add_lead_byte( hex $1 );
             next;
         }
+        # 0x12 0x3456
         if (/^0x([0-9a-fA-F]+)\s+0x([0-9a-fA-F]+)\s+(\#.*)?/)
         {
-            my $cp = hex $1;
-            my $uni = hex $2;
-            $cp2uni[$cp] = $uni unless defined($cp2uni[$cp]);
-            $uni2cp[$uni] = $cp unless defined($uni2cp[$uni]);
-            if ($cp > 0xff && !defined($cp2uni[$cp >> 8]))
-            {
-                push @lead_bytes,$cp >> 8;
-                $cp2uni[$cp >> 8] = 0;
-            }
+            add_mapping( hex $1, hex $2 );
             next;
         }
         die "$name: Unrecognized line $_\n";
@@ -1847,17 +1862,45 @@ sub DUMP_COMPOSE_TABLES($)
     save_file($filename);
 }
 
-
 ################################################################
-# handle a "bestfit" Windows mapping file
+# output a codepage definition file from the global tables
+sub output_codepage_file($$$$)
+{
+    my ($codepage, $filename, $comment, $has_glyphs) = @_;
+
+    my $output = sprintf "libs/wine/c_%03d.c", $codepage;
+    open OUTPUT,">$output.new" or die "Cannot create $output";
 
-sub handle_bestfit_file($$$)
+    printf "Building %s from %s (%s)\n", $output, $filename || "hardcoded data", $comment;
+
+    # dump all tables
+
+    printf OUTPUT "/* code page %03d (%s) */\n", $codepage, $comment;
+    if ($filename)
+    {
+        print OUTPUT "/* generated from $MAPPINGS/$filename */\n";
+        print OUTPUT "/* DO NOT EDIT!! */\n\n";
+    }
+    else
+    {
+        printf OUTPUT "/* Automatically generated; DO NOT EDIT!! */\n\n";
+    }
+    printf OUTPUT "#include \"wine/unicode.h\"\n\n";
+
+    if (!@lead_bytes) { dump_sbcs_table( $codepage, $has_glyphs, $comment, $default_char, $default_wchar ); }
+    else { dump_dbcs_table( $codepage, $comment, $default_char, $default_wchar, get_lb_ranges() ); }
+    close OUTPUT;
+    save_file($output);
+}
+
+################################################################
+# read a "bestfit" Windows mapping file
+sub read_bestfit_file($)
 {
-    my ($filename, $has_glyphs, $comment) = @_;
+    my ($filename) = @_;
     my $state = "";
-    my ($codepage, $width, $def, $defw, $count);
+    my ($codepage, $width, $count);
     my ($lb_cur, $lb_end);
-    my @lb_ranges = ();
 
     my $INPUT = open_data_file( $MAPPINGS, $filename ) or die "Cannot open $filename";
 
@@ -1876,8 +1919,8 @@ sub handle_bestfit_file($$$)
         if (/^CPINFO\s+(\d+)\s+0x([0-9a-fA-f]+)\s+0x([0-9a-fA-F]+)/)
         {
             $width = $1;
-            $def = hex $2;
-            $defw = hex $3;
+            $default_char = hex $2;
+            $default_wchar = hex $3;
             next;
         }
         if (/^(MBTABLE|WCTABLE|DBCSRANGE|DBCSTABLE)\s+(\d+)/)
@@ -1906,12 +1949,7 @@ sub handle_bestfit_file($$$)
             {
                 my $start = hex $1;
                 my $end = hex $2;
-                push @lb_ranges, $start, $end;
-                for (my $i = $start; $i <= $end; $i++)
-                {
-                    push @lead_bytes, $i;
-                    $cp2uni[$i] = 0;
-                }
+                for (my $i = $start; $i <= $end; $i++) { add_lead_byte( $i ); }
                 $lb_cur = $start;
                 $lb_end = $end;
                 next;
@@ -1932,23 +1970,6 @@ sub handle_bestfit_file($$$)
         die "$filename: Unrecognized line $_\n";
     }
     close $INPUT;
-
-    my $output = sprintf "libs/wine/c_%03d.c", $codepage;
-    open OUTPUT,">$output.new" or die "Cannot create $output";
-
-    printf "Building %s from %s (%s)\n", $output, $filename, $comment;
-
-    # dump all tables
-
-    printf OUTPUT "/* code page %03d (%s) */\n", $codepage, $comment;
-    printf OUTPUT "/* generated from $MAPPINGS/$filename */\n";
-    printf OUTPUT "/* DO NOT EDIT!! */\n\n";
-    printf OUTPUT "#include \"wine/unicode.h\"\n\n";
-
-    if ($width == 1) { dump_sbcs_table( $codepage, $has_glyphs, $comment, $def, $defw ); }
-    else { dump_dbcs_table( $codepage, $comment, $def, $defw, @lb_ranges ); }
-    close OUTPUT;
-    save_file($output);
 }
 
 
@@ -1956,47 +1977,36 @@ sub handle_bestfit_file($$$)
 # read an input file and generate the corresponding .c file
 sub HANDLE_FILE(@)
 {
-    my ($codepage,$filename,$has_glyphs,$comment) = @_;
+    my ($codepage,$filename,$has_glyphs,$comment,$def,$defw) = @_;
 
     @cp2uni = ();
     @lead_bytes = ();
     @uni2cp = ();
+    $default_char = $def || $DEF_CHAR;
+    $default_wchar = $defw || $DEF_CHAR;
 
-    # symbol codepage file is special
-    if ($codepage == 20932) { READ_JIS0208_FILE( $filename ); }
-    elsif ($codepage == 20127) { fill_20127_codepage(); }
-    elsif ($filename =~ /\/bestfit/)
+    # some codepage files are special
+    if ($codepage == 20932)
     {
-        handle_bestfit_file( $filename, $has_glyphs, $comment );
-        return;
+        READ_JIS0208_FILE( $filename );
+        ADD_DEFAULT_MAPPINGS();
     }
-    else { READ_FILE( $filename ); }
-
-    ADD_DEFAULT_MAPPINGS();
-
-    my $output = sprintf "libs/wine/c_%03d.c", $codepage;
-    open OUTPUT,">$output.new" or die "Cannot create $output";
-
-    printf "Building %s from %s (%s)\n", $output, $filename || "hardcoded data", $comment;
-
-    # dump all tables
-
-    printf OUTPUT "/* code page %03d (%s) */\n", $codepage, $comment;
-    if ($filename)
+    elsif ($codepage == 20127)
     {
-        print OUTPUT "/* generated from $MAPPINGS/$filename */\n";
-        print OUTPUT "/* DO NOT EDIT!! */\n\n";
+        fill_20127_codepage();
+        ADD_DEFAULT_MAPPINGS();
+    }
+    elsif ($filename =~ /\/bestfit/)
+    {
+        read_bestfit_file( $filename );
     }
     else
     {
-        printf OUTPUT "/* Automatically generated; DO NOT EDIT!! */\n\n";
+        read_codepage_file( $filename );
+        ADD_DEFAULT_MAPPINGS();
     }
-    printf OUTPUT "#include \"wine/unicode.h\"\n\n";
 
-    if (!@lead_bytes) { dump_sbcs_table( $codepage, $has_glyphs, $comment, $DEF_CHAR, $DEF_CHAR ); }
-    else { dump_dbcs_table( $codepage, $comment, $DEF_CHAR, $DEF_CHAR, get_lb_ranges() ); }
-    close OUTPUT;
-    save_file($output);
+    output_codepage_file( $codepage, $filename, $comment, $has_glyphs );
 }
 
 




More information about the wine-cvs mailing list