diff options
Diffstat (limited to 'Build/source/libs/icu/icu-xetex/common/unifilt.cpp')
-rw-r--r-- | Build/source/libs/icu/icu-xetex/common/unifilt.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-xetex/common/unifilt.cpp b/Build/source/libs/icu/icu-xetex/common/unifilt.cpp new file mode 100644 index 00000000000..69ac3070c79 --- /dev/null +++ b/Build/source/libs/icu/icu-xetex/common/unifilt.cpp @@ -0,0 +1,68 @@ +/* +********************************************************************** +* Copyright (c) 2001-2004, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* Date Name Description +* 07/18/01 aliu Creation. +********************************************************************** +*/ + +#include "unicode/unifilt.h" +#include "unicode/rep.h" + +U_NAMESPACE_BEGIN +UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFilter) + + +/* Define this here due to the lack of another file. + It can't be defined in the header */ +UnicodeMatcher::~UnicodeMatcher() {} + +UnicodeFilter::~UnicodeFilter() {} + +/** + * UnicodeFunctor API. Cast 'this' to a UnicodeMatcher* pointer + * and return the pointer. + */ +UnicodeMatcher* UnicodeFilter::toMatcher() const { + return (UnicodeMatcher*) this; +} + +void UnicodeFilter::setData(const TransliterationRuleData*) {} + +/** + * Default implementation of UnicodeMatcher::matches() for Unicode + * filters. Matches a single code point at offset (either one or + * two 16-bit code units). + */ +UMatchDegree UnicodeFilter::matches(const Replaceable& text, + int32_t& offset, + int32_t limit, + UBool incremental) { + UChar32 c; + if (offset < limit && + contains(c = text.char32At(offset))) { + offset += UTF_CHAR_LENGTH(c); + return U_MATCH; + } + if (offset > limit && + contains(c = text.char32At(offset))) { + // Backup offset by 1, unless the preceding character is a + // surrogate pair -- then backup by 2 (keep offset pointing at + // the lead surrogate). + --offset; + if (offset >= 0) { + offset -= UTF_CHAR_LENGTH(text.char32At(offset)) - 1; + } + return U_MATCH; + } + if (incremental && offset == limit) { + return U_PARTIAL_MATCH; + } + return U_MISMATCH; +} + +U_NAMESPACE_END + +//eof |