/*
*******************************************************************************
-* Copyright (C) 1996-2006, International Business Machines Corporation and *
+* Copyright (C) 1996-2010, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
UBool CollationElementIterator::operator==(
const CollationElementIterator& that) const
{
- if (this == &that) {
- return TRUE;
- }
-
- if (m_data_ == that.m_data_) {
+ if (this == &that || m_data_ == that.m_data_) {
return TRUE;
}
// the constructor and setText always sets a length
// and we only compare the string not the contents of the normalization
// buffer
- int thislength = m_data_->iteratordata_.endp -
- m_data_->iteratordata_.string;
- int thatlength = that.m_data_->iteratordata_.endp -
- that.m_data_->iteratordata_.string;
+ int thislength = (int)(m_data_->iteratordata_.endp - m_data_->iteratordata_.string);
+ int thatlength = (int)(that.m_data_->iteratordata_.endp - that.m_data_->iteratordata_.string);
if (thislength != thatlength) {
return FALSE;
// checking normalization buffer
if ((m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) == 0) {
- if ((m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) != 0) {
+ if ((that.m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) != 0) {
return FALSE;
}
// both are in the normalization buffer
if (m_data_->iteratordata_.pos
- - m_data_->iteratordata_.writableBuffer
+ - m_data_->iteratordata_.writableBuffer.getBuffer()
!= that.m_data_->iteratordata_.pos
- - that.m_data_->iteratordata_.writableBuffer) {
+ - that.m_data_->iteratordata_.writableBuffer.getBuffer()) {
// not in the same position in the normalization buffer
return FALSE;
}
}
- else if ((m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) == 0) {
+ else if ((that.m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) == 0) {
return FALSE;
}
// checking ce position
int32_t length = source.length();
UChar *string = NULL;
if (m_data_->isWritable && m_data_->iteratordata_.string != NULL) {
- uprv_free(m_data_->iteratordata_.string);
+ uprv_free((UChar *)m_data_->iteratordata_.string);
}
m_data_->isWritable = TRUE;
if (length > 0) {
}
*string = 0;
}
+ /* Free offsetBuffer before initializing it. */
+ ucol_freeOffsetBuffer(&(m_data_->iteratordata_));
uprv_init_collIterate(m_data_->iteratordata_.coll, string, length,
- &m_data_->iteratordata_);
+ &m_data_->iteratordata_, &status);
m_data_->reset_ = TRUE;
}
}
if (m_data_->isWritable && m_data_->iteratordata_.string != NULL) {
- uprv_free(m_data_->iteratordata_.string);
+ uprv_free((UChar *)m_data_->iteratordata_.string);
}
m_data_->isWritable = TRUE;
+ /* Free offsetBuffer before initializing it. */
+ ucol_freeOffsetBuffer(&(m_data_->iteratordata_));
uprv_init_collIterate(m_data_->iteratordata_.coll, buffer, length,
- &m_data_->iteratordata_);
+ &m_data_->iteratordata_, &status);
m_data_->reset_ = TRUE;
}
// checking only UCOL_ITER_HASLEN is not enough here as we may be in
// the normalization buffer
- length = othercoliter->endp - othercoliter->string;
+ length = (int)(othercoliter->endp - othercoliter->string);
ucolelem->reset_ = otherucolelem->reset_;
ucolelem->isWritable = TRUE;
if (length > 0) {
coliter->string = (UChar *)uprv_malloc(length * U_SIZEOF_UCHAR);
if(coliter->string != NULL) {
- uprv_memcpy(coliter->string, othercoliter->string,
+ uprv_memcpy((UChar *)coliter->string, othercoliter->string,
length * U_SIZEOF_UCHAR);
} else { // Error: couldn't allocate memory. No copying should be done
length = 0;
/* handle writable buffer here */
if (othercoliter->flags & UCOL_ITER_INNORMBUF) {
- uint32_t wlength = u_strlen(othercoliter->writableBuffer) + 1;
- if (wlength < coliter->writableBufSize) {
- uprv_memcpy(coliter->stackWritableBuffer,
- othercoliter->stackWritableBuffer,
- wlength * U_SIZEOF_UCHAR);
- }
- else {
- if (coliter->writableBuffer != coliter->stackWritableBuffer) {
- uprv_free(coliter->writableBuffer);
- }
- coliter->writableBuffer = (UChar *)uprv_malloc(
- wlength * U_SIZEOF_UCHAR);
- if(coliter->writableBuffer != NULL) {
- uprv_memcpy(coliter->writableBuffer,
- othercoliter->writableBuffer,
- wlength * U_SIZEOF_UCHAR);
- coliter->writableBufSize = wlength;
- } else { // Error: couldn't allocate memory for writableBuffer
- coliter->writableBufSize = 0;
- }
- }
+ coliter->writableBuffer = othercoliter->writableBuffer;
+ coliter->writableBuffer.getTerminatedBuffer();
}
/* current position */
(othercoliter->pos - othercoliter->string);
}
else {
- coliter->pos = coliter->writableBuffer +
- (othercoliter->pos - othercoliter->writableBuffer);
+ coliter->pos = coliter->writableBuffer.getTerminatedBuffer() +
+ (othercoliter->pos - othercoliter->writableBuffer.getBuffer());
}
/* CE buffer */
- int32_t CEsize = (int32_t)(othercoliter->CEpos - othercoliter->CEs);
- if (CEsize > 0) {
- uprv_memcpy(coliter->CEs, othercoliter->CEs, CEsize);
+ int32_t CEsize;
+ if (coliter->extendCEs) {
+ uprv_memcpy(coliter->CEs, othercoliter->CEs, sizeof(uint32_t) * UCOL_EXPAND_CE_BUFFER_SIZE);
+ CEsize = sizeof(othercoliter->extendCEs);
+ if (CEsize > 0) {
+ othercoliter->extendCEs = (uint32_t *)uprv_malloc(CEsize);
+ uprv_memcpy(coliter->extendCEs, othercoliter->extendCEs, CEsize);
+ }
+ coliter->toReturn = coliter->extendCEs +
+ (othercoliter->toReturn - othercoliter->extendCEs);
+ coliter->CEpos = coliter->extendCEs + CEsize;
+ } else {
+ CEsize = (int32_t)(othercoliter->CEpos - othercoliter->CEs);
+ if (CEsize > 0) {
+ uprv_memcpy(coliter->CEs, othercoliter->CEs, CEsize);
+ }
+ coliter->toReturn = coliter->CEs +
+ (othercoliter->toReturn - othercoliter->CEs);
+ coliter->CEpos = coliter->CEs + CEsize;
}
- coliter->toReturn = coliter->CEs +
- (othercoliter->toReturn - othercoliter->CEs);
- coliter->CEpos = coliter->CEs + CEsize;
if (othercoliter->fcdPosition != NULL) {
coliter->fcdPosition = coliter->string +