1 /* 2 ********************************************************************** 3 * Copyright (c) 2002-2008, 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 return (UnicodeReplacer*) this; 70 } 71 72 /** 73 * UnicodeReplacer API 74 */ 75 int32_t FunctionReplacer::replace(Replaceable& text, 76 int32_t start, 77 int32_t limit, 78 int32_t& cursor) 79 { 80 81 // First delegate to subordinate replacer 82 int32_t len = replacer->toReplacer()->replace(text, start, limit, cursor); 83 limit = start + len; 84 85 // Now transliterate 86 limit = translit->transliterate(text, start, limit); 87 88 return limit - start; 89 } 90 91 /** 92 * UnicodeReplacer API 93 */ 94 UnicodeString& FunctionReplacer::toReplacerPattern(UnicodeString& rule, 95 UBool escapeUnprintable) const { 96 UnicodeString str; 97 rule.truncate(0); 98 rule.append(AMPERSAND); 99 rule.append(translit->getID()); 100 rule.append(OPEN); 101 rule.append(replacer->toReplacer()->toReplacerPattern(str, escapeUnprintable)); 102 rule.append(CLOSE); 103 return rule; 104 } 105 106 /** 107 * Implement UnicodeReplacer 108 */ 109 void FunctionReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const { 110 UnicodeSet set; 111 toUnionTo.addAll(translit->getTargetSet(set)); 112 } 113 114 /** 115 * UnicodeFunctor API 116 */ 117 void FunctionReplacer::setData(const TransliterationRuleData* d) { 118 replacer->setData(d); 119 } 120 121 U_NAMESPACE_END 122 123 #endif /* #if !UCONFIG_NO_TRANSLITERATION */ 124 125 //eof 126