| Index: source/i18n/collationcompare.cpp
|
| diff --git a/source/i18n/collationcompare.cpp b/source/i18n/collationcompare.cpp
|
| index 6f9107e9db516416fdbdec4493f6cd585d9897ac..3b72d05d718a0f6bb2e7221936a23f82e5562e29 100644
|
| --- a/source/i18n/collationcompare.cpp
|
| +++ b/source/i18n/collationcompare.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| *******************************************************************************
|
| -* Copyright (C) 1996-2014, International Business Machines
|
| +* Copyright (C) 1996-2015, International Business Machines
|
| * Corporation and others. All Rights Reserved.
|
| *******************************************************************************
|
| * collationcompare.cpp
|
| @@ -40,7 +40,6 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
| UBool anyVariable = FALSE;
|
|
|
| // Fetch CEs, compare primaries, store secondary & tertiary weights.
|
| - U_ALIGN_CODE(16);
|
| for(;;) {
|
| // We fetch CEs until we get a non-ignorable primary or reach the end.
|
| uint32_t leftPrimary;
|
| @@ -95,10 +94,9 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
|
|
| if(leftPrimary != rightPrimary) {
|
| // Return the primary difference, with script reordering.
|
| - const uint8_t *reorderTable = settings.reorderTable;
|
| - if (reorderTable != NULL) {
|
| - leftPrimary = Collation::reorder(reorderTable, leftPrimary);
|
| - rightPrimary = Collation::reorder(reorderTable, rightPrimary);
|
| + if(settings.hasReordering()) {
|
| + leftPrimary = settings.reorder(leftPrimary);
|
| + rightPrimary = settings.reorder(rightPrimary);
|
| }
|
| return (leftPrimary < rightPrimary) ? UCOL_LESS : UCOL_GREATER;
|
| }
|
| @@ -136,18 +134,17 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
| int32_t rightStart = 0;
|
| for(;;) {
|
| // Find the merge separator or the NO_CE terminator.
|
| + uint32_t p;
|
| int32_t leftLimit = leftStart;
|
| - uint32_t leftLower32;
|
| - while((leftLower32 = (uint32_t)left.getCE(leftLimit)) >
|
| - Collation::MERGE_SEPARATOR_LOWER32 ||
|
| - leftLower32 == 0) {
|
| + while((p = (uint32_t)(left.getCE(leftLimit) >> 32)) >
|
| + Collation::MERGE_SEPARATOR_PRIMARY ||
|
| + p == 0) {
|
| ++leftLimit;
|
| }
|
| int32_t rightLimit = rightStart;
|
| - uint32_t rightLower32;
|
| - while((rightLower32 = (uint32_t)right.getCE(rightLimit)) >
|
| - Collation::MERGE_SEPARATOR_LOWER32 ||
|
| - rightLower32 == 0) {
|
| + while((p = (uint32_t)(right.getCE(rightLimit) >> 32)) >
|
| + Collation::MERGE_SEPARATOR_PRIMARY ||
|
| + p == 0) {
|
| ++rightLimit;
|
| }
|
|
|
| @@ -175,7 +172,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
| // Both strings have the same number of merge separators,
|
| // or else there would have been a primary-level difference.
|
| U_ASSERT(left.getCE(leftLimit) == right.getCE(rightLimit));
|
| - if(left.getCE(leftLimit) == Collation::NO_CE) { break; }
|
| + if(p == Collation::NO_CE_PRIMARY) { break; }
|
| // Skip both merge separators and continue.
|
| leftStart = leftLimit + 1;
|
| rightStart = rightLimit + 1;
|
| @@ -276,20 +273,19 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
|
|
| if(leftTertiary != rightTertiary) {
|
| if(CollationSettings::sortsTertiaryUpperCaseFirst(options)) {
|
| - // Pass through NO_CE and MERGE_SEPARATOR
|
| - // and keep real tertiary weights larger than the MERGE_SEPARATOR.
|
| + // Pass through NO_CE and keep real tertiary weights larger than that.
|
| // Do not change the artificial uppercase weight of a tertiary CE (0.0.ut),
|
| // to keep tertiary CEs well-formed.
|
| // Their case+tertiary weights must be greater than those of
|
| // primary and secondary CEs.
|
| - if(leftTertiary > Collation::MERGE_SEPARATOR_WEIGHT16) {
|
| + if(leftTertiary > Collation::NO_CE_WEIGHT16) {
|
| if(leftLower32 > 0xffff) {
|
| leftTertiary ^= 0xc000;
|
| } else {
|
| leftTertiary += 0x4000;
|
| }
|
| }
|
| - if(rightTertiary > Collation::MERGE_SEPARATOR_WEIGHT16) {
|
| + if(rightTertiary > Collation::NO_CE_WEIGHT16) {
|
| if(rightLower32 > 0xffff) {
|
| rightTertiary ^= 0xc000;
|
| } else {
|
| @@ -316,11 +312,9 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
| do {
|
| int64_t ce = left.getCE(leftIndex++);
|
| leftQuaternary = (uint32_t)ce & 0xffff;
|
| - if(leftQuaternary == 0) {
|
| - // Variable primary or completely ignorable.
|
| + if(leftQuaternary <= Collation::NO_CE_WEIGHT16) {
|
| + // Variable primary or completely ignorable or NO_CE.
|
| leftQuaternary = (uint32_t)(ce >> 32);
|
| - } else if(leftQuaternary <= Collation::MERGE_SEPARATOR_WEIGHT16) {
|
| - // Leave NO_CE or MERGE_SEPARATOR as is.
|
| } else {
|
| // Regular CE, not tertiary ignorable.
|
| // Preserve the quaternary weight in bits 7..6.
|
| @@ -332,11 +326,9 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
| do {
|
| int64_t ce = right.getCE(rightIndex++);
|
| rightQuaternary = (uint32_t)ce & 0xffff;
|
| - if(rightQuaternary == 0) {
|
| - // Variable primary or completely ignorable.
|
| + if(rightQuaternary <= Collation::NO_CE_WEIGHT16) {
|
| + // Variable primary or completely ignorable or NO_CE.
|
| rightQuaternary = (uint32_t)(ce >> 32);
|
| - } else if(rightQuaternary <= Collation::MERGE_SEPARATOR_WEIGHT16) {
|
| - // Leave NO_CE or MERGE_SEPARATOR as is.
|
| } else {
|
| // Regular CE, not tertiary ignorable.
|
| // Preserve the quaternary weight in bits 7..6.
|
| @@ -346,14 +338,13 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat
|
|
|
| if(leftQuaternary != rightQuaternary) {
|
| // Return the difference, with script reordering.
|
| - const uint8_t *reorderTable = settings.reorderTable;
|
| - if (reorderTable != NULL) {
|
| - leftQuaternary = Collation::reorder(reorderTable, leftQuaternary);
|
| - rightQuaternary = Collation::reorder(reorderTable, rightQuaternary);
|
| + if(settings.hasReordering()) {
|
| + leftQuaternary = settings.reorder(leftQuaternary);
|
| + rightQuaternary = settings.reorder(rightQuaternary);
|
| }
|
| return (leftQuaternary < rightQuaternary) ? UCOL_LESS : UCOL_GREATER;
|
| }
|
| - if(leftQuaternary == Collation::NO_CE_WEIGHT16) { break; }
|
| + if(leftQuaternary == Collation::NO_CE_PRIMARY) { break; }
|
| }
|
| return UCOL_EQUAL;
|
| }
|
|
|