Home | History | Annotate | Download | only in common
      1 /*
      2 **********************************************************************
      3 * Copyright (c) 2001-2004, 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 
     14 U_NAMESPACE_BEGIN
     15 UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFilter)
     16 
     17 
     18 /* Define this here due to the lack of another file.
     19    It can't be defined in the header */
     20 UnicodeMatcher::~UnicodeMatcher() {}
     21 
     22 UnicodeFilter::~UnicodeFilter() {}
     23 
     24 /**
     25  * UnicodeFunctor API.  Cast 'this' to a UnicodeMatcher* pointer
     26  * and return the pointer.
     27  */
     28 UnicodeMatcher* UnicodeFilter::toMatcher() const {
     29     return (UnicodeMatcher*) this;
     30 }
     31 
     32 void UnicodeFilter::setData(const TransliterationRuleData*) {}
     33 
     34 /**
     35  * Default implementation of UnicodeMatcher::matches() for Unicode
     36  * filters.  Matches a single code point at offset (either one or
     37  * two 16-bit code units).
     38  */
     39 UMatchDegree UnicodeFilter::matches(const Replaceable& text,
     40                                     int32_t& offset,
     41                                     int32_t limit,
     42                                     UBool incremental) {
     43     UChar32 c;
     44     if (offset < limit &&
     45         contains(c = text.char32At(offset))) {
     46         offset += UTF_CHAR_LENGTH(c);
     47         return U_MATCH;
     48     }
     49     if (offset > limit &&
     50         contains(c = text.char32At(offset))) {
     51         // Backup offset by 1, unless the preceding character is a
     52         // surrogate pair -- then backup by 2 (keep offset pointing at
     53         // the lead surrogate).
     54         --offset;
     55         if (offset >= 0) {
     56             offset -= UTF_CHAR_LENGTH(text.char32At(offset)) - 1;
     57         }
     58         return U_MATCH;
     59     }
     60     if (incremental && offset == limit) {
     61         return U_PARTIAL_MATCH;
     62     }
     63     return U_MISMATCH;
     64 }
     65 
     66 U_NAMESPACE_END
     67 
     68 //eof
     69