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