diff --git a/icu4c/source/common/utext.cpp b/icu4c/source/common/utext.cpp index dfc9a61da55..40266ffb860 100644 --- a/icu4c/source/common/utext.cpp +++ b/icu4c/source/common/utext.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 2005-2008, International Business Machines +* Copyright (C) 2005-2009, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -2449,7 +2449,13 @@ ucstrTextAccess(UText *ut, int64_t index, UBool forward) { if (U16_IS_LEAD(str[chunkLimit-1])) { --chunkLimit; } + // Null-terminated chunk with end still unknown. + // Update the chunk length to reflect what has been scanned thus far. + // That the full length is still unknown is (still) flagged by + // ut->a being < 0. ut->chunkNativeLimit = chunkLimit; + ut->nativeIndexingLimit = chunkLimit; + ut->chunkLength = chunkLimit; } } diff --git a/icu4c/source/test/intltest/utxttest.cpp b/icu4c/source/test/intltest/utxttest.cpp index 35564ca08ba..c61d089a5ff 100644 --- a/icu4c/source/test/intltest/utxttest.cpp +++ b/icu4c/source/test/intltest/utxttest.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2005-2008, International Business Machines Corporation and + * Copyright (c) 2005-2009, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -54,8 +54,10 @@ UTextTest::runIndexedTest(int32_t index, UBool exec, if (exec) ErrorTest(); break; case 2: name = "FreezeTest"; if (exec) FreezeTest(); break; - case 3: name = "Ticket5560"; - if (exec) Ticket5560(); break; + case 3: name = "Ticket5560"; + if (exec) Ticket5560(); break; + case 4: name = "Ticket6847"; + if (exec) Ticket6847(); break; default: name = ""; break; } } @@ -1398,3 +1400,35 @@ void UTextTest::Ticket5560() { utext_close(&ut2); } + +// Test for Ticket 6847 +// +void UTextTest::Ticket6847() { + const int STRLEN = 90; + UChar s[STRLEN]; + u_memset(s, 0x41, STRLEN); + + UErrorCode status = U_ZERO_ERROR; + UText *ut = utext_openUChars(NULL, s, -1, &status); + + utext_setNativeIndex(ut, 0); + int32_t count = 0; + UChar32 c = 0; + int32_t nativeIndex = UTEXT_GETNATIVEINDEX(ut); + TEST_ASSERT(nativeIndex == 0); + while ((c = utext_next32(ut)) != U_SENTINEL) { + TEST_ASSERT(c == 0x41); + TEST_ASSERT(count < STRLEN); + if (count >= STRLEN) { + break; + } + count++; + nativeIndex = UTEXT_GETNATIVEINDEX(ut); + TEST_ASSERT(nativeIndex == count); + } + TEST_ASSERT(count == STRLEN); + nativeIndex = UTEXT_GETNATIVEINDEX(ut); + TEST_ASSERT(nativeIndex == STRLEN); + utext_close(ut); +} + diff --git a/icu4c/source/test/intltest/utxttest.h b/icu4c/source/test/intltest/utxttest.h index ca1e2f605eb..5e52f54d308 100644 --- a/icu4c/source/test/intltest/utxttest.h +++ b/icu4c/source/test/intltest/utxttest.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 2005-2007, International Business Machines Corporation and + * Copyright (c) 2005-2009, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /************************************************************************ @@ -31,7 +31,8 @@ public: void TextTest(); void ErrorTest(); void FreezeTest(); - void Ticket5560(); + void Ticket5560(); + void Ticket6847(); private: struct m { // Map between native indices & code points. @@ -44,8 +45,8 @@ private: void TestAccessNoClone(const UnicodeString &us, UText *ut, int cpCount, m *cpMap); void TestCMR (const UnicodeString &us, UText *ut, int cpCount, m *nativeMap, m *utf16Map); void TestCopyMove(const UnicodeString &us, UText *ut, UBool move, - int32_t nativeStart, int32_t nativeLimit, int32_t nativeDest, - int32_t u16Start, int32_t u16Limit, int32_t u16Dest); + int32_t nativeStart, int32_t nativeLimit, int32_t nativeDest, + int32_t u16Start, int32_t u16Limit, int32_t u16Dest); void TestReplace(const UnicodeString &us, // reference UnicodeString in which to do the replace UText *ut, // UnicodeText object under test. int32_t nativeStart, // Range to be replaced, in UText native units.