#!/usr/bin/perl # # Reads the Unicode 2.0 "unidata2.txt" file and selects encodings # for case pairs, then builds an include file "casemap.h" for the # case conversion routines. use integer $INFILE = "UnicodeData.txt"; $OUT = ">casemap.h"; $TEST = ">allcodes"; # Open the data file ... open INFILE or die "Can't open input file $INFILE!\n"; open OUT or die "Can't open output file $OUT!\n"; open TEST or die "Can't open output file $OUT!\n"; #Initialize the upper and lower hashes %lwrtable = (); %uprtable = (); @low = ("0") x 256; @upr = ("0") x 256; while ($line = ) { # Decode the fields ... ($code, $name, $cat, $comb, $bidi, $decomp, $dec, $dig, $num, $mirror, $oldname, $comment, $upper, $lower, $title) = split /;/, $line; #Get the high byte of the code $high = substr $code, 0, 2; if ($lower ne "") { $low[hex $high] = "lblk" . $high; $lwrtable{$code} = $lower; } if ($upper ne "") { $upr[hex $high] = "ublk" . $high; $uprtable{$code} = $upper; } #Write everything to the test file printf TEST "%s %s %s\n", $code, $upper ne "" ? $upper : "0000", $lower ne "" ? $lower : "0000"; } close(FILE); close TEST; #Generate the header file print OUT "/*\n"; print OUT " * Automatically generated file -- do not edit!\n"; print OUT " * (Use tools/unimap.pl for generation)\n"; print OUT " *\n"; print OUT " * Mapping tables for Unicode case conversion\n"; print OUT " */\n"; print OUT "\n"; print OUT "#ifndef __WINE_CASEMAP_H\n"; print OUT "#define __WINE_CASEMAP_H\n"; print OUT "\n"; print OUT "#include \"windef.h\"\n"; print OUT "\n"; #Write out the non-trivial mappings for ($high = 0; $high < 256; $high++) { #Check whether the table is needed if (length $low[$high] < 6) { next; } printf OUT "/* Lowercase mappings %02X00 - %02XFF */\n", $high, $high; printf OUT "static const WCHAR lblk%02X[256] = {\n", $high; for ($low = 0; $low < 256; $low += 8) { @patch = (); for ($i = 0; $i < 8; $i++) { $code = sprintf "%02X%02X", $high, $low + $i; $map = $lwrtable{$code}; if ($map eq "") { $map = $code; } $patch[$i] = "0x" . $map; } printf OUT "\t%s, %s, %s, %s, %s, %s, %s, %s,\n", @patch; } print OUT "};\n\n"; } print OUT "static const WCHAR * const lwrtable[256] = {\n"; for ($i = 0; $i < 256; $i += 8) { @patch = @low[$i+0 .. $i+7]; printf OUT "\t%06s, %06s, %06s, %06s, %06s, %06s, %06s, %06s,\n", @patch; } print OUT "};\n\n"; for ($high = 0; $high < 256; $high++) { #Check whether the table is needed if (length $upr[$high] < 6) { next; } printf OUT "/* Uppercase mappings %02X00 - %02XFF */\n", $high, $high; printf OUT "static const WCHAR ublk%02X[256] = {\n", $high; for ($low = 0; $low < 256; $low += 8) { @patch = (); for ($i = 0; $i < 8; $i++) { $code = sprintf "%02X%02X", $high, $low + $i; $map = $uprtable{$code}; if ($map eq "") { $map = $code; } $patch[$i] = "0x" . $map; } printf OUT "\t%s, %s, %s, %s, %s, %s, %s, %s,\n", @patch; } print OUT "};\n\n"; } print OUT "static const WCHAR * const uprtable[256] = {\n"; for ($i = 0; $i < 256; $i += 8) { @patch = @upr[$i+0 .. $i+7]; printf OUT "\t%06s, %06s, %06s, %06s, %06s, %06s, %06s, %06s,\n", @patch; } print OUT "};\n"; print OUT "\n"; print OUT "#endif /* !defined(__WINE_CASEMAP_H) */\n"; close(OUT);