int32_t CaseInsensitiveCompare(const char16_t *a, const char16_t *b, uint32_t len) { NS_ASSERTION(a && b, "Do not pass in invalid pointers!"); if (len) { do { uint32_t c1 = *a++; uint32_t c2 = *b++; // Unfortunately, we need to check for surrogates BEFORE we check // for equality, because we could have identical high surrogates // but non-identical characters, so we can't just skip them // If c1 isn't a surrogate, we don't bother to check c2; // in the case where it _is_ a surrogate, we're definitely going to get // a mismatch, and don't need to interpret and lowercase it if (NS_IS_HIGH_SURROGATE(c1) && len > 1 && NS_IS_LOW_SURROGATE(*a)) { c1 = SURROGATE_TO_UCS4(c1, *a++); if (NS_IS_HIGH_SURROGATE(c2) && NS_IS_LOW_SURROGATE(*b)) { c2 = SURROGATE_TO_UCS4(c2, *b++); } // If c2 wasn't a surrogate, decrementing len means we'd stop // short of the end of string b, but that doesn't actually matter // because we're going to find a mismatch and return early --len; } if (c1 != c2) { c1 = ToLowerCase_inline(c1); c2 = ToLowerCase_inline(c2); if (c1 != c2) { if (c1 < c2) { return -1; } return 1; } } } while (--len != 0); } return 0; }
uint32_t ToLowerCase(uint32_t aChar) { return ToLowerCase_inline(aChar); }
PRUint32 ToLowerCase(PRUint32 aChar) { return ToLowerCase_inline(aChar); }