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