1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* Copyright (C) 1999-2011, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 11/17/99 aliu Creation. 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "umutex.h" 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h" 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uniset.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "rbt_data.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "hash.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTransliterationRuleData::TransliterationRuleData(UErrorCode& status) 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : UMemory(), ruleSet(status), variableNames(status), 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variables(0), variablesAreOwned(TRUE) 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 3183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius variableNames.setValueDeleter(uprv_deleteUObject); 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variables = 0; 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variablesLength = 0; 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTransliterationRuleData::TransliterationRuleData(const TransliterationRuleData& other) : 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UMemory(other), ruleSet(other.ruleSet), 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variablesAreOwned(TRUE), 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variablesBase(other.variablesBase), 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variablesLength(other.variablesLength) 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i = 0; 4483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius variableNames.setValueDeleter(uprv_deleteUObject); 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t pos = -1; 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UHashElement *e; 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while ((e = other.variableNames.nextElement(pos)) != 0) { 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString* value = 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru new UnicodeString(*(const UnicodeString*)e->value.pointer); 5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Exit out if value could not be created. 5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (value == NULL) { 5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variableNames.put(*(UnicodeString*)e->key.pointer, value, status); 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variables = 0; 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (other.variables != 0) { 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variables = (UnicodeFunctor **)uprv_malloc(variablesLength * sizeof(UnicodeFunctor *)); 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* test for NULL */ 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (variables == 0) { 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (i=0; i<variablesLength; ++i) { 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru variables[i] = other.variables[i]->clone(); 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (variables[i] == NULL) { 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_MEMORY_ALLOCATION_ERROR; 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Remove the array and exit if memory allocation error occured. 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t n = i-1; n >= 0; n++) { 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho delete variables[n]; 7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_free(variables); 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho variables = NULL; 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Do this last, _after_ setting up variables[]. 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ruleSet.setData(this); // ruleSet must already be frozen 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTransliterationRuleData::~TransliterationRuleData() { 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (variablesAreOwned && variables != 0) { 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int32_t i=0; i<variablesLength; ++i) { 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete variables[i]; 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_free(variables); 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeFunctor* 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTransliterationRuleData::lookup(UChar32 standIn) const { 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t i = standIn - variablesBase; 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (i >= 0 && i < variablesLength) ? variables[i] : 0; 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeMatcher* 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTransliterationRuleData::lookupMatcher(UChar32 standIn) const { 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeFunctor *f = lookup(standIn); 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (f != 0) ? f->toMatcher() : 0; 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeReplacer* 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTransliterationRuleData::lookupReplacer(UChar32 standIn) const { 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeFunctor *f = lookup(standIn); 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (f != 0) ? f->toReplacer() : 0; 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 118