From f54c2f65b8cdc0ed3220aef87e23165da559f598 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 26 Jun 2013 17:28:15 +0200 Subject: [PATCH] make_unicode: Move codepage file output code to a common routine and make default characters configurable. --- tools/make_unicode | 158 ++++++++++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 74 deletions(-) diff --git a/tools/make_unicode b/tools/make_unicode index 59c75abde3b..8ac2411148c 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); } +################################################################ +# 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"; + + 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); +} ################################################################ -# handle a "bestfit" Windows mapping file - -sub handle_bestfit_file($$$) +# 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(); } + # some codepage files are special + if ($codepage == 20932) + { + READ_JIS0208_FILE( $filename ); + ADD_DEFAULT_MAPPINGS(); + } + elsif ($codepage == 20127) + { + fill_20127_codepage(); + ADD_DEFAULT_MAPPINGS(); + } elsif ($filename =~ /\/bestfit/) { - handle_bestfit_file( $filename, $has_glyphs, $comment ); - return; - } - 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) - { - print OUTPUT "/* generated from $MAPPINGS/$filename */\n"; - print OUTPUT "/* DO NOT EDIT!! */\n\n"; + 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 ); }