Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Side by Side Diff: source/i18n/stsearch.cpp

Issue 845603002: Update ICU to 54.1 step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@master
Patch Set: remove unusued directories Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/i18n/smpdtfmt.cpp ('k') | source/i18n/tblcoll.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ********************************************************************** 2 **********************************************************************
3 * Copyright (C) 2001-2008 IBM and others. All rights reserved. 3 * Copyright (C) 2001-2014 IBM and others. All rights reserved.
4 ********************************************************************** 4 **********************************************************************
5 * Date Name Description 5 * Date Name Description
6 * 03/22/2000 helena Creation. 6 * 03/22/2000 helena Creation.
7 ********************************************************************** 7 **********************************************************************
8 */ 8 */
9 9
10 #include "unicode/utypes.h" 10 #include "unicode/utypes.h"
11 11
12 #if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION 12 #if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION
13 13
14 #include "unicode/stsearch.h" 14 #include "unicode/stsearch.h"
15 #include "usrchimp.h" 15 #include "usrchimp.h"
16 #include "cmemory.h" 16 #include "cmemory.h"
17 17
18 U_NAMESPACE_BEGIN 18 U_NAMESPACE_BEGIN
19 19
20 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringSearch) 20 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringSearch)
21 21
22 // public constructors and destructors ----------------------------------- 22 // public constructors and destructors -----------------------------------
23 23
24 StringSearch::StringSearch(const UnicodeString &pattern, 24 StringSearch::StringSearch(const UnicodeString &pattern,
25 const UnicodeString &text, 25 const UnicodeString &text,
26 const Locale &locale, 26 const Locale &locale,
27 BreakIterator *breakiter, 27 BreakIterator *breakiter,
28 UErrorCode &status) : 28 UErrorCode &status) :
29 SearchIterator(text, breakiter), 29 SearchIterator(text, breakiter),
30 m_collator_(),
31 m_pattern_(pattern) 30 m_pattern_(pattern)
32 { 31 {
33 if (U_FAILURE(status)) { 32 if (U_FAILURE(status)) {
34 m_strsrch_ = NULL; 33 m_strsrch_ = NULL;
35 return; 34 return;
36 } 35 }
37 36
38 m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(), 37 m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(),
39 m_text_.getBuffer(), m_text_.length(), 38 m_text_.getBuffer(), m_text_.length(),
40 locale.getName(), (UBreakIterator *)breakiter, 39 locale.getName(), (UBreakIterator *)breakiter,
41 &status); 40 &status);
42 uprv_free(m_search_); 41 uprv_free(m_search_);
43 m_search_ = NULL; 42 m_search_ = NULL;
44 43
45 // !!! dlf m_collator_ is an odd beast. basically it is an aliasing
46 // wrapper around the internal collator and rules, which (here) are
47 // owned by this stringsearch object. this means 1) it's destructor
48 // _should not_ delete the ucollator or rules, and 2) changes made
49 // to the exposed collator (setStrength etc) _should_ modify the
50 // ucollator. thus the collator is not a copy-on-write alias, and it
51 // needs to distinguish itself not merely from 'stand alone' colators
52 // but also from copy-on-write ones. it needs additional state, which
53 // setUCollator should set.
54
55 if (U_SUCCESS(status)) { 44 if (U_SUCCESS(status)) {
56 // Alias the collator
57 m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
58 // m_search_ has been created by the base SearchIterator class 45 // m_search_ has been created by the base SearchIterator class
59 m_search_ = m_strsrch_->search; 46 m_search_ = m_strsrch_->search;
60 } 47 }
61 } 48 }
62 49
63 StringSearch::StringSearch(const UnicodeString &pattern, 50 StringSearch::StringSearch(const UnicodeString &pattern,
64 const UnicodeString &text, 51 const UnicodeString &text,
65 RuleBasedCollator *coll, 52 RuleBasedCollator *coll,
66 BreakIterator *breakiter, 53 BreakIterator *breakiter,
67 UErrorCode &status) : 54 UErrorCode &status) :
68 SearchIterator(text, breakiter), 55 SearchIterator(text, breakiter),
69 m_collator_(),
70 m_pattern_(pattern) 56 m_pattern_(pattern)
71 { 57 {
72 if (U_FAILURE(status)) { 58 if (U_FAILURE(status)) {
73 m_strsrch_ = NULL; 59 m_strsrch_ = NULL;
74 return; 60 return;
75 } 61 }
76 if (coll == NULL) { 62 if (coll == NULL) {
77 status = U_ILLEGAL_ARGUMENT_ERROR; 63 status = U_ILLEGAL_ARGUMENT_ERROR;
78 m_strsrch_ = NULL; 64 m_strsrch_ = NULL;
79 return; 65 return;
80 } 66 }
81 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 67 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(),
82 m_pattern_.length(), 68 m_pattern_.length(),
83 m_text_.getBuffer(), 69 m_text_.getBuffer(),
84 m_text_.length(), coll->ucollator, 70 m_text_.length(), coll->toUCollator(),
85 (UBreakIterator *)breakiter, 71 (UBreakIterator *)breakiter,
86 &status); 72 &status);
87 uprv_free(m_search_); 73 uprv_free(m_search_);
88 m_search_ = NULL; 74 m_search_ = NULL;
89 75
90 if (U_SUCCESS(status)) { 76 if (U_SUCCESS(status)) {
91 // Alias the collator
92 m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
93 // m_search_ has been created by the base SearchIterator class 77 // m_search_ has been created by the base SearchIterator class
94 m_search_ = m_strsrch_->search; 78 m_search_ = m_strsrch_->search;
95 } 79 }
96 } 80 }
97 81
98 StringSearch::StringSearch(const UnicodeString &pattern, 82 StringSearch::StringSearch(const UnicodeString &pattern,
99 CharacterIterator &text, 83 CharacterIterator &text,
100 const Locale &locale, 84 const Locale &locale,
101 BreakIterator *breakiter, 85 BreakIterator *breakiter,
102 UErrorCode &status) : 86 UErrorCode &status) :
103 SearchIterator(text, breakiter), 87 SearchIterator(text, breakiter),
104 m_collator_(),
105 m_pattern_(pattern) 88 m_pattern_(pattern)
106 { 89 {
107 if (U_FAILURE(status)) { 90 if (U_FAILURE(status)) {
108 m_strsrch_ = NULL; 91 m_strsrch_ = NULL;
109 return; 92 return;
110 } 93 }
111 m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(), 94 m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(),
112 m_text_.getBuffer(), m_text_.length(), 95 m_text_.getBuffer(), m_text_.length(),
113 locale.getName(), (UBreakIterator *)breakiter, 96 locale.getName(), (UBreakIterator *)breakiter,
114 &status); 97 &status);
115 uprv_free(m_search_); 98 uprv_free(m_search_);
116 m_search_ = NULL; 99 m_search_ = NULL;
117 100
118 if (U_SUCCESS(status)) { 101 if (U_SUCCESS(status)) {
119 // Alias the collator
120 m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
121 // m_search_ has been created by the base SearchIterator class 102 // m_search_ has been created by the base SearchIterator class
122 m_search_ = m_strsrch_->search; 103 m_search_ = m_strsrch_->search;
123 } 104 }
124 } 105 }
125 106
126 StringSearch::StringSearch(const UnicodeString &pattern, 107 StringSearch::StringSearch(const UnicodeString &pattern,
127 CharacterIterator &text, 108 CharacterIterator &text,
128 RuleBasedCollator *coll, 109 RuleBasedCollator *coll,
129 BreakIterator *breakiter, 110 BreakIterator *breakiter,
130 UErrorCode &status) : 111 UErrorCode &status) :
131 SearchIterator(text, breakiter), 112 SearchIterator(text, breakiter),
132 m_collator_(),
133 m_pattern_(pattern) 113 m_pattern_(pattern)
134 { 114 {
135 if (U_FAILURE(status)) { 115 if (U_FAILURE(status)) {
136 m_strsrch_ = NULL; 116 m_strsrch_ = NULL;
137 return; 117 return;
138 } 118 }
139 if (coll == NULL) { 119 if (coll == NULL) {
140 status = U_ILLEGAL_ARGUMENT_ERROR; 120 status = U_ILLEGAL_ARGUMENT_ERROR;
141 m_strsrch_ = NULL; 121 m_strsrch_ = NULL;
142 return; 122 return;
143 } 123 }
144 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 124 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(),
145 m_pattern_.length(), 125 m_pattern_.length(),
146 m_text_.getBuffer(), 126 m_text_.getBuffer(),
147 m_text_.length(), coll->ucollator, 127 m_text_.length(), coll->toUCollator(),
148 (UBreakIterator *)breakiter, 128 (UBreakIterator *)breakiter,
149 &status); 129 &status);
150 uprv_free(m_search_); 130 uprv_free(m_search_);
151 m_search_ = NULL; 131 m_search_ = NULL;
152 132
153 if (U_SUCCESS(status)) { 133 if (U_SUCCESS(status)) {
154 // Alias the collator
155 m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
156 // m_search_ has been created by the base SearchIterator class 134 // m_search_ has been created by the base SearchIterator class
157 m_search_ = m_strsrch_->search; 135 m_search_ = m_strsrch_->search;
158 } 136 }
159 } 137 }
160 138
161 StringSearch::StringSearch(const StringSearch &that) : 139 StringSearch::StringSearch(const StringSearch &that) :
162 SearchIterator(that.m_text_, that.m_breakiterator_), 140 SearchIterator(that.m_text_, that.m_breakiterator_),
163 m_collator_(),
164 m_pattern_(that.m_pattern_) 141 m_pattern_(that.m_pattern_)
165 { 142 {
166 UErrorCode status = U_ZERO_ERROR; 143 UErrorCode status = U_ZERO_ERROR;
167 144
168 // Free m_search_ from the superclass 145 // Free m_search_ from the superclass
169 uprv_free(m_search_); 146 uprv_free(m_search_);
170 m_search_ = NULL; 147 m_search_ = NULL;
171 148
172 if (that.m_strsrch_ == NULL) { 149 if (that.m_strsrch_ == NULL) {
173 // This was not a good copy 150 // This was not a good copy
174 m_strsrch_ = NULL; 151 m_strsrch_ = NULL;
175 } 152 }
176 else { 153 else {
177 // Make a deep copy 154 // Make a deep copy
178 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 155 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(),
179 m_pattern_.length(), 156 m_pattern_.length(),
180 m_text_.getBuffer(), 157 m_text_.getBuffer(),
181 m_text_.length(), 158 m_text_.length(),
182 that.m_strsrch_->collator, 159 that.m_strsrch_->collator,
183 (UBreakIterator *)that.m_breakitera tor_, 160 (UBreakIterator *)that.m_breakitera tor_,
184 &status); 161 &status);
185 if (U_SUCCESS(status)) { 162 if (U_SUCCESS(status)) {
186 // Alias the collator
187 m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
188 // m_search_ has been created by the base SearchIterator class 163 // m_search_ has been created by the base SearchIterator class
189 m_search_ = m_strsrch_->search; 164 m_search_ = m_strsrch_->search;
190 } 165 }
191 } 166 }
192 } 167 }
193 168
194 StringSearch::~StringSearch() 169 StringSearch::~StringSearch()
195 { 170 {
196 if (m_strsrch_ != NULL) { 171 if (m_strsrch_ != NULL) {
197 usearch_close(m_strsrch_); 172 usearch_close(m_strsrch_);
(...skipping 17 matching lines...) Expand all
215 // all m_search_ in the parent class is linked up with m_strsrch_ 190 // all m_search_ in the parent class is linked up with m_strsrch_
216 usearch_close(m_strsrch_); 191 usearch_close(m_strsrch_);
217 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 192 m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(),
218 m_pattern_.length(), 193 m_pattern_.length(),
219 m_text_.getBuffer(), 194 m_text_.getBuffer(),
220 m_text_.length(), 195 m_text_.length(),
221 that.m_strsrch_->collator, 196 that.m_strsrch_->collator,
222 NULL, &status); 197 NULL, &status);
223 // Check null pointer 198 // Check null pointer
224 if (m_strsrch_ != NULL) { 199 if (m_strsrch_ != NULL) {
225 » // Alias the collator 200 m_search_ = m_strsrch_->search;
226 » m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
227 » m_search_ = m_strsrch_->search;
228 } 201 }
229 } 202 }
230 return *this; 203 return *this;
231 } 204 }
232 205
233 UBool StringSearch::operator==(const SearchIterator &that) const 206 UBool StringSearch::operator==(const SearchIterator &that) const
234 { 207 {
235 if (this == &that) { 208 if (this == &that) {
236 return TRUE; 209 return TRUE;
237 } 210 }
(...skipping 29 matching lines...) Expand all
267 void StringSearch::setText(CharacterIterator &text, UErrorCode &status) 240 void StringSearch::setText(CharacterIterator &text, UErrorCode &status)
268 { 241 {
269 if (U_SUCCESS(status)) { 242 if (U_SUCCESS(status)) {
270 text.getText(m_text_); 243 text.getText(m_text_);
271 usearch_setText(m_strsrch_, m_text_.getBuffer(), m_text_.length(), &stat us); 244 usearch_setText(m_strsrch_, m_text_.getBuffer(), m_text_.length(), &stat us);
272 } 245 }
273 } 246 }
274 247
275 RuleBasedCollator * StringSearch::getCollator() const 248 RuleBasedCollator * StringSearch::getCollator() const
276 { 249 {
277 return (RuleBasedCollator *)&m_collator_; 250 // Note the const_cast. It would be cleaner if this const method returned a const collator.
251 return RuleBasedCollator::rbcFromUCollator(const_cast<UCollator *>(m_strsrch _->collator));
278 } 252 }
279 253
280 void StringSearch::setCollator(RuleBasedCollator *coll, UErrorCode &status) 254 void StringSearch::setCollator(RuleBasedCollator *coll, UErrorCode &status)
281 { 255 {
282 if (U_SUCCESS(status)) { 256 if (U_SUCCESS(status)) {
283 usearch_setCollator(m_strsrch_, coll->getUCollator(), &status); 257 usearch_setCollator(m_strsrch_, coll->toUCollator(), &status);
284 // Alias the collator
285 m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
286 } 258 }
287 } 259 }
288 260
289 void StringSearch::setPattern(const UnicodeString &pattern, 261 void StringSearch::setPattern(const UnicodeString &pattern,
290 UErrorCode &status) 262 UErrorCode &status)
291 { 263 {
292 if (U_SUCCESS(status)) { 264 if (U_SUCCESS(status)) {
293 m_pattern_ = pattern; 265 m_pattern_ = pattern;
294 usearch_setPattern(m_strsrch_, m_pattern_.getBuffer(), m_pattern_.length (), 266 usearch_setPattern(m_strsrch_, m_pattern_.getBuffer(), m_pattern_.length (),
295 &status); 267 &status);
296 } 268 }
297 } 269 }
298 270
299 const UnicodeString & StringSearch::getPattern() const 271 const UnicodeString & StringSearch::getPattern() const
300 { 272 {
301 return m_pattern_; 273 return m_pattern_;
302 } 274 }
303 275
304 // public methods ---------------------------------------------------- 276 // public methods ----------------------------------------------------
305 277
306 void StringSearch::reset() 278 void StringSearch::reset()
307 { 279 {
308 usearch_reset(m_strsrch_); 280 usearch_reset(m_strsrch_);
309 } 281 }
310 282
311 SearchIterator * StringSearch::safeClone(void) const 283 SearchIterator * StringSearch::safeClone(void) const
312 { 284 {
313 UErrorCode status = U_ZERO_ERROR; 285 UErrorCode status = U_ZERO_ERROR;
314 StringSearch *result = new StringSearch(m_pattern_, m_text_, 286 StringSearch *result = new StringSearch(m_pattern_, m_text_,
315 (RuleBasedCollator *)&m_collator_, 287 getCollator(),
316 m_breakiterator_, 288 m_breakiterator_,
317 status); 289 status);
318 /* test for NULL */ 290 /* test for NULL */
319 if (result == 0) { 291 if (result == 0) {
320 status = U_MEMORY_ALLOCATION_ERROR; 292 status = U_MEMORY_ALLOCATION_ERROR;
321 return 0; 293 return 0;
322 } 294 }
323 result->setOffset(getOffset(), status); 295 result->setOffset(getOffset(), status);
324 result->setMatchStart(m_strsrch_->search->matchedIndex); 296 result->setMatchStart(m_strsrch_->search->matchedIndex);
325 result->setMatchLength(m_strsrch_->search->matchedLength); 297 result->setMatchLength(m_strsrch_->search->matchedLength);
326 if (U_FAILURE(status)) { 298 if (U_FAILURE(status)) {
327 return NULL; 299 return NULL;
328 } 300 }
329 return result; 301 return result;
330 } 302 }
331 303
332 // protected method ------------------------------------------------- 304 // protected method -------------------------------------------------
333 305
334 int32_t StringSearch::handleNext(int32_t position, UErrorCode &status) 306 int32_t StringSearch::handleNext(int32_t position, UErrorCode &status)
335 { 307 {
336 // values passed here are already in the pre-shift position 308 // values passed here are already in the pre-shift position
337 if (U_SUCCESS(status)) { 309 if (U_SUCCESS(status)) {
338 if (m_strsrch_->pattern.CELength == 0) { 310 if (m_strsrch_->pattern.cesLength == 0) {
339 m_search_->matchedIndex = 311 m_search_->matchedIndex =
340 m_search_->matchedIndex == USEARCH_DONE ? 312 m_search_->matchedIndex == USEARCH_DONE ?
341 getOffset() : m_search_->matchedIndex + 1; 313 getOffset() : m_search_->matchedIndex + 1;
342 m_search_->matchedLength = 0; 314 m_search_->matchedLength = 0;
343 ucol_setOffset(m_strsrch_->textIter, m_search_->matchedIndex, 315 ucol_setOffset(m_strsrch_->textIter, m_search_->matchedIndex,
344 &status); 316 &status);
345 if (m_search_->matchedIndex == m_search_->textLength) { 317 if (m_search_->matchedIndex == m_search_->textLength) {
346 m_search_->matchedIndex = USEARCH_DONE; 318 m_search_->matchedIndex = USEARCH_DONE;
347 } 319 }
348 } 320 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 #endif 398 #endif
427 } 399 }
428 } 400 }
429 return USEARCH_DONE; 401 return USEARCH_DONE;
430 } 402 }
431 403
432 int32_t StringSearch::handlePrev(int32_t position, UErrorCode &status) 404 int32_t StringSearch::handlePrev(int32_t position, UErrorCode &status)
433 { 405 {
434 // values passed here are already in the pre-shift position 406 // values passed here are already in the pre-shift position
435 if (U_SUCCESS(status)) { 407 if (U_SUCCESS(status)) {
436 if (m_strsrch_->pattern.CELength == 0) { 408 if (m_strsrch_->pattern.cesLength == 0) {
437 m_search_->matchedIndex = 409 m_search_->matchedIndex =
438 (m_search_->matchedIndex == USEARCH_DONE ? getOffset() : 410 (m_search_->matchedIndex == USEARCH_DONE ? getOffset() :
439 m_search_->matchedIndex); 411 m_search_->matchedIndex);
440 if (m_search_->matchedIndex == 0) { 412 if (m_search_->matchedIndex == 0) {
441 setMatchNotFound(); 413 setMatchNotFound();
442 } 414 }
443 else { 415 else {
444 m_search_->matchedIndex --; 416 m_search_->matchedIndex --;
445 ucol_setOffset(m_strsrch_->textIter, m_search_->matchedIndex, 417 ucol_setOffset(m_strsrch_->textIter, m_search_->matchedIndex,
446 &status); 418 &status);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 } 472 }
501 473
502 return m_search_->matchedIndex; 474 return m_search_->matchedIndex;
503 } 475 }
504 return USEARCH_DONE; 476 return USEARCH_DONE;
505 } 477 }
506 478
507 U_NAMESPACE_END 479 U_NAMESPACE_END
508 480
509 #endif /* #if !UCONFIG_NO_COLLATION */ 481 #endif /* #if !UCONFIG_NO_COLLATION */
OLDNEW
« no previous file with comments | « source/i18n/smpdtfmt.cpp ('k') | source/i18n/tblcoll.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698