16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1999-2013, International Business Machines 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* ucnv_io.cpp: 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* initializes global variables and defines functions pertaining to converter 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* name resolution aspect of the conversion code. 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* new implementation: 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created on: 1999nov22 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Markus W. Scherer 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Use the binary cnvalias.icu (created from convrtrs.txt) to work 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* with aliases for converter names. 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 11/22/1999 markus Created 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 06/28/2002 grhoten Major overhaul of the converter alias design. 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Now an alias can map to different converters 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* depending on the specified standard. 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h" 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udata.h" 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h" 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uarrsort.h" 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h" 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "udataswp.h" 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucnv_io.h" 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uenumimp.h" 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucln_cmn.h" 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Format of cnvalias.icu ----------------------------------------------------- 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * cnvalias.icu is a binary, memory-mappable form of convrtrs.txt. 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This binary form contains several tables. All indexes are to uint16_t 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * units, and not to the bytes (uint8_t units). Addressing everything on 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 16-bit boundaries allows us to store more information with small index 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * numbers, which are also 16-bit in size. The majority of the table (except 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the string table) are 16-bit numbers. 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * First there is the size of the Table of Contents (TOC). The TOC 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * entries contain the size of each section. In order to find the offset 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * you just need to sum up the previous offsets. 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The TOC length and entries are an array of uint32_t values. 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The first section after the TOC starts immediately after the TOC. 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1) This section contains a list of converters. This list contains indexes 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * into the string table for the converter name. The index of this list is 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * also used by other sections, which are mentioned later on. 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This list is not sorted. 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2) This section contains a list of tags. This list contains indexes 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * into the string table for the tag name. The index of this list is 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * also used by other sections, which are mentioned later on. 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This list is in priority order of standards. 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3) This section contains a list of sorted unique aliases. This 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * list contains indexes into the string table for the alias name. The 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * index of this list is also used by other sections, like the 4th section. 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The index for the 3rd and 4th section is used to get the 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * alias -> converter name mapping. Section 3 and 4 form a two column table. 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Some of the most significant bits of each index may contain other 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * information (see findConverter for details). 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4) This section contains a list of mapped converter names. Consider this 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as a table that maps the 3rd section to the 1st section. This list contains 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * indexes into the 1st section. The index of this list is the same index in 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the 3rd section. There is also some extra information in the high bits of 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * each converter index in this table. Currently it's only used to say that 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * an alias mapped to this converter is ambiguous. See UCNV_CONVERTER_INDEX_MASK 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and UCNV_AMBIGUOUS_ALIAS_MAP_BIT for more information. This section is 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the predigested form of the 5th section so that an alias lookup can be fast. 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 5) This section contains a 2D array with indexes to the 6th section. This 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * section is the full form of all alias mappings. The column index is the 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * index into the converter list (column header). The row index is the index 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to tag list (row header). This 2D array is the top part a 3D array. The 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * third dimension is in the 6th section. 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6) This is blob of variable length arrays. Each array starts with a size, 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and is followed by indexes to alias names in the string table. This is 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the third dimension to the section 5. No other section should be referencing 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * this section. 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7) Starting in ICU 3.6, this can be a UConverterAliasOptions struct. Its 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * presence indicates that a section 9 exists. UConverterAliasOptions specifies 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * what type of string normalization is used among other potential things in the 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * future. 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8) This is the string table. All strings are indexed on an even address. 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * There are two reasons for this. First many chip architectures locate strings 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * faster on even address boundaries. Second, since all indexes are 16-bit 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * numbers, this string table can be 128KB in size instead of 64KB when we 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * only have strings starting on an even address. 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9) When present this is a set of prenormalized strings from section 8. This 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * table contains normalized strings with the dashes and spaces stripped out, 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and all strings lowercased. In the future, the options in section 7 may state 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * other types of normalization. 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Here is the concept of section 5 and 6. It's a 3D cube. Each tag 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * has a unique alias among all converters. That same alias can 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * be mentioned in other standards on different converters, 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * but only one alias per tag can be unique. 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Converter Names (Usually in TR22 form) 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * -------------------------------------------. 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * T / /| 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a / / | 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * g / / | 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * s / / | 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * / / | 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ------------------------------------------/ | 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A | | | 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * l | | | 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * i | | / 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a | | / 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * s | | / 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * e | | / 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * s | |/ 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ------------------------------------------- 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Here is what it really looks like. It's like swiss cheese. 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * There are holes. Some converters aren't recognized by 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a standard, or they are really old converters that the 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * standard doesn't recognize anymore. 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Converter Names (Usually in TR22 form) 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * -------------------------------------------. 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * T /##########################################/| 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a / # # /# 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * g / # ## ## ### # ### ### ### #/ 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * s / # ##### #### ## ## #/# 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * / ### # # ## # # # ### # # #/## 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ------------------------------------------/# # 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A |### # # ## # # # ### # # #|# # 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * l |# # # # # ## # #|# # 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * i |# # # # # # #|# 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a |# #|# 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * s | #|# 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * e 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * s 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Used by the UEnumeration API 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UAliasContext { 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listOffset; 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listIdx; 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UAliasContext; 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char DATA_NAME[] = "cnvalias"; 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char DATA_TYPE[] = "icu"; 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UDataMemory *gAliasData=NULL; 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gAliasDataInitOnce = U_INITONCE_INITIALIZER; 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tocLengthIndex=0, 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org converterListIndex=1, 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tagListIndex=2, 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aliasListIndex=3, 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org untaggedConvArrayIndex=4, 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org taggedAliasArrayIndex=5, 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org taggedAliasListsIndex=6, 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tableOptionsIndex=7, 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stringTableIndex=8, 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org normalizedStringTableIndex=9, 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsetsCount, /* length of the swapper's temporary offsets[] */ 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org minTocLength=8 /* min. tocLength in the file, does not count the tocLengthIndex! */ 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UConverterAliasOptions defaultTableOptions = { 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_IO_UNNORMALIZED, 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 /* containsCnvOptionInfo */ 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UConverterAlias gMainTable; 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define GET_STRING(idx) (const char *)(gMainTable.stringTable + (idx)) 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define GET_NORMALIZED_STRING(idx) (const char *)(gMainTable.normalizedStringTable + (idx)) 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgisAcceptable(void * /*context*/, 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char * /*type*/, const char * /*name*/, 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UDataInfo *pInfo) { 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UBool)( 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->size>=20 && 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->isBigEndian==U_IS_BIG_ENDIAN && 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->charsetFamily==U_CHARSET_FAMILY && 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[0]==0x43 && /* dataFormat="CvAl" */ 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[1]==0x76 && 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[2]==0x41 && 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[3]==0x6c && 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->formatVersion[0]==3); 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV ucnv_io_cleanup(void) 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gAliasData) { 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_close(gAliasData); 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gAliasData = NULL; 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gAliasDataInitOnce.reset(); 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(&gMainTable, 0, sizeof(gMainTable)); 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; /* Everything was cleaned up */ 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV initAliasData(UErrorCode &errCode) { 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDataMemory *data; 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *table; 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint32_t *sectionSizes; 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t tableStart; 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t currOffset; 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup); 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(gAliasData == NULL); 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org data = udata_openChoice(NULL, DATA_TYPE, DATA_NAME, isAcceptable, NULL, &errCode); 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errCode)) { 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sectionSizes = (const uint32_t *)udata_getMemory(data); 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org table = (const uint16_t *)sectionSizes; 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tableStart = sectionSizes[0]; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tableStart < minTocLength) { 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errCode = U_INVALID_FORMAT_ERROR; 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_close(data); 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gAliasData = data; 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.converterListSize = sectionSizes[1]; 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.tagListSize = sectionSizes[2]; 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.aliasListSize = sectionSizes[3]; 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.untaggedConvArraySize = sectionSizes[4]; 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.taggedAliasArraySize = sectionSizes[5]; 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.taggedAliasListsSize = sectionSizes[6]; 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.optionTableSize = sectionSizes[7]; 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.stringTableSize = sectionSizes[8]; 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tableStart > 8) { 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.normalizedStringTableSize = sectionSizes[9]; 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset = tableStart * (sizeof(uint32_t)/sizeof(uint16_t)) + (sizeof(uint32_t)/sizeof(uint16_t)); 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.converterList = table + currOffset; 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.converterListSize; 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.tagList = table + currOffset; 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.tagListSize; 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.aliasList = table + currOffset; 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.aliasListSize; 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.untaggedConvArray = table + currOffset; 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.untaggedConvArraySize; 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.taggedAliasArray = table + currOffset; 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* aliasLists is a 1's based array, but it has a padding character */ 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.taggedAliasArraySize; 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.taggedAliasLists = table + currOffset; 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.taggedAliasListsSize; 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gMainTable.optionTableSize > 0 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org && ((const UConverterAliasOptions *)(table + currOffset))->stringNormalizationType < UCNV_IO_NORM_TYPE_COUNT) 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Faster table */ 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.optionTable = (const UConverterAliasOptions *)(table + currOffset); 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Smaller table, or I can't handle this normalization mode! 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Use the original slower table lookup. */ 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.optionTable = &defaultTableOptions; 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.optionTableSize; 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.stringTable = table + currOffset; 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currOffset += gMainTable.stringTableSize; 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gMainTable.normalizedStringTable = ((gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED) 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ? gMainTable.stringTable : (table + currOffset)); 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orghaveAliasData(UErrorCode *pErrorCode) { 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gAliasDataInitOnce, &initAliasData, *pErrorCode); 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return U_SUCCESS(*pErrorCode); 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic inline UBool 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgisAlias(const char *alias, UErrorCode *pErrorCode) { 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(alias==NULL) { 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UBool)(*alias!=0); 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t getTagNumber(const char *tagname) { 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gMainTable.tagList) { 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t tagNum; 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (tagNum = 0; tagNum < gMainTable.tagListSize; tagNum++) { 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!uprv_stricmp(GET_STRING(gMainTable.tagList[tagNum]), tagname)) { 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return tagNum; 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UINT32_MAX; 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* character types relevant for ucnv_compareNames() */ 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UIGNORE, 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ZERO, 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NONZERO, 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MINLETTER /* any values from here on are lowercase letter mappings */ 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* character types for ASCII 00..7F */ 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const uint8_t asciiTypes[128] = { 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, 0, 0, 0, 0, 0, 0, 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0, 0, 0, 0, 0, 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0, 0, 0, 0, 0 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define GET_ASCII_TYPE(c) ((int8_t)(c) >= 0 ? asciiTypes[(uint8_t)c] : (uint8_t)UIGNORE) 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* character types for EBCDIC 80..FF */ 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const uint8_t ebcdicTypes[128] = { 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0, 0, 0, 0, 0, 0, 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0, 0, 0, 0, 0, 0, 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0, 0, 0, 0, 0, 0, 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0, 0, 0, 0, 0, 0, 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0, 0, 0, 0, 0, 0, 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0, 0, 0, 0, 0, 0, 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, NONZERO, 0, 0, 0, 0, 0, 0 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define GET_EBCDIC_TYPE(c) ((int8_t)(c) < 0 ? ebcdicTypes[(c)&0x7f] : (uint8_t)UIGNORE) 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_CHARSET_FAMILY==U_ASCII_FAMILY 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define GET_CHAR_TYPE(c) GET_ASCII_TYPE(c) 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define GET_CHAR_TYPE(c) GET_EBCDIC_TYPE(c) 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# error U_CHARSET_FAMILY is not valid 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* @see ucnv_compareNames */ 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC char * U_EXPORT2 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_stripASCIIForCompare(char *dst, const char *name) { 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *dstItr = dst; 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t type, nextType; 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char c1; 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool afterDigit = FALSE; 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((c1 = *name++) != 0) { 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org type = GET_ASCII_TYPE(c1); 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (type) { 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UIGNORE: 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit = FALSE; 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore all but letters and digits */ 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case ZERO: 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!afterDigit) { 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextType = GET_ASCII_TYPE(*name); 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (nextType == ZERO || nextType == NONZERO) { 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore leading zero before another digit */ 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case NONZERO: 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit = TRUE; 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c1 = (char)type; /* lowercased letter */ 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit = FALSE; 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dstItr++ = c1; 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dstItr = 0; 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return dst; 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC char * U_EXPORT2 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_stripEBCDICForCompare(char *dst, const char *name) { 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *dstItr = dst; 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t type, nextType; 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char c1; 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool afterDigit = FALSE; 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((c1 = *name++) != 0) { 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org type = GET_EBCDIC_TYPE(c1); 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (type) { 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UIGNORE: 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit = FALSE; 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore all but letters and digits */ 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case ZERO: 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!afterDigit) { 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextType = GET_EBCDIC_TYPE(*name); 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (nextType == ZERO || nextType == NONZERO) { 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore leading zero before another digit */ 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case NONZERO: 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit = TRUE; 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c1 = (char)type; /* lowercased letter */ 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit = FALSE; 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dstItr++ = c1; 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *dstItr = 0; 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return dst; 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Do a fuzzy compare of two converter/alias names. 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The comparison is case-insensitive, ignores leading zeroes if they are not 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * followed by further digits, and ignores all but letters and digits. 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Thus the strings "UTF-8", "utf_8", "u*T@f08" and "Utf 8" are exactly equivalent. 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See section 1.4, Charset Alias Matching in Unicode Technical Standard #22 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * at http://www.unicode.org/reports/tr22/ 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is a symmetrical (commutative) operation; order of arguments 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is insignificant. This is an important property for sorting the 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * list (when the list is preprocessed into binary form) and for 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * performing binary searches on it at run time. 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param name1 a converter name or alias, zero-terminated 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param name2 a converter name or alias, zero-terminated 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return 0 if the names match, or a negative value if the name1 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * lexically precedes name2, or a positive value if the name1 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * lexically follows name2. 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see ucnv_io_stripForCompare 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int U_EXPORT2 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_compareNames(const char *name1, const char *name2) { 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int rc; 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t type, nextType; 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char c1, c2; 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool afterDigit1 = FALSE, afterDigit2 = FALSE; 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((c1 = *name1++) != 0) { 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org type = GET_CHAR_TYPE(c1); 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (type) { 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UIGNORE: 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit1 = FALSE; 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore all but letters and digits */ 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case ZERO: 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!afterDigit1) { 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextType = GET_CHAR_TYPE(*name1); 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (nextType == ZERO || nextType == NONZERO) { 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore leading zero before another digit */ 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case NONZERO: 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit1 = TRUE; 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c1 = (char)type; /* lowercased letter */ 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit1 = FALSE; 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; /* deliver c1 */ 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((c2 = *name2++) != 0) { 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org type = GET_CHAR_TYPE(c2); 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (type) { 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case UIGNORE: 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit2 = FALSE; 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore all but letters and digits */ 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case ZERO: 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!afterDigit2) { 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nextType = GET_CHAR_TYPE(*name2); 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (nextType == ZERO || nextType == NONZERO) { 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* ignore leading zero before another digit */ 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case NONZERO: 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit2 = TRUE; 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c2 = (char)type; /* lowercased letter */ 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org afterDigit2 = FALSE; 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; /* deliver c2 */ 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* If we reach the ends of both strings then they match */ 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((c1|c2)==0) { 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Case-insensitive comparison */ 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rc = (int)(unsigned char)c1 - (int)(unsigned char)c2; 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rc != 0) { 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return rc; 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * search for an alias 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * return the converter number index for gConverterList 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic inline uint32_t 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgfindConverter(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) { 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t mid, start, limit; 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t lastMid; 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int result; 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int isUnnormalized = (gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED); 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char strippedName[UCNV_MAX_CONVERTER_NAME_LENGTH]; 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!isUnnormalized) { 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uprv_strlen(alias) >= UCNV_MAX_CONVERTER_NAME_LENGTH) { 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_BUFFER_OVERFLOW_ERROR; 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UINT32_MAX; 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Lower case and remove ignoreable characters. */ 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_stripForCompare(strippedName, alias); 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias = strippedName; 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* do a binary search for the alias */ 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org start = 0; 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org limit = gMainTable.untaggedConvArraySize; 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mid = limit; 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lastMid = UINT32_MAX; 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mid = (uint32_t)((start + limit) / 2); 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (lastMid == mid) { /* Have we moved? */ 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; /* We haven't moved, and it wasn't found. */ 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lastMid = mid; 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isUnnormalized) { 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = ucnv_compareNames(alias, GET_STRING(gMainTable.aliasList[mid])); 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = uprv_strcmp(alias, GET_NORMALIZED_STRING(gMainTable.aliasList[mid])); 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result < 0) { 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org limit = mid; 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (result > 0) { 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org start = mid; 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Since the gencnval tool folds duplicates into one entry, 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * this alias in gAliasList is unique, but different standards 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * may map an alias to different converters. 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (gMainTable.untaggedConvArray[mid] & UCNV_AMBIGUOUS_ALIAS_MAP_BIT) { 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_AMBIGUOUS_ALIAS_WARNING; 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* State whether the canonical converter name contains an option. 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org This information is contained in this list in order to maintain backward & forward compatibility. */ 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (containsOption) { 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool containsCnvOptionInfo = (UBool)gMainTable.optionTable->containsCnvOptionInfo; 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *containsOption = (UBool)((containsCnvOptionInfo 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org && ((gMainTable.untaggedConvArray[mid] & UCNV_CONTAINS_OPTION_BIT) != 0)) 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || !containsCnvOptionInfo); 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gMainTable.untaggedConvArray[mid] & UCNV_CONVERTER_INDEX_MASK; 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UINT32_MAX; 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Is this alias in this list? 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * alias and listOffset should be non-NULL. 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic inline UBool 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgisAliasInList(const char *alias, uint32_t listOffset) { 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset) { 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t currAlias; 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* +1 to skip listCount */ 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (currAlias = 0; currAlias < listCount; currAlias++) { 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (currList[currAlias] 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org && ucnv_compareNames(alias, GET_STRING(currList[currAlias]))==0) 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Search for an standard name of an alias (what is the default name 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that this standard uses?) 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * return the listOffset for gTaggedAliasLists. If it's 0, 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the it couldn't be found, but the parameters are valid. 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgfindTaggedAliasListsOffset(const char *alias, const char *standard, UErrorCode *pErrorCode) { 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t idx; 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listOffset; 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convNum; 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode myErr = U_ZERO_ERROR; 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t tagNum = getTagNumber(standard); 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Make a quick guess. Hopefully they used a TR22 canonical alias. */ 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org convNum = findConverter(alias, NULL, &myErr); 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myErr != U_ZERO_ERROR) { 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = myErr; 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tagNum < (gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gMainTable.converterListSize) { 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org listOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + convNum]; 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset && gMainTable.taggedAliasLists[listOffset + 1]) { 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return listOffset; 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myErr == U_AMBIGUOUS_ALIAS_WARNING) { 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Uh Oh! They used an ambiguous alias. 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org We have to search the whole swiss cheese starting 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org at the highest standard affinity. 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org This may take a while. 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (idx = 0; idx < gMainTable.taggedAliasArraySize; idx++) { 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org listOffset = gMainTable.taggedAliasArray[idx]; 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset && isAliasInList(alias, listOffset)) { 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t currTagNum = idx/gMainTable.converterListSize; 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t currConvNum = (idx - currTagNum*gMainTable.converterListSize); 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t tempListOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + currConvNum]; 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tempListOffset && gMainTable.taggedAliasLists[tempListOffset + 1]) { 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return tempListOffset; 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else keep on looking */ 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* We could speed this up by starting on the next row 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org because an alias is unique per row, right now. 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org This would change if alias versioning appears. */ 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* The standard doesn't know about the alias */ 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else no default name */ 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else converter or tag not found */ 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UINT32_MAX; 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Return the canonical name */ 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint32_t 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgfindTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErrorCode) { 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t idx; 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listOffset; 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convNum; 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode myErr = U_ZERO_ERROR; 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t tagNum = getTagNumber(standard); 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Make a quick guess. Hopefully they used a TR22 canonical alias. */ 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org convNum = findConverter(alias, NULL, &myErr); 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myErr != U_ZERO_ERROR) { 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = myErr; 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tagNum < (gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) && convNum < gMainTable.converterListSize) { 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org listOffset = gMainTable.taggedAliasArray[tagNum*gMainTable.converterListSize + convNum]; 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset && isAliasInList(alias, listOffset)) { 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return convNum; 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myErr == U_AMBIGUOUS_ALIAS_WARNING) { 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Uh Oh! They used an ambiguous alias. 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org We have to search one slice of the swiss cheese. 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org We search only in the requested tag, not the whole thing. 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org This may take a while. 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convStart = (tagNum)*gMainTable.converterListSize; 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convLimit = (tagNum+1)*gMainTable.converterListSize; 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (idx = convStart; idx < convLimit; idx++) { 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org listOffset = gMainTable.taggedAliasArray[idx]; 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset && isAliasInList(alias, listOffset)) { 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return idx-convStart; 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* The standard doesn't know about the alias */ 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else no canonical name */ 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else converter or tag not found */ 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UINT32_MAX; 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC const char * 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) { 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *aliasTmp = alias; 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < 2; i++) { 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (i == 1) { 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * After the first unsuccess converter lookup, check to see if 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the name begins with 'x-'. If it does, strip it off and try 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * again. This behaviour is similar to how ICU4J does it. 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (aliasTmp[0] == 'x' || aliasTmp[1] == '-') { 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aliasTmp = aliasTmp+2; 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(haveAliasData(pErrorCode) && isAlias(aliasTmp, pErrorCode)) { 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convNum = findConverter(aliasTmp, containsOption, pErrorCode); 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (convNum < gMainTable.converterListSize) { 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return GET_STRING(gMainTable.converterList[convNum]); 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else converter not found */ 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t U_CALLCONV 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_countStandardAliases(UEnumeration *enumerator, UErrorCode * /*pErrorCode*/) { 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value = 0; 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UAliasContext *myContext = (UAliasContext *)(enumerator->context); 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listOffset = myContext->listOffset; 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset) { 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value = gMainTable.taggedAliasLists[listOffset]; 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return value; 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* U_CALLCONV 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_nextStandardAliases(UEnumeration *enumerator, 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t* resultLength, 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode * /*pErrorCode*/) 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UAliasContext *myContext = (UAliasContext *)(enumerator->context); 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listOffset = myContext->listOffset; 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset) { 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myContext->listIdx < listCount) { 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *myStr = GET_STRING(currList[myContext->listIdx++]); 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (resultLength) { 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *resultLength = (int32_t)uprv_strlen(myStr); 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return myStr; 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Either we accessed a zero length list, or we enumerated too far. */ 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (resultLength) { 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *resultLength = 0; 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_resetStandardAliases(UEnumeration *enumerator, UErrorCode * /*pErrorCode*/) { 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((UAliasContext *)(enumerator->context))->listIdx = 0; 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_closeUEnumeration(UEnumeration *enumerator) { 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(enumerator->context); 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(enumerator); 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Enumerate the aliases for the specified converter and standard tag */ 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UEnumeration gEnumAliases = { 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_closeUEnumeration, 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_countStandardAliases, 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uenum_unextDefault, 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_nextStandardAliases, 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_resetStandardAliases 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UEnumeration * U_EXPORT2 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_openStandardNames(const char *convName, 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *standard, 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode) 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UEnumeration *myEnum = NULL; 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveAliasData(pErrorCode) && isAlias(convName, pErrorCode)) { 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listOffset = findTaggedAliasListsOffset(convName, standard, pErrorCode); 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* When listOffset == 0, we want to acknowledge that the 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org converter name and standard are okay, but there 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org is nothing to enumerate. */ 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset < gMainTable.taggedAliasListsSize) { 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UAliasContext *myContext; 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myEnum = static_cast<UEnumeration *>(uprv_malloc(sizeof(UEnumeration))); 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myEnum == NULL) { 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(myEnum, &gEnumAliases, sizeof(UEnumeration)); 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myContext = static_cast<UAliasContext *>(uprv_malloc(sizeof(UAliasContext))); 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myContext == NULL) { 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(myEnum); 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myContext->listOffset = listOffset; 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myContext->listIdx = 0; 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myEnum->context = myContext; 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else converter or tag not found */ 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return myEnum; 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint16_t 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_countAliases(const char *alias, UErrorCode *pErrorCode) { 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convNum = findConverter(alias, NULL, pErrorCode); 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (convNum < gMainTable.converterListSize) { 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* tagListNum - 1 is the ALL tag */ 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum]; 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset) { 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gMainTable.taggedAliasLists[listOffset]; 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else this shouldn't happen. internal program error */ 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else converter not found */ 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint16_t 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_getAliases(const char *alias, uint16_t start, const char **aliases, UErrorCode *pErrorCode) { 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t currAlias; 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convNum = findConverter(alias, NULL, pErrorCode); 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (convNum < gMainTable.converterListSize) { 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* tagListNum - 1 is the ALL tag */ 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum]; 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset) { 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* +1 to skip listCount */ 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (currAlias = start; currAlias < listCount; currAlias++) { 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aliases[currAlias] = GET_STRING(currList[currAlias]); 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else this shouldn't happen. internal program error */ 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else converter not found */ 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char * 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode) { 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convNum = findConverter(alias, NULL, pErrorCode); 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (convNum < gMainTable.converterListSize) { 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* tagListNum - 1 is the ALL tag */ 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t listOffset = gMainTable.taggedAliasArray[(gMainTable.tagListSize - 1)*gMainTable.converterListSize + convNum]; 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (listOffset) { 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listCount = gMainTable.taggedAliasLists[listOffset]; 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* +1 to skip listCount */ 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (n < listCount) { 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return GET_STRING(currList[n]); 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else this shouldn't happen. internal program error */ 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else converter not found */ 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint16_t 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_countStandards(UErrorCode *pErrorCode) { 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveAliasData(pErrorCode)) { 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Don't include the empty list */ 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (uint16_t)(gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS); 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_getStandard(uint16_t n, UErrorCode *pErrorCode) { 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveAliasData(pErrorCode)) { 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (n < gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS) { 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return GET_STRING(gMainTable.tagList[n]); 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_getStandardName(const char *alias, const char *standard, UErrorCode *pErrorCode) { 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t listOffset = findTaggedAliasListsOffset(alias, standard, pErrorCode); 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 < listOffset && listOffset < gMainTable.taggedAliasListsSize) { 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *currList = gMainTable.taggedAliasLists + listOffset + 1; 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Get the preferred name from this list */ 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (currList[0]) { 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return GET_STRING(currList[0]); 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else someone screwed up the alias table. */ 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* *pErrorCode = U_INVALID_FORMAT_ERROR */ 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI uint16_t U_EXPORT2 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_countAliases(const char *alias, UErrorCode *pErrorCode) 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ucnv_io_countAliases(alias, pErrorCode); 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char* U_EXPORT2 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_getAlias(const char *alias, uint16_t n, UErrorCode *pErrorCode) 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ucnv_io_getAlias(alias, n, pErrorCode); 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_getAliases(const char *alias, const char **aliases, UErrorCode *pErrorCode) 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_getAliases(alias, 0, aliases, pErrorCode); 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI uint16_t U_EXPORT2 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_countStandards(void) 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode err = U_ZERO_ERROR; 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ucnv_io_countStandards(&err); 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErrorCode) { 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveAliasData(pErrorCode) && isAlias(alias, pErrorCode)) { 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t convNum = findTaggedConverterNum(alias, standard, pErrorCode); 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (convNum < gMainTable.converterListSize) { 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return GET_STRING(gMainTable.converterList[convNum]); 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t U_CALLCONV 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_countAllConverters(UEnumeration * /*enumerator*/, UErrorCode * /*pErrorCode*/) { 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gMainTable.converterListSize; 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* U_CALLCONV 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_nextAllConverters(UEnumeration *enumerator, 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t* resultLength, 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode * /*pErrorCode*/) 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t *myContext = (uint16_t *)(enumerator->context); 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*myContext < gMainTable.converterListSize) { 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *myStr = GET_STRING(gMainTable.converterList[(*myContext)++]); 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (resultLength) { 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *resultLength = (int32_t)uprv_strlen(myStr); 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return myStr; 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Either we accessed a zero length list, or we enumerated too far. */ 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (resultLength) { 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *resultLength = 0; 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_resetAllConverters(UEnumeration *enumerator, UErrorCode * /*pErrorCode*/) { 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *((uint16_t *)(enumerator->context)) = 0; 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UEnumeration gEnumAllConverters = { 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_closeUEnumeration, 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_countAllConverters, 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uenum_unextDefault, 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_nextAllConverters, 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_io_resetAllConverters 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UEnumeration * U_EXPORT2 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_openAllNames(UErrorCode *pErrorCode) { 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UEnumeration *myEnum = NULL; 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveAliasData(pErrorCode)) { 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t *myContext; 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myEnum = static_cast<UEnumeration *>(uprv_malloc(sizeof(UEnumeration))); 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myEnum == NULL) { 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(myEnum, &gEnumAllConverters, sizeof(UEnumeration)); 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myContext = static_cast<uint16_t *>(uprv_malloc(sizeof(uint16_t))); 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (myContext == NULL) { 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(myEnum); 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *myContext = 0; 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myEnum->context = myContext; 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return myEnum; 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC uint16_t 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_io_countKnownConverters(UErrorCode *pErrorCode) { 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveAliasData(pErrorCode)) { 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (uint16_t)gMainTable.converterListSize; 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* alias table swapping ----------------------------------------------------- */ 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef char * U_CALLCONV StripForCompareFn(char *dst, const char *name); 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * row of a temporary array 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * gets platform-endian charset string indexes and sorting indexes; 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * after sorting this array by strings, the actual arrays are permutated 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * according to the sorting indexes 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct TempRow { 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t strIndex, sortIndex; 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TempRow; 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct TempAliasTable { 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *chars; 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TempRow *rows; 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t *resort; 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StripForCompareFn *stripForCompare; 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TempAliasTable; 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org STACK_ROW_CAPACITY=500 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgio_compareRows(const void *context, const void *left, const void *right) { 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char strippedLeft[UCNV_MAX_CONVERTER_NAME_LENGTH], 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strippedRight[UCNV_MAX_CONVERTER_NAME_LENGTH]; 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TempAliasTable *tempTable=(TempAliasTable *)context; 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *chars=tempTable->chars; 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (int32_t)uprv_strcmp(tempTable->stripForCompare(strippedLeft, chars+2*((const TempRow *)left)->strIndex), 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable->stripForCompare(strippedRight, chars+2*((const TempRow *)right)->strIndex)); 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_swapAliases(const UDataSwapper *ds, 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void *inData, int32_t length, void *outData, 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode) { 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UDataInfo *pInfo; 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t headerSize; 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *inTable; 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint32_t *inSectionSizes; 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t toc[offsetsCount]; 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t offsets[offsetsCount]; /* 16-bit-addressed offsets from inTable/outTable */ 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t i, count, tocLength, topOffset; 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TempRow rows[STACK_ROW_CAPACITY]; 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t resort[STACK_ROW_CAPACITY]; 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TempAliasTable tempTable; 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* udata_swapDataHeader checks the arguments */ 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode); 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check data format and format version */ 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo=(const UDataInfo *)((const char *)inData+4); 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!( 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[0]==0x43 && /* dataFormat="CvAl" */ 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[1]==0x76 && 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[2]==0x41 && 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[3]==0x6c && 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->formatVersion[0]==3 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org )) { 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_printError(ds, "ucnv_swapAliases(): data format %02x.%02x.%02x.%02x (format version %02x) is not an alias table\n", 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[0], pInfo->dataFormat[1], 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->dataFormat[2], pInfo->dataFormat[3], 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pInfo->formatVersion[0]); 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode=U_UNSUPPORTED_ERROR; 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* an alias table must contain at least the table of contents array */ 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length>=0 && (length-headerSize)<4*(1+minTocLength)) { 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_printError(ds, "ucnv_swapAliases(): too few bytes (%d after header) for an alias table\n", 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length-headerSize); 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inSectionSizes=(const uint32_t *)((const char *)inData+headerSize); 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inTable=(const uint16_t *)inSectionSizes; 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(toc, 0, sizeof(toc)); 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toc[tocLengthIndex]=tocLength=ds->readUInt32(inSectionSizes[tocLengthIndex]); 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(tocLength<minTocLength || offsetsCount<=tocLength) { 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_printError(ds, "ucnv_swapAliases(): table of contents contains unsupported number of sections (%u sections)\n", tocLength); 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode=U_INVALID_FORMAT_ERROR; 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* read the known part of the table of contents */ 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=converterListIndex; i<=tocLength; ++i) { 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toc[i]=ds->readUInt32(inSectionSizes[i]); 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* compute offsets */ 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(offsets, 0, sizeof(offsets)); 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsets[converterListIndex]=2*(1+tocLength); /* count two 16-bit units per toc entry */ 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=tagListIndex; i<=tocLength; ++i) { 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsets[i]=offsets[i-1]+toc[i-1]; 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* compute the overall size of the after-header data, in numbers of 16-bit units */ 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org topOffset=offsets[i-1]+toc[i-1]; 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length>=0) { 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t *outTable; 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint16_t *p, *p2; 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t *q, *q2; 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t oldIndex; 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((length-headerSize)<(2*(int32_t)topOffset)) { 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_printError(ds, "ucnv_swapAliases(): too few bytes (%d after header) for an alias table\n", 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length-headerSize); 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outTable=(uint16_t *)((char *)outData+headerSize); 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* swap the entire table of contents */ 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray32(ds, inTable, 4*(1+tocLength), outTable, pErrorCode); 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* swap unormalized strings & normalized strings */ 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapInvChars(ds, inTable+offsets[stringTableIndex], 2*(int32_t)(toc[stringTableIndex]+toc[normalizedStringTableIndex]), 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outTable+offsets[stringTableIndex], pErrorCode); 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(*pErrorCode)) { 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_printError(ds, "ucnv_swapAliases().swapInvChars(charset names) failed\n"); 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ds->inCharset==ds->outCharset) { 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* no need to sort, just swap all 16-bit values together */ 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray16(ds, 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inTable+offsets[converterListIndex], 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2*(int32_t)(offsets[stringTableIndex]-offsets[converterListIndex]), 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outTable+offsets[converterListIndex], 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pErrorCode); 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* allocate the temporary table for sorting */ 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count=toc[aliasListIndex]; 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.chars=(const char *)(outTable+offsets[stringTableIndex]); /* sort by outCharset */ 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(count<=STACK_ROW_CAPACITY) { 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.rows=rows; 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.resort=resort; 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.rows=(TempRow *)uprv_malloc(count*sizeof(TempRow)+count*2); 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(tempTable.rows==NULL) { 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_printError(ds, "ucnv_swapAliases(): unable to allocate memory for sorting tables (max length: %u)\n", 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count); 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *pErrorCode=U_MEMORY_ALLOCATION_ERROR; 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.resort=(uint16_t *)(tempTable.rows+count); 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ds->outCharset==U_ASCII_FAMILY) { 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.stripForCompare=ucnv_io_stripASCIIForCompare; 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else /* U_EBCDIC_FAMILY */ { 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.stripForCompare=ucnv_io_stripEBCDICForCompare; 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Sort unique aliases+mapped names. 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * We need to sort the list again by outCharset strings because they 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * sort differently for different charset families. 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * First we set up a temporary table with the string indexes and 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * sorting indexes and sort that. 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Then we permutate and copy/swap the actual values. 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p=inTable+offsets[aliasListIndex]; 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org q=outTable+offsets[aliasListIndex]; 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p2=inTable+offsets[untaggedConvArrayIndex]; 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org q2=outTable+offsets[untaggedConvArrayIndex]; 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<count; ++i) { 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.rows[i].strIndex=ds->readUInt16(p[i]); 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempTable.rows[i].sortIndex=(uint16_t)i; 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_sortArray(tempTable.rows, (int32_t)count, sizeof(TempRow), 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org io_compareRows, &tempTable, 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FALSE, pErrorCode); 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(*pErrorCode)) { 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* copy/swap/permutate items */ 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(p!=q) { 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<count; ++i) { 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org oldIndex=tempTable.rows[i].sortIndex; 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray16(ds, p+oldIndex, 2, q+i, pErrorCode); 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray16(ds, p2+oldIndex, 2, q2+i, pErrorCode); 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If we swap in-place, then the permutation must use another 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * temporary array (tempTable.resort) 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * before the results are copied to the outBundle. 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t *r=tempTable.resort; 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<count; ++i) { 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org oldIndex=tempTable.rows[i].sortIndex; 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray16(ds, p+oldIndex, 2, r+i, pErrorCode); 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(q, r, 2*count); 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<count; ++i) { 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org oldIndex=tempTable.rows[i].sortIndex; 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray16(ds, p2+oldIndex, 2, r+i, pErrorCode); 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcpy(q2, r, 2*count); 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(tempTable.rows!=rows) { 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(tempTable.rows); 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(*pErrorCode)) { 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_printError(ds, "ucnv_swapAliases().uprv_sortArray(%u items) failed\n", 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count); 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* swap remaining 16-bit values */ 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray16(ds, 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inTable+offsets[converterListIndex], 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2*(int32_t)(offsets[aliasListIndex]-offsets[converterListIndex]), 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outTable+offsets[converterListIndex], 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pErrorCode); 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ds->swapArray16(ds, 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inTable+offsets[taggedAliasArrayIndex], 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2*(int32_t)(offsets[stringTableIndex]-offsets[taggedAliasArrayIndex]), 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org outTable+offsets[taggedAliasArrayIndex], 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pErrorCode); 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return headerSize+2*(int32_t)topOffset; 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Hey, Emacs, please set the following: 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Local Variables: 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * indent-tabs-mode: nil 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * End: 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1348