150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho******************************************************************************* 350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 459d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2009-2013, International Business Machines 550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Corporation and others. All Rights Reserved. 650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho******************************************************************************* 850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* file name: normalizer2.cpp 950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* encoding: US-ASCII 1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* tab size: 8 (not used) 1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* indentation:4 1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* created on: 2009nov22 1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* created by: Markus W. Scherer 1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*/ 1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utypes.h" 1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_NORMALIZATION 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/localpointer.h" 2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/normalizer2.h" 2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/unistr.h" 2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/unorm.h" 2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cpputils.h" 2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cstring.h" 2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "mutex.h" 2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "normalizer2impl.h" 2959d709d503bab6e2b61931737e662dd293b40578ccornelius#include "uassert.h" 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ucln_cmn.h" 3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "uhash.h" 3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_BEGIN 3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Public API dispatch via Normalizer2 subclasses -------------------------- *** 3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 37103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::~Normalizer2() {} 38103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 39103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUBool 40103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::getRawDecomposition(UChar32, UnicodeString &) const { 41103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return FALSE; 42103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 43103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 44103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUChar32 45103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::composePair(UChar32, UChar32) const { 46103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return U_SENTINEL; 47103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 48103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 49103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusuint8_t 50103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::getCombiningClass(UChar32 /*c*/) const { 51103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 0; 52103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 53103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Normalizer2 implementation for the old UNORM_NONE. 5550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass NoopNormalizer2 : public Normalizer2 { 56103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~NoopNormalizer2(); 57103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UnicodeString & 5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalize(const UnicodeString &src, 6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString &dest, 6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) const { 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(errorCode)) { 6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(&dest!=&src) { 6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest=src; 6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return dest; 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UnicodeString & 7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizeSecondAndAppend(UnicodeString &first, 7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString &second, 7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) const { 7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(errorCode)) { 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(&first!=&second) { 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho first.append(second); 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return first; 8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UnicodeString & 8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho append(UnicodeString &first, 8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString &second, 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) const { 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(errorCode)) { 8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(&first!=&second) { 9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho first.append(second); 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return first; 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool 9827f654740f2a26ad62a5c155af9199af9e69b889claireho getDecomposition(UChar32, UnicodeString &) const { 9927f654740f2a26ad62a5c155af9199af9e69b889claireho return FALSE; 10027f654740f2a26ad62a5c155af9199af9e69b889claireho } 101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // No need to override the default getRawDecomposition(). 10227f654740f2a26ad62a5c155af9199af9e69b889claireho virtual UBool 10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho isNormalized(const UnicodeString &, UErrorCode &) const { 10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return TRUE; 10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UNormalizationCheckResult 10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho quickCheck(const UnicodeString &, UErrorCode &) const { 10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_YES; 10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual int32_t 11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho spanQuickCheckYes(const UnicodeString &s, UErrorCode &) const { 11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return s.length(); 11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryBefore(UChar32) const { return TRUE; } 11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryAfter(UChar32) const { return TRUE; } 11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool isInert(UChar32) const { return TRUE; } 11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 119103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNoopNormalizer2::~NoopNormalizer2() {} 120103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Intermediate class: 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Has Normalizer2Impl and does boilerplate argument checking and setup. 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass Normalizer2WithImpl : public Normalizer2 { 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehopublic: 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Normalizer2WithImpl(const Normalizer2Impl &ni) : impl(ni) {} 126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~Normalizer2WithImpl(); 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // normalize 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UnicodeString & 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalize(const UnicodeString &src, 13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString &dest, 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) const { 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest.setToBogus(); 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return dest; 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *sArray=src.getBuffer(); 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(&dest==&src || sArray==NULL) { 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest.setToBogus(); 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return dest; 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest.remove(); 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer buffer(impl, dest); 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(buffer.init(src.length(), errorCode)) { 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalize(sArray, sArray+src.length(), buffer, errorCode); 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return dest; 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalize(const UChar *src, const UChar *limit, 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const = 0; 15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // normalize and append 15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UnicodeString & 15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizeSecondAndAppend(UnicodeString &first, 15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString &second, 15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) const { 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return normalizeSecondAndAppend(first, second, TRUE, errorCode); 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UnicodeString & 16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho append(UnicodeString &first, 16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString &second, 16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) const { 16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return normalizeSecondAndAppend(first, second, FALSE, errorCode); 16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString & 16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizeSecondAndAppend(UnicodeString &first, 16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString &second, 17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool doNormalize, 17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) const { 17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_checkCanGetBuffer(first, errorCode); 17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return first; 17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *secondArray=second.getBuffer(); 17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(&first==&second || secondArray==NULL) { 17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return first; 18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t firstLength=first.length(); 182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString safeMiddle; 183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ReorderingBuffer buffer(impl, first); 185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(buffer.init(firstLength+second.length(), errorCode)) { 186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho normalizeAndAppend(secondArray, secondArray+second.length(), doNormalize, 187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho safeMiddle, buffer, errorCode); 188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } // The ReorderingBuffer destructor finalizes the first string. 190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(errorCode)) { 191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Restore the modified suffix of the first string. 192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho first.replace(firstLength-safeMiddle.length(), 0x7fffffff, safeMiddle); 19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return first; 19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, 198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString &safeMiddle, 19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const = 0; 20027f654740f2a26ad62a5c155af9199af9e69b889claireho virtual UBool 20127f654740f2a26ad62a5c155af9199af9e69b889claireho getDecomposition(UChar32 c, UnicodeString &decomposition) const { 20227f654740f2a26ad62a5c155af9199af9e69b889claireho UChar buffer[4]; 20327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t length; 20427f654740f2a26ad62a5c155af9199af9e69b889claireho const UChar *d=impl.getDecomposition(c, buffer, length); 20527f654740f2a26ad62a5c155af9199af9e69b889claireho if(d==NULL) { 20627f654740f2a26ad62a5c155af9199af9e69b889claireho return FALSE; 20727f654740f2a26ad62a5c155af9199af9e69b889claireho } 20827f654740f2a26ad62a5c155af9199af9e69b889claireho if(d==buffer) { 20927f654740f2a26ad62a5c155af9199af9e69b889claireho decomposition.setTo(buffer, length); // copy the string (Jamos from Hangul syllable c) 21027f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 21127f654740f2a26ad62a5c155af9199af9e69b889claireho decomposition.setTo(FALSE, d, length); // read-only alias 21227f654740f2a26ad62a5c155af9199af9e69b889claireho } 21327f654740f2a26ad62a5c155af9199af9e69b889claireho return TRUE; 21427f654740f2a26ad62a5c155af9199af9e69b889claireho } 215103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual UBool 216103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius getRawDecomposition(UChar32 c, UnicodeString &decomposition) const { 217103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar buffer[30]; 218103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t length; 219103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UChar *d=impl.getRawDecomposition(c, buffer, length); 220103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(d==NULL) { 221103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return FALSE; 222103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 223103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(d==buffer) { 224103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius decomposition.setTo(buffer, length); // copy the string (algorithmic decomposition) 225103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 226103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius decomposition.setTo(FALSE, d, length); // read-only alias 227103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return TRUE; 229103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 230103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual UChar32 231103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius composePair(UChar32 a, UChar32 b) const { 232103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return impl.composePair(a, b); 233103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 234103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 235103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual uint8_t 236103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius getCombiningClass(UChar32 c) const { 237103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return impl.getCC(impl.getNorm16(c)); 238103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // quick checks 24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool 24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho isNormalized(const UnicodeString &s, UErrorCode &errorCode) const { 24350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *sArray=s.getBuffer(); 24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(sArray==NULL) { 24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *sLimit=sArray+s.length(); 25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return sLimit==spanQuickCheckYes(sArray, sLimit, errorCode); 25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UNormalizationCheckResult 25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { 25650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return Normalizer2WithImpl::isNormalized(s, errorCode) ? UNORM_YES : UNORM_NO; 25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 25850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual int32_t 25950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const { 26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 26250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *sArray=s.getBuffer(); 26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(sArray==NULL) { 26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 26750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 26850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return (int32_t)(spanQuickCheckYes(sArray, sArray+s.length(), errorCode)-sArray); 26950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual const UChar * 27150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const = 0; 27250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 27350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UNormalizationCheckResult getQuickCheck(UChar32) const { 27450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_YES; 27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 27650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 27750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const Normalizer2Impl &impl; 27850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 27950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 280103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2WithImpl::~Normalizer2WithImpl() {} 281103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 28250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass DecomposeNormalizer2 : public Normalizer2WithImpl { 28350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehopublic: 28450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DecomposeNormalizer2(const Normalizer2Impl &ni) : Normalizer2WithImpl(ni) {} 285103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~DecomposeNormalizer2(); 28650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 28750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoprivate: 28850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalize(const UChar *src, const UChar *limit, 29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const { 29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho impl.decompose(src, limit, &buffer, errorCode); 29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. 29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, 296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString &safeMiddle, 29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const { 298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho impl.decomposeAndAppend(src, limit, doNormalize, safeMiddle, buffer, errorCode); 29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual const UChar * 30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const { 30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.decompose(src, limit, NULL, errorCode); 30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. 30550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { 30650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.isDecompYes(impl.getNorm16(c)) ? UNORM_YES : UNORM_NO; 30750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 30850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundary(c, TRUE); } 30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundary(c, FALSE); } 31050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool isInert(UChar32 c) const { return impl.isDecompInert(c); } 31150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 31250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 313103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusDecomposeNormalizer2::~DecomposeNormalizer2() {} 314103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 31550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass ComposeNormalizer2 : public Normalizer2WithImpl { 31650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehopublic: 31750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ComposeNormalizer2(const Normalizer2Impl &ni, UBool fcc) : 31850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Normalizer2WithImpl(ni), onlyContiguous(fcc) {} 319103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~ComposeNormalizer2(); 32050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 32150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoprivate: 32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalize(const UChar *src, const UChar *limit, 32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const { 32550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho impl.compose(src, limit, onlyContiguous, TRUE, buffer, errorCode); 32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 32750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. 32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, 330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString &safeMiddle, 33150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const { 332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho impl.composeAndAppend(src, limit, doNormalize, onlyContiguous, safeMiddle, buffer, errorCode); 33350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 33450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool 33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho isNormalized(const UnicodeString &s, UErrorCode &errorCode) const { 33750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 33850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *sArray=s.getBuffer(); 34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(sArray==NULL) { 34250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 34350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 34450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 34550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString temp; 34650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer buffer(impl, temp); 34750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!buffer.init(5, errorCode)) { // small destCapacity for substring normalization 34850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.compose(sArray, sArray+s.length(), onlyContiguous, FALSE, buffer, errorCode); 35150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 35250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UNormalizationCheckResult 35350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { 35450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 35550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_MAYBE; 35650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 35750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *sArray=s.getBuffer(); 35850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(sArray==NULL) { 35950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 36050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_MAYBE; 36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 36250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UNormalizationCheckResult qcResult=UNORM_YES; 36350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho impl.composeQuickCheck(sArray, sArray+s.length(), onlyContiguous, &qcResult); 36450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return qcResult; 36550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 36650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual const UChar * 36750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const { 36850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.composeQuickCheck(src, limit, onlyContiguous, NULL); 36950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 37050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. 37150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { 37250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.getCompQuickCheck(impl.getNorm16(c)); 37350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 37450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryBefore(UChar32 c) const { 37550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.hasCompBoundaryBefore(c); 37650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 37750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryAfter(UChar32 c) const { 37850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.hasCompBoundaryAfter(c, onlyContiguous, FALSE); 37950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 38050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool isInert(UChar32 c) const { 38150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.hasCompBoundaryAfter(c, onlyContiguous, TRUE); 38250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 38350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 38450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UBool onlyContiguous; 38550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 38650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 387103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusComposeNormalizer2::~ComposeNormalizer2() {} 388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 38950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass FCDNormalizer2 : public Normalizer2WithImpl { 39050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehopublic: 39150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FCDNormalizer2(const Normalizer2Impl &ni) : Normalizer2WithImpl(ni) {} 392103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius virtual ~FCDNormalizer2(); 39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 39450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoprivate: 39550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 39650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalize(const UChar *src, const UChar *limit, 39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const { 39850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho impl.makeFCD(src, limit, &buffer, errorCode); 39950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. 40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void 40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, 403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString &safeMiddle, 40450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ReorderingBuffer &buffer, UErrorCode &errorCode) const { 405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho impl.makeFCDAndAppend(src, limit, doNormalize, safeMiddle, buffer, errorCode); 40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 40750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual const UChar * 40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const { 40950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return impl.makeFCD(src, limit, NULL, errorCode); 41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 41150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. 41250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasFCDBoundaryBefore(c); } 41350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasFCDBoundaryAfter(c); } 41450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual UBool isInert(UChar32 c) const { return impl.isFCDInert(c); } 41550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 41650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 417103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusFCDNormalizer2::~FCDNormalizer2() {} 418103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 41950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// instance cache ---------------------------------------------------------- *** 42050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 42150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct Norm2AllModes : public UMemory { 42250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static Norm2AllModes *createInstance(const char *packageName, 42350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *name, 42450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode); 42550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Norm2AllModes() : comp(impl, FALSE), decomp(impl), fcd(impl), fcc(impl, TRUE) {} 42650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 42750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Normalizer2Impl impl; 42850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ComposeNormalizer2 comp; 42950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DecomposeNormalizer2 decomp; 43050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FCDNormalizer2 fcd; 43150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ComposeNormalizer2 fcc; 43250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 43350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 43450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNorm2AllModes * 43550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNorm2AllModes::createInstance(const char *packageName, 43650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *name, 43750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) { 43850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 43950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 44050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 44150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalPointer<Norm2AllModes> allModes(new Norm2AllModes); 44250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(allModes.isNull()) { 44350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_MEMORY_ALLOCATION_ERROR; 44450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 44550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 44650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho allModes->impl.load(packageName, name, errorCode); 44750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return U_SUCCESS(errorCode) ? allModes.orphan() : NULL; 44850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 44950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 45050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CDECL_BEGIN 45150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool U_CALLCONV uprv_normalizer2_cleanup(); 45250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CDECL_END 45350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 45450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 45559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic Norm2AllModes *nfcSingleton; 45659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic Norm2AllModes *nfkcSingleton; 45759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic Norm2AllModes *nfkc_cfSingleton; 45859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic Normalizer2 *noopSingleton; 45959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UHashtable *cache=NULL; 46059d709d503bab6e2b61931737e662dd293b40578ccornelius 46159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce nfcInitOnce = U_INITONCE_INITIALIZER; 46259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce nfkcInitOnce = U_INITONCE_INITIALIZER; 46359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce nfkc_cfInitOnce = U_INITONCE_INITIALIZER; 46459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce noopInitOnce = U_INITONCE_INITIALIZER; 46559d709d503bab6e2b61931737e662dd293b40578ccornelius 46659d709d503bab6e2b61931737e662dd293b40578ccornelius// UInitOnce singleton initialization function 46759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void U_CALLCONV initSingletons(const char *what, UErrorCode &errorCode) { 46859d709d503bab6e2b61931737e662dd293b40578ccornelius if (uprv_strcmp(what, "nfc") == 0) { 46959d709d503bab6e2b61931737e662dd293b40578ccornelius nfcSingleton = Norm2AllModes::createInstance(NULL, "nfc", errorCode); 47059d709d503bab6e2b61931737e662dd293b40578ccornelius } else if (uprv_strcmp(what, "nfkc") == 0) { 47159d709d503bab6e2b61931737e662dd293b40578ccornelius nfkcSingleton = Norm2AllModes::createInstance(NULL, "nfkc", errorCode); 47259d709d503bab6e2b61931737e662dd293b40578ccornelius } else if (uprv_strcmp(what, "nfkc_cf") == 0) { 47359d709d503bab6e2b61931737e662dd293b40578ccornelius nfkc_cfSingleton = Norm2AllModes::createInstance(NULL, "nfkc_cf", errorCode); 47459d709d503bab6e2b61931737e662dd293b40578ccornelius } else if (uprv_strcmp(what, "noop") == 0) { 47559d709d503bab6e2b61931737e662dd293b40578ccornelius noopSingleton = new NoopNormalizer2; 47659d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 47759d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(FALSE); // Unknown singleton 47859d709d503bab6e2b61931737e662dd293b40578ccornelius } 47959d709d503bab6e2b61931737e662dd293b40578ccornelius ucln_common_registerCleanup(UCLN_COMMON_NORMALIZER2, uprv_normalizer2_cleanup); 48059d709d503bab6e2b61931737e662dd293b40578ccornelius} 48150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 48250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CDECL_BEGIN 48350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 48450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void U_CALLCONV deleteNorm2AllModes(void *allModes) { 48550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete (Norm2AllModes *)allModes; 48650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 48750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 48850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool U_CALLCONV uprv_normalizer2_cleanup() { 48959d709d503bab6e2b61931737e662dd293b40578ccornelius delete nfcSingleton; 49059d709d503bab6e2b61931737e662dd293b40578ccornelius nfcSingleton = NULL; 49159d709d503bab6e2b61931737e662dd293b40578ccornelius delete nfkcSingleton; 49259d709d503bab6e2b61931737e662dd293b40578ccornelius nfkcSingleton = NULL; 49359d709d503bab6e2b61931737e662dd293b40578ccornelius delete nfkc_cfSingleton; 49459d709d503bab6e2b61931737e662dd293b40578ccornelius nfkc_cfSingleton = NULL; 49559d709d503bab6e2b61931737e662dd293b40578ccornelius delete noopSingleton; 49659d709d503bab6e2b61931737e662dd293b40578ccornelius noopSingleton = NULL; 49750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uhash_close(cache); 49850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho cache=NULL; 49959d709d503bab6e2b61931737e662dd293b40578ccornelius nfcInitOnce.reset(); 50059d709d503bab6e2b61931737e662dd293b40578ccornelius nfkcInitOnce.reset(); 50159d709d503bab6e2b61931737e662dd293b40578ccornelius nfkc_cfInitOnce.reset(); 50259d709d503bab6e2b61931737e662dd293b40578ccornelius noopInitOnce.reset(); 50350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return TRUE; 50450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 50550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 50650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CDECL_END 50750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 50850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getNFCInstance(UErrorCode &errorCode) { 50959d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfcInitOnce, &initSingletons, "nfc", errorCode); 51059d709d503bab6e2b61931737e662dd293b40578ccornelius return nfcSingleton!=NULL ? &nfcSingleton->comp : NULL; 51150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 51250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 51350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getNFDInstance(UErrorCode &errorCode) { 51459d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfcInitOnce, &initSingletons, "nfc", errorCode); 51559d709d503bab6e2b61931737e662dd293b40578ccornelius return nfcSingleton!=NULL ? &nfcSingleton->decomp : NULL; 51650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 51750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 51850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getFCDInstance(UErrorCode &errorCode) { 51959d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfcInitOnce, &initSingletons, "nfc", errorCode); 52059d709d503bab6e2b61931737e662dd293b40578ccornelius return nfcSingleton!=NULL ? &nfcSingleton->fcd : NULL; 52150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 52250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 52350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getFCCInstance(UErrorCode &errorCode) { 52459d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfcInitOnce, &initSingletons, "nfc", errorCode); 52559d709d503bab6e2b61931737e662dd293b40578ccornelius return nfcSingleton!=NULL ? &nfcSingleton->fcc : NULL; 52650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 52750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 52850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getNFKCInstance(UErrorCode &errorCode) { 52959d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfkcInitOnce, &initSingletons, "nfkc", errorCode); 53059d709d503bab6e2b61931737e662dd293b40578ccornelius return nfkcSingleton!=NULL ? &nfkcSingleton->comp : NULL; 53150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 53250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 53350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getNFKDInstance(UErrorCode &errorCode) { 53459d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfkcInitOnce, &initSingletons, "nfkc", errorCode); 53559d709d503bab6e2b61931737e662dd293b40578ccornelius return nfkcSingleton!=NULL ? &nfkcSingleton->decomp : NULL; 53650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 53750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 53850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getNFKC_CFInstance(UErrorCode &errorCode) { 53959d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfkc_cfInitOnce, &initSingletons, "nfkc_cf", errorCode); 54059d709d503bab6e2b61931737e662dd293b40578ccornelius return nfkc_cfSingleton!=NULL ? &nfkc_cfSingleton->comp : NULL; 54150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 54250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 54350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 *Normalizer2Factory::getNoopInstance(UErrorCode &errorCode) { 54459d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(noopInitOnce, &initSingletons, "noop", errorCode); 54559d709d503bab6e2b61931737e662dd293b40578ccornelius return noopSingleton; 54650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 54750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 54850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 * 54950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNormalizer2Factory::getInstance(UNormalizationMode mode, UErrorCode &errorCode) { 55050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 55150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 55250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 55350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho switch(mode) { 55450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM_NFD: 55550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getNFDInstance(errorCode); 55650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM_NFKD: 55750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getNFKDInstance(errorCode); 55850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM_NFC: 55950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getNFCInstance(errorCode); 56050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM_NFKC: 56150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getNFKCInstance(errorCode); 56250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM_FCD: 56350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getFCDInstance(errorCode); 56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho default: // UNORM_NONE 56550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getNoopInstance(errorCode); 56650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 56750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 56850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 56950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2Impl * 57050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNormalizer2Factory::getNFCImpl(UErrorCode &errorCode) { 57159d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfcInitOnce, &initSingletons, "nfc", errorCode); 57259d709d503bab6e2b61931737e662dd293b40578ccornelius return nfcSingleton!=NULL ? &nfcSingleton->impl : NULL; 57350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 57450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 57550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2Impl * 57650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNormalizer2Factory::getNFKCImpl(UErrorCode &errorCode) { 57759d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfkcInitOnce, &initSingletons, "nfkc", errorCode); 57859d709d503bab6e2b61931737e662dd293b40578ccornelius return nfkcSingleton!=NULL ? &nfkcSingleton->impl : NULL; 57950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 58050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 58150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2Impl * 58250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNormalizer2Factory::getNFKC_CFImpl(UErrorCode &errorCode) { 58359d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfkc_cfInitOnce, &initSingletons, "nfkc_cf", errorCode); 58459d709d503bab6e2b61931737e662dd293b40578ccornelius return nfkc_cfSingleton!=NULL ? &nfkc_cfSingleton->impl : NULL; 58550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 58650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 58750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2Impl * 58850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNormalizer2Factory::getImpl(const Normalizer2 *norm2) { 58950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return &((Normalizer2WithImpl *)norm2)->impl; 59050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 59150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusconst Normalizer2 * 593103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::getNFCInstance(UErrorCode &errorCode) { 594103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return Normalizer2Factory::getNFCInstance(errorCode); 595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusconst Normalizer2 * 598103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::getNFDInstance(UErrorCode &errorCode) { 599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return Normalizer2Factory::getNFDInstance(errorCode); 600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 601103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusconst Normalizer2 * 603103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::getNFKCInstance(UErrorCode &errorCode) { 604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return Normalizer2Factory::getNFKCInstance(errorCode); 605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusconst Normalizer2 * 608103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::getNFKDInstance(UErrorCode &errorCode) { 609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return Normalizer2Factory::getNFKDInstance(errorCode); 610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusconst Normalizer2 * 613103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusNormalizer2::getNFKCCasefoldInstance(UErrorCode &errorCode) { 614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return Normalizer2Factory::getNFKC_CFInstance(errorCode); 61550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 61650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 61750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst Normalizer2 * 61850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoNormalizer2::getInstance(const char *packageName, 61950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *name, 62050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UNormalization2Mode mode, 62150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &errorCode) { 62250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 62350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 62450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 62550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(name==NULL || *name==0) { 62650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ILLEGAL_ARGUMENT_ERROR; 627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return NULL; 62850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 62950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Norm2AllModes *allModes=NULL; 63050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(packageName==NULL) { 63150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(0==uprv_strcmp(name, "nfc")) { 63259d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfcInitOnce, &initSingletons, "nfc", errorCode); 63359d709d503bab6e2b61931737e662dd293b40578ccornelius allModes=nfcSingleton; 63450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(0==uprv_strcmp(name, "nfkc")) { 63559d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfkcInitOnce, &initSingletons, "nfkc", errorCode); 63659d709d503bab6e2b61931737e662dd293b40578ccornelius allModes=nfkcSingleton; 63750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(0==uprv_strcmp(name, "nfkc_cf")) { 63859d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(nfkc_cfInitOnce, &initSingletons, "nfkc_cf", errorCode); 63959d709d503bab6e2b61931737e662dd293b40578ccornelius allModes=nfkc_cfSingleton; 64050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 64150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 64250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(allModes==NULL && U_SUCCESS(errorCode)) { 64350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 64450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Mutex lock; 64550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(cache!=NULL) { 64650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho allModes=(Norm2AllModes *)uhash_get(cache, name); 64750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 64850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 64950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(allModes==NULL) { 65050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalPointer<Norm2AllModes> localAllModes( 65150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Norm2AllModes::createInstance(packageName, name, errorCode)); 65250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(errorCode)) { 65350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Mutex lock; 65450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(cache==NULL) { 65550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho cache=uhash_open(uhash_hashChars, uhash_compareChars, NULL, &errorCode); 65650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(errorCode)) { 65750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 65850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 65950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uhash_setKeyDeleter(cache, uprv_free); 66050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uhash_setValueDeleter(cache, deleteNorm2AllModes); 66150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 66250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void *temp=uhash_get(cache, name); 66350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(temp==NULL) { 66450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t keyLength=uprv_strlen(name)+1; 66550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char *nameCopy=(char *)uprv_malloc(keyLength); 66650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(nameCopy==NULL) { 66750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_MEMORY_ALLOCATION_ERROR; 66850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 66950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_memcpy(nameCopy, name, keyLength); 67150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uhash_put(cache, nameCopy, allModes=localAllModes.orphan(), &errorCode); 67250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 67350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // race condition 67450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho allModes=(Norm2AllModes *)temp; 67550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 67950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(allModes!=NULL && U_SUCCESS(errorCode)) { 68050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho switch(mode) { 68150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM2_COMPOSE: 68250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return &allModes->comp; 68350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM2_DECOMPOSE: 68450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return &allModes->decomp; 68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM2_FCD: 68650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return &allModes->fcd; 68750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case UNORM2_COMPOSE_CONTIGUOUS: 68850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return &allModes->fcc; 68950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho default: 69050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; // do nothing 69150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 69250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 69350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 69450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 69550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 69650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_END 69750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 69850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// C API ------------------------------------------------------------------- *** 69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 70050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_USE 70150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 70254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI const UNormalizer2 * U_EXPORT2 703103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_getNFCInstance(UErrorCode *pErrorCode) { 704103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return (const UNormalizer2 *)Normalizer2::getNFCInstance(*pErrorCode); 705103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 706103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 70754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI const UNormalizer2 * U_EXPORT2 708103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_getNFDInstance(UErrorCode *pErrorCode) { 709103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return (const UNormalizer2 *)Normalizer2::getNFDInstance(*pErrorCode); 710103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 711103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 71254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI const UNormalizer2 * U_EXPORT2 713103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_getNFKCInstance(UErrorCode *pErrorCode) { 714103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return (const UNormalizer2 *)Normalizer2::getNFKCInstance(*pErrorCode); 715103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 716103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 71754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI const UNormalizer2 * U_EXPORT2 718103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_getNFKDInstance(UErrorCode *pErrorCode) { 719103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return (const UNormalizer2 *)Normalizer2::getNFKDInstance(*pErrorCode); 720103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 721103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 72254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI const UNormalizer2 * U_EXPORT2 723103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_getNFKCCasefoldInstance(UErrorCode *pErrorCode) { 724103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return (const UNormalizer2 *)Normalizer2::getNFKCCasefoldInstance(*pErrorCode); 725103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 726103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 72754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI const UNormalizer2 * U_EXPORT2 72850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_getInstance(const char *packageName, 72950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *name, 73050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UNormalization2Mode mode, 73150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 73250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return (const UNormalizer2 *)Normalizer2::getInstance(packageName, name, mode, *pErrorCode); 73350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 73450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 73554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI void U_EXPORT2 73650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_close(UNormalizer2 *norm2) { 73750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete (Normalizer2 *)norm2; 73850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 73950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 74054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2 74150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_normalize(const UNormalizer2 *norm2, 74250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *src, int32_t length, 74350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *dest, int32_t capacity, 74450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 74550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*pErrorCode)) { 74650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 74750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 74827f654740f2a26ad62a5c155af9199af9e69b889claireho if( (src==NULL ? length!=0 : length<-1) || 74927f654740f2a26ad62a5c155af9199af9e69b889claireho (dest==NULL ? capacity!=0 : capacity<0) || 75027f654740f2a26ad62a5c155af9199af9e69b889claireho (src==dest && src!=NULL) 75127f654740f2a26ad62a5c155af9199af9e69b889claireho ) { 75250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 75350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 75450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 75550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString destString(dest, 0, capacity); 75627f654740f2a26ad62a5c155af9199af9e69b889claireho // length==0: Nothing to do, and n2wi->normalize(NULL, NULL, buffer, ...) would crash. 75727f654740f2a26ad62a5c155af9199af9e69b889claireho if(length!=0) { 75827f654740f2a26ad62a5c155af9199af9e69b889claireho const Normalizer2 *n2=(const Normalizer2 *)norm2; 75927f654740f2a26ad62a5c155af9199af9e69b889claireho const Normalizer2WithImpl *n2wi=dynamic_cast<const Normalizer2WithImpl *>(n2); 76027f654740f2a26ad62a5c155af9199af9e69b889claireho if(n2wi!=NULL) { 76127f654740f2a26ad62a5c155af9199af9e69b889claireho // Avoid duplicate argument checking and support NUL-terminated src. 76227f654740f2a26ad62a5c155af9199af9e69b889claireho ReorderingBuffer buffer(n2wi->impl, destString); 76327f654740f2a26ad62a5c155af9199af9e69b889claireho if(buffer.init(length, *pErrorCode)) { 76427f654740f2a26ad62a5c155af9199af9e69b889claireho n2wi->normalize(src, length>=0 ? src+length : NULL, buffer, *pErrorCode); 76527f654740f2a26ad62a5c155af9199af9e69b889claireho } 76627f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 76727f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString srcString(length<0, src, length); 76827f654740f2a26ad62a5c155af9199af9e69b889claireho n2->normalize(srcString, destString, *pErrorCode); 76950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 77050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 77150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return destString.extract(dest, capacity, *pErrorCode); 77250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 77350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 77450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t 77550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehonormalizeSecondAndAppend(const UNormalizer2 *norm2, 77650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *first, int32_t firstLength, int32_t firstCapacity, 77750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *second, int32_t secondLength, 77850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool doNormalize, 77950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 78050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*pErrorCode)) { 78150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 78250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 78327f654740f2a26ad62a5c155af9199af9e69b889claireho if( (second==NULL ? secondLength!=0 : secondLength<-1) || 78427f654740f2a26ad62a5c155af9199af9e69b889claireho (first==NULL ? (firstCapacity!=0 || firstLength!=0) : 78527f654740f2a26ad62a5c155af9199af9e69b889claireho (firstCapacity<0 || firstLength<-1)) || 78627f654740f2a26ad62a5c155af9199af9e69b889claireho (first==second && first!=NULL) 78750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 78850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 78950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 79050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 79150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString firstString(first, firstLength, firstCapacity); 792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho firstLength=firstString.length(); // In case it was -1. 79327f654740f2a26ad62a5c155af9199af9e69b889claireho // secondLength==0: Nothing to do, and n2wi->normalizeAndAppend(NULL, NULL, buffer, ...) would crash. 79427f654740f2a26ad62a5c155af9199af9e69b889claireho if(secondLength!=0) { 79527f654740f2a26ad62a5c155af9199af9e69b889claireho const Normalizer2 *n2=(const Normalizer2 *)norm2; 79627f654740f2a26ad62a5c155af9199af9e69b889claireho const Normalizer2WithImpl *n2wi=dynamic_cast<const Normalizer2WithImpl *>(n2); 79727f654740f2a26ad62a5c155af9199af9e69b889claireho if(n2wi!=NULL) { 79827f654740f2a26ad62a5c155af9199af9e69b889claireho // Avoid duplicate argument checking and support NUL-terminated src. 799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString safeMiddle; 800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ReorderingBuffer buffer(n2wi->impl, firstString); 802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(buffer.init(firstLength+secondLength+1, *pErrorCode)) { // destCapacity>=-1 803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho n2wi->normalizeAndAppend(second, secondLength>=0 ? second+secondLength : NULL, 804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho doNormalize, safeMiddle, buffer, *pErrorCode); 805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } // The ReorderingBuffer destructor finalizes firstString. 807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(*pErrorCode) || firstString.length()>firstCapacity) { 808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Restore the modified suffix of the first string. 809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // This does not restore first[] array contents between firstLength and firstCapacity. 810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // (That might be uninitialized memory, as far as we know.) 811103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(first!=NULL) { /* don't dereference NULL */ 812103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius safeMiddle.extract(0, 0x7fffffff, first+firstLength-safeMiddle.length()); 813103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(firstLength<firstCapacity) { 814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho first[firstLength]=0; // NUL-terminate in case it was originally. 815103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 81727f654740f2a26ad62a5c155af9199af9e69b889claireho } 81850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 81927f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString secondString(secondLength<0, second, secondLength); 82027f654740f2a26ad62a5c155af9199af9e69b889claireho if(doNormalize) { 82127f654740f2a26ad62a5c155af9199af9e69b889claireho n2->normalizeSecondAndAppend(firstString, secondString, *pErrorCode); 82227f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 82327f654740f2a26ad62a5c155af9199af9e69b889claireho n2->append(firstString, secondString, *pErrorCode); 82427f654740f2a26ad62a5c155af9199af9e69b889claireho } 82550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 82650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 82750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return firstString.extract(first, firstCapacity, *pErrorCode); 82850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 82950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 83054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2 83150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_normalizeSecondAndAppend(const UNormalizer2 *norm2, 83250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *first, int32_t firstLength, int32_t firstCapacity, 83350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *second, int32_t secondLength, 83450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return normalizeSecondAndAppend(norm2, 83650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho first, firstLength, firstCapacity, 83750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho second, secondLength, 83850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TRUE, pErrorCode); 83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 84050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 84154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2 84250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_append(const UNormalizer2 *norm2, 84350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *first, int32_t firstLength, int32_t firstCapacity, 84450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *second, int32_t secondLength, 84550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 84650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return normalizeSecondAndAppend(norm2, 84750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho first, firstLength, firstCapacity, 84850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho second, secondLength, 84950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FALSE, pErrorCode); 85050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 85150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 85254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2 85327f654740f2a26ad62a5c155af9199af9e69b889clairehounorm2_getDecomposition(const UNormalizer2 *norm2, 85427f654740f2a26ad62a5c155af9199af9e69b889claireho UChar32 c, UChar *decomposition, int32_t capacity, 85527f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *pErrorCode) { 85627f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(*pErrorCode)) { 85727f654740f2a26ad62a5c155af9199af9e69b889claireho return 0; 85827f654740f2a26ad62a5c155af9199af9e69b889claireho } 85927f654740f2a26ad62a5c155af9199af9e69b889claireho if(decomposition==NULL ? capacity!=0 : capacity<0) { 86027f654740f2a26ad62a5c155af9199af9e69b889claireho *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 86127f654740f2a26ad62a5c155af9199af9e69b889claireho return 0; 86227f654740f2a26ad62a5c155af9199af9e69b889claireho } 86327f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString destString(decomposition, 0, capacity); 86427f654740f2a26ad62a5c155af9199af9e69b889claireho if(reinterpret_cast<const Normalizer2 *>(norm2)->getDecomposition(c, destString)) { 86527f654740f2a26ad62a5c155af9199af9e69b889claireho return destString.extract(decomposition, capacity, *pErrorCode); 86627f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 86727f654740f2a26ad62a5c155af9199af9e69b889claireho return -1; 86827f654740f2a26ad62a5c155af9199af9e69b889claireho } 86927f654740f2a26ad62a5c155af9199af9e69b889claireho} 87027f654740f2a26ad62a5c155af9199af9e69b889claireho 87154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2 872103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_getRawDecomposition(const UNormalizer2 *norm2, 873103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 c, UChar *decomposition, int32_t capacity, 874103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode *pErrorCode) { 875103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*pErrorCode)) { 876103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 0; 877103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 878103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(decomposition==NULL ? capacity!=0 : capacity<0) { 879103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 0; 881103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 882103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString destString(decomposition, 0, capacity); 883103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(reinterpret_cast<const Normalizer2 *>(norm2)->getRawDecomposition(c, destString)) { 884103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return destString.extract(decomposition, capacity, *pErrorCode); 885103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 886103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return -1; 887103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 888103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 889103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 89054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UChar32 U_EXPORT2 891103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_composePair(const UNormalizer2 *norm2, UChar32 a, UChar32 b) { 892103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return reinterpret_cast<const Normalizer2 *>(norm2)->composePair(a, b); 893103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 894103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 89554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI uint8_t U_EXPORT2 896103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm2_getCombiningClass(const UNormalizer2 *norm2, UChar32 c) { 897103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return reinterpret_cast<const Normalizer2 *>(norm2)->getCombiningClass(c); 898103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 899103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 90054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UBool U_EXPORT2 90150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_isNormalized(const UNormalizer2 *norm2, 90250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *s, int32_t length, 90350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 90450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*pErrorCode)) { 90550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 90650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 90727f654740f2a26ad62a5c155af9199af9e69b889claireho if((s==NULL && length!=0) || length<-1) { 90850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 90950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 91050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 91150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString sString(length<0, s, length); 91250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((const Normalizer2 *)norm2)->isNormalized(sString, *pErrorCode); 91350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 91450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 91554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UNormalizationCheckResult U_EXPORT2 91650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_quickCheck(const UNormalizer2 *norm2, 91750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *s, int32_t length, 91850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 91950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*pErrorCode)) { 92050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_NO; 92150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 92227f654740f2a26ad62a5c155af9199af9e69b889claireho if((s==NULL && length!=0) || length<-1) { 92350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 92450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_NO; 92550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 92650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString sString(length<0, s, length); 92750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((const Normalizer2 *)norm2)->quickCheck(sString, *pErrorCode); 92850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 92950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 93054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2 93150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_spanQuickCheckYes(const UNormalizer2 *norm2, 93250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *s, int32_t length, 93350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *pErrorCode) { 93450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*pErrorCode)) { 93550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 93650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 93727f654740f2a26ad62a5c155af9199af9e69b889claireho if((s==NULL && length!=0) || length<-1) { 93850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 93950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 94050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 94150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString sString(length<0, s, length); 94250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((const Normalizer2 *)norm2)->spanQuickCheckYes(sString, *pErrorCode); 94350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 94450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 94554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UBool U_EXPORT2 94650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_hasBoundaryBefore(const UNormalizer2 *norm2, UChar32 c) { 94750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((const Normalizer2 *)norm2)->hasBoundaryBefore(c); 94850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 94950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 95054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UBool U_EXPORT2 95150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_hasBoundaryAfter(const UNormalizer2 *norm2, UChar32 c) { 95250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((const Normalizer2 *)norm2)->hasBoundaryAfter(c); 95350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 95450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 95554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UBool U_EXPORT2 95650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm2_isInert(const UNormalizer2 *norm2, UChar32 c) { 95750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((const Normalizer2 *)norm2)->isInert(c); 95850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 95950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 96050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Some properties APIs ---------------------------------------------------- *** 96150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 962103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_CAPI uint8_t U_EXPORT2 963103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusu_getCombiningClass(UChar32 c) { 964103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode errorCode=U_ZERO_ERROR; 965103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const Normalizer2 *nfd=Normalizer2Factory::getNFDInstance(errorCode); 966103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_SUCCESS(errorCode)) { 967103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return nfd->getCombiningClass(c); 968103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 969103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 0; 970103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 971103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 972103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 973103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_CFUNC UNormalizationCheckResult 97450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehounorm_getQuickCheck(UChar32 c, UNormalizationMode mode) { 97550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(mode<=UNORM_NONE || UNORM_FCD<=mode) { 97650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_YES; 97750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 97850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode errorCode=U_ZERO_ERROR; 97950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const Normalizer2 *norm2=Normalizer2Factory::getInstance(mode, errorCode); 98050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(errorCode)) { 98150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((const Normalizer2WithImpl *)norm2)->getQuickCheck(c); 98250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 98350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UNORM_MAYBE; 98450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 98550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 98650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 987103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_CFUNC uint16_t 988103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusunorm_getFCD16(UChar32 c) { 989103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode errorCode=U_ZERO_ERROR; 990103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const Normalizer2Impl *impl=Normalizer2Factory::getNFCImpl(errorCode); 991103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_SUCCESS(errorCode)) { 992103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return impl->getFCD16(c); 99350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return 0; 99550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 99650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 99750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 99850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif // !UCONFIG_NO_NORMALIZATION 999