1 // © 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), fFoldChars(NULL), fFoldLength(0) {
23 }
24 
~CaseFoldingUTextIterator()25 CaseFoldingUTextIterator::~CaseFoldingUTextIterator() {}
26 
next()27 UChar32 CaseFoldingUTextIterator::next() {
28     UChar32  foldedC;
29     UChar32  originalC;
30     if (fFoldChars == NULL) {
31         // We are not in a string folding of an earlier character.
32         // Start handling the next char from the input UText.
33         originalC = UTEXT_NEXT32(&fUText);
34         if (originalC == U_SENTINEL) {
35             return originalC;
36         }
37         fFoldLength = ucase_toFullFolding(originalC, &fFoldChars, U_FOLD_CASE_DEFAULT);
38         if (fFoldLength >= UCASE_MAX_STRING_LENGTH || fFoldLength < 0) {
39             // input code point folds to a single code point, possibly itself.
40             // See comment in ucase.h for explanation of return values from ucase_toFullFoldings.
41             if (fFoldLength < 0) {
42                 fFoldLength = ~fFoldLength;
43             }
44             foldedC = (UChar32)fFoldLength;
45             fFoldChars = NULL;
46             return foldedC;
47         }
48         // String foldings fall through here.
49         fFoldIndex = 0;
50     }
51 
52     U16_NEXT(fFoldChars, fFoldIndex, fFoldLength, foldedC);
53     if (fFoldIndex >= fFoldLength) {
54         fFoldChars = NULL;
55     }
56     return foldedC;
57 }
58 
59 
inExpansion()60 UBool CaseFoldingUTextIterator::inExpansion() {
61     return fFoldChars != NULL;
62 }
63 
64 
65 
CaseFoldingUCharIterator(const UChar * chars,int64_t start,int64_t limit)66 CaseFoldingUCharIterator::CaseFoldingUCharIterator(const UChar *chars, int64_t start, int64_t limit) :
67    fChars(chars), fIndex(start), fLimit(limit), fFoldChars(NULL), fFoldLength(0) {
68 }
69 
70 
~CaseFoldingUCharIterator()71 CaseFoldingUCharIterator::~CaseFoldingUCharIterator() {}
72 
73 
next()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(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 
inExpansion()108 UBool CaseFoldingUCharIterator::inExpansion() {
109     return fFoldChars != NULL;
110 }
111 
getIndex()112 int64_t CaseFoldingUCharIterator::getIndex() {
113     return fIndex;
114 }
115 
116 
117 U_NAMESPACE_END
118 
119 #endif
120 
121