]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/coleitr.cpp
ICU-461.12.tar.gz
[apple/icu.git] / icuSources / i18n / coleitr.cpp
index 8c1b87f4960809bab9156d5399ee6bd530018997..173166af622dc131b7f19372e2a035b15887f6df 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-* Copyright (C) 1996-2006, International Business Machines Corporation and    *
+* Copyright (C) 1996-2010, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
@@ -86,11 +86,7 @@ UBool CollationElementIterator::operator!=(
 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;
     }
 
@@ -103,10 +99,8 @@ UBool CollationElementIterator::operator==(
     // 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;
@@ -123,19 +117,19 @@ UBool CollationElementIterator::operator==(
 
     // 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
@@ -182,7 +176,7 @@ void CollationElementIterator::setText(const UnicodeString& source,
     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) {
@@ -203,8 +197,10 @@ void CollationElementIterator::setText(const UnicodeString& source,
         }
         *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;
 }
@@ -245,11 +241,13 @@ void CollationElementIterator::setText(CharacterIterator& source,
     }
 
     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;
 }
 
@@ -400,7 +398,7 @@ const CollationElementIterator& CollationElementIterator::operator=(
 
         // 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;
@@ -409,7 +407,7 @@ const CollationElementIterator& CollationElementIterator::operator=(
         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;
@@ -425,27 +423,8 @@ const CollationElementIterator& CollationElementIterator::operator=(
         /* 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 */
@@ -456,18 +435,31 @@ const CollationElementIterator& CollationElementIterator::operator=(
                 (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 +