summaryrefslogtreecommitdiff
path: root/deps/node/deps/icu-small/source/i18n/collationcompare.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/icu-small/source/i18n/collationcompare.cpp')
-rw-r--r--deps/node/deps/icu-small/source/i18n/collationcompare.cpp356
1 files changed, 0 insertions, 356 deletions
diff --git a/deps/node/deps/icu-small/source/i18n/collationcompare.cpp b/deps/node/deps/icu-small/source/i18n/collationcompare.cpp
deleted file mode 100644
index cbf32c9f..00000000
--- a/deps/node/deps/icu-small/source/i18n/collationcompare.cpp
+++ /dev/null
@@ -1,356 +0,0 @@
-// © 2016 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-/*
-*******************************************************************************
-* Copyright (C) 1996-2015, International Business Machines
-* Corporation and others. All Rights Reserved.
-*******************************************************************************
-* collationcompare.cpp
-*
-* created on: 2012feb14 with new and old collation code
-* created by: Markus W. Scherer
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "unicode/ucol.h"
-#include "cmemory.h"
-#include "collation.h"
-#include "collationcompare.h"
-#include "collationiterator.h"
-#include "collationsettings.h"
-#include "uassert.h"
-
-U_NAMESPACE_BEGIN
-
-UCollationResult
-CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterator &right,
- const CollationSettings &settings,
- UErrorCode &errorCode) {
- if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
-
- int32_t options = settings.options;
- uint32_t variableTop;
- if((options & CollationSettings::ALTERNATE_MASK) == 0) {
- variableTop = 0;
- } else {
- // +1 so that we can use "<" and primary ignorables test out early.
- variableTop = settings.variableTop + 1;
- }
- UBool anyVariable = FALSE;
-
- // Fetch CEs, compare primaries, store secondary & tertiary weights.
- for(;;) {
- // We fetch CEs until we get a non-ignorable primary or reach the end.
- uint32_t leftPrimary;
- do {
- int64_t ce = left.nextCE(errorCode);
- leftPrimary = (uint32_t)(ce >> 32);
- if(leftPrimary < variableTop && leftPrimary > Collation::MERGE_SEPARATOR_PRIMARY) {
- // Variable CE, shift it to quaternary level.
- // Ignore all following primary ignorables, and shift further variable CEs.
- anyVariable = TRUE;
- do {
- // Store only the primary of the variable CE.
- left.setCurrentCE(ce & INT64_C(0xffffffff00000000));
- for(;;) {
- ce = left.nextCE(errorCode);
- leftPrimary = (uint32_t)(ce >> 32);
- if(leftPrimary == 0) {
- left.setCurrentCE(0);
- } else {
- break;
- }
- }
- } while(leftPrimary < variableTop &&
- leftPrimary > Collation::MERGE_SEPARATOR_PRIMARY);
- }
- } while(leftPrimary == 0);
-
- uint32_t rightPrimary;
- do {
- int64_t ce = right.nextCE(errorCode);
- rightPrimary = (uint32_t)(ce >> 32);
- if(rightPrimary < variableTop && rightPrimary > Collation::MERGE_SEPARATOR_PRIMARY) {
- // Variable CE, shift it to quaternary level.
- // Ignore all following primary ignorables, and shift further variable CEs.
- anyVariable = TRUE;
- do {
- // Store only the primary of the variable CE.
- right.setCurrentCE(ce & INT64_C(0xffffffff00000000));
- for(;;) {
- ce = right.nextCE(errorCode);
- rightPrimary = (uint32_t)(ce >> 32);
- if(rightPrimary == 0) {
- right.setCurrentCE(0);
- } else {
- break;
- }
- }
- } while(rightPrimary < variableTop &&
- rightPrimary > Collation::MERGE_SEPARATOR_PRIMARY);
- }
- } while(rightPrimary == 0);
-
- if(leftPrimary != rightPrimary) {
- // Return the primary difference, with script reordering.
- if(settings.hasReordering()) {
- leftPrimary = settings.reorder(leftPrimary);
- rightPrimary = settings.reorder(rightPrimary);
- }
- return (leftPrimary < rightPrimary) ? UCOL_LESS : UCOL_GREATER;
- }
- if(leftPrimary == Collation::NO_CE_PRIMARY) { break; }
- }
- if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
-
- // Compare the buffered secondary & tertiary weights.
- // We might skip the secondary level but continue with the case level
- // which is turned on separately.
- if(CollationSettings::getStrength(options) >= UCOL_SECONDARY) {
- if((options & CollationSettings::BACKWARD_SECONDARY) == 0) {
- int32_t leftIndex = 0;
- int32_t rightIndex = 0;
- for(;;) {
- uint32_t leftSecondary;
- do {
- leftSecondary = ((uint32_t)left.getCE(leftIndex++)) >> 16;
- } while(leftSecondary == 0);
-
- uint32_t rightSecondary;
- do {
- rightSecondary = ((uint32_t)right.getCE(rightIndex++)) >> 16;
- } while(rightSecondary == 0);
-
- if(leftSecondary != rightSecondary) {
- return (leftSecondary < rightSecondary) ? UCOL_LESS : UCOL_GREATER;
- }
- if(leftSecondary == Collation::NO_CE_WEIGHT16) { break; }
- }
- } else {
- // The backwards secondary level compares secondary weights backwards
- // within segments separated by the merge separator (U+FFFE, weight 02).
- int32_t leftStart = 0;
- int32_t rightStart = 0;
- for(;;) {
- // Find the merge separator or the NO_CE terminator.
- uint32_t p;
- int32_t leftLimit = leftStart;
- while((p = (uint32_t)(left.getCE(leftLimit) >> 32)) >
- Collation::MERGE_SEPARATOR_PRIMARY ||
- p == 0) {
- ++leftLimit;
- }
- int32_t rightLimit = rightStart;
- while((p = (uint32_t)(right.getCE(rightLimit) >> 32)) >
- Collation::MERGE_SEPARATOR_PRIMARY ||
- p == 0) {
- ++rightLimit;
- }
-
- // Compare the segments.
- int32_t leftIndex = leftLimit;
- int32_t rightIndex = rightLimit;
- for(;;) {
- int32_t leftSecondary = 0;
- while(leftSecondary == 0 && leftIndex > leftStart) {
- leftSecondary = ((uint32_t)left.getCE(--leftIndex)) >> 16;
- }
-
- int32_t rightSecondary = 0;
- while(rightSecondary == 0 && rightIndex > rightStart) {
- rightSecondary = ((uint32_t)right.getCE(--rightIndex)) >> 16;
- }
-
- if(leftSecondary != rightSecondary) {
- return (leftSecondary < rightSecondary) ? UCOL_LESS : UCOL_GREATER;
- }
- if(leftSecondary == 0) { break; }
- }
-
- // Did we reach the end of either string?
- // 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(p == Collation::NO_CE_PRIMARY) { break; }
- // Skip both merge separators and continue.
- leftStart = leftLimit + 1;
- rightStart = rightLimit + 1;
- }
- }
- }
-
- if((options & CollationSettings::CASE_LEVEL) != 0) {
- int32_t strength = CollationSettings::getStrength(options);
- int32_t leftIndex = 0;
- int32_t rightIndex = 0;
- for(;;) {
- uint32_t leftCase, leftLower32, rightCase;
- if(strength == UCOL_PRIMARY) {
- // Primary+caseLevel: Ignore case level weights of primary ignorables.
- // Otherwise we would get a-umlaut > a
- // which is not desirable for accent-insensitive sorting.
- // Check for (lower 32 bits) == 0 as well because variable CEs are stored
- // with only primary weights.
- int64_t ce;
- do {
- ce = left.getCE(leftIndex++);
- leftCase = (uint32_t)ce;
- } while((uint32_t)(ce >> 32) == 0 || leftCase == 0);
- leftLower32 = leftCase;
- leftCase &= 0xc000;
-
- do {
- ce = right.getCE(rightIndex++);
- rightCase = (uint32_t)ce;
- } while((uint32_t)(ce >> 32) == 0 || rightCase == 0);
- rightCase &= 0xc000;
- } else {
- // Secondary+caseLevel: By analogy with the above,
- // ignore case level weights of secondary ignorables.
- //
- // Note: A tertiary CE has uppercase case bits (0.0.ut)
- // to keep tertiary+caseFirst well-formed.
- //
- // Tertiary+caseLevel: Also ignore case level weights of secondary ignorables.
- // Otherwise a tertiary CE's uppercase would be no greater than
- // a primary/secondary CE's uppercase.
- // (See UCA well-formedness condition 2.)
- // We could construct a special case weight higher than uppercase,
- // but it's simpler to always ignore case weights of secondary ignorables,
- // turning 0.0.ut into 0.0.0.t.
- // (See LDML Collation, Case Parameters.)
- do {
- leftCase = (uint32_t)left.getCE(leftIndex++);
- } while(leftCase <= 0xffff);
- leftLower32 = leftCase;
- leftCase &= 0xc000;
-
- do {
- rightCase = (uint32_t)right.getCE(rightIndex++);
- } while(rightCase <= 0xffff);
- rightCase &= 0xc000;
- }
-
- // No need to handle NO_CE and MERGE_SEPARATOR specially:
- // There is one case weight for each previous-level weight,
- // so level length differences were handled there.
- if(leftCase != rightCase) {
- if((options & CollationSettings::UPPER_FIRST) == 0) {
- return (leftCase < rightCase) ? UCOL_LESS : UCOL_GREATER;
- } else {
- return (leftCase < rightCase) ? UCOL_GREATER : UCOL_LESS;
- }
- }
- if((leftLower32 >> 16) == Collation::NO_CE_WEIGHT16) { break; }
- }
- }
- if(CollationSettings::getStrength(options) <= UCOL_SECONDARY) { return UCOL_EQUAL; }
-
- uint32_t tertiaryMask = CollationSettings::getTertiaryMask(options);
-
- int32_t leftIndex = 0;
- int32_t rightIndex = 0;
- uint32_t anyQuaternaries = 0;
- for(;;) {
- uint32_t leftLower32, leftTertiary;
- do {
- leftLower32 = (uint32_t)left.getCE(leftIndex++);
- anyQuaternaries |= leftLower32;
- U_ASSERT((leftLower32 & Collation::ONLY_TERTIARY_MASK) != 0 ||
- (leftLower32 & 0xc0c0) == 0);
- leftTertiary = leftLower32 & tertiaryMask;
- } while(leftTertiary == 0);
-
- uint32_t rightLower32, rightTertiary;
- do {
- rightLower32 = (uint32_t)right.getCE(rightIndex++);
- anyQuaternaries |= rightLower32;
- U_ASSERT((rightLower32 & Collation::ONLY_TERTIARY_MASK) != 0 ||
- (rightLower32 & 0xc0c0) == 0);
- rightTertiary = rightLower32 & tertiaryMask;
- } while(rightTertiary == 0);
-
- if(leftTertiary != rightTertiary) {
- if(CollationSettings::sortsTertiaryUpperCaseFirst(options)) {
- // 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::NO_CE_WEIGHT16) {
- if(leftLower32 > 0xffff) {
- leftTertiary ^= 0xc000;
- } else {
- leftTertiary += 0x4000;
- }
- }
- if(rightTertiary > Collation::NO_CE_WEIGHT16) {
- if(rightLower32 > 0xffff) {
- rightTertiary ^= 0xc000;
- } else {
- rightTertiary += 0x4000;
- }
- }
- }
- return (leftTertiary < rightTertiary) ? UCOL_LESS : UCOL_GREATER;
- }
- if(leftTertiary == Collation::NO_CE_WEIGHT16) { break; }
- }
- if(CollationSettings::getStrength(options) <= UCOL_TERTIARY) { return UCOL_EQUAL; }
-
- if(!anyVariable && (anyQuaternaries & 0xc0) == 0) {
- // If there are no "variable" CEs and no non-zero quaternary weights,
- // then there are no quaternary differences.
- return UCOL_EQUAL;
- }
-
- leftIndex = 0;
- rightIndex = 0;
- for(;;) {
- uint32_t leftQuaternary;
- do {
- int64_t ce = left.getCE(leftIndex++);
- leftQuaternary = (uint32_t)ce & 0xffff;
- if(leftQuaternary <= Collation::NO_CE_WEIGHT16) {
- // Variable primary or completely ignorable or NO_CE.
- leftQuaternary = (uint32_t)(ce >> 32);
- } else {
- // Regular CE, not tertiary ignorable.
- // Preserve the quaternary weight in bits 7..6.
- leftQuaternary |= 0xffffff3f;
- }
- } while(leftQuaternary == 0);
-
- uint32_t rightQuaternary;
- do {
- int64_t ce = right.getCE(rightIndex++);
- rightQuaternary = (uint32_t)ce & 0xffff;
- if(rightQuaternary <= Collation::NO_CE_WEIGHT16) {
- // Variable primary or completely ignorable or NO_CE.
- rightQuaternary = (uint32_t)(ce >> 32);
- } else {
- // Regular CE, not tertiary ignorable.
- // Preserve the quaternary weight in bits 7..6.
- rightQuaternary |= 0xffffff3f;
- }
- } while(rightQuaternary == 0);
-
- if(leftQuaternary != rightQuaternary) {
- // Return the difference, with script reordering.
- if(settings.hasReordering()) {
- leftQuaternary = settings.reorder(leftQuaternary);
- rightQuaternary = settings.reorder(rightQuaternary);
- }
- return (leftQuaternary < rightQuaternary) ? UCOL_LESS : UCOL_GREATER;
- }
- if(leftQuaternary == Collation::NO_CE_PRIMARY) { break; }
- }
- return UCOL_EQUAL;
-}
-
-U_NAMESPACE_END
-
-#endif // !UCONFIG_NO_COLLATION