coll.cpp revision 27f654740f2a26ad62a5c155af9199af9e69b889
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ****************************************************************************** 327f654740f2a26ad62a5c155af9199af9e69b889claireho * Copyright (C) 1996-2010, International Business Machines Corporation and 427f654740f2a26ad62a5c155af9199af9e69b889claireho * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ****************************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * File coll.cpp 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Created by: Helena Shih 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Modification History: 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Date Name Description 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/5/97 aliu Modified createDefault to load collation data from 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * binary files when possible. Added related methods 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * createCollationFromFile, chopLocale, createPathName. 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/11/97 aliu Added methods addToCache, findInCache, which implement 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a Collation cache. Modified createDefault to look in 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * cache first, and also to store newly created Collation 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * objects in the cache. Modified to not use gLocPath. 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/12/97 aliu Modified to create objects from RuleBasedCollator cache. 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Moved cache out of Collation class. 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/13/97 aliu Moved several methods out of this class and into 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * RuleBasedCollator, with modifications. Modified 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * createDefault() to call new RuleBasedCollator(Locale&) 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * constructor. General clean up and documentation. 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2/20/97 helena Added clone, operator==, operator!=, operator=, and copy 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * constructor. 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 05/06/97 helena Added memory allocation error detection. 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 05/08/97 helena Added createInstance(). 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 6/20/97 helena Java class name change. 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 04/23/99 stephen Removed EDecompositionMode, merged with 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Normalizer::EMode 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 11/23/9 srl Inlining of some critical functions 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 01/29/01 synwee Modified into a C++ wrapper calling C APIs (ucol.h) 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coll.h" 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tblcoll.h" 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucol_imp.h" 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h" 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "servloc.h" 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustrenum.h" 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "uresimp.h" 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucln_in.h" 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic U_NAMESPACE_QUALIFIER Locale* availableLocaleList = NULL; 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t availableLocaleListCount; 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic U_NAMESPACE_QUALIFIER ICULocaleService* gService = NULL; 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Release all static memory held by collator. 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_CALLCONV collator_cleanup(void) { 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gService) { 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete gService; 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gService = NULL; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (availableLocaleList) { 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete []availableLocaleList; 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru availableLocaleList = NULL; 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru availableLocaleListCount = 0; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------------ 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Registration 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------- 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollatorFactory::~CollatorFactory() {} 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------- 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollatorFactory::visible(void) const { 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------- 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollatorFactory::getDisplayName(const Locale& objectLocale, 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Locale& displayLocale, 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& result) 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return objectLocale.getDisplayName(displayLocale, result); 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ICUCollatorFactory : public ICUResourceBundleFactory { 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public: 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ICUCollatorFactory(): ICUResourceBundleFactory(UnicodeString(U_ICUDATA_COLL, -1, US_INV)) { } 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru protected: 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUObject* 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruICUCollatorFactory::create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const { 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (handlesKey(key, status)) { 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const LocaleKey& lkey = (const LocaleKey&)key; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc; 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // make sure the requested locale is correct 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // default LocaleFactory uses currentLocale since that's the one vetted by handlesKey 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // but for ICU rb resources we use the actual one since it will fallback again 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lkey.canonicalLocale(loc); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Collator::makeInstance(loc, status); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ICUCollatorService : public ICULocaleService { 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ICUCollatorService() 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : ICULocaleService(UNICODE_STRING_SIMPLE("Collator")) 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru registerFactory(new ICUCollatorFactory(), status); 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* cloneInstance(UObject* instance) const { 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Collator*)instance)->clone(); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualID, UErrorCode& status) const { 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocaleKey& lkey = (LocaleKey&)key; 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualID) { 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ugly Hack Alert! We return an empty actualID to signal 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to callers that this is a default object, not a "real" 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // service-created object. (TODO remove in 3.0) [aliu] 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actualID->truncate(0); 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc(""); 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lkey.canonicalLocale(loc); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Collator::makeInstance(loc, status); 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const { 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString ar; 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualReturn == NULL) { 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actualReturn = &ar; 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator* result = (Collator*)ICULocaleService::getKey(key, actualReturn, status); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ugly Hack Alert! If the actualReturn length is zero, this 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // means we got a default object, not a "real" service-created 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // object. We don't call setLocales() on a default object, 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // because that will overwrite its correct built-in locale 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // metadata (valid & actual) with our incorrect data (all we 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // have is the requested locale). (TODO remove in 3.0) [aliu] 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result && actualReturn->length() > 0) { 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const LocaleKey& lkey = (const LocaleKey&)key; 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale canonicalLocale(""); 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale currentLocale(""); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru LocaleUtility::initLocaleFromName(*actualReturn, currentLocale); 181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result->setLocales(lkey.canonicalLocale(canonicalLocale), currentLocale, currentLocale); 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool isDefault() const { 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return countFactories() == 1; 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic ICULocaleService* 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetService(void) 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool needInit; 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX_CHECK(NULL, (UBool)(gService == NULL), needInit); 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(needInit) { 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ICULocaleService *newservice = new ICUCollatorService(); 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(newservice) { 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(gService == NULL) { 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gService = newservice; 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newservice = NULL; 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(newservice) { 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete newservice; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gService; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UBool 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruhasService(void) 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool retVal; 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX_CHECK(NULL, gService != NULL, retVal); 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return retVal; 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCollator* 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::createUCollator(const char *loc, 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *result = 0; 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status && U_SUCCESS(*status) && hasService()) { 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale desiredLocale(loc); 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *col = (Collator*)gService->get(desiredLocale, *status); 23827f654740f2a26ad62a5c155af9199af9e69b889claireho RuleBasedCollator *rbc; 23927f654740f2a26ad62a5c155af9199af9e69b889claireho if (col && (rbc = dynamic_cast<RuleBasedCollator *>(col))) { 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!rbc->dataIsOwned) { 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_safeClone(rbc->ucollator, NULL, NULL, status); 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = rbc->ucollator; 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rbc->ucollator = NULL; // to prevent free on delete 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete col; 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* UCONFIG_NO_SERVICE */ 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool isAvailableLocaleListInitialized(UErrorCode &status) { 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // for now, there is a hardcoded list, so just walk through that list and set it up. 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool needInit; 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX_CHECK(NULL, availableLocaleList == NULL, needInit); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (needInit) { 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *index = NULL; 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle installed; 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale * temp; 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t localeCount; 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_initStackObject(&installed); 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index = ures_openDirect(U_ICUDATA_COLL, "res_index", &status); 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_getByKey(index, "InstalledLocales", &installed, &status); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localeCount = ures_getSize(&installed); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp = new Locale[localeCount]; 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (temp != NULL) { 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_resetIterator(&installed); 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(ures_hasNext(&installed)) { 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *tempKey = NULL; 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_getNextString(&installed, NULL, &tempKey, &status); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp[i++] = Locale(tempKey); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (availableLocaleList == NULL) 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru availableLocaleListCount = localeCount; 285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru availableLocaleList = temp; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp = NULL; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru needInit = FALSE; 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (temp) { 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete []temp; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(&installed); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(index); 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return !needInit; 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Collator public methods ----------------------------------------------- 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator* U_EXPORT2 Collator::createInstance(UErrorCode& success) 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return createInstance(Locale::getDefault(), success); 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale, 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale actualLoc; 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *result = 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (Collator*)gService->get(desiredLocale, &actualLoc, status); 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ugly Hack Alert! If the returned locale is empty (not root, 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // but empty -- getName() == "") then that means the service 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // returned a default object, not a "real" service object. In 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that case, the locale metadata (valid & actual) is setup 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // correctly already, and we don't want to overwrite it. (TODO 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // remove in 3.0) [aliu] 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*actualLoc.getName() != 0) { 329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result->setLocales(desiredLocale, actualLoc, actualLoc); 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return makeInstance(desiredLocale, status); 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator* Collator::makeInstance(const Locale& desiredLocale, 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A bit of explanation is required here. Although in the current 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // implementation 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Collator::createInstance() is just turning around and calling 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // RuleBasedCollator(Locale&), this will not necessarily always be the 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // case. For example, suppose we modify this code to handle a 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // non-table-based Collator, such as that for Thai. In this case, 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // createInstance() will have to be modified to somehow determine this fact 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (perhaps a field in the resource bundle). Then it can construct the 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // non-table-based Collator in some other way, when it sees that it needs 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to. 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS 352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // return a valid collation object, if the system is functioning properly. 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The reason is that it will fall back, use the default locale, and even 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // use the built-in default collation rules. THEREFORE, createInstance() 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ADVANCE that the given locale's collation is properly implemented as a 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // RuleBasedCollator. 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Currently, we don't do this...we always return a RuleBasedCollator, 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // whether it is strictly correct to do so or not, without checking, because 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we currently have no way of checking. 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator* collation = new RuleBasedCollator(desiredLocale, 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status); 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (collation == 0) { 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete collation; 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru collation = 0; 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return collation; 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_USE_COLLATION_OBSOLETE_2_6 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// !!! dlf the following is obsolete, ignore registration for this 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator * 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::createInstance(const Locale &loc, 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UVersionInfo version, 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode &status) 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *collator; 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UVersionInfo info; 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru collator=new RuleBasedCollator(loc, status); 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (collator == 0) { 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru collator->getVersion(info); 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(0!=uprv_memcmp(version, info, sizeof(UVersionInfo))) { 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete collator; 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_MISSING_RESOURCE_ERROR; 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return collator; 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// implement deprecated, previously abstract method 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::EComparisonResult Collator::compare(const UnicodeString& source, 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (Collator::EComparisonResult)compare(source, target, ec); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// implement deprecated, previously abstract method 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::EComparisonResult Collator::compare(const UnicodeString& source, 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target, 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length) const 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (Collator::EComparisonResult)compare(source, target, length, ec); 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// implement deprecated, previously abstract method 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::EComparisonResult Collator::compare(const UChar* source, int32_t sourceLength, 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* target, int32_t targetLength) 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (Collator::EComparisonResult)compare(source, sourceLength, target, targetLength, ec); 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUCollationResult Collator::compare(UCharIterator &/*sIter*/, 434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCharIterator &/*tIter*/, 435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode &status) const { 436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_SUCCESS(status)) { 437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Not implemented in the base class. 438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_UNSUPPORTED_ERROR; 439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return UCOL_EQUAL; 441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUCollationResult Collator::compareUTF8(const StringPiece &source, 444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const StringPiece &target, 445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode &status) const { 446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_FAILURE(status)) { 447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return UCOL_EQUAL; 448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCharIterator sIter, tIter; 450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uiter_setUTF8(&sIter, source.data(), source.length()); 451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uiter_setUTF8(&tIter, target.data(), target.length()); 452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return compare(sIter, tIter, status); 453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::equals(const UnicodeString& source, 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (compare(source, target, ec) == UCOL_EQUAL); 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::greaterOrEqual(const UnicodeString& source, 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (compare(source, target, ec) != UCOL_LESS); 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::greater(const UnicodeString& source, 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& target) const 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (compare(source, target, ec) == UCOL_GREATER); 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// this API ignores registered collators, since it returns an 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// array of indefinite lifetime 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst Locale* U_EXPORT2 Collator::getAvailableLocales(int32_t& count) 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale *result = NULL; 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = 0; 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isAvailableLocaleListInitialized(status)) 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = availableLocaleList; 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = availableLocaleListCount; 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Locale& displayLocale, 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& name) 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString locNameStr; 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocaleUtility::initNameFromLocale(objectLocale, locNameStr); 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gService->getDisplayName(locNameStr, name, displayLocale); 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return objectLocale.getDisplayName(displayLocale, name); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& U_EXPORT2 Collator::getDisplayName(const Locale& objectLocale, 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& name) 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getDisplayName(objectLocale, Locale::getDefault(), name); 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is useless information */ 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*void Collator::getVersion(UVersionInfo versionInfo) const 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (versionInfo!=NULL) 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(versionInfo, fVersion, U_MAX_VERSION_LENGTH); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UCollator protected constructor destructor ---------------------------- 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Default constructor. 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Constructor is different from the old default Collator constructor. 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* The task for determing the default collation strength and normalization mode 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* is left to the child class. 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::Collator() 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: UObject() 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Constructor. 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Empty constructor, does not handle the arguments. 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* This constructor is done for backward compatibility with 1.7 and 1.8. 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* The task for handling the argument collation strength and normalization 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* mode is left to the child class. 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* @param collationStrength collation strength 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* @param decompositionMode 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* @deprecated 2.4 use the default constructor instead 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::Collator(UCollationStrength, UNormalizationMode ) 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: UObject() 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::~Collator() 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::Collator(const Collator &other) 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : UObject(other) 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::operator==(const Collator& other) const 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)(this == &other); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool Collator::operator!=(const Collator& other) const 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)!(*this == other); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t U_EXPORT2 Collator::getBound(const uint8_t *source, 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sourceLength, 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColBoundMode boundType, 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t noOfLevels, 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *result, 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultLength, 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode &status) 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ucol_getBound(source, sourceLength, boundType, noOfLevels, result, resultLength, &status); 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruCollator::setLocales(const Locale& /* requestedLocale */, const Locale& /* validLocale */, const Locale& /*actualLocale*/) { 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeSet *Collator::getTailoredSet(UErrorCode &status) const 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // everything can be changed 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new UnicodeSet(0, 0x10FFFF); 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruURegistryKey U_EXPORT2 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status) 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getService()->registerInstance(toAdopt, locale, status); 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass CFactory : public LocaleKeyFactory { 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollatorFactory* _delegate; 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Hashtable* _ids; 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CFactory(CollatorFactory* delegate, UErrorCode& status) 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : LocaleKeyFactory(delegate->visible() ? VISIBLE : INVISIBLE) 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru , _delegate(delegate) 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru , _ids(NULL) 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = 0; 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _ids = new Hashtable(status); 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (_ids) { 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString * idlist = _delegate->getSupportedIDs(count, status); 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < count; ++i) { 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _ids->put(idlist[i], (void*)this, status); 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete _ids; 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _ids = NULL; 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~CFactory() 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete _delegate; 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete _ids; 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const Hashtable* getSupportedIDs(UErrorCode& status) const 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _ids; 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUObject* 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCFactory::create(const ICUServiceKey& key, const ICUService* /* service */, UErrorCode& status) const 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (handlesKey(key, status)) { 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const LocaleKey& lkey = (const LocaleKey&)key; 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale validLoc; 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lkey.currentLocale(validLoc); 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _delegate->createCollator(validLoc); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((_coverage & 0x1) == 0) { 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Hashtable* ids = getSupportedIDs(status); 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ids && (ids->get(id) != NULL)) { 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc; 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocaleUtility::initLocaleFromName(id, loc); 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _delegate->getDisplayName(loc, locale, result); 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.setToBogus(); 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruURegistryKey U_EXPORT2 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::registerFactory(CollatorFactory* toAdopt, UErrorCode& status) 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CFactory* f = new CFactory(toAdopt, status); 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f) { 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getService()->registerFactory(f, status); 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool U_EXPORT2 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::unregister(URegistryKey key, UErrorCode& status) 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return gService->unregister(key, status); 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* UCONFIG_NO_SERVICE */ 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass CollationLocaleListEnumeration : public StringEnumeration { 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t index; 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UClassID U_EXPORT2 getStaticClassID(void); 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UClassID getDynamicClassID(void) const; 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationLocaleListEnumeration() 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : index(0) 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The global variables should already be initialized. 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //isAvailableLocaleListInitialized(status); 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~CollationLocaleListEnumeration() { 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual StringEnumeration * clone() const 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CollationLocaleListEnumeration *result = new CollationLocaleListEnumeration(); 731c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (result) { 732c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result->index = index; 733c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t count(UErrorCode &/*status*/) const { 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return availableLocaleListCount; 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const char* next(int32_t* resultLength, UErrorCode& /*status*/) { 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* result; 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(index < availableLocaleListCount) { 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = availableLocaleList[index++].getName(); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resultLength != NULL) { 74650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *resultLength = (int32_t)uprv_strlen(result); 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resultLength != NULL) { 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *resultLength = 0; 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = NULL; 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const UnicodeString* snext(UErrorCode& status) { 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultLength = 0; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *s = next(&resultLength, status); 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return setChars(s, resultLength, status); 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void reset(UErrorCode& /*status*/) { 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index = 0; 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(CollationLocaleListEnumeration) 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringEnumeration* U_EXPORT2 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getAvailableLocales(void) 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hasService()) { 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getService()->getAvailableLocales(); 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* UCONFIG_NO_SERVICE */ 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isAvailableLocaleListInitialized(status)) { 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new CollationLocaleListEnumeration(); 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringEnumeration* U_EXPORT2 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getKeywords(UErrorCode& status) { 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This is a wrapper over ucol_getKeywords 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UEnumeration* uenum = ucol_getKeywords(&status); 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uenum_close(uenum); 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new UStringEnumeration(uenum); 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringEnumeration* U_EXPORT2 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getKeywordValues(const char *keyword, UErrorCode& status) { 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This is a wrapper over ucol_getKeywordValues 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UEnumeration* uenum = ucol_getKeywordValues(keyword, &status); 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uenum_close(uenum); 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new UStringEnumeration(uenum); 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 810b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruStringEnumeration* U_EXPORT2 811b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruCollator::getKeywordValuesForLocale(const char* key, const Locale& locale, 812b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool commonlyUsed, UErrorCode& status) { 813b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // This is a wrapper over ucol_getKeywordValuesForLocale 814b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UEnumeration *uenum = ucol_getKeywordValuesForLocale(key, locale.getName(), 815b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru commonlyUsed, &status); 816b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 817b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uenum_close(uenum); 818b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 819b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 820b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return new UStringEnumeration(uenum); 821b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocale U_EXPORT2 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::getFunctionalEquivalent(const char* keyword, const Locale& locale, 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool& isAvailable, UErrorCode& status) { 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This is a wrapper over ucol_getFunctionalEquivalent 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char loc[ULOC_FULLNAME_CAPACITY]; 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*int32_t len =*/ ucol_getFunctionalEquivalent(loc, sizeof(loc), 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru keyword, locale.getName(), &isAvailable, &status); 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *loc = 0; // root 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Locale::createFromName(loc); 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83627f654740f2a26ad62a5c155af9199af9e69b889clairehoint32_t Collator::getReorderCodes(int32_t *dest, 83727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t destCapacity, 83827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode& status) const 83927f654740f2a26ad62a5c155af9199af9e69b889claireho{ 84027f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_SUCCESS(status)) { 84127f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_UNSUPPORTED_ERROR; 84227f654740f2a26ad62a5c155af9199af9e69b889claireho } 84327f654740f2a26ad62a5c155af9199af9e69b889claireho return 0; 84427f654740f2a26ad62a5c155af9199af9e69b889claireho} 84527f654740f2a26ad62a5c155af9199af9e69b889claireho 84627f654740f2a26ad62a5c155af9199af9e69b889clairehovoid Collator::setReorderCodes(const int32_t *reorderCodes, 84727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t reorderCodesLength, 84827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode& status) 84927f654740f2a26ad62a5c155af9199af9e69b889claireho{ 85027f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_SUCCESS(status)) { 85127f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_UNSUPPORTED_ERROR; 85227f654740f2a26ad62a5c155af9199af9e69b889claireho } 85327f654740f2a26ad62a5c155af9199af9e69b889claireho} 85427f654740f2a26ad62a5c155af9199af9e69b889claireho 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UCollator private data members ---------------------------------------- 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is useless information */ 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*const UVersionInfo Collator::fVersion = {1, 1, 0, 0};*/ 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------- 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* eof */ 867