-const UTrie2 *
-Normalizer2Factory::getFCDTrie(UErrorCode &errorCode) {
- Norm2AllModes *allModes=
- Norm2AllModesSingleton(nfcSingleton, "nfc").getInstance(errorCode);
- if(allModes!=NULL) {
- return allModes->impl.getFCDTrie(errorCode);
- } else {
- return NULL;
- }
-}
-
-const Normalizer2 *
-Normalizer2::getInstance(const char *packageName,
- const char *name,
- UNormalization2Mode mode,
- UErrorCode &errorCode) {
- if(U_FAILURE(errorCode)) {
- return NULL;
- }
- if(name==NULL || *name==0) {
- errorCode=U_ILLEGAL_ARGUMENT_ERROR;
- }
- Norm2AllModes *allModes=NULL;
- if(packageName==NULL) {
- if(0==uprv_strcmp(name, "nfc")) {
- allModes=Norm2AllModesSingleton(nfcSingleton, "nfc").getInstance(errorCode);
- } else if(0==uprv_strcmp(name, "nfkc")) {
- allModes=Norm2AllModesSingleton(nfkcSingleton, "nfkc").getInstance(errorCode);
- } else if(0==uprv_strcmp(name, "nfkc_cf")) {
- allModes=Norm2AllModesSingleton(nfkc_cfSingleton, "nfkc_cf").getInstance(errorCode);
- }
- }
- if(allModes==NULL && U_SUCCESS(errorCode)) {
- {
- Mutex lock;
- if(cache!=NULL) {
- allModes=(Norm2AllModes *)uhash_get(cache, name);
- }
- }
- if(allModes==NULL) {
- LocalPointer<Norm2AllModes> localAllModes(
- Norm2AllModes::createInstance(packageName, name, errorCode));
- if(U_SUCCESS(errorCode)) {
- Mutex lock;
- if(cache==NULL) {
- cache=uhash_open(uhash_hashChars, uhash_compareChars, NULL, &errorCode);
- if(U_FAILURE(errorCode)) {
- return NULL;
- }
- uhash_setKeyDeleter(cache, uprv_free);
- uhash_setValueDeleter(cache, deleteNorm2AllModes);
- }
- void *temp=uhash_get(cache, name);
- if(temp==NULL) {
- int32_t keyLength=uprv_strlen(name)+1;
- char *nameCopy=(char *)uprv_malloc(keyLength);
- if(nameCopy==NULL) {
- errorCode=U_MEMORY_ALLOCATION_ERROR;
- return NULL;
- }
- uprv_memcpy(nameCopy, name, keyLength);
- uhash_put(cache, nameCopy, allModes=localAllModes.orphan(), &errorCode);
- } else {
- // race condition
- allModes=(Norm2AllModes *)temp;
- }
- }
- }
- }
- if(allModes!=NULL && U_SUCCESS(errorCode)) {
- switch(mode) {
- case UNORM2_COMPOSE:
- return &allModes->comp;
- case UNORM2_DECOMPOSE:
- return &allModes->decomp;
- case UNORM2_FCD:
- allModes->impl.getFCDTrie(errorCode);
- return &allModes->fcd;
- case UNORM2_COMPOSE_CONTIGUOUS:
- return &allModes->fcc;
- default:
- break; // do nothing
- }
- }
- return NULL;
-}
-
-UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION(Normalizer2)
-