Index: source/common/caniter.cpp |
diff --git a/source/common/caniter.cpp b/source/common/caniter.cpp |
index d47681787755ee6be6cd1658fa1c72a8cab62745..58b378181056fccc4f287417004d836dfdbe93f6 100644 |
--- a/source/common/caniter.cpp |
+++ b/source/common/caniter.cpp |
@@ -1,6 +1,6 @@ |
/* |
***************************************************************************** |
- * Copyright (C) 1996-2014, International Business Machines Corporation and |
+ * Copyright (C) 1996-2015, International Business Machines Corporation and |
* others. All Rights Reserved. |
***************************************************************************** |
*/ |
@@ -294,7 +294,7 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros |
for (i = 0; i < source.length(); i += U16_LENGTH(cp)) { |
cp = source.char32At(i); |
const UHashElement *ne = NULL; |
- int32_t el = -1; |
+ int32_t el = UHASH_FIRST; |
UnicodeString subPermuteString = source; |
// optimization: |
@@ -359,7 +359,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i |
// TODO: optimize by not permuting any class zero. |
const UHashElement *ne = NULL; |
- int32_t el = -1; |
+ int32_t el = UHASH_FIRST; |
//Iterator it = basic.iterator(); |
ne = basic.nextElement(el); |
//while (it.hasNext()) |
@@ -370,7 +370,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i |
permutations.removeAll(); |
permute(item, CANITER_SKIP_ZEROES, &permutations, status); |
const UHashElement *ne2 = NULL; |
- int32_t el2 = -1; |
+ int32_t el2 = UHASH_FIRST; |
//Iterator it2 = permutations.iterator(); |
ne2 = permutations.nextElement(el2); |
//while (it2.hasNext()) |
@@ -416,7 +416,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i |
} |
//result.toArray(finalResult); |
result_len = 0; |
- el = -1; |
+ el = UHASH_FIRST; |
ne = result.nextElement(el); |
while(ne != NULL) { |
finalResult[result_len++] = *((UnicodeString *)(ne->value.pointer)); |
@@ -463,7 +463,7 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const UCh |
UnicodeString prefix(segment, i); |
prefix += cp2; |
- int32_t el = -1; |
+ int32_t el = UHASH_FIRST; |
const UHashElement *ne = remainder.nextElement(el); |
while (ne != NULL) { |
UnicodeString item = *((UnicodeString *)(ne->value.pointer)); |
@@ -508,6 +508,13 @@ Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, con |
int32_t inputLen=temp.length(); |
UnicodeString decompString; |
nfd.normalize(temp, decompString, status); |
+ if (U_FAILURE(status)) { |
+ return NULL; |
+ } |
+ if (decompString.isBogus()) { |
+ status = U_MEMORY_ALLOCATION_ERROR; |
+ return NULL; |
+ } |
const UChar *decomp=decompString.getBuffer(); |
int32_t decompLen=decompString.length(); |