intl/icu/source/i18n/regeximp.cpp

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     1 //
     2 //   Copyright (C) 2012 International Business Machines Corporation
     3 //   and others. All rights reserved.
     4 //
     5 //   file:  regeximp.cpp
     6 //
     7 //           ICU Regular Expressions,
     8 //             miscellaneous implementation functions.
     9 //
    11 #include "unicode/utypes.h"
    13 #if !UCONFIG_NO_REGULAR_EXPRESSIONS
    14 #include "regeximp.h"
    15 #include "unicode/utf16.h"
    17 U_NAMESPACE_BEGIN
    19 CaseFoldingUTextIterator::CaseFoldingUTextIterator(UText &text) :
    20    fUText(text), fcsp(NULL), fFoldChars(NULL), fFoldLength(0) {
    21    fcsp = ucase_getSingleton();
    22 }
    24 CaseFoldingUTextIterator::~CaseFoldingUTextIterator() {}
    26 UChar32 CaseFoldingUTextIterator::next() {
    27     UChar32  foldedC;
    28     UChar32  originalC;
    29     if (fFoldChars == NULL) {
    30         // We are not in a string folding of an earlier character.
    31         // Start handling the next char from the input UText.
    32         originalC = UTEXT_NEXT32(&fUText);
    33         if (originalC == U_SENTINEL) {
    34             return originalC;
    35         }
    36         fFoldLength = ucase_toFullFolding(fcsp, originalC, &fFoldChars, U_FOLD_CASE_DEFAULT);
    37         if (fFoldLength >= UCASE_MAX_STRING_LENGTH || fFoldLength < 0) {
    38             // input code point folds to a single code point, possibly itself.
    39             // See comment in ucase.h for explanation of return values from ucase_toFullFoldings.
    40             if (fFoldLength < 0) {
    41                 fFoldLength = ~fFoldLength;
    42             }
    43             foldedC = (UChar32)fFoldLength;
    44             fFoldChars = NULL;
    45             return foldedC;
    46         }
    47         // String foldings fall through here.
    48         fFoldIndex = 0;
    49     }
    51     U16_NEXT(fFoldChars, fFoldIndex, fFoldLength, foldedC);
    52     if (fFoldIndex >= fFoldLength) {
    53         fFoldChars = NULL;
    54     }
    55     return foldedC;
    56 }
    59 UBool CaseFoldingUTextIterator::inExpansion() {
    60     return fFoldChars != NULL;
    61 }
    65 CaseFoldingUCharIterator::CaseFoldingUCharIterator(const UChar *chars, int64_t start, int64_t limit) :
    66    fChars(chars), fIndex(start), fLimit(limit), fcsp(NULL), fFoldChars(NULL), fFoldLength(0) {
    67    fcsp = ucase_getSingleton();
    68 }
    71 CaseFoldingUCharIterator::~CaseFoldingUCharIterator() {}
    74 UChar32 CaseFoldingUCharIterator::next() {
    75     UChar32  foldedC;
    76     UChar32  originalC;
    77     if (fFoldChars == NULL) {
    78         // We are not in a string folding of an earlier character.
    79         // Start handling the next char from the input UText.
    80         if (fIndex >= fLimit) {
    81             return U_SENTINEL;
    82         }
    83         U16_NEXT(fChars, fIndex, fLimit, originalC);
    85         fFoldLength = ucase_toFullFolding(fcsp, originalC, &fFoldChars, U_FOLD_CASE_DEFAULT);
    86         if (fFoldLength >= UCASE_MAX_STRING_LENGTH || fFoldLength < 0) {
    87             // input code point folds to a single code point, possibly itself.
    88             // See comment in ucase.h for explanation of return values from ucase_toFullFoldings.
    89             if (fFoldLength < 0) {
    90                 fFoldLength = ~fFoldLength;
    91             }
    92             foldedC = (UChar32)fFoldLength;
    93             fFoldChars = NULL;
    94             return foldedC;
    95         }
    96         // String foldings fall through here.
    97         fFoldIndex = 0;
    98     }
   100     U16_NEXT(fFoldChars, fFoldIndex, fFoldLength, foldedC);
   101     if (fFoldIndex >= fFoldLength) {
   102         fFoldChars = NULL;
   103     }
   104     return foldedC;
   105 }
   108 UBool CaseFoldingUCharIterator::inExpansion() {
   109     return fFoldChars != NULL;
   110 }
   112 int64_t CaseFoldingUCharIterator::getIndex() {
   113     return fIndex;
   114 }
   117 U_NAMESPACE_END
   119 #endif

mercurial