Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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