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 19static const UChar AMPERSAND = 38; // '&' 20static const UChar OPEN[] = {40,32,0}; // "( " 21static const UChar CLOSE[] = {32,41,0}; // " )" 22 23U_NAMESPACE_BEGIN 24 25UOBJECT_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 */ 32FunctionReplacer::FunctionReplacer(Transliterator* adoptedTranslit, 33 UnicodeFunctor* adoptedReplacer) { 34 translit = adoptedTranslit; 35 replacer = adoptedReplacer; 36} 37 38/** 39 * Copy constructor. 40 */ 41FunctionReplacer::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 */ 52FunctionReplacer::~FunctionReplacer() { 53 delete translit; 54 delete replacer; 55} 56 57/** 58 * Implement UnicodeFunctor 59 */ 60UnicodeFunctor* 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 */ 68UnicodeReplacer* 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 */ 78int32_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 */ 97UnicodeString& 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 */ 112void FunctionReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const { 113 UnicodeSet set; 114 toUnionTo.addAll(translit->getTargetSet(set)); 115} 116 117/** 118 * UnicodeFunctor API 119 */ 120void FunctionReplacer::setData(const TransliterationRuleData* d) { 121 replacer->setData(d); 122} 123 124U_NAMESPACE_END 125 126#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 127 128//eof 129