16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1999-2011 International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* ucnv_bld.h: 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Contains internal data structure definitions 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Created by Bertrand A. Damiba 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Change history: 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 06/29/2000 helena Major rewrite of the callback APIs. 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UCNV_BLD_H 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_BLD_H 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv_err.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utf16.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucnv_cnv.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucnvmbcs.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucnv_ext.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "udataswp.h" 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* size of the overflow buffers in UConverter, enough for escaping callbacks */ 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_ERROR_BUFFER_LENGTH 32 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* at most 4 bytes per substitution character (part of .cnv file format! see UConverterStaticData) */ 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_MAX_SUBCHAR_LEN 4 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* at most 8 bytes per character in toUBytes[] (UTF-8 uses up to 6) */ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_MAX_CHAR_LEN 8 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* converter options bits */ 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_OPTION_VERSION 0xf 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_OPTION_SWAP_LFNL 0x10 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_GET_VERSION(cnv) ((cnv)->options&UCNV_OPTION_VERSION) 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN /* We must declare the following as 'extern "C"' so that if ucnv 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org itself is compiled under C++, the linkage of the funcptrs will 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org work. 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgunion UConverterTable { 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterMBCSTable mbcs; 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef union UConverterTable UConverterTable; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UConverterImpl; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UConverterImpl UConverterImpl; 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** values for the unicodeMask */ 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_HAS_SUPPLEMENTARY 1 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_HAS_SURROGATES 2 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UConverterStaticData { /* +offset: size */ 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t structSize; /* +0: 4 Size of this structure */ 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char name 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org [UCNV_MAX_CONVERTER_NAME_LENGTH]; /* +4: 60 internal name of the converter- invariant chars */ 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t codepage; /* +64: 4 codepage # (now IBM-$codepage) */ 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t platform; /* +68: 1 platform of the converter (only IBM now) */ 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t conversionType; /* +69: 1 conversion type */ 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t minBytesPerChar; /* +70: 1 Minimum # bytes per char in this codepage */ 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t maxBytesPerChar; /* +71: 1 Maximum # bytes output per UChar in this codepage */ 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t subChar[UCNV_MAX_SUBCHAR_LEN]; /* +72: 4 [note: 4 and 8 byte boundary] */ 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t subCharLen; /* +76: 1 */ 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t hasToUnicodeFallback; /* +77: 1 UBool needs to be changed to UBool to be consistent across platform */ 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t hasFromUnicodeFallback; /* +78: 1 */ 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t unicodeMask; /* +79: 1 bit 0: has supplementary bit 1: has single surrogates */ 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t subChar1; /* +80: 1 single-byte substitution character for IBM MBCS (0 if none) */ 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t reserved[19]; /* +81: 19 to round out the structure */ 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* total size: 100 */ 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UConverterStaticData; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Defines the UConverterSharedData struct, 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the immutable, shared part of UConverter. 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UConverterSharedData { 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t structSize; /* Size of this structure */ 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t referenceCounter; /* used to count number of clients, 0xffffffff for static SharedData */ 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void *dataMemory; /* from udata_openChoice() - for cleanup */ 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void *table; /* Unused. This used to be a UConverterTable - Pointer to conversion data - see mbcs below */ 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UConverterStaticData *staticData; /* pointer to the static (non changing) data. */ 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool sharedDataCached; /* TRUE: shared data is in cache, don't destroy on ucnv_close() if 0 ref. FALSE: shared data isn't in the cache, do attempt to clean it up if the ref is 0 */ 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*UBool staticDataOwned; TRUE if static data owned by shared data & should be freed with it, NEVER true for udata() loaded statics. This ignored variable was removed to make space for sharedDataCached. */ 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UConverterImpl *impl; /* vtable-style struct of mostly function pointers */ 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*initial values of some members of the mutable part of object */ 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t toUnicodeStatus; 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Shared data structures currently come in two flavors: 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - readonly for built-in algorithmic converters 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - allocated for MBCS, with a pointer to an allocated UConverterTable 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which always has a UConverterMBCSTable 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * To eliminate one allocation, I am making the UConverterMBCSTable 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a member of the shared data. It is the last member so that static 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * definitions of UConverterSharedData work as before. 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The table field above also remains to avoid updating all static 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * definitions, but is now unused. 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * markus 2003-nov-07 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterMBCSTable mbcs; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Defines a UConverter, the lightweight mutable part the user sees */ 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UConverter { 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Error function pointer called when conversion issues 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * occur during a ucnv_fromUnicode call 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void (U_EXPORT2 *fromUCharErrorBehaviour) (const void *context, 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterFromUnicodeArgs *args, 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *codeUnits, 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length, 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 codePoint, 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterCallbackReason reason, 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Error function pointer called when conversion issues 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * occur during a ucnv_toUnicode call 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void (U_EXPORT2 *fromCharErrorBehaviour) (const void *context, 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterToUnicodeArgs *args, 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *codeUnits, 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length, 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterCallbackReason reason, 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *); 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Pointer to additional data that depends on the converter type. 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Used by ISO 2022, SCSU, GB 18030 converters, possibly more. 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void *extraInfo; 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void *fromUContext; 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void *toUContext; 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Pointer to charset bytes for substitution string if subCharLen>0, 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * or pointer to Unicode string (UChar *) if subCharLen<0. 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * subCharLen==0 is equivalent to using a skip callback. 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If the pointer is !=subUChars then it is allocated with 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UCNV_ERROR_BUFFER_LENGTH * U_SIZEOF_UCHAR bytes. 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The subUChars field is declared as UChar[] not uint8_t[] to 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * guarantee alignment for UChars. 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t *subChars; 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterSharedData *sharedData; /* Pointer to the shared immutable part of the converter object */ 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t options; /* options flags from UConverterOpen, may contain additional bits */ 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool sharedDataIsCached; /* TRUE: shared data is in cache, don't destroy on ucnv_close() if 0 ref. FALSE: shared data isn't in the cache, do attempt to clean it up if the ref is 0 */ 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isCopyLocal; /* TRUE if UConverter is not owned and not released in ucnv_close() (stack-allocated, safeClone(), etc.) */ 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isExtraLocal; /* TRUE if extraInfo is not owned and not released in ucnv_close() (stack-allocated, safeClone(), etc.) */ 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool useFallback; 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t toULength; /* number of bytes in toUBytes */ 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t toUBytes[UCNV_MAX_CHAR_LEN-1];/* more "toU status"; keeps the bytes of the current character */ 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t toUnicodeStatus; /* Used to internalize stream status information */ 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t mode; 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t fromUnicodeStatus; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * More fromUnicode() status. Serves 3 purposes: 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - keeps a lead surrogate between buffers (similar to toUBytes[]) 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - keeps a lead surrogate at the end of the stream, 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which the framework handles as truncated input 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - if the fromUnicode() implementation returns to the framework 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (ucnv.c ucnv_fromUnicode()), then the framework calls the callback 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for this code point 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 fromUChar32; 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * value for ucnv_getMaxCharSize() 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * usually simply copied from the static data, but ucnvmbcs.c modifies 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the value depending on the converter type and options 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t maxBytesPerUChar; 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t subCharLen; /* length of the codepage specific character sequence */ 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t invalidCharLength; 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t charErrorBufferLength; /* number of valid bytes in charErrorBuffer */ 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t invalidUCharLength; 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t UCharErrorBufferLength; /* number of valid UChars in charErrorBuffer */ 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t subChar1; /* single-byte substitution character if different from subChar */ 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool useSubChar1; 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char invalidCharBuffer[UCNV_MAX_CHAR_LEN]; /* bytes from last error/callback situation */ 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t charErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* codepage output from Error functions */ 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar subUChars[UCNV_MAX_SUBCHAR_LEN/U_SIZEOF_UCHAR]; /* see subChars documentation */ 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar invalidUCharBuffer[U16_MAX_LENGTH]; /* UChars from last error/callback situation */ 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar UCharErrorBuffer[UCNV_ERROR_BUFFER_LENGTH]; /* unicode output from Error functions */ 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* fields for conversion extension */ 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* store previous UChars/chars to continue partial matches */ 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 preFromUFirstCP; /* >=0: partial match */ 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar preFromU[UCNV_EXT_MAX_UCHARS]; 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char preToU[UCNV_EXT_MAX_BYTES]; 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t preFromULength, preToULength; /* negative: replay */ 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t preToUFirstLength; /* length of first character */ 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* new fields for ICU 4.0 */ 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterCallbackReason toUCallbackReason; /* (*fromCharErrorBehaviour) reason, set when error is detected */ 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END /* end of UConverter */ 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CONVERTER_FILE_EXTENSION ".cnv" 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Return the number of all converter names. 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pErrorCode The error code 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the number of all converter names 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC uint16_t 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_bld_countAvailableConverters(UErrorCode *pErrorCode); 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Return the (n)th converter name in mixed case, or NULL 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if there is none (typically, if the data cannot be loaded). 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 0<=index<ucnv_io_countAvailableConverters(). 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param n The number specifies which converter name to get 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pErrorCode The error code 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the (n)th converter name in mixed case, or NULL if there is none. 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC const char * 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_bld_getAvailableConverter(uint16_t n, UErrorCode *pErrorCode); 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Load a non-algorithmic converter. 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If pkg==NULL, then this function must be called inside umtx_lock(&cnvCacheMutex). 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UConverterSharedData * 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_load(UConverterLoadArgs *pArgs, UErrorCode *err); 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unload a non-algorithmic converter. 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * It must be sharedData->referenceCounter != ~0 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and this function must be called inside umtx_lock(&cnvCacheMutex). 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_unload(UConverterSharedData *sharedData); 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Swap ICU .cnv conversion tables. See udataswp.h. 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_swap(const UDataSwapper *ds, 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void *inData, int32_t length, void *outData, 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* _UCNV_BLD */ 287