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* ucnv_cnv.h: 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Definitions for converter implementations. 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 05/09/00 helena Added implementation to handle fallback mappings. 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 06/29/2000 helena Major rewrite of the callback APIs. 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UCNV_CNV_H 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_CNV_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/uset.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uset_imp.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* this is used in fromUnicode DBCS tables as an "unassigned" marker */ 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define missingCharMarker 0xFFFF 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * #define missingUCharMarker 0xfffe 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * commented out because there are actually two values used in toUnicode tables: 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * U+fffe "unassigned" 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * U+ffff "illegal" 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** Forward declaration, see ucnv_bld.h */ 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UConverterSharedData; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UConverterSharedData UConverterSharedData; 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* function types for UConverterImpl ---------------------------------------- */ 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* struct with arguments for UConverterLoad and ucnv_load() */ 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct { 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size; /* sizeof(UConverterLoadArgs) */ 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t nestedLoads; /* count nested ucnv_load() calls */ 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool onlyTestIsLoadable; /* input: don't actually load */ 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool reserved0; /* reserved - for good alignment of the pointers */ 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int16_t reserved; /* reserved - for good alignment of the pointers */ 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t options; 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *pkg, *name, *locale; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UConverterLoadArgs; 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_LOAD_ARGS_INITIALIZER \ 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { (int32_t)sizeof(UConverterLoadArgs), 0, FALSE, FALSE, 0, 0, NULL, NULL, NULL } 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterLoad) (UConverterSharedData *sharedData, 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterLoadArgs *pArgs, 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint8_t *raw, UErrorCode *pErrorCode); 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterUnload) (UConverterSharedData *sharedData); 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterOpen) (UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode); 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterClose) (UConverter *cnv); 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef enum UConverterResetChoice { 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_RESET_BOTH, 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_RESET_TO_UNICODE, 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_RESET_FROM_UNICODE 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UConverterResetChoice; 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterReset) (UConverter *cnv, UConverterResetChoice choice); 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Converter implementation function(s) for ucnv_toUnicode(). 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If the toUnicodeWithOffsets function pointer is NULL, 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * then the toUnicode function will be used and the offsets will be set to -1. 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Must maintain state across buffers. Use toUBytes[toULength] for partial input 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * sequences; it will be checked in ucnv.c at the end of the input stream 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to detect truncated input. 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Some converters may need additional detection and may then set U_TRUNCATED_CHAR_FOUND. 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The toUnicodeWithOffsets must write exactly as many offset values as target 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * units. Write offset values of -1 for when the source index corresponding to 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the output unit is not known (e.g., the character started in an earlier buffer). 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The pArgs->offsets pointer need not be moved forward. 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * At function return, either one of the following conditions must be true: 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - U_BUFFER_OVERFLOW_ERROR and the target is full: target==targetLimit 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - another error code with toUBytes[toULength] set to the offending input 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - no error, and the source is consumed: source==sourceLimit 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The ucnv.c code will handle the end of the input (reset) 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (reset, and truncation detection) and callbacks. 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterToUnicode) (UConverterToUnicodeArgs *, UErrorCode *); 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Same rules as for UConverterToUnicode. 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A lead surrogate is kept in fromUChar32 across buffers, and if an error 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * occurs, then the offending input code point must be put into fromUChar32 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as well. 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterFromUnicode) (UConverterFromUnicodeArgs *, UErrorCode *); 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Converter implementation function for ucnv_convertEx(), for direct conversion 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * between two charsets without pivoting through UTF-16. 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The rules are the same as for UConverterToUnicode and UConverterFromUnicode. 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * In addition, 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - The toUnicode side must behave and keep state exactly like the 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UConverterToUnicode implementation for the same source charset. 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - A U_USING_DEFAULT_WARNING can be set to request to temporarily fall back 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to pivoting. When this function is called, the conversion framework makes 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * sure that this warning is not set on input. 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - Continuing a partial match and flushing the toUnicode replay buffer 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * are handled by pivoting, using the toUnicode and fromUnicode functions. 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterConvert) (UConverterFromUnicodeArgs *pFromUArgs, 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterToUnicodeArgs *pToUArgs, 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Converter implementation function for ucnv_getNextUChar(). 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If the function pointer is NULL, then the toUnicode function will be used. 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Will be called at a character boundary (toULength==0). 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * May return with 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - U_INDEX_OUTOFBOUNDS_ERROR if there was no output for the input 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (the return value will be ignored) 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - U_TRUNCATED_CHAR_FOUND or another error code (never U_BUFFER_OVERFLOW_ERROR!) 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with toUBytes[toULength] set to the offending input 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (the return value will be ignored) 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - return UCNV_GET_NEXT_UCHAR_USE_TO_U, without moving the source pointer, 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to indicate that the ucnv.c code shall call the toUnicode function instead 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - return a real code point result 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unless UCNV_GET_NEXT_UCHAR_USE_TO_U is returned, the source bytes must be consumed. 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The ucnv.c code will handle the end of the input (reset) 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (except for truncation detection!) and callbacks. 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef UChar32 (*UConverterGetNextUChar) (UConverterToUnicodeArgs *, UErrorCode *); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterGetStarters)(const UConverter* converter, 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool starters[256], 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* If this function pointer is null or if the function returns null 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the name field in static data struct should be returned by 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ucnv_getName() API function 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef const char * (*UConverterGetName) (const UConverter *cnv); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Write the codepage substitution character. 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If this function is not set, then ucnv_cbFromUWriteSub() writes 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the substitution character from UConverter. 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For stateful converters, it is typically necessary to handle this 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * specificially for the converter in order to properly maintain the state. 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterWriteSub) (UConverterFromUnicodeArgs *pArgs, int32_t offsetIndex, UErrorCode *pErrorCode); 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For converter-specific safeClone processing 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If this function is not set, then ucnv_safeClone assumes that the converter has no private data that changes 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * after the converter is done opening. 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If this function is set, then it is called just after a memcpy() of 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * converter data to the new, empty converter, and is expected to set up 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the initial state of the converter. It is not expected to increment the 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * reference counts of the standard data types such as the shared data. 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef UConverter * (*UConverterSafeClone) (const UConverter *cnv, 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void *stackBuffer, 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *pBufferSize, 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *status); 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Filters for some ucnv_getUnicodeSet() implementation code. 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef enum UConverterSetFilter { 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_SET_FILTER_NONE, 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_SET_FILTER_DBCS_ONLY, 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_SET_FILTER_2022_CN, 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_SET_FILTER_SJIS, 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_SET_FILTER_GR94DBCS, 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_SET_FILTER_HZ, 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCNV_SET_FILTER_COUNT 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UConverterSetFilter; 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Fills the set of Unicode code points that can be converted by an ICU converter. 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The API function ucnv_getUnicodeSet() clears the USet before calling 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the converter's getUnicodeSet() implementation; the converter should only 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * add the appropriate code points to allow recursive use. 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For example, the ISO-2022-JP converter will call each subconverter's 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * getUnicodeSet() implementation to consecutively add code points to 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the same USet, which will result in a union of the sets of all subconverters. 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For more documentation, see ucnv_getUnicodeSet() in ucnv.h. 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (*UConverterGetUnicodeSet) (const UConverter *cnv, 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const USetAdder *sa, 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterUnicodeSet which, 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool CONVERSION_U_SUCCESS (UErrorCode err); 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UConverterImpl contains all the data and functions for a converter type. 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Its function pointers work much like a C++ vtable. 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Many converter types need to define only a subset of the functions; 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * when a function pointer is NULL, then a default action will be performed. 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Every converter type must implement toUnicode, fromUnicode, and getNextUChar, 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * otherwise the converter may crash. 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Every converter type that has variable-length codepage sequences should 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * also implement toUnicodeWithOffsets and fromUnicodeWithOffsets for 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * correct offset handling. 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * All other functions may or may not be implemented - it depends only on 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * whether the converter type needs them. 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * When open() fails, then close() will be called, if present. 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UConverterImpl { 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterType type; 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterLoad load; 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterUnload unload; 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterOpen open; 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterClose close; 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterReset reset; 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterToUnicode toUnicode; 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterToUnicode toUnicodeWithOffsets; 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterFromUnicode fromUnicode; 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterFromUnicode fromUnicodeWithOffsets; 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterGetNextUChar getNextUChar; 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterGetStarters getStarters; 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterGetName getName; 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterWriteSub writeSub; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterSafeClone safeClone; 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterGetUnicodeSet getUnicodeSet; 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterConvert toUTF8; 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterConvert fromUTF8; 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern const UConverterSharedData 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _MBCSData, _Latin1Data, 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _UTF8Data, _UTF16BEData, _UTF16LEData, _UTF32BEData, _UTF32LEData, 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _ISO2022Data, 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _LMBCSData1,_LMBCSData2, _LMBCSData3, _LMBCSData4, _LMBCSData5, _LMBCSData6, 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _LMBCSData8,_LMBCSData11,_LMBCSData16,_LMBCSData17,_LMBCSData18,_LMBCSData19, 2624dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org#if !UCONFIG_NO_NON_HTML5_CONVERSION 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _HZData,_ISCIIData, _SCSUData, _ASCIIData, 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _UTF7Data, _Bocu1Data, _UTF16Data, _UTF32Data, _CESU8Data, _IMAPData, _CompoundTextData; 2654dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org#else 2664dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org _HZData, _ASCIIData, 2674dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org _UTF16Data, _UTF32Data, _CompoundTextData; 2684dfa619cf375ebb67b7b9311487d19a4129f742fjshin@chromium.org#endif 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** Always use fallbacks from codepage to Unicode */ 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TO_U_USE_FALLBACK(useFallback) TRUE 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_TO_U_USE_FALLBACK(cnv) TRUE 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** Use fallbacks from Unicode to codepage when cnv->useFallback or for private-use code points */ 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IS_PRIVATE_USE(c) ((uint32_t)((c)-0xe000)<0x1900 || (uint32_t)((c)-0xf0000)<0x20000) 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define FROM_U_USE_FALLBACK(useFallback, c) ((useFallback) || IS_PRIVATE_USE(c)) 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_FROM_U_USE_FALLBACK(cnv, c) FROM_U_USE_FALLBACK((cnv)->useFallback, c) 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Magic number for ucnv_getNextUChar(), returned by a 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * getNextUChar() implementation to indicate to use the converter's toUnicode() 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * instead of the native function. 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UCNV_GET_NEXT_UCHAR_USE_TO_U -9 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_getCompleteUnicodeSet(const UConverter *cnv, 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const USetAdder *sa, 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterUnicodeSet which, 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_getNonSurrogateUnicodeSet(const UConverter *cnv, 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const USetAdder *sa, 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverterUnicodeSet which, 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_fromUWriteBytes(UConverter *cnv, 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *bytes, int32_t length, 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char **target, const char *targetLimit, 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t **offsets, 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sourceIndex, 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_toUWriteUChars(UConverter *cnv, 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *uchars, int32_t length, 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar **target, const UChar *targetLimit, 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t **offsets, 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sourceIndex, 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucnv_toUWriteCodePoint(UConverter *cnv, 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c, 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar **target, const UChar *targetLimit, 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t **offsets, 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t sourceIndex, 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode *pErrorCode); 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* UCNV_CNV */ 327