Imported Upstream version 58.1
[platform/upstream/icu.git] / source / i18n / regeximp.cpp
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
21 CaseFoldingUTextIterator::CaseFoldingUTextIterator(UText &text) :
22    fUText(text), fcsp(NULL), fFoldChars(NULL), fFoldLength(0) {
23    fcsp = ucase_getSingleton();
24 }
25
26 CaseFoldingUTextIterator::~CaseFoldingUTextIterator() {}
27
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
61 UBool CaseFoldingUTextIterator::inExpansion() {
62     return fFoldChars != NULL;
63 }
64
65
66
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
73 CaseFoldingUCharIterator::~CaseFoldingUCharIterator() {}
74
75
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
110 UBool CaseFoldingUCharIterator::inExpansion() {
111     return fFoldChars != NULL;
112 }
113
114 int64_t CaseFoldingUCharIterator::getIndex() {
115     return fIndex;
116 }
117
118
119 U_NAMESPACE_END
120
121 #endif
122