1*c667dd47SPedro Giffuni#!/usr/bin/env perl 27e90fac2SAndrew Rist#************************************************************** 37e90fac2SAndrew Rist# 47e90fac2SAndrew Rist# Licensed to the Apache Software Foundation (ASF) under one 57e90fac2SAndrew Rist# or more contributor license agreements. See the NOTICE file 67e90fac2SAndrew Rist# distributed with this work for additional information 77e90fac2SAndrew Rist# regarding copyright ownership. The ASF licenses this file 87e90fac2SAndrew Rist# to you under the Apache License, Version 2.0 (the 97e90fac2SAndrew Rist# "License"); you may not use this file except in compliance 107e90fac2SAndrew Rist# with the License. You may obtain a copy of the License at 117e90fac2SAndrew Rist# 127e90fac2SAndrew Rist# http://www.apache.org/licenses/LICENSE-2.0 137e90fac2SAndrew Rist# 147e90fac2SAndrew Rist# Unless required by applicable law or agreed to in writing, 157e90fac2SAndrew Rist# software distributed under the License is distributed on an 167e90fac2SAndrew Rist# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 177e90fac2SAndrew Rist# KIND, either express or implied. See the License for the 187e90fac2SAndrew Rist# specific language governing permissions and limitations 197e90fac2SAndrew Rist# under the License. 207e90fac2SAndrew Rist# 217e90fac2SAndrew Rist#************************************************************** 227e90fac2SAndrew Rist 237e90fac2SAndrew Rist 24cdf0e10cSrcweir 25cdf0e10cSrcweir# The following files must be available in a ./input subdir: 26cdf0e10cSrcweir 27cdf0e10cSrcweir# <http://www.info.gov.hk/digital21/eng/hkscs/download/big5-iso.txt> 28cdf0e10cSrcweir 29cdf0e10cSrcweir# <http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT>: 30cdf0e10cSrcweir# "Unicode version: 1.1 Table version: 0.0d3 Date: 11 February 1994" 31cdf0e10cSrcweir# Only used to track Unicode characters that are mapped from both Big5 and 32cdf0e10cSrcweir# HKSCS. 33cdf0e10cSrcweir 34cdf0e10cSrcweir# <http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT>: 35cdf0e10cSrcweir# "Unicode version: 2.0 Table version: 2.01 Date: 1/7/2000" 36cdf0e10cSrcweir# Only used to track Unicode characters that are mapped from both CP950 and 37cdf0e10cSrcweir# HKSCS. 38cdf0e10cSrcweir 39cdf0e10cSrcweir$surrogates = 0; # set to 1 to allow mappings to Unicode beyond Plane 0 40cdf0e10cSrcweir 41cdf0e10cSrcweir$id = "Big5Hkscs2001"; 42cdf0e10cSrcweir 43cdf0e10cSrcweirsub isValidUtf32 44cdf0e10cSrcweir{ 45cdf0e10cSrcweir my $utf32 = $_[0]; 46cdf0e10cSrcweir return $utf32 >= 0 && $utf32 <= 0x10FFFF 47cdf0e10cSrcweir && !($utf32 >= 0xD800 && $utf32 <= 0xDFFF) 48cdf0e10cSrcweir && !($utf32 >= 0xFDD0 && $utf32 <= 0xFDEF) 49cdf0e10cSrcweir && ($utf32 & 0xFFFF) < 0xFFFE; 50cdf0e10cSrcweir} 51cdf0e10cSrcweir 52cdf0e10cSrcweirsub printUtf32 53cdf0e10cSrcweir{ 54cdf0e10cSrcweir my $utf32 = $_[0]; 55cdf0e10cSrcweir return sprintf("U+%04X", $utf32); 56cdf0e10cSrcweir} 57cdf0e10cSrcweir 58cdf0e10cSrcweirsub isValidBig5 59cdf0e10cSrcweir{ 60cdf0e10cSrcweir my $big5 = $_[0]; 61cdf0e10cSrcweir my $big5_row = $big5 >> 8; 62cdf0e10cSrcweir my $big5_column = $big5 & 0xFF; 63cdf0e10cSrcweir return $big5_row >= 0x81 && $big5_row <= 0xFE 64cdf0e10cSrcweir && ($big5_column >= 0x40 && $big5_column <= 0x7E 65cdf0e10cSrcweir || $big5_column >= 0xA1 && $big5_column <= 0xFE); 66cdf0e10cSrcweir} 67cdf0e10cSrcweir 68cdf0e10cSrcweirsub printBig5 69cdf0e10cSrcweir{ 70cdf0e10cSrcweir my $big5 = $_[0]; 71cdf0e10cSrcweir return sprintf("%04X", $big5); 72cdf0e10cSrcweir} 73cdf0e10cSrcweir 74cdf0e10cSrcweirsub printStats 75cdf0e10cSrcweir{ 76cdf0e10cSrcweir my $used = $_[0]; 77cdf0e10cSrcweir my $space = $_[1]; 78cdf0e10cSrcweir return sprintf("%d/%d bytes (%.1f%%)", 79cdf0e10cSrcweir $used, 80cdf0e10cSrcweir $space, 81cdf0e10cSrcweir $used * 100 / $space); 82cdf0e10cSrcweir} 83cdf0e10cSrcweir 84cdf0e10cSrcweirsub printSpaces 85cdf0e10cSrcweir{ 86cdf0e10cSrcweir my $column_width = $_[0]; 87cdf0e10cSrcweir my $columns_per_line = $_[1]; 88cdf0e10cSrcweir my $end = $_[2]; 89cdf0e10cSrcweir $output = ""; 90cdf0e10cSrcweir for ($i = int($end / $columns_per_line) * $columns_per_line; 91cdf0e10cSrcweir $i < $end; 92cdf0e10cSrcweir ++$i) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir for ($j = 0; $j < $column_width; ++$j) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir $output = $output . " "; 97cdf0e10cSrcweir } 98cdf0e10cSrcweir } 99cdf0e10cSrcweir return $output; 100cdf0e10cSrcweir} 101cdf0e10cSrcweir 102cdf0e10cSrcweirsub addMapping 103cdf0e10cSrcweir{ 104cdf0e10cSrcweir my $utf32 = $_[0]; 105cdf0e10cSrcweir my $big5 = $_[1]; 106cdf0e10cSrcweir my $comp = $_[2]; 107cdf0e10cSrcweir 108cdf0e10cSrcweir $uni_plane = $utf32 >> 16; 109cdf0e10cSrcweir $uni_page = ($utf32 >> 8) & 0xFF; 110cdf0e10cSrcweir $uni_index = $utf32 & 0xFF; 111cdf0e10cSrcweir 112cdf0e10cSrcweir if (!defined($uni_plane_used[$uni_plane]) 113cdf0e10cSrcweir || !defined($uni_page_used[$uni_plane][$uni_page]) 114cdf0e10cSrcweir || !defined($uni_map[$uni_plane][$uni_page][$uni_index])) 115cdf0e10cSrcweir { 116cdf0e10cSrcweir $uni_map[$uni_plane][$uni_page][$uni_index] = $big5; 117cdf0e10cSrcweir $uni_plane_used[$uni_plane] = 1; 118cdf0e10cSrcweir $uni_page_used[$uni_plane][$uni_page] = 1; 119cdf0e10cSrcweir if ($comp != -1) 120cdf0e10cSrcweir { 121cdf0e10cSrcweir ++$compat[$comp]; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir } 124cdf0e10cSrcweir else 125cdf0e10cSrcweir { 126cdf0e10cSrcweir $big5_1 = $uni_map[$uni_plane][$uni_page][$uni_index]; 127cdf0e10cSrcweir print "WARNING! Mapping ", printUtf32($utf32), " to ", 128cdf0e10cSrcweir printBig5($big5_1), ", NOT ", ($comp ? "compat " : ""), 129cdf0e10cSrcweir printBig5($big5), "\n"; 130cdf0e10cSrcweir } 131cdf0e10cSrcweir} 132cdf0e10cSrcweir 133cdf0e10cSrcweir# Build mappings to track Unicode characters that are mapped from both Big5/ 134cdf0e10cSrcweir# CP950 and HKSCS: 135cdf0e10cSrcweir{ 136cdf0e10cSrcweir $filename = "BIG5.TXT"; 137cdf0e10cSrcweir open IN, ("input/" . $filename) or die "Cannot read " . $filename; 138cdf0e10cSrcweir while (<IN>) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir if (/(0x[0-9A-F][0-9A-F][0-9A-F][0-9A-F])[ \t]+(0x[0-9A-F]+)[ \t]+\#.*$/) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir $big5 = oct($1); 143cdf0e10cSrcweir $utf32 = oct($2); 144cdf0e10cSrcweir isValidBig5($big5) 145cdf0e10cSrcweir or die "Bad Big5 char " . printBig5($big5); 146cdf0e10cSrcweir isValidUtf32($utf32) 147cdf0e10cSrcweir or die "Bad UTF32 char " . printUtf32($utf32); 148cdf0e10cSrcweir if ($utf32 != 0xFFFD) 149cdf0e10cSrcweir { 150cdf0e10cSrcweir if (defined($underlying_big5[$utf32])) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir print "WARNING! In ", $filename, ", both ", 153cdf0e10cSrcweir printBig5($underlying_big5[$utf32]), " and ", 154cdf0e10cSrcweir printBig5($big5), " map to ", printUtf32($utf32), 155cdf0e10cSrcweir "\n"; 156cdf0e10cSrcweir } 157cdf0e10cSrcweir else 158cdf0e10cSrcweir { 159cdf0e10cSrcweir $underlying_big5[$utf32] = $big5; 160cdf0e10cSrcweir } 161cdf0e10cSrcweir } 162cdf0e10cSrcweir } 163cdf0e10cSrcweir } 164cdf0e10cSrcweir close IN; 165cdf0e10cSrcweir 166cdf0e10cSrcweir $filename = "CP950.TXT"; 167cdf0e10cSrcweir open IN, ("input/" . $filename) or die "Cannot read " . $filename; 168cdf0e10cSrcweir while (<IN>) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir if (/(0x[0-9A-F][0-9A-F][0-9A-F][0-9A-F])[ \t]+(0x[0-9A-F]+)[ \t]+\#.*$/) 171cdf0e10cSrcweir { 172cdf0e10cSrcweir $big5 = oct($1); 173cdf0e10cSrcweir $utf32 = oct($2); 174cdf0e10cSrcweir isValidBig5($big5) 175cdf0e10cSrcweir or die "Bad Big5 char " . printBig5($big5); 176cdf0e10cSrcweir isValidUtf32($utf32) 177cdf0e10cSrcweir or die "Bad UTF32 char " . printUtf32($utf32); 178cdf0e10cSrcweir if (defined($underlying_cp950[$utf32])) 179cdf0e10cSrcweir { 180cdf0e10cSrcweir print "WARNING! In ", $filename, ", both ", 181cdf0e10cSrcweir printBig5($underlying_cp950[$utf32]), " and ", 182cdf0e10cSrcweir printBig5($big5), " map to ", printUtf32($utf32), "\n"; 183cdf0e10cSrcweir } 184cdf0e10cSrcweir else 185cdf0e10cSrcweir { 186cdf0e10cSrcweir $underlying_cp950[$utf32] = $big5; 187cdf0e10cSrcweir } 188cdf0e10cSrcweir } 189cdf0e10cSrcweir } 190cdf0e10cSrcweir close IN; 191cdf0e10cSrcweir} 192cdf0e10cSrcweir 193cdf0e10cSrcweir# The following are mapped by the underlying RTL_TEXTENCODING_BIG5 to some 194cdf0e10cSrcweir# nonstandard Unicode points, so they are explicitly mentioned here to map 195cdf0e10cSrcweir# to the standard Unicode PUA points. (In the other direction, the unofficial 196cdf0e10cSrcweir# mappings from Unicode to RTL_TEXTENCODING_BIG5 C6A1--C7FE are harmless, 197cdf0e10cSrcweir# since all Unicode characters involved are already covered by the official 198cdf0e10cSrcweir# Big5-HKSCS mappings.) 199cdf0e10cSrcweir$big5_map[0xC6][0xCF] = 0xF6E0; addMapping(0xF6E0, 0xC6CF, -1); 200cdf0e10cSrcweir$big5_map[0xC6][0xD3] = 0xF6E4; addMapping(0xF6E4, 0xC6D3, -1); 201cdf0e10cSrcweir$big5_map[0xC6][0xD5] = 0xF6E6; addMapping(0xF6E6, 0xC6D5, -1); 202cdf0e10cSrcweir$big5_map[0xC6][0xD7] = 0xF6E8; addMapping(0xF6E8, 0xC6D7, -1); 203cdf0e10cSrcweir$big5_map[0xC6][0xDE] = 0xF6EF; addMapping(0xF6EF, 0xC6DE, -1); 204cdf0e10cSrcweir$big5_map[0xC6][0xDF] = 0xF6F0; addMapping(0xF6F0, 0xC6DF, -1); 205cdf0e10cSrcweir 206cdf0e10cSrcweir# The following implements the mapping of Big5-HKSCS compatibility points 207cdf0e10cSrcweir# (GCCS characters unified with other HKSCS characters) to Unicode. In the 208cdf0e10cSrcweir# other direction, characters from Unicode's PUA will map to these Big5-HKSCS 209cdf0e10cSrcweir# compatibility points. (See the first list in <http://www.info.gov.hk/ 210cdf0e10cSrcweir# digital21/eng/hkscs/download/big5cmp.txt>.) 211cdf0e10cSrcweir$big5_map[0x8E][0x69] = 0x7BB8; 212cdf0e10cSrcweir$big5_map[0x8E][0x6F] = 0x7C06; 213cdf0e10cSrcweir$big5_map[0x8E][0x7E] = 0x7CCE; 214cdf0e10cSrcweir$big5_map[0x8E][0xAB] = 0x7DD2; 215cdf0e10cSrcweir$big5_map[0x8E][0xB4] = 0x7E1D; 216cdf0e10cSrcweir$big5_map[0x8E][0xCD] = 0x8005; 217cdf0e10cSrcweir$big5_map[0x8E][0xD0] = 0x8028; 218cdf0e10cSrcweir$big5_map[0x8F][0x57] = 0x83C1; 219cdf0e10cSrcweir$big5_map[0x8F][0x69] = 0x84A8; 220cdf0e10cSrcweir$big5_map[0x8F][0x6E] = 0x840F; 221cdf0e10cSrcweir$big5_map[0x8F][0xCB] = 0x89A6; 222cdf0e10cSrcweir$big5_map[0x8F][0xCC] = 0x89A9; 223cdf0e10cSrcweir$big5_map[0x8F][0xFE] = 0x8D77; 224cdf0e10cSrcweir$big5_map[0x90][0x6D] = 0x90FD; 225cdf0e10cSrcweir$big5_map[0x90][0x7A] = 0x92B9; 226cdf0e10cSrcweir$big5_map[0x90][0xDC] = 0x975C; 227cdf0e10cSrcweir$big5_map[0x90][0xF1] = 0x97FF; 228cdf0e10cSrcweir$big5_map[0x91][0xBF] = 0x9F16; 229cdf0e10cSrcweir$big5_map[0x92][0x44] = 0x8503; 230cdf0e10cSrcweir$big5_map[0x92][0xAF] = 0x5159; 231cdf0e10cSrcweir$big5_map[0x92][0xB0] = 0x515B; 232cdf0e10cSrcweir$big5_map[0x92][0xB1] = 0x515D; 233cdf0e10cSrcweir$big5_map[0x92][0xB2] = 0x515E; 234cdf0e10cSrcweir$big5_map[0x92][0xC8] = 0x936E; 235cdf0e10cSrcweir$big5_map[0x92][0xD1] = 0x7479; 236cdf0e10cSrcweir$big5_map[0x94][0x47] = 0x6D67; 237cdf0e10cSrcweir$big5_map[0x94][0xCA] = 0x799B; 238cdf0e10cSrcweir$big5_map[0x95][0xD9] = 0x9097; 239cdf0e10cSrcweir$big5_map[0x96][0x44] = 0x975D; 240cdf0e10cSrcweir$big5_map[0x96][0xED] = 0x701E; 241cdf0e10cSrcweir$big5_map[0x96][0xFC] = 0x5B28; 242cdf0e10cSrcweir$big5_map[0x9B][0x76] = 0x7201; 243cdf0e10cSrcweir$big5_map[0x9B][0x78] = 0x77D7; 244cdf0e10cSrcweir$big5_map[0x9B][0x7B] = 0x7E87; 245cdf0e10cSrcweir$big5_map[0x9B][0xC6] = 0x99D6; 246cdf0e10cSrcweir$big5_map[0x9B][0xDE] = 0x91D4; 247cdf0e10cSrcweir$big5_map[0x9B][0xEC] = 0x60DE; 248cdf0e10cSrcweir$big5_map[0x9B][0xF6] = 0x6FB6; 249cdf0e10cSrcweir$big5_map[0x9C][0x42] = 0x8F36; 250cdf0e10cSrcweir$big5_map[0x9C][0x53] = 0x4FBB; 251cdf0e10cSrcweir$big5_map[0x9C][0x62] = 0x71DF; 252cdf0e10cSrcweir$big5_map[0x9C][0x68] = 0x9104; 253cdf0e10cSrcweir$big5_map[0x9C][0x6B] = 0x9DF0; 254cdf0e10cSrcweir$big5_map[0x9C][0x77] = 0x83CF; 255cdf0e10cSrcweir$big5_map[0x9C][0xBC] = 0x5C10; 256cdf0e10cSrcweir$big5_map[0x9C][0xBD] = 0x79E3; 257cdf0e10cSrcweir$big5_map[0x9C][0xD0] = 0x5A67; 258cdf0e10cSrcweir$big5_map[0x9D][0x57] = 0x8F0B; 259cdf0e10cSrcweir$big5_map[0x9D][0x5A] = 0x7B51; 260cdf0e10cSrcweir$big5_map[0x9D][0xC4] = 0x62D0; 261cdf0e10cSrcweir$big5_map[0x9E][0xA9] = 0x6062; 262cdf0e10cSrcweir$big5_map[0x9E][0xEF] = 0x75F9; 263cdf0e10cSrcweir$big5_map[0x9E][0xFD] = 0x6C4A; 264cdf0e10cSrcweir$big5_map[0x9F][0x60] = 0x9B2E; 265cdf0e10cSrcweir$big5_map[0x9F][0x66] = 0x9F17; 266cdf0e10cSrcweir$big5_map[0x9F][0xCB] = 0x50ED; 267cdf0e10cSrcweir$big5_map[0x9F][0xD8] = 0x5F0C; 268cdf0e10cSrcweir$big5_map[0xA0][0x63] = 0x880F; 269cdf0e10cSrcweir$big5_map[0xA0][0x77] = 0x62CE; 270cdf0e10cSrcweir$big5_map[0xA0][0xD5] = 0x7468; 271cdf0e10cSrcweir$big5_map[0xA0][0xDF] = 0x7162; 272cdf0e10cSrcweir$big5_map[0xA0][0xE4] = 0x7250; 273cdf0e10cSrcweir$big5_map[0xFA][0x5F] = 0x5029; 274cdf0e10cSrcweir$big5_map[0xFA][0x66] = 0x507D; 275cdf0e10cSrcweir$big5_map[0xFA][0xBD] = 0x5305; 276cdf0e10cSrcweir$big5_map[0xFA][0xC5] = 0x5344; 277cdf0e10cSrcweir$big5_map[0xFA][0xD5] = 0x537F; 278cdf0e10cSrcweir$big5_map[0xFB][0x48] = 0x5605; 279cdf0e10cSrcweir$big5_map[0xFB][0xB8] = 0x5A77; 280cdf0e10cSrcweir$big5_map[0xFB][0xF3] = 0x5E75; 281cdf0e10cSrcweir$big5_map[0xFB][0xF9] = 0x5ED0; 282cdf0e10cSrcweir$big5_map[0xFC][0x4F] = 0x5F58; 283cdf0e10cSrcweir$big5_map[0xFC][0x6C] = 0x60A4; 284cdf0e10cSrcweir$big5_map[0xFC][0xB9] = 0x6490; 285cdf0e10cSrcweir$big5_map[0xFC][0xE2] = 0x6674; 286cdf0e10cSrcweir$big5_map[0xFC][0xF1] = 0x675E; 287cdf0e10cSrcweir$big5_map[0xFD][0xB7] = 0x6C9C; 288cdf0e10cSrcweir$big5_map[0xFD][0xB8] = 0x6E1D; 289cdf0e10cSrcweir$big5_map[0xFD][0xBB] = 0x6E2F; 290cdf0e10cSrcweir$big5_map[0xFD][0xF1] = 0x716E; 291cdf0e10cSrcweir$big5_map[0xFE][0x52] = 0x732A; 292cdf0e10cSrcweir$big5_map[0xFE][0x6F] = 0x745C; 293cdf0e10cSrcweir$big5_map[0xFE][0xAA] = 0x74E9; 294cdf0e10cSrcweir$big5_map[0xFE][0xDD] = 0x7809; 295cdf0e10cSrcweir 296cdf0e10cSrcweir$pua = 0; 297cdf0e10cSrcweir$compat[0] = 0; # 1993 298cdf0e10cSrcweir$compat[1] = 0; # 2000 299cdf0e10cSrcweir$compat[2] = 0; # 2001 300cdf0e10cSrcweir 301cdf0e10cSrcweir$filename = "big5-iso.txt"; 302cdf0e10cSrcweiropen IN, ("input/" . $filename) or die "Cannot read " . $filename; 303cdf0e10cSrcweirwhile (<IN>) 304cdf0e10cSrcweir{ 305cdf0e10cSrcweir if (/^([0-9A-F]+) +([0-9A-F]+) +([0-9A-F]+) +([0-9A-F]+)$/) 306cdf0e10cSrcweir { 307cdf0e10cSrcweir $big5 = oct("0x" . $1); 308cdf0e10cSrcweir $utf32_1993 = oct("0x" . $2); 309cdf0e10cSrcweir $utf32_2000 = oct("0x" . $3); 310cdf0e10cSrcweir $utf32_2001 = oct("0x" . $4); 311cdf0e10cSrcweir isValidBig5($big5) 312cdf0e10cSrcweir or die "Bad Big5 char " . printBig5($big5); 313cdf0e10cSrcweir isValidUtf32($utf32_1993) 314cdf0e10cSrcweir or die "Bad UTF32 char " . printUtf32($utf32_1993); 315cdf0e10cSrcweir isValidUtf32($utf32_2000) 316cdf0e10cSrcweir or die "Bad UTF32 char " . printUtf32($utf32_2000); 317cdf0e10cSrcweir isValidUtf32($utf32_2001) 318cdf0e10cSrcweir or die "Bad UTF32 char " . printUtf32($utf32_2001); 319cdf0e10cSrcweir 320cdf0e10cSrcweir $utf32 = $surrogates ? $utf32_2001 : $utf32_2000; 321cdf0e10cSrcweir 322cdf0e10cSrcweir if (defined($underlying_big5[$utf32]) 323cdf0e10cSrcweir || defined($underlying_cp950[$utf32])) 324cdf0e10cSrcweir { 325cdf0e10cSrcweir if (defined($underlying_big5[$utf32]) 326cdf0e10cSrcweir && defined($underlying_cp950[$utf32]) 327cdf0e10cSrcweir && $underlying_big5[$utf32] == $underlying_cp950[$utf32] 328cdf0e10cSrcweir && $underlying_big5[$utf32] == $big5 329cdf0e10cSrcweir || 330cdf0e10cSrcweir defined($underlying_big5[$utf32]) 331cdf0e10cSrcweir && !defined($underlying_cp950[$utf32]) 332cdf0e10cSrcweir && $underlying_big5[$utf32] == $big5 333cdf0e10cSrcweir || 334cdf0e10cSrcweir !defined($underlying_big5[$utf32]) 335cdf0e10cSrcweir && defined($underlying_cp950[$utf32]) 336cdf0e10cSrcweir && $underlying_cp950[$utf32] == $big5) 337cdf0e10cSrcweir { 338cdf0e10cSrcweir # ignore 339cdf0e10cSrcweir 340cdf0e10cSrcweir # Depending on real underlying mapping (cf. 341cdf0e10cSrcweir # ../convertbig5hkscs.tab), it would be possible to save some 342cdf0e10cSrcweir # table space by dropping those HKSCS code points that are 343cdf0e10cSrcweir # already covered by the underlying mapping. 344cdf0e10cSrcweir } 345cdf0e10cSrcweir else 346cdf0e10cSrcweir { 347cdf0e10cSrcweir print "XXX mapping underlying"; 348cdf0e10cSrcweir if (defined($underlying_big5[$utf32]) 349cdf0e10cSrcweir && defined($underlying_cp950[$utf32]) 350cdf0e10cSrcweir && $underlying_big5[$utf32] == $underlying_cp950[$utf32]) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir print " Big5/CP950 ", printBig5($underlying_big5[$utf32]); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir else 355cdf0e10cSrcweir { 356cdf0e10cSrcweir if (defined($underlying_big5[$utf32])) 357cdf0e10cSrcweir { 358cdf0e10cSrcweir print " Big5 ", printBig5($underlying_big5[$utf32]); 359cdf0e10cSrcweir } 360cdf0e10cSrcweir if (defined($underlying_cp950[$utf32])) 361cdf0e10cSrcweir { 362cdf0e10cSrcweir print " CP950 ", printBig5($underlying_cp950[$utf32]); 363cdf0e10cSrcweir } 364cdf0e10cSrcweir } 365cdf0e10cSrcweir print " and HKSCS ", printBig5($big5), " to ", 366cdf0e10cSrcweir printUtf32($utf32), "\n"; 367cdf0e10cSrcweir } 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir if ($utf32 >= 0xE000 && $utf32 <= 0xF8FF) 371cdf0e10cSrcweir { 372cdf0e10cSrcweir ++$pua; 373cdf0e10cSrcweir } 374cdf0e10cSrcweir 375cdf0e10cSrcweir $big5_row = $big5 >> 8; 376cdf0e10cSrcweir $big5_column = $big5 & 0xFF; 377cdf0e10cSrcweir if (defined($big5_map[$big5_row][$big5_column])) 378cdf0e10cSrcweir { 379cdf0e10cSrcweir die "Bad Big5 mapping " . printBig5($big5); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir $big5_map[$big5_row][$big5_column] = $utf32; 382cdf0e10cSrcweir 383cdf0e10cSrcweir addMapping($utf32, $big5, -1); 384cdf0e10cSrcweir 385cdf0e10cSrcweir if ($utf32_2001 != $utf32) 386cdf0e10cSrcweir { 387cdf0e10cSrcweir addMapping($utf32_2001, $big5, 2); 388cdf0e10cSrcweir } 389cdf0e10cSrcweir if ($utf32_2000 != $utf32 && $utf32_2000 != $utf32_2001) 390cdf0e10cSrcweir { 391cdf0e10cSrcweir addMapping($utf32_2000, $big5, 1); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir if ($utf32_1993 != $utf32 && $utf32_1993 != $utf32_2000 394cdf0e10cSrcweir && $utf32_1993 != $utf32_2001) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir addMapping($utf32_1993, $big5, 0); 397cdf0e10cSrcweir } 398cdf0e10cSrcweir } 399cdf0e10cSrcweir} 400cdf0e10cSrcweirclose IN; 401cdf0e10cSrcweir 402cdf0e10cSrcweirprint $pua, " mappings to PUA\n"; 403cdf0e10cSrcweirprint $compat[0], " 1993 compatibility mappings\n" if ($compat[0] != 0); 404cdf0e10cSrcweirprint $compat[1], " 2000 compatibility mappings\n" if ($compat[1] != 0); 405cdf0e10cSrcweirprint $compat[2], " 2001 compatibility mappings\n" if ($compat[2] != 0); 406cdf0e10cSrcweir 407cdf0e10cSrcweirif (defined($uni_plane_used[0]) && defined($uni_page_used[0][0])) 408cdf0e10cSrcweir{ 409cdf0e10cSrcweir for ($utf32 = 0; $utf32 <= 0x7F; ++$utf32) 410cdf0e10cSrcweir { 411cdf0e10cSrcweir if (defined($uni_map[0][0][$uni_index])) 412cdf0e10cSrcweir { 413cdf0e10cSrcweir $big5 = $uni_map[0][0][$utf32]; 414cdf0e10cSrcweir die "Mapping " . printUtf32($utf32) . " to " . printBig5($big5); 415cdf0e10cSrcweir } 416cdf0e10cSrcweir } 417cdf0e10cSrcweir} 418cdf0e10cSrcweir 419cdf0e10cSrcweir$filename = lc($id) . ".tab"; 420cdf0e10cSrcweiropen OUT, ("> " . $filename) or die "Cannot write " . $filename; 421cdf0e10cSrcweir 422cdf0e10cSrcweir{ 423cdf0e10cSrcweir $filename = lc($id). ".pl"; 424cdf0e10cSrcweir open IN, $filename or die "Cannot read ". $filename; 425cdf0e10cSrcweir $first = 1; 426cdf0e10cSrcweir while (<IN>) 427cdf0e10cSrcweir { 428cdf0e10cSrcweir if (/^\#!.*$/) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir } 431cdf0e10cSrcweir elsif (/^\#(\*.*)$/) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir if ($first == 1) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir print OUT "/", $1, "\n"; 436cdf0e10cSrcweir $first = 0; 437cdf0e10cSrcweir } 438cdf0e10cSrcweir else 439cdf0e10cSrcweir { 440cdf0e10cSrcweir print OUT " ", substr($1, 0, length($1) - 1), "/\n"; 441cdf0e10cSrcweir } 442cdf0e10cSrcweir } 443cdf0e10cSrcweir elsif (/^\# (.*)$/) 444cdf0e10cSrcweir { 445cdf0e10cSrcweir print OUT " *", $1, "\n"; 446cdf0e10cSrcweir } 447cdf0e10cSrcweir elsif (/^\#(.*)$/) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir print OUT " *", $1, "\n"; 450cdf0e10cSrcweir } 451cdf0e10cSrcweir else 452cdf0e10cSrcweir { 453cdf0e10cSrcweir goto done; 454cdf0e10cSrcweir } 455cdf0e10cSrcweir } 456cdf0e10cSrcweir done: 457cdf0e10cSrcweir} 458cdf0e10cSrcweir 459cdf0e10cSrcweirprint OUT "\n", 460cdf0e10cSrcweir "#ifndef _SAL_TYPES_H_\n", 461cdf0e10cSrcweir "#include \"sal/types.h\"\n", 462cdf0e10cSrcweir "#endif\n", 463cdf0e10cSrcweir "\n"; 464cdf0e10cSrcweir 465cdf0e10cSrcweirprint OUT "static sal_uInt16 const aImpl", $id, "ToUnicodeData[] = {\n"; 466cdf0e10cSrcweir$big5_data_index = 0; 467cdf0e10cSrcweir$big5_rows = 0; 468cdf0e10cSrcweir$big5_chars = 0; 469cdf0e10cSrcweirfor ($big5_row = 0; $big5_row <= 255; ++$big5_row) 470cdf0e10cSrcweir{ 471cdf0e10cSrcweir $big5_row_first = -1; 472cdf0e10cSrcweir for ($big5_column = 0; $big5_column <= 255; ++$big5_column) 473cdf0e10cSrcweir { 474cdf0e10cSrcweir if (defined($big5_map[$big5_row][$big5_column])) 475cdf0e10cSrcweir { 476cdf0e10cSrcweir if ($big5_row_first == -1) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir $big5_row_first = $big5_column; 479cdf0e10cSrcweir } 480cdf0e10cSrcweir $big5_row_last = $big5_column; 481cdf0e10cSrcweir } 482cdf0e10cSrcweir } 483cdf0e10cSrcweir if ($big5_row_first != -1) 484cdf0e10cSrcweir { 485cdf0e10cSrcweir $big5_data_offsets[$big5_row] = $big5_data_index; 486cdf0e10cSrcweir ++$big5_rows; 487cdf0e10cSrcweir print OUT " /* row ", $big5_row, " */\n"; 488cdf0e10cSrcweir 489cdf0e10cSrcweir $big5_row_surrogates_first = -1; 490cdf0e10cSrcweir $big5_row_chars = 0; 491cdf0e10cSrcweir $big5_row_surrogates = 0; 492cdf0e10cSrcweir 493cdf0e10cSrcweir print OUT " ", $big5_row_first, " | (", $big5_row_last, 494cdf0e10cSrcweir " << 8), /* first, last */\n"; 495cdf0e10cSrcweir ++$big5_data_index; 496cdf0e10cSrcweir 497cdf0e10cSrcweir print OUT " ", printSpaces(7, 10, $big5_row_first); 498cdf0e10cSrcweir $bol = 0; 499cdf0e10cSrcweir for ($big5_column = $big5_row_first; 500cdf0e10cSrcweir $big5_column <= $big5_row_last; 501cdf0e10cSrcweir ++$big5_column) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir if ($bol == 1) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir print OUT " "; 506cdf0e10cSrcweir $bol = 0; 507cdf0e10cSrcweir } 508cdf0e10cSrcweir if (defined($big5_map[$big5_row][$big5_column])) 509cdf0e10cSrcweir { 510cdf0e10cSrcweir $utf32 = $big5_map[$big5_row][$big5_column]; 511cdf0e10cSrcweir ++$big5_row_chars; 512cdf0e10cSrcweir if ($utf32 <= 0xFFFF) 513cdf0e10cSrcweir { 514cdf0e10cSrcweir printf OUT "0x%04X,", $utf32; 515cdf0e10cSrcweir } 516cdf0e10cSrcweir else 517cdf0e10cSrcweir { 518cdf0e10cSrcweir ++$big5_row_surrogates; 519cdf0e10cSrcweir printf OUT "0x%04X,", 520cdf0e10cSrcweir (0xD800 | (($utf32 - 0x10000) >> 10)); 521cdf0e10cSrcweir if ($big5_row_surrogates_first == -1) 522cdf0e10cSrcweir { 523cdf0e10cSrcweir $big5_row_surrogates_first = $big5_column; 524cdf0e10cSrcweir } 525cdf0e10cSrcweir $big5_row_surrogates_last = $big5_column; 526cdf0e10cSrcweir } 527cdf0e10cSrcweir } 528cdf0e10cSrcweir else 529cdf0e10cSrcweir { 530cdf0e10cSrcweir printf OUT "0xffff,"; 531cdf0e10cSrcweir } 532cdf0e10cSrcweir ++$big5_data_index; 533cdf0e10cSrcweir if ($big5_column % 10 == 9) 534cdf0e10cSrcweir { 535cdf0e10cSrcweir print OUT "\n"; 536cdf0e10cSrcweir $bol = 1; 537cdf0e10cSrcweir } 538cdf0e10cSrcweir } 539cdf0e10cSrcweir if ($bol == 0) 540cdf0e10cSrcweir { 541cdf0e10cSrcweir print OUT "\n"; 542cdf0e10cSrcweir } 543cdf0e10cSrcweir 544cdf0e10cSrcweir if ($big5_row_surrogates_first != -1) 545cdf0e10cSrcweir { 546cdf0e10cSrcweir print OUT " ", $big5_row_surrogates_first, 547cdf0e10cSrcweir ", /* first low-surrogate */\n"; 548cdf0e10cSrcweir ++$big5_data_index; 549cdf0e10cSrcweir 550cdf0e10cSrcweir print OUT " ", printSpaces(7, 10, $big5_row_surrogates_first); 551cdf0e10cSrcweir $bol = 0; 552cdf0e10cSrcweir for ($big5_column = $big5_row_surrogates_first; 553cdf0e10cSrcweir $big5_column <= $big5_row_surrogates_last; 554cdf0e10cSrcweir ++$big5_column) 555cdf0e10cSrcweir { 556cdf0e10cSrcweir if ($bol == 1) 557cdf0e10cSrcweir { 558cdf0e10cSrcweir print OUT " "; 559cdf0e10cSrcweir $bol = 0; 560cdf0e10cSrcweir } 561cdf0e10cSrcweir $utf32 = 0; 562cdf0e10cSrcweir if (defined($big5_map[$big5_row][$big5_column])) 563cdf0e10cSrcweir { 564cdf0e10cSrcweir $utf32 = $big5_map[$big5_row][$big5_column]; 565cdf0e10cSrcweir } 566cdf0e10cSrcweir if ($utf32 <= 0xFFFF) 567cdf0e10cSrcweir { 568cdf0e10cSrcweir printf OUT " 0,"; 569cdf0e10cSrcweir } 570cdf0e10cSrcweir else 571cdf0e10cSrcweir { 572cdf0e10cSrcweir printf OUT "0x%04X,", 573cdf0e10cSrcweir (0xDC00 | (($utf32 - 0x10000) & 0x3FF)); 574cdf0e10cSrcweir } 575cdf0e10cSrcweir ++$big5_data_index; 576cdf0e10cSrcweir if ($big5_column % 10 == 9) 577cdf0e10cSrcweir { 578cdf0e10cSrcweir print OUT "\n"; 579cdf0e10cSrcweir $bol = 1; 580cdf0e10cSrcweir } 581cdf0e10cSrcweir } 582cdf0e10cSrcweir if ($bol == 0) 583cdf0e10cSrcweir { 584cdf0e10cSrcweir print OUT "\n"; 585cdf0e10cSrcweir } 586cdf0e10cSrcweir } 587cdf0e10cSrcweir 588cdf0e10cSrcweir $big5_chars += $big5_row_chars; 589cdf0e10cSrcweir $big5_data_space[$big5_row] 590cdf0e10cSrcweir = ($big5_data_index - $big5_data_offsets[$big5_row]) * 2; 591cdf0e10cSrcweir $big5_data_used[$big5_row] 592cdf0e10cSrcweir = (1 + $big5_row_chars + ($big5_row_surrogates == 0 ? 593cdf0e10cSrcweir 0 : 1 + $big5_row_surrogates)) 594cdf0e10cSrcweir * 2; 595cdf0e10cSrcweir } 596cdf0e10cSrcweir else 597cdf0e10cSrcweir { 598cdf0e10cSrcweir print OUT " /* row ", $big5_row, ": --- */\n"; 599cdf0e10cSrcweir $big5_data_offsets[$big5_row] = -1; 600cdf0e10cSrcweir } 601cdf0e10cSrcweir} 602cdf0e10cSrcweirprint OUT "};\n\n"; 603cdf0e10cSrcweirprint "big5 rows = ", $big5_rows, ", chars = ", $big5_chars, "\n"; 604cdf0e10cSrcweir 605cdf0e10cSrcweirprint OUT "static sal_Int32 const aImpl", $id, "ToUnicodeRowOffsets[] = {\n"; 606cdf0e10cSrcweir$big5_rowoffsets_used = 0; 607cdf0e10cSrcweirfor ($big5_row = 0; $big5_row <= 255; ++$big5_row) 608cdf0e10cSrcweir{ 609cdf0e10cSrcweir if ($big5_data_offsets[$big5_row] == -1) 610cdf0e10cSrcweir { 611cdf0e10cSrcweir print OUT " -1, /* row ", $big5_row, " */\n"; 612cdf0e10cSrcweir } 613cdf0e10cSrcweir else 614cdf0e10cSrcweir { 615cdf0e10cSrcweir print OUT " ", 616cdf0e10cSrcweir $big5_data_offsets[$big5_row], 617cdf0e10cSrcweir ", /* row ", 618cdf0e10cSrcweir $big5_row, 619cdf0e10cSrcweir "; ", 620cdf0e10cSrcweir printStats($big5_data_used[$big5_row], 621cdf0e10cSrcweir $big5_data_space[$big5_row]), 622cdf0e10cSrcweir " */\n"; 623cdf0e10cSrcweir $big5_rowoffsets_used += 4; 624cdf0e10cSrcweir } 625cdf0e10cSrcweir} 626cdf0e10cSrcweirprint OUT "};\n\n"; 627cdf0e10cSrcweir 628cdf0e10cSrcweirprint OUT "static sal_uInt16 const aImplUnicodeTo", $id, "Data[] = {\n"; 629cdf0e10cSrcweir$uni_data_index = 0; 630cdf0e10cSrcweirfor ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane) 631cdf0e10cSrcweir{ 632cdf0e10cSrcweir if (defined($uni_plane_used[$uni_plane])) 633cdf0e10cSrcweir { 634cdf0e10cSrcweir for ($uni_page = 0; $uni_page <= 255; ++$uni_page) 635cdf0e10cSrcweir { 636cdf0e10cSrcweir if (defined($uni_page_used[$uni_plane][$uni_page])) 637cdf0e10cSrcweir { 638cdf0e10cSrcweir $uni_data_offsets[$uni_plane][$uni_page] = $uni_data_index; 639cdf0e10cSrcweir print OUT " /* plane ", $uni_plane, ", page ", $uni_page, 640cdf0e10cSrcweir " */\n"; 641cdf0e10cSrcweir 642cdf0e10cSrcweir $uni_page_first = -1; 643cdf0e10cSrcweir for ($uni_index = 0; $uni_index <= 255; ++$uni_index) 644cdf0e10cSrcweir { 645cdf0e10cSrcweir if (defined($uni_map[$uni_plane][$uni_page][$uni_index])) 646cdf0e10cSrcweir { 647cdf0e10cSrcweir if ($uni_page_first == -1) 648cdf0e10cSrcweir { 649cdf0e10cSrcweir $uni_page_first = $uni_index; 650cdf0e10cSrcweir } 651cdf0e10cSrcweir $uni_page_last = $uni_index; 652cdf0e10cSrcweir } 653cdf0e10cSrcweir } 654cdf0e10cSrcweir 655cdf0e10cSrcweir $uni_data_used[$uni_plane][$uni_page] = 0; 656cdf0e10cSrcweir 657cdf0e10cSrcweir print OUT " ", $uni_page_first, " | (", $uni_page_last, 658cdf0e10cSrcweir " << 8), /* first, last */\n"; 659cdf0e10cSrcweir ++$uni_data_index; 660cdf0e10cSrcweir $uni_data_used[$uni_plane][$uni_page] += 2; 661cdf0e10cSrcweir 662cdf0e10cSrcweir print OUT " ", printSpaces(7, 10, $uni_page_first); 663cdf0e10cSrcweir $bol = 0; 664cdf0e10cSrcweir for ($uni_index = $uni_page_first; 665cdf0e10cSrcweir $uni_index <= $uni_page_last; 666cdf0e10cSrcweir ++$uni_index) 667cdf0e10cSrcweir { 668cdf0e10cSrcweir if ($bol == 1) 669cdf0e10cSrcweir { 670cdf0e10cSrcweir print OUT " "; 671cdf0e10cSrcweir $bol = 0; 672cdf0e10cSrcweir } 673cdf0e10cSrcweir if (defined($uni_map[$uni_plane][$uni_page][$uni_index])) 674cdf0e10cSrcweir { 675cdf0e10cSrcweir $big5 = $uni_map[$uni_plane][$uni_page][$uni_index]; 676cdf0e10cSrcweir printf OUT "0x%04X,", $big5; 677cdf0e10cSrcweir $uni_data_used[$uni_plane][$uni_page] += 2; 678cdf0e10cSrcweir } 679cdf0e10cSrcweir else 680cdf0e10cSrcweir { 681cdf0e10cSrcweir print OUT " 0,"; 682cdf0e10cSrcweir } 683cdf0e10cSrcweir ++$uni_data_index; 684cdf0e10cSrcweir if ($uni_index % 10 == 9) 685cdf0e10cSrcweir { 686cdf0e10cSrcweir print OUT "\n"; 687cdf0e10cSrcweir $bol = 1; 688cdf0e10cSrcweir } 689cdf0e10cSrcweir } 690cdf0e10cSrcweir if ($bol == 0) 691cdf0e10cSrcweir { 692cdf0e10cSrcweir print OUT "\n"; 693cdf0e10cSrcweir } 694cdf0e10cSrcweir 695cdf0e10cSrcweir $uni_data_space[$uni_plane][$uni_page] 696cdf0e10cSrcweir = ($uni_data_index 697cdf0e10cSrcweir - $uni_data_offsets[$uni_plane][$uni_page]) * 2; 698cdf0e10cSrcweir } 699cdf0e10cSrcweir else 700cdf0e10cSrcweir { 701cdf0e10cSrcweir $uni_data_offsets[$uni_plane][$uni_page] = -1; 702cdf0e10cSrcweir print OUT " /* plane ", $uni_plane, ", page ", $uni_page, 703cdf0e10cSrcweir ": --- */\n"; 704cdf0e10cSrcweir } 705cdf0e10cSrcweir } 706cdf0e10cSrcweir } 707cdf0e10cSrcweir else 708cdf0e10cSrcweir { 709cdf0e10cSrcweir print OUT " /* plane ", $uni_plane, ": --- */\n"; 710cdf0e10cSrcweir } 711cdf0e10cSrcweir} 712cdf0e10cSrcweirprint OUT "};\n\n"; 713cdf0e10cSrcweir 714cdf0e10cSrcweirprint OUT "static sal_Int32 const aImplUnicodeTo", $id, "PageOffsets[] = {\n"; 715cdf0e10cSrcweirfor ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane) 716cdf0e10cSrcweir{ 717cdf0e10cSrcweir if (defined($uni_plane_used[$uni_plane])) 718cdf0e10cSrcweir { 719cdf0e10cSrcweir $uni_pageoffsets_used[$uni_plane] = 0; 720cdf0e10cSrcweir $uni_data_used_sum[$uni_plane] = 0; 721cdf0e10cSrcweir $uni_data_space_sum[$uni_plane] = 0; 722cdf0e10cSrcweir for ($uni_page = 0; $uni_page <= 255; ++$uni_page) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir $offset = $uni_data_offsets[$uni_plane][$uni_page]; 725cdf0e10cSrcweir if ($offset == -1) 726cdf0e10cSrcweir { 727cdf0e10cSrcweir print OUT " -1, /* plane ", 728cdf0e10cSrcweir $uni_plane, 729cdf0e10cSrcweir ", page ", 730cdf0e10cSrcweir $uni_page, 731cdf0e10cSrcweir " */\n"; 732cdf0e10cSrcweir } 733cdf0e10cSrcweir else 734cdf0e10cSrcweir { 735cdf0e10cSrcweir print OUT " ", 736cdf0e10cSrcweir $offset, 737cdf0e10cSrcweir ", /* plane ", 738cdf0e10cSrcweir $uni_plane, 739cdf0e10cSrcweir ", page ", 740cdf0e10cSrcweir $uni_page, 741cdf0e10cSrcweir "; ", 742cdf0e10cSrcweir printStats($uni_data_used[$uni_plane][$uni_page], 743cdf0e10cSrcweir $uni_data_space[$uni_plane][$uni_page]), 744cdf0e10cSrcweir " */\n"; 745cdf0e10cSrcweir $uni_pageoffsets_used[$uni_plane] += 4; 746cdf0e10cSrcweir $uni_data_used_sum[$uni_plane] 747cdf0e10cSrcweir += $uni_data_used[$uni_plane][$uni_page]; 748cdf0e10cSrcweir $uni_data_space_sum[$uni_plane] 749cdf0e10cSrcweir += $uni_data_space[$uni_plane][$uni_page]; 750cdf0e10cSrcweir } 751cdf0e10cSrcweir } 752cdf0e10cSrcweir } 753cdf0e10cSrcweir else 754cdf0e10cSrcweir { 755cdf0e10cSrcweir print OUT " /* plane ", $uni_plane, ": --- */\n"; 756cdf0e10cSrcweir } 757cdf0e10cSrcweir} 758cdf0e10cSrcweirprint OUT "};\n\n"; 759cdf0e10cSrcweir 760cdf0e10cSrcweirprint OUT "static sal_Int32 const aImplUnicodeTo", 761cdf0e10cSrcweir $id, 762cdf0e10cSrcweir "PlaneOffsets[] = {\n"; 763cdf0e10cSrcweir$uni_page_offset = 0; 764cdf0e10cSrcweir$uni_planeoffsets_used = 0; 765cdf0e10cSrcweir$uni_pageoffsets_used_sum = 0; 766cdf0e10cSrcweir$uni_pageoffsets_space_sum = 0; 767cdf0e10cSrcweir$uni_data_used_sum2 = 0; 768cdf0e10cSrcweir$uni_data_space_sum2 = 0; 769cdf0e10cSrcweirfor ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane) 770cdf0e10cSrcweir{ 771cdf0e10cSrcweir if (defined ($uni_plane_used[$uni_plane])) 772cdf0e10cSrcweir { 773cdf0e10cSrcweir print OUT " ", 774cdf0e10cSrcweir $uni_page_offset++, 775cdf0e10cSrcweir " * 256, /* plane ", 776cdf0e10cSrcweir $uni_plane, 777cdf0e10cSrcweir "; ", 778cdf0e10cSrcweir printStats($uni_pageoffsets_used[$uni_plane], 256 * 4), 779cdf0e10cSrcweir ", ", 780cdf0e10cSrcweir printStats($uni_data_used_sum[$uni_plane], 781cdf0e10cSrcweir $uni_data_space_sum[$uni_plane]), 782cdf0e10cSrcweir " */\n"; 783cdf0e10cSrcweir $uni_planeoffsets_used += 4; 784cdf0e10cSrcweir $uni_pageoffsets_used_sum += $uni_pageoffsets_used[$uni_plane]; 785cdf0e10cSrcweir $uni_pageoffsets_space_sum += 256 * 4; 786cdf0e10cSrcweir $uni_data_used_sum2 += $uni_data_used_sum[$uni_plane]; 787cdf0e10cSrcweir $uni_data_space_sum2 += $uni_data_space_sum[$uni_plane]; 788cdf0e10cSrcweir } 789cdf0e10cSrcweir else 790cdf0e10cSrcweir { 791cdf0e10cSrcweir print OUT " -1, /* plane ", $uni_plane, " */\n"; 792cdf0e10cSrcweir } 793cdf0e10cSrcweir} 794cdf0e10cSrcweirprint OUT " /* ", 795cdf0e10cSrcweir printStats($uni_planeoffsets_used, 17 * 4), 796cdf0e10cSrcweir ", ", 797cdf0e10cSrcweir printStats($uni_pageoffsets_used_sum, $uni_pageoffsets_space_sum), 798cdf0e10cSrcweir ", ", 799cdf0e10cSrcweir printStats($uni_data_used_sum2, $uni_data_space_sum2), 800cdf0e10cSrcweir " */\n};\n"; 801cdf0e10cSrcweir 802cdf0e10cSrcweirclose OUT; 803