| /* |
| ********************************************************************** |
| * Copyright (c) 2002-2012, International Business Machines Corporation |
| * and others. All Rights Reserved. |
| ********************************************************************** |
| * Date Name Description |
| * 02/04/2002 aliu Creation. |
| ********************************************************************** |
| */ |
| |
| #include "unicode/utypes.h" |
| |
| #if !UCONFIG_NO_TRANSLITERATION |
| |
| #include "unicode/translit.h" |
| #include "unicode/uniset.h" |
| #include "funcrepl.h" |
| |
| static const UChar AMPERSAND = 38; // '&' |
| static const UChar OPEN[] = {40,32,0}; // "( " |
| static const UChar CLOSE[] = {32,41,0}; // " )" |
| |
| U_NAMESPACE_BEGIN |
| |
| UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FunctionReplacer) |
| |
| /** |
| * Construct a replacer that takes the output of the given |
| * replacer, passes it through the given transliterator, and emits |
| * the result as output. |
| */ |
| FunctionReplacer::FunctionReplacer(Transliterator* adoptedTranslit, |
| UnicodeFunctor* adoptedReplacer) { |
| translit = adoptedTranslit; |
| replacer = adoptedReplacer; |
| } |
| |
| /** |
| * Copy constructor. |
| */ |
| FunctionReplacer::FunctionReplacer(const FunctionReplacer& other) : |
| UnicodeFunctor(other), |
| UnicodeReplacer(other) |
| { |
| translit = other.translit->clone(); |
| replacer = other.replacer->clone(); |
| } |
| |
| /** |
| * Destructor |
| */ |
| FunctionReplacer::~FunctionReplacer() { |
| delete translit; |
| delete replacer; |
| } |
| |
| /** |
| * Implement UnicodeFunctor |
| */ |
| UnicodeFunctor* FunctionReplacer::clone() const { |
| return new FunctionReplacer(*this); |
| } |
| |
| /** |
| * UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer |
| * and return the pointer. |
| */ |
| UnicodeReplacer* FunctionReplacer::toReplacer() const { |
| FunctionReplacer *nonconst_this = const_cast<FunctionReplacer *>(this); |
| UnicodeReplacer *nonconst_base = static_cast<UnicodeReplacer *>(nonconst_this); |
| |
| return nonconst_base; |
| } |
| |
| /** |
| * UnicodeReplacer API |
| */ |
| int32_t FunctionReplacer::replace(Replaceable& text, |
| int32_t start, |
| int32_t limit, |
| int32_t& cursor) |
| { |
| |
| // First delegate to subordinate replacer |
| int32_t len = replacer->toReplacer()->replace(text, start, limit, cursor); |
| limit = start + len; |
| |
| // Now transliterate |
| limit = translit->transliterate(text, start, limit); |
| |
| return limit - start; |
| } |
| |
| /** |
| * UnicodeReplacer API |
| */ |
| UnicodeString& FunctionReplacer::toReplacerPattern(UnicodeString& rule, |
| UBool escapeUnprintable) const { |
| UnicodeString str; |
| rule.truncate(0); |
| rule.append(AMPERSAND); |
| rule.append(translit->getID()); |
| rule.append(OPEN, 2); |
| rule.append(replacer->toReplacer()->toReplacerPattern(str, escapeUnprintable)); |
| rule.append(CLOSE, 2); |
| return rule; |
| } |
| |
| /** |
| * Implement UnicodeReplacer |
| */ |
| void FunctionReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const { |
| UnicodeSet set; |
| toUnionTo.addAll(translit->getTargetSet(set)); |
| } |
| |
| /** |
| * UnicodeFunctor API |
| */ |
| void FunctionReplacer::setData(const TransliterationRuleData* d) { |
| replacer->setData(d); |
| } |
| |
| U_NAMESPACE_END |
| |
| #endif /* #if !UCONFIG_NO_TRANSLITERATION */ |
| |
| //eof |