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