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 // 10 11 #include "unicode/utypes.h" 12 13 #if !UCONFIG_NO_REGULAR_EXPRESSIONS 14 #include "regeximp.h" 15 #include "unicode/utf16.h" 16 17 U_NAMESPACE_BEGIN 18 19 CaseFoldingUTextIterator::CaseFoldingUTextIterator(UText &text) : 20 fUText(text), fcsp(NULL), fFoldChars(NULL), fFoldLength(0) { 21 fcsp = ucase_getSingleton(); 22 } 23 24 CaseFoldingUTextIterator::~CaseFoldingUTextIterator() {} 25 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 } 50 51 U16_NEXT(fFoldChars, fFoldIndex, fFoldLength, foldedC); 52 if (fFoldIndex >= fFoldLength) { 53 fFoldChars = NULL; 54 } 55 return foldedC; 56 } 57 58 59 UBool CaseFoldingUTextIterator::inExpansion() { 60 return fFoldChars != NULL; 61 } 62 63 64 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 } 69 70 71 CaseFoldingUCharIterator::~CaseFoldingUCharIterator() {} 72 73 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); 84 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 } 99 100 U16_NEXT(fFoldChars, fFoldIndex, fFoldLength, foldedC); 101 if (fFoldIndex >= fFoldLength) { 102 fFoldChars = NULL; 103 } 104 return foldedC; 105 } 106 107 108 UBool CaseFoldingUCharIterator::inExpansion() { 109 return fFoldChars != NULL; 110 } 111 112 int64_t CaseFoldingUCharIterator::getIndex() { 113 return fIndex; 114 } 115 116 117 U_NAMESPACE_END 118 119 #endif 120 121