TransliteratorEntry* TransliteratorRegistry::find(UnicodeString& source, UnicodeString& target, UnicodeString& variant) { TransliteratorSpec src(source); TransliteratorSpec trg(target); TransliteratorEntry* entry; if (variant.length() != 0) { // Seek exact match in hashtable entry = findInDynamicStore(src, trg, variant); if (entry != 0) { return entry; } // Seek exact match in locale resources entry = findInStaticStore(src, trg, variant); if (entry != 0) { return entry; } } for (;;) { src.reset(); for (;;) { // Seek match in hashtable entry = findInDynamicStore(src, trg, NO_VARIANT); if (entry != 0) { return entry; } // Seek match in locale resources entry = findInStaticStore(src, trg, NO_VARIANT); if (entry != 0) { return entry; } if (!src.hasFallback()) { break; } src.next(); } if (!trg.hasFallback()) { break; } trg.next(); } return 0; }
/** * Top-level find method. Attempt to find a source-target/variant in * either the dynamic or the static (locale resource) store. Perform * fallback. * * Lookup sequence for ss_SS_SSS-tt_TT_TTT/v: * * ss_SS_SSS-tt_TT_TTT/v -- in hashtable * ss_SS_SSS-tt_TT_TTT/v -- in ss_SS_SSS (no fallback) * * repeat with t = tt_TT_TTT, tt_TT, tt, and tscript * * ss_SS_SSS-t/ * * ss_SS-t/ * * ss-t/ * * sscript-t/ * * * Here * matches the first variant listed. * * Caller does NOT own returned object. Return 0 on failure. */ TransliteratorEntry* TransliteratorRegistry::find(UnicodeString& source, UnicodeString& target, UnicodeString& variant) { TransliteratorSpec src(source); TransliteratorSpec trg(target); TransliteratorEntry* entry; // Seek exact match in hashtable. Temporary fix for ICU 4.6. // TODO: The general logic for finding a matching transliterator needs to be reviewed. // ICU ticket #8089 UnicodeString ID; TransliteratorIDParser::STVtoID(source, target, variant, ID); entry = (TransliteratorEntry*) registry.get(ID); if (entry != 0) { // std::string ss; // std::cout << ID.toUTF8String(ss) << std::endl; return entry; } if (variant.length() != 0) { // Seek exact match in hashtable entry = findInDynamicStore(src, trg, variant); if (entry != 0) { return entry; } // Seek exact match in locale resources entry = findInStaticStore(src, trg, variant); if (entry != 0) { return entry; } } for (;;) { src.reset(); for (;;) { // Seek match in hashtable entry = findInDynamicStore(src, trg, NO_VARIANT); if (entry != 0) { return entry; } // Seek match in locale resources entry = findInStaticStore(src, trg, NO_VARIANT); if (entry != 0) { return entry; } if (!src.hasFallback()) { break; } src.next(); } if (!trg.hasFallback()) { break; } trg.next(); } return 0; }