1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho********************************************************************** 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (C) 2010-2011, International Business Machines 4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Corporation and others. All Rights Reserved. 5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho********************************************************************** 6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* file name: ucnv_ct.c 7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* encoding: US-ASCII 8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* tab size: 8 (not used) 9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* indentation:4 10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* 11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* created on: 2010Dec09 12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* created by: Michael Ow 13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/ 14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h" 16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION 18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ucnv.h" 20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/uset.h" 21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ucnv_err.h" 22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ucnv_cb.h" 23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "ucnv_imp.h" 24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "ucnv_bld.h" 25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "ucnv_cnv.h" 26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "ucnvmbcs.h" 27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "cstring.h" 28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "cmemory.h" 29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef enum { 33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho INVALID = -2, 34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho DO_SEARCH = -1, 35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_SINGLE_0 = 0, 37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_SINGLE_1 = 1, 38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_SINGLE_2 = 2, 39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_SINGLE_3 = 3, 40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_DOUBLE_1 = 4, 42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_DOUBLE_2 = 5, 43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_DOUBLE_3 = 6, 44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_DOUBLE_4 = 7, 45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_DOUBLE_5 = 8, 46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_DOUBLE_6 = 9, 47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_DOUBLE_7 = 10, 48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_TRIPLE_DOUBLE = 11, 50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IBM_915 = 12, 52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IBM_916 = 13, 53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IBM_914 = 14, 54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IBM_874 = 15, 55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IBM_912 = 16, 56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IBM_913 = 17, 57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ISO_8859_14 = 18, 58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IBM_923 = 19, 59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NUM_OF_CONVERTERS = 20 60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} COMPOUND_TEXT_CONVERTERS; 61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define SEARCH_LENGTH 12 63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const uint8_t escSeqCompoundText[NUM_OF_CONVERTERS][5] = { 65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Single */ 66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x41, 0, 0 }, 67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x4D, 0, 0 }, 68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x46, 0, 0 }, 69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x47, 0, 0 }, 70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Double */ 72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x24, 0x29, 0x41, 0 }, 73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x24, 0x29, 0x42, 0 }, 74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x24, 0x29, 0x43, 0 }, 75b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x24, 0x29, 0x44, 0 }, 76b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x24, 0x29, 0x47, 0 }, 77b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x24, 0x29, 0x48, 0 }, 78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x24, 0x29, 0x49, 0 }, 79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Triple/Double */ 81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x25, 0x47, 0, 0 }, 82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*IBM-915*/ 84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x4C, 0, 0 }, 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*IBM-916*/ 86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x48, 0, 0 }, 87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*IBM-914*/ 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x44, 0, 0 }, 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*IBM-874*/ 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x54, 0, 0 }, 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*IBM-912*/ 92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x42, 0, 0 }, 93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* IBM-913 */ 94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x43, 0, 0 }, 95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* ISO-8859_14 */ 96b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x5F, 0, 0 }, 97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* IBM-923 */ 98b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0x1B, 0x2D, 0x62, 0, 0 }, 99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define ESC_START 0x1B 102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isASCIIRange(codepoint) \ 104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint == 0x0000) || (codepoint == 0x0009) || (codepoint == 0x000A) || \ 105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint >= 0x0020 && codepoint <= 0x007f) || (codepoint >= 0x00A0 && codepoint <= 0x00FF)) 106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isIBM915(codepoint) \ 108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint >= 0x0401 && codepoint <= 0x045F) || (codepoint == 0x2116)) 109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isIBM916(codepoint) \ 111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint >= 0x05D0 && codepoint <= 0x05EA) || (codepoint == 0x2017) || (codepoint == 0x203E)) 112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isCompoundS3(codepoint) \ 114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint == 0x060C) || (codepoint == 0x061B) || (codepoint == 0x061F) || (codepoint >= 0x0621 && codepoint <= 0x063A) || \ 115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint >= 0x0640 && codepoint <= 0x0652) || (codepoint >= 0x0660 && codepoint <= 0x066D) || (codepoint == 0x200B) || \ 116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint >= 0x0FE70 && codepoint <= 0x0FE72) || (codepoint == 0x0FE74) || (codepoint >= 0x0FE76 && codepoint <= 0x0FEBE)) 117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isCompoundS2(codepoint) \ 119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint == 0x02BC) || (codepoint == 0x02BD) || (codepoint >= 0x0384 && codepoint <= 0x03CE) || (codepoint == 0x2015)) 120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isIBM914(codepoint) \ 122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint == 0x0100) || (codepoint == 0x0101) || (codepoint == 0x0112) || (codepoint == 0x0113) || (codepoint == 0x0116) || (codepoint == 0x0117) || \ 123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x0122) || (codepoint == 0x0123) || (codepoint >= 0x0128 && codepoint <= 0x012B) || (codepoint == 0x012E) || (codepoint == 0x012F) || \ 124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint >= 0x0136 && codepoint <= 0x0138) || (codepoint == 0x013B) || (codepoint == 0x013C) || (codepoint == 0x0145) || (codepoint == 0x0146) || \ 125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint >= 0x014A && codepoint <= 0x014D) || (codepoint == 0x0156) || (codepoint == 0x0157) || (codepoint >= 0x0166 && codepoint <= 0x016B) || \ 126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x0172) || (codepoint == 0x0173)) 127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isIBM874(codepoint) \ 129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint >= 0x0E01 && codepoint <= 0x0E3A) || (codepoint >= 0x0E3F && codepoint <= 0x0E5B)) 130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isIBM912(codepoint) \ 132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint >= 0x0102 && codepoint <= 0x0107) || (codepoint >= 0x010C && codepoint <= 0x0111) || (codepoint >= 0x0118 && codepoint <= 0x011B) || \ 133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x0139) || (codepoint == 0x013A) || (codepoint == 0x013D) || (codepoint == 0x013E) || (codepoint >= 0x0141 && codepoint <= 0x0144) || \ 134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x0147) || (codepoint == 0x0147) || (codepoint == 0x0150) || (codepoint == 0x0151) || (codepoint == 0x0154) || (codepoint == 0x0155) || \ 135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint >= 0x0158 && codepoint <= 0x015B) || (codepoint == 0x015E) || (codepoint == 0x015F) || (codepoint >= 0x0160 && codepoint <= 0x0165) || \ 136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x016E) || (codepoint == 0x016F) || (codepoint == 0x0170) || (codepoint == 0x0171) || (codepoint >= 0x0179 && codepoint <= 0x017E) || \ 137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x02C7) || (codepoint == 0x02D8) || (codepoint == 0x02D9) || (codepoint == 0x02DB) || (codepoint == 0x02DD)) 138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isIBM913(codepoint) \ 140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint >= 0x0108 && codepoint <= 0x010B) || (codepoint == 0x011C) || \ 141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x011D) || (codepoint == 0x0120) || (codepoint == 0x0121) || \ 142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint >= 0x0124 && codepoint <= 0x0127) || (codepoint == 0x0134) || (codepoint == 0x0135) || \ 143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x015C) || (codepoint == 0x015D) || (codepoint == 0x016C) || (codepoint == 0x016D)) 144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isCompoundS1(codepoint) \ 146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint == 0x011E) || (codepoint == 0x011F) || (codepoint == 0x0130) || \ 147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x0131) || (codepoint >= 0x0218 && codepoint <= 0x021B)) 148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isISO8859_14(codepoint) \ 150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint >= 0x0174 && codepoint <= 0x0177) || (codepoint == 0x1E0A) || \ 151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x1E0B) || (codepoint == 0x1E1E) || (codepoint == 0x1E1F) || \ 152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x1E40) || (codepoint == 0x1E41) || (codepoint == 0x1E56) || \ 153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x1E57) || (codepoint == 0x1E60) || (codepoint == 0x1E61) || \ 154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x1E6A) || (codepoint == 0x1E6B) || (codepoint == 0x1EF2) || \ 155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (codepoint == 0x1EF3) || (codepoint >= 0x1E80 && codepoint <= 0x1E85)) 156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define isIBM923(codepoint) \ 158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((codepoint == 0x0152) || (codepoint == 0x0153) || (codepoint == 0x0178) || (codepoint == 0x20AC)) 159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct{ 162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterSharedData *myConverterArray[NUM_OF_CONVERTERS]; 163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_CONVERTERS state; 164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} UConverterDataCompoundText; 165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*********** Compound Text Converter Protos ***********/ 167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode); 169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho _CompoundTextClose(UConverter *converter); 172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundTextReset(UConverter *converter, UConverterResetChoice choice); 175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char* 177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundTextgetName(const UConverter* cnv); 178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic int32_t findNextEsc(const char *source, const char *sourceLimit) { 181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t length = sourceLimit - source; 182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t i; 183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 0; i < length; i++) { 184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (*(source + i) == 0x1B) { 185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return i; 186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return length; 190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic COMPOUND_TEXT_CONVERTERS getState(int codepoint) { 193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_CONVERTERS state = DO_SEARCH; 194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (isASCIIRange(codepoint)) { 196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = COMPOUND_TEXT_SINGLE_0; 197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isIBM912(codepoint)) { 198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = IBM_912; 199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }else if (isIBM913(codepoint)) { 200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = IBM_913; 201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isISO8859_14(codepoint)) { 202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = ISO_8859_14; 203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isIBM923(codepoint)) { 204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = IBM_923; 205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isIBM874(codepoint)) { 206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = IBM_874; 207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isIBM914(codepoint)) { 208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = IBM_914; 209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isCompoundS2(codepoint)) { 210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = COMPOUND_TEXT_SINGLE_2; 211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isCompoundS3(codepoint)) { 212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = COMPOUND_TEXT_SINGLE_3; 213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isIBM916(codepoint)) { 214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = IBM_916; 215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isIBM915(codepoint)) { 216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = IBM_915; 217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (isCompoundS1(codepoint)) { 218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = COMPOUND_TEXT_SINGLE_1; 219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return state; 222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic COMPOUND_TEXT_CONVERTERS findStateFromEscSeq(const char* source, const char* sourceLimit, const uint8_t* toUBytesBuffer, int32_t toUBytesBufferLength, UErrorCode *err) { 225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_CONVERTERS state = INVALID; 226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool matchFound = FALSE; 227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t i, n, offset = toUBytesBufferLength; 228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 0; i < NUM_OF_CONVERTERS; i++) { 230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho matchFound = TRUE; 231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (n = 0; escSeqCompoundText[i][n] != 0; n++) { 232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (n < toUBytesBufferLength) { 233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (toUBytesBuffer[n] != escSeqCompoundText[i][n]) { 234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho matchFound = FALSE; 235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if ((source + (n - offset)) >= sourceLimit) { 238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err = U_TRUNCATED_CHAR_FOUND; 239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho matchFound = FALSE; 240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (*(source + (n - offset)) != escSeqCompoundText[i][n]) { 242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho matchFound = FALSE; 243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (matchFound) { 248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (matchFound) { 253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho state = (COMPOUND_TEXT_CONVERTERS)i; 254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return state; 257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ 261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cnv->extraInfo = uprv_malloc (sizeof (UConverterDataCompoundText)); 262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (cnv->extraInfo != NULL) { 263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) cnv->extraInfo; 264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterNamePieces stackPieces; 266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterLoadArgs stackArgs={ (int32_t)sizeof(UConverterLoadArgs) }; 267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_0] = NULL; 269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_1] = ucnv_loadSharedData("icu-internal-compound-s1", &stackPieces, &stackArgs, errorCode); 270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_2] = ucnv_loadSharedData("icu-internal-compound-s2", &stackPieces, &stackArgs, errorCode); 271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_3] = ucnv_loadSharedData("icu-internal-compound-s3", &stackPieces, &stackArgs, errorCode); 272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_1] = ucnv_loadSharedData("icu-internal-compound-d1", &stackPieces, &stackArgs, errorCode); 273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_2] = ucnv_loadSharedData("icu-internal-compound-d2", &stackPieces, &stackArgs, errorCode); 274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_3] = ucnv_loadSharedData("icu-internal-compound-d3", &stackPieces, &stackArgs, errorCode); 275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_4] = ucnv_loadSharedData("icu-internal-compound-d4", &stackPieces, &stackArgs, errorCode); 276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_5] = ucnv_loadSharedData("icu-internal-compound-d5", &stackPieces, &stackArgs, errorCode); 277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_6] = ucnv_loadSharedData("icu-internal-compound-d6", &stackPieces, &stackArgs, errorCode); 278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_DOUBLE_7] = ucnv_loadSharedData("icu-internal-compound-d7", &stackPieces, &stackArgs, errorCode); 279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[COMPOUND_TEXT_TRIPLE_DOUBLE] = ucnv_loadSharedData("icu-internal-compound-t", &stackPieces, &stackArgs, errorCode); 280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[IBM_915] = ucnv_loadSharedData("ibm-915_P100-1995", &stackPieces, &stackArgs, errorCode); 282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[IBM_916] = ucnv_loadSharedData("ibm-916_P100-1995", &stackPieces, &stackArgs, errorCode); 283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[IBM_914] = ucnv_loadSharedData("ibm-914_P100-1995", &stackPieces, &stackArgs, errorCode); 284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[IBM_874] = ucnv_loadSharedData("ibm-874_P100-1995", &stackPieces, &stackArgs, errorCode); 285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[IBM_912] = ucnv_loadSharedData("ibm-912_P100-1995", &stackPieces, &stackArgs, errorCode); 286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[IBM_913] = ucnv_loadSharedData("ibm-913_P100-2000", &stackPieces, &stackArgs, errorCode); 287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[ISO_8859_14] = ucnv_loadSharedData("iso-8859_14-1998", &stackPieces, &stackArgs, errorCode); 288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->myConverterArray[IBM_923] = ucnv_loadSharedData("ibm-923_P100-1998", &stackPieces, &stackArgs, errorCode); 289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(*errorCode) || pArgs->onlyTestIsLoadable) { 291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho _CompoundTextClose(cnv); 292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->state = 0; 296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 297b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *errorCode = U_MEMORY_ALLOCATION_ERROR; 298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundTextClose(UConverter *converter) { 304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterDataCompoundText* myConverterData = (UConverterDataCompoundText*)(converter->extraInfo); 305b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t i; 306b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (converter->extraInfo != NULL) { 308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*close the array of converter pointers and free the memory*/ 309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 0; i < NUM_OF_CONVERTERS; i++) { 310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (myConverterData->myConverterArray[i] != NULL) { 311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucnv_unloadSharedDataIfReady(myConverterData->myConverterArray[i]); 312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_free(converter->extraInfo); 316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundTextReset(UConverter *converter, UConverterResetChoice choice) { 321b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 323b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const char* 324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundTextgetName(const UConverter* cnv){ 325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return "x11-compound-text"; 326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUConverter_fromUnicode_CompoundText_OFFSETS(UConverterFromUnicodeArgs* args, UErrorCode* err){ 330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverter *cnv = args->converter; 331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint8_t *target = (uint8_t *) args->target; 332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const uint8_t *targetLimit = (const uint8_t *) args->targetLimit; 333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar* source = args->source; 334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar* sourceLimit = args->sourceLimit; 335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* int32_t* offsets = args->offsets; */ 336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 sourceChar; 337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool useFallback = cnv->useFallback; 338b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint8_t tmpTargetBuffer[7]; 339b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t tmpTargetBufferLength = 0; 340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_CONVERTERS currentState, tmpState; 341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint32_t pValue; 342b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t pValueLength = 0; 343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t i, n; 344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) cnv->extraInfo; 346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho currentState = myConverterData->state; 348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* check if the last codepoint of previous buffer was a lead surrogate*/ 350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if((sourceChar = cnv->fromUChar32)!=0 && target< targetLimit) { 351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho goto getTrail; 352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while( source < sourceLimit){ 355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(target < targetLimit){ 356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sourceChar = *(source++); 358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*check if the char is a First surrogate*/ 359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(UTF_IS_SURROGATE(sourceChar)) { 360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(UTF_IS_SURROGATE_FIRST(sourceChar)) { 361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehogetTrail: 362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*look ahead to find the trail surrogate*/ 363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(source < sourceLimit) { 364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test the following code unit */ 365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar trail=(UChar) *source; 366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(UTF_IS_SECOND_SURROGATE(trail)) { 367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho source++; 368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail); 369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cnv->fromUChar32=0x00; 370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* convert this supplementary code point */ 371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* exit this condition tree */ 372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* this is an unmatched lead code unit (1st surrogate) */ 374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* callback(illegal) */ 375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err=U_ILLEGAL_CHAR_FOUND; 376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cnv->fromUChar32=sourceChar; 377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* no more input */ 381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cnv->fromUChar32=sourceChar; 382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* this is an unmatched trail code unit (2nd surrogate) */ 386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* callback(illegal) */ 387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err=U_ILLEGAL_CHAR_FOUND; 388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho cnv->fromUChar32=sourceChar; 389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpTargetBufferLength = 0; 394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpState = getState(sourceChar); 395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (tmpState != DO_SEARCH && currentState != tmpState) { 397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Get escape sequence if necessary */ 398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho currentState = tmpState; 399b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 0; escSeqCompoundText[currentState][i] != 0; i++) { 400b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpTargetBuffer[tmpTargetBufferLength++] = escSeqCompoundText[currentState][i]; 401b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 402b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 404b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (tmpState == DO_SEARCH) { 405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Test all available converters */ 406b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 1; i < SEARCH_LENGTH; i++) { 407b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pValueLength = ucnv_MBCSFromUChar32(myConverterData->myConverterArray[i], sourceChar, &pValue, useFallback); 408b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pValueLength > 0) { 409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpState = (COMPOUND_TEXT_CONVERTERS)i; 410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (currentState != tmpState) { 411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho currentState = tmpState; 412b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 0; escSeqCompoundText[currentState][i] != 0; i++) { 413b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpTargetBuffer[tmpTargetBufferLength++] = escSeqCompoundText[currentState][i]; 414b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 415b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (n = (pValueLength - 1); n >= 0; n--) { 417b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)(pValue >> (n * 8)); 418b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 419b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 420b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 421b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 422b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (tmpState == COMPOUND_TEXT_SINGLE_0) { 423b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)sourceChar; 424b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 425b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pValueLength = ucnv_MBCSFromUChar32(myConverterData->myConverterArray[currentState], sourceChar, &pValue, useFallback); 426b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pValueLength > 0) { 427b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (n = (pValueLength - 1); n >= 0; n--) { 428b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpTargetBuffer[tmpTargetBufferLength++] = (uint8_t)(pValue >> (n * 8)); 429b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 430b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 431b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 432b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 433b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 0; i < tmpTargetBufferLength; i++) { 434b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (target < targetLimit) { 435b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *target++ = tmpTargetBuffer[i]; 436b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 437b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err = U_BUFFER_OVERFLOW_ERROR; 438b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 439b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 440b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 441b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 442b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (*err == U_BUFFER_OVERFLOW_ERROR) { 443b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (; i < tmpTargetBufferLength; i++) { 444b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = tmpTargetBuffer[i]; 445b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 446b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 447b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 448b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err = U_BUFFER_OVERFLOW_ERROR; 449b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*save the state and return */ 454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->state = currentState; 455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->source = source; 456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->target = (char*)target; 457b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUConverter_toUnicode_CompoundText_OFFSETS(UConverterToUnicodeArgs *args, 462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode* err){ 463b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char *mySource = (char *) args->source; 464b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar *myTarget = args->target; 465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char *mySourceLimit = args->sourceLimit; 466b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char *tmpSourceLimit = mySourceLimit; 467b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint32_t mySourceChar = 0x0000; 468b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho COMPOUND_TEXT_CONVERTERS currentState, tmpState; 469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t sourceOffset = 0; 470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) args->converter->extraInfo; 471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterSharedData* savedSharedData = NULL; 472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterToUnicodeArgs subArgs; 474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t minArgsSize; 475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* set up the subconverter arguments */ 477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(args->size<sizeof(UConverterToUnicodeArgs)) { 478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho minArgsSize = args->size; 479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho minArgsSize = (int32_t)sizeof(UConverterToUnicodeArgs); 481b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 482b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_memcpy(&subArgs, args, minArgsSize); 484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.size = (uint16_t)minArgsSize; 485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho currentState = tmpState = myConverterData->state; 487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while(mySource < mySourceLimit){ 489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(myTarget < args->targetLimit){ 490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (args->converter->toULength > 0) { 491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mySourceChar = args->converter->toUBytes[0]; 492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 493b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mySourceChar = (uint8_t)*mySource; 494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (mySourceChar == ESC_START) { 497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpState = findStateFromEscSeq(mySource, mySourceLimit, args->converter->toUBytes, args->converter->toULength, err); 498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (*err == U_TRUNCATED_CHAR_FOUND) { 500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (; mySource < mySourceLimit;) { 501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->converter->toUBytes[args->converter->toULength++] = *mySource++; 502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err = U_ZERO_ERROR; 504b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 505b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (tmpState == INVALID) { 506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err = U_ILLEGAL_CHAR_FOUND; 507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (tmpState != currentState) { 511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho currentState = tmpState; 512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sourceOffset = uprv_strlen((char*)escSeqCompoundText[currentState]) - args->converter->toULength; 515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mySource += sourceOffset; 517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->converter->toULength = 0; 519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (currentState == COMPOUND_TEXT_SINGLE_0) { 522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while (mySource < mySourceLimit) { 523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (*mySource == ESC_START) { 524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (myTarget < args->targetLimit) { 527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *myTarget++ = 0x00ff&(*mySource++); 528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err = U_BUFFER_OVERFLOW_ERROR; 530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (mySource < mySourceLimit){ 534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sourceOffset = findNextEsc(mySource, mySourceLimit); 535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tmpSourceLimit = mySource + sourceOffset; 537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.source = mySource; 539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.sourceLimit = tmpSourceLimit; 540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.target = myTarget; 541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho savedSharedData = subArgs.converter->sharedData; 542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.converter->sharedData = myConverterData->myConverterArray[currentState]; 543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucnv_MBCSToUnicodeWithOffsets(&subArgs, err); 545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.converter->sharedData = savedSharedData; 547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mySource = subArgs.source; 549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myTarget = subArgs.target; 550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(*err)) { 552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(*err == U_BUFFER_OVERFLOW_ERROR) { 553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(subArgs.converter->UCharErrorBufferLength > 0) { 554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_memcpy(args->converter->UCharErrorBuffer, subArgs.converter->UCharErrorBuffer, 555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.converter->UCharErrorBufferLength); 556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 557b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->converter->UCharErrorBufferLength=subArgs.converter->UCharErrorBufferLength; 558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho subArgs.converter->UCharErrorBufferLength = 0; 559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 564b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *err = U_BUFFER_OVERFLOW_ERROR; 565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myConverterData->state = currentState; 569b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->target = myTarget; 570b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho args->source = mySource; 571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 572b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 573b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void 574b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho_CompoundText_GetUnicodeSet(const UConverter *cnv, 575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const USetAdder *sa, 576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterUnicodeSet which, 577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode *pErrorCode) { 578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *)cnv->extraInfo; 579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t i; 580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 1; i < NUM_OF_CONVERTERS; i++) { 582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucnv_MBCSGetUnicodeSetForUnicode(myConverterData->myConverterArray[i], sa, which, pErrorCode); 583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sa->add(sa->set, 0x0000); 585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sa->add(sa->set, 0x0009); 586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sa->add(sa->set, 0x000A); 587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sa->addRange(sa->set, 0x0020, 0x007F); 588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sa->addRange(sa->set, 0x00A0, 0x00FF); 589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 591b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UConverterImpl _CompoundTextImpl = { 592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 593b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCNV_COMPOUND_TEXT, 594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho _CompoundTextOpen, 599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho _CompoundTextClose, 600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho _CompoundTextReset, 601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverter_toUnicode_CompoundText_OFFSETS, 603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverter_toUnicode_CompoundText_OFFSETS, 604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverter_fromUnicode_CompoundText_OFFSETS, 605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UConverter_fromUnicode_CompoundText_OFFSETS, 606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho _CompoundTextgetName, 610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho _CompoundText_GetUnicodeSet 613b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UConverterStaticData _CompoundTextStaticData = { 615b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sizeof(UConverterStaticData), 616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "COMPOUND_TEXT", 617b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0, 618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCNV_IBM, 619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCNV_COMPOUND_TEXT, 620b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1, 621b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6, 622b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0xef, 0, 0, 0 }, 623b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1, 624b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho FALSE, 625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho FALSE, 626b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0, 627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0, 628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ 629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst UConverterSharedData _CompoundTextData = { 631b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sizeof(UConverterSharedData), 632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ~((uint32_t) 0), 633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NULL, 635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho &_CompoundTextStaticData, 636b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho FALSE, 637b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho &_CompoundTextImpl, 638b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0 639b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 640b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 641b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ 642