/*
**********************************************************************
-* Copyright (c) 2002-2003, International Business Machines Corporation
+* Copyright (c) 2002-2004, International Business Machines Corporation
* and others. All Rights Reserved.
**********************************************************************
* Date Name Description
*/
TransliteratorIDParser::SingleID*
TransliteratorIDParser::parseSingleID(const UnicodeString& id, int32_t& pos,
- int32_t dir) {
+ int32_t dir, UErrorCode& status) {
int32_t start = pos;
if (dir == FORWARD) {
single = specsToID(specsA, FORWARD);
} else {
- single = specsToSpecialInverse(*specsA);
+ single = specsToSpecialInverse(*specsA, status);
if (single == NULL) {
single = specsToID(specsA, REVERSE);
}
if (UnicodeSet::resemblesPattern(id, pos)) {
ParsePosition ppos(pos);
UErrorCode ec = U_ZERO_ERROR;
- filter = new UnicodeSet(id, ppos, USET_IGNORE_SPACE, ec);
+ filter = new UnicodeSet(id, ppos, USET_IGNORE_SPACE, NULL, ec);
/* test for NULL */
if (filter == 0) {
pos = start;
delete (TransliteratorIDParser::SingleID*) obj;
}
-static void U_CALLCONV _deleteTransliterator(void* obj) {
+static void U_CALLCONV _deleteTransliteratorTrIDPars(void* obj) {
delete (Transliterator*) obj;
}
U_CDECL_END
UBool sawDelimiter = TRUE;
for (;;) {
- SingleID* single = parseSingleID(id, pos, dir);
+ SingleID* single = parseSingleID(id, pos, dir, ec);
if (single == NULL) {
break;
}
if (U_FAILURE(ec)) {
goto RETURN;
}
- tlist.setDeleter(_deleteTransliterator);
+ tlist.setDeleter(_deleteTransliteratorTrIDPars);
Transliterator* t;
int32_t i;
list.removeAllElements();
if (U_SUCCESS(ec)) {
- list.setDeleter(_deleteTransliterator);
+ list.setDeleter(_deleteTransliteratorTrIDPars);
while (tlist.size() > 0) {
t = (Transliterator*) tlist.orphanElementAt(0);
*/
void TransliteratorIDParser::registerSpecialInverse(const UnicodeString& target,
const UnicodeString& inverseTarget,
- UBool bidirectional) {
- init();
+ UBool bidirectional,
+ UErrorCode &status) {
+ init(status);
+ if (U_FAILURE(status)) {
+ return;
+ }
// If target == inverseTarget then force bidirectional => FALSE
if (bidirectional && 0==target.caseCompare(inverseTarget, U_FOLD_CASE_DEFAULT)) {
umtx_init(&LOCK);
Mutex lock(&LOCK);
- UErrorCode ec = U_ZERO_ERROR;
- SPECIAL_INVERSES->put(target, new UnicodeString(inverseTarget), ec);
+ SPECIAL_INVERSES->put(target, new UnicodeString(inverseTarget), status);
if (bidirectional) {
- SPECIAL_INVERSES->put(inverseTarget, new UnicodeString(target), ec);
+ SPECIAL_INVERSES->put(inverseTarget, new UnicodeString(target), status);
}
}
ParsePosition ppos(pos);
UErrorCode ec = U_ZERO_ERROR;
- UnicodeSet set(id, ppos, USET_IGNORE_SPACE, ec);
+ UnicodeSet set(id, ppos, USET_IGNORE_SPACE, NULL, ec);
if (U_FAILURE(ec)) {
pos = start;
return NULL;
* 'filter' field of NULL.
*/
TransliteratorIDParser::SingleID*
-TransliteratorIDParser::specsToSpecialInverse(const Specs& specs) {
+TransliteratorIDParser::specsToSpecialInverse(const Specs& specs, UErrorCode &status) {
if (0!=specs.source.caseCompare(ANY, U_FOLD_CASE_DEFAULT)) {
return NULL;
}
- init();
+ init(status);
UnicodeString* inverseTarget;
/**
* Initialize static memory.
*/
-void TransliteratorIDParser::init() {
+void TransliteratorIDParser::init(UErrorCode &status) {
if (SPECIAL_INVERSES != NULL) {
return;
}
- Hashtable* special_inverses = new Hashtable(TRUE);
+ Hashtable* special_inverses = new Hashtable(TRUE, status);
special_inverses->setValueDeleter(uhash_deleteUnicodeString);
umtx_init(&LOCK);
umtx_unlock(&LOCK);
delete special_inverses;
- ucln_i18n_registerCleanup();
+ ucln_i18n_registerCleanup(UCLN_I18N_TRANSLITERATOR, transliterator_cleanup);
}
/**