1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* 2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)********************************************************************** 3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (C) 2001-2008 IBM and others. All rights reserved. 4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)********************************************************************** 5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Date Name Description 6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* 03/22/2000 helena Creation. 7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)********************************************************************** 8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/ 9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h" 11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION 13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/stsearch.h" 15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "usrchimp.h" 16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cmemory.h" 17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN 19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UOBJECT_DEFINE_RTTI_IMPLEMENTATION(StringSearch) 21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// public constructors and destructors ----------------------------------- 23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch::StringSearch(const UnicodeString &pattern, 25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &text, 26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const Locale &locale, 27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BreakIterator *breakiter, 28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) : 29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SearchIterator(text, breakiter), 30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_(), 31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_(pattern) 32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = NULL; 35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(), 39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.getBuffer(), m_text_.length(), 40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) locale.getName(), (UBreakIterator *)breakiter, 41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(m_search_); 43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = NULL; 44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // !!! dlf m_collator_ is an odd beast. basically it is an aliasing 46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // wrapper around the internal collator and rules, which (here) are 47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // owned by this stringsearch object. this means 1) it's destructor 48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // _should not_ delete the ucollator or rules, and 2) changes made 49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // to the exposed collator (setStrength etc) _should_ modify the 50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // ucollator. thus the collator is not a copy-on-write alias, and it 51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // needs to distinguish itself not merely from 'stand alone' colators 52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // but also from copy-on-write ones. it needs additional state, which 53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // setUCollator should set. 54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Alias the collator 57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_.setUCollator((UCollator *)m_strsrch_->collator); 58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // m_search_ has been created by the base SearchIterator class 59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = m_strsrch_->search; 60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch::StringSearch(const UnicodeString &pattern, 64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const UnicodeString &text, 65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RuleBasedCollator *coll, 66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BreakIterator *breakiter, 67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) : 68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SearchIterator(text, breakiter), 69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_(), 70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_(pattern) 71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = NULL; 74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (coll == NULL) { 77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ILLEGAL_ARGUMENT_ERROR; 78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = NULL; 79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_.length(), 83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.getBuffer(), 84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.length(), coll->ucollator, 85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (UBreakIterator *)breakiter, 86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(m_search_); 88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = NULL; 89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Alias the collator 92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_.setUCollator((UCollator *)m_strsrch_->collator); 93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // m_search_ has been created by the base SearchIterator class 94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = m_strsrch_->search; 95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch::StringSearch(const UnicodeString &pattern, 99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CharacterIterator &text, 100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) const Locale &locale, 101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BreakIterator *breakiter, 102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) : 103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SearchIterator(text, breakiter), 104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_(), 105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_(pattern) 106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = NULL; 109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(), 112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.getBuffer(), m_text_.length(), 113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) locale.getName(), (UBreakIterator *)breakiter, 114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(m_search_); 116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = NULL; 117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Alias the collator 120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_.setUCollator((UCollator *)m_strsrch_->collator); 121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // m_search_ has been created by the base SearchIterator class 122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = m_strsrch_->search; 123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch::StringSearch(const UnicodeString &pattern, 127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) CharacterIterator &text, 128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) RuleBasedCollator *coll, 129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) BreakIterator *breakiter, 130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) : 131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SearchIterator(text, breakiter), 132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_(), 133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_(pattern) 134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = NULL; 137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (coll == NULL) { 140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_ILLEGAL_ARGUMENT_ERROR; 141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = NULL; 142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return; 143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_.length(), 146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.getBuffer(), 147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.length(), coll->ucollator, 148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (UBreakIterator *)breakiter, 149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(m_search_); 151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = NULL; 152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Alias the collator 155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_.setUCollator((UCollator *)m_strsrch_->collator); 156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // m_search_ has been created by the base SearchIterator class 157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = m_strsrch_->search; 158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch::StringSearch(const StringSearch &that) : 162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) SearchIterator(that.m_text_, that.m_breakiterator_), 163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_(), 164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_(that.m_pattern_) 165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode status = U_ZERO_ERROR; 167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Free m_search_ from the superclass 169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) uprv_free(m_search_); 170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = NULL; 171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (that.m_strsrch_ == NULL) { 173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // This was not a good copy 174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = NULL; 175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) else { 177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Make a deep copy 178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_.length(), 180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.getBuffer(), 181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.length(), 182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) that.m_strsrch_->collator, 183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (UBreakIterator *)that.m_breakiterator_, 184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Alias the collator 187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_.setUCollator((UCollator *)m_strsrch_->collator); 188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // m_search_ has been created by the base SearchIterator class 189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = m_strsrch_->search; 190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch::~StringSearch() 195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_strsrch_ != NULL) { 197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_close(m_strsrch_); 198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = NULL; 199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch * 203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch::clone() const { 204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return new StringSearch(*this); 205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// operator overloading --------------------------------------------- 208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)StringSearch & StringSearch::operator=(const StringSearch &that) 209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if ((*this) != that) { 211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode status = U_ZERO_ERROR; 212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_ = that.m_text_; 213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_breakiterator_ = that.m_breakiterator_; 214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_ = that.m_pattern_; 215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // all m_search_ in the parent class is linked up with m_strsrch_ 216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_close(m_strsrch_); 217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(), 218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_.length(), 219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.getBuffer(), 220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_.length(), 221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) that.m_strsrch_->collator, 222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) NULL, &status); 223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Check null pointer 224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_strsrch_ != NULL) { 225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Alias the collator 226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_.setUCollator((UCollator *)m_strsrch_->collator); 227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_ = m_strsrch_->search; 228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return *this; 231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UBool StringSearch::operator==(const SearchIterator &that) const 234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (this == &that) { 236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return TRUE; 237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (SearchIterator::operator ==(that)) { 239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) StringSearch &thatsrch = (StringSearch &)that; 240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return (this->m_pattern_ == thatsrch.m_pattern_ && 241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) this->m_strsrch_->collator == thatsrch.m_strsrch_->collator); 242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return FALSE; 244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// public get and set methods ---------------------------------------- 247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void StringSearch::setOffset(int32_t position, UErrorCode &status) 249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // status checked in usearch_setOffset 251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_setOffset(m_strsrch_, position, &status); 252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t StringSearch::getOffset(void) const 255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return usearch_getOffset(m_strsrch_); 257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void StringSearch::setText(const UnicodeString &text, UErrorCode &status) 260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_text_ = text; 263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_setText(m_strsrch_, text.getBuffer(), text.length(), &status); 264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void StringSearch::setText(CharacterIterator &text, UErrorCode &status) 268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) text.getText(m_text_); 271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_setText(m_strsrch_, m_text_.getBuffer(), m_text_.length(), &status); 272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)RuleBasedCollator * StringSearch::getCollator() const 276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return (RuleBasedCollator *)&m_collator_; 278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void StringSearch::setCollator(RuleBasedCollator *coll, UErrorCode &status) 281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_setCollator(m_strsrch_, coll->getUCollator(), &status); 284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // Alias the collator 285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_collator_.setUCollator((UCollator *)m_strsrch_->collator); 286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void StringSearch::setPattern(const UnicodeString &pattern, 290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode &status) 291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_pattern_ = pattern; 294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_setPattern(m_strsrch_, m_pattern_.getBuffer(), m_pattern_.length(), 295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)const UnicodeString & StringSearch::getPattern() const 300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return m_pattern_; 302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// public methods ---------------------------------------------------- 305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)void StringSearch::reset() 307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_reset(m_strsrch_); 309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)SearchIterator * StringSearch::safeClone(void) const 312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) UErrorCode status = U_ZERO_ERROR; 314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) StringSearch *result = new StringSearch(m_pattern_, m_text_, 315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (RuleBasedCollator *)&m_collator_, 316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_breakiterator_, 317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status); 318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /* test for NULL */ 319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (result == 0) { 320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) status = U_MEMORY_ALLOCATION_ERROR; 321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return 0; 322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) result->setOffset(getOffset(), status); 324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) result->setMatchStart(m_strsrch_->search->matchedIndex); 325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) result->setMatchLength(m_strsrch_->search->matchedLength); 326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return NULL; 328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return result; 330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)// protected method ------------------------------------------------- 333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t StringSearch::handleNext(int32_t position, UErrorCode &status) 335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // values passed here are already in the pre-shift position 337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_strsrch_->pattern.CELength == 0) { 339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex = 340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex == USEARCH_DONE ? 341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) getOffset() : m_search_->matchedIndex + 1; 342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedLength = 0; 343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, m_search_->matchedIndex, 344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->matchedIndex == m_search_->textLength) { 346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex = USEARCH_DONE; 347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) else { 350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // looking at usearch.cpp, this part is shifted out to 351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // StringSearch instead of SearchIterator because m_strsrch_ is 352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // not accessible in SearchIterator 353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if 0 354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (position + m_strsrch_->pattern.defaultShiftSize 355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) > m_search_->textLength) { 356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) setMatchNotFound(); 357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->matchedLength <= 0) { 361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // the flipping direction issue has already been handled 362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // in next() 363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // for boundary check purposes. this will ensure that the 364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // next match will not preceed the current offset 365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // note search->matchedIndex will always be set to something 366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // in the code 367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex = position - 1; 368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, position, &status); 371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if 0 373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (;;) { 374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->isCanonicalMatch) { 375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // can't use exact here since extra accents are allowed. 376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handleNextCanonical(m_strsrch_, &status); 377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) else { 379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handleNextExact(m_strsrch_, &status); 380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_breakiterator_ == NULL 385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_BREAK_ITERATION 386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) || 387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex == USEARCH_DONE || 388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (m_breakiterator_->isBoundary(m_search_->matchedIndex) && 389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_breakiterator_->isBoundary(m_search_->matchedIndex + 390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedLength)) 391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ) { 393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->matchedIndex == USEARCH_DONE) { 394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, 395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->textLength, &status); 396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) else { 398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, 399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex, &status); 400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return m_search_->matchedIndex; 402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#else 405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // if m_strsrch_->breakIter is always the same as m_breakiterator_ 406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // then we don't need to check the match boundaries here because 407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // usearch_handleNextXXX will already have done it. 408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->isCanonicalMatch) { 409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // *could* actually use exact here 'cause no extra accents allowed... 410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handleNextCanonical(m_strsrch_, &status); 411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handleNextExact(m_strsrch_, &status); 413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->matchedIndex == USEARCH_DONE) { 420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, m_search_->textLength, &status); 421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, m_search_->matchedIndex, &status); 423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return m_search_->matchedIndex; 426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)int32_t StringSearch::handlePrev(int32_t position, UErrorCode &status) 433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){ 434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // values passed here are already in the pre-shift position 435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_SUCCESS(status)) { 436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_strsrch_->pattern.CELength == 0) { 437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex = 438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (m_search_->matchedIndex == USEARCH_DONE ? getOffset() : 439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex); 440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->matchedIndex == 0) { 441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) setMatchNotFound(); 442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) else { 444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex --; 445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, m_search_->matchedIndex, 446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) &status); 447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedLength = 0; 448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) else { 451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // looking at usearch.cpp, this part is shifted out to 452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // StringSearch instead of SearchIterator because m_strsrch_ is 453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // not accessible in SearchIterator 454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if 0 455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (!m_search_->isOverlap && 456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) position - m_strsrch_->pattern.defaultShiftSize < 0) { 457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) setMatchNotFound(); 458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) for (;;) { 462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->isCanonicalMatch) { 463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // can't use exact here since extra accents are allowed. 464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handlePreviousCanonical(m_strsrch_, &status); 465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) else { 467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handlePreviousExact(m_strsrch_, &status); 468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_breakiterator_ == NULL 473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_BREAK_ITERATION 474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) || 475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedIndex == USEARCH_DONE || 476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) (m_breakiterator_->isBoundary(m_search_->matchedIndex) && 477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_breakiterator_->isBoundary(m_search_->matchedIndex + 478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) m_search_->matchedLength)) 479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ) { 481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return m_search_->matchedIndex; 482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#else 485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) ucol_setOffset(m_strsrch_->textIter, position, &status); 486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (m_search_->isCanonicalMatch) { 488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) // *could* use exact match here since extra accents *not* allowed! 489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handlePreviousCanonical(m_strsrch_, &status); 490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } else { 491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) usearch_handlePreviousExact(m_strsrch_, &status); 492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) if (U_FAILURE(status)) { 495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return m_search_->matchedIndex; 499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif 500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return m_search_->matchedIndex; 503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) } 504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) return USEARCH_DONE; 505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} 506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END 508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) 509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* #if !UCONFIG_NO_COLLATION */ 510