1 /* 2 ********************************************************************** 3 * Copyright (c) 2002-2012, International Business Machines Corporation 4 * and others. All Rights Reserved. 5 ********************************************************************** 6 * Date Name Description 7 * 02/04/2002 aliu Creation. 8 ********************************************************************** 9 */ 10 11 #include "unicode/utypes.h" 12 13 #if !UCONFIG_NO_TRANSLITERATION 14 15 #include "unicode/translit.h" 16 #include "unicode/uniset.h" 17 #include "funcrepl.h" 18 19 static const UChar AMPERSAND = 38; // '&' 20 static const UChar OPEN[] = {40,32,0}; // "( " 21 static const UChar CLOSE[] = {32,41,0}; // " )" 22 23 U_NAMESPACE_BEGIN 24 25 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FunctionReplacer) 26 27 /** 28 * Construct a replacer that takes the output of the given 29 * replacer, passes it through the given transliterator, and emits 30 * the result as output. 31 */ 32 FunctionReplacer::FunctionReplacer(Transliterator* adoptedTranslit, 33 UnicodeFunctor* adoptedReplacer) { 34 translit = adoptedTranslit; 35 replacer = adoptedReplacer; 36 } 37 38 /** 39 * Copy constructor. 40 */ 41 FunctionReplacer::FunctionReplacer(const FunctionReplacer& other) : 42 UnicodeFunctor(other), 43 UnicodeReplacer(other) 44 { 45 translit = other.translit->clone(); 46 replacer = other.replacer->clone(); 47 } 48 49 /** 50 * Destructor 51 */ 52 FunctionReplacer::~FunctionReplacer() { 53 delete translit; 54 delete replacer; 55 } 56 57 /** 58 * Implement UnicodeFunctor 59 */ 60 UnicodeFunctor* FunctionReplacer::clone() const { 61 return new FunctionReplacer(*this); 62 } 63 64 /** 65 * UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer 66 * and return the pointer. 67 */ 68 UnicodeReplacer* FunctionReplacer::toReplacer() const { 69 FunctionReplacer *nonconst_this = const_cast<FunctionReplacer *>(this); 70 UnicodeReplacer *nonconst_base = static_cast<UnicodeReplacer *>(nonconst_this); 71 72 return nonconst_base; 73 } 74 75 /** 76 * UnicodeReplacer API 77 */ 78 int32_t FunctionReplacer::replace(Replaceable& text, 79 int32_t start, 80 int32_t limit, 81 int32_t& cursor) 82 { 83 84 // First delegate to subordinate replacer 85 int32_t len = replacer->toReplacer()->replace(text, start, limit, cursor); 86 limit = start + len; 87 88 // Now transliterate 89 limit = translit->transliterate(text, start, limit); 90 91 return limit - start; 92 } 93 94 /** 95 * UnicodeReplacer API 96 */ 97 UnicodeString& FunctionReplacer::toReplacerPattern(UnicodeString& rule, 98 UBool escapeUnprintable) const { 99 UnicodeString str; 100 rule.truncate(0); 101 rule.append(AMPERSAND); 102 rule.append(translit->getID()); 103 rule.append(OPEN, 2); 104 rule.append(replacer->toReplacer()->toReplacerPattern(str, escapeUnprintable)); 105 rule.append(CLOSE, 2); 106 return rule; 107 } 108 109 /** 110 * Implement UnicodeReplacer 111 */ 112 void FunctionReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const { 113 UnicodeSet set; 114 toUnionTo.addAll(translit->getTargetSet(set)); 115 } 116 117 /** 118 * UnicodeFunctor API 119 */ 120 void FunctionReplacer::setData(const TransliterationRuleData* d) { 121 replacer->setData(d); 122 } 123 124 U_NAMESPACE_END 125 126 #endif /* #if !UCONFIG_NO_TRANSLITERATION */ 127 128 //eof 129