Index: icu46/source/i18n/funcrepl.cpp |
=================================================================== |
--- icu46/source/i18n/funcrepl.cpp (revision 0) |
+++ icu46/source/i18n/funcrepl.cpp (revision 0) |
@@ -0,0 +1,125 @@ |
+/* |
+********************************************************************** |
+* Copyright (c) 2002-2008, 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 { |
+ return (UnicodeReplacer*) this; |
+} |
+ |
+/** |
+ * 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); |
+ rule.append(replacer->toReplacer()->toReplacerPattern(str, escapeUnprintable)); |
+ rule.append(CLOSE); |
+ 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 |
Property changes on: icu46/source/i18n/funcrepl.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |