|
1 /* |
|
2 ********************************************************************** |
|
3 * Copyright (c) 2001-2012, International Business Machines |
|
4 * Corporation and others. All Rights Reserved. |
|
5 ********************************************************************** |
|
6 * Date Name Description |
|
7 * 07/18/01 aliu Creation. |
|
8 ********************************************************************** |
|
9 */ |
|
10 |
|
11 #include "unicode/unifilt.h" |
|
12 #include "unicode/rep.h" |
|
13 #include "unicode/utf16.h" |
|
14 |
|
15 U_NAMESPACE_BEGIN |
|
16 UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFilter) |
|
17 |
|
18 |
|
19 /* Define this here due to the lack of another file. |
|
20 It can't be defined in the header */ |
|
21 UnicodeMatcher::~UnicodeMatcher() {} |
|
22 |
|
23 UnicodeFilter::~UnicodeFilter() {} |
|
24 |
|
25 /** |
|
26 * UnicodeFunctor API. |
|
27 * Note that UnicodeMatcher is a base class of UnicodeFilter. |
|
28 */ |
|
29 UnicodeMatcher* UnicodeFilter::toMatcher() const { |
|
30 return const_cast<UnicodeFilter *>(this); |
|
31 } |
|
32 |
|
33 void UnicodeFilter::setData(const TransliterationRuleData*) {} |
|
34 |
|
35 /** |
|
36 * Default implementation of UnicodeMatcher::matches() for Unicode |
|
37 * filters. Matches a single code point at offset (either one or |
|
38 * two 16-bit code units). |
|
39 */ |
|
40 UMatchDegree UnicodeFilter::matches(const Replaceable& text, |
|
41 int32_t& offset, |
|
42 int32_t limit, |
|
43 UBool incremental) { |
|
44 UChar32 c; |
|
45 if (offset < limit && |
|
46 contains(c = text.char32At(offset))) { |
|
47 offset += U16_LENGTH(c); |
|
48 return U_MATCH; |
|
49 } |
|
50 if (offset > limit && |
|
51 contains(c = text.char32At(offset))) { |
|
52 // Backup offset by 1, unless the preceding character is a |
|
53 // surrogate pair -- then backup by 2 (keep offset pointing at |
|
54 // the lead surrogate). |
|
55 --offset; |
|
56 if (offset >= 0) { |
|
57 offset -= U16_LENGTH(text.char32At(offset)) - 1; |
|
58 } |
|
59 return U_MATCH; |
|
60 } |
|
61 if (incremental && offset == limit) { |
|
62 return U_PARTIAL_MATCH; |
|
63 } |
|
64 return U_MISMATCH; |
|
65 } |
|
66 |
|
67 U_NAMESPACE_END |
|
68 |
|
69 //eof |