Collator::Result Collator::collate(const UChar* lhs, size_t lhsLength, const UChar* rhs, size_t rhsLength) const { if (!m_collator) createCollator(); return static_cast<Result>(ucol_strcoll(m_collator, lhs, lhsLength, rhs, rhsLength)); }
Collator::Result Collator::collate(const UChar* lhs, size_t lhsLength, const UChar* rhs, size_t rhsLength) const { #ifndef USE_TI_UCOL_REPLACEMENTS if (!m_collator) createCollator(); return static_cast<Result>(ucol_strcoll(m_collator, lhs, lhsLength, rhs, rhsLength)); #else RetainPtr<CFStringRef> localeStr = CFStringCreateWithCString(NULL, m_locale, kCFStringEncodingASCII); RetainPtr<CFLocaleRef> locale = CFLocaleCreate(NULL, localeStr.get()); if (!locale) { locale = CFLocaleCopyCurrent(); } // We assume that lhsLength/rhsLength != -1, which is reasonable based on the source. RetainPtr<CFStringRef> lhsRef = CFStringCreateWithCharacters(NULL, (const UniChar*)lhs, lhsLength); RetainPtr<CFStringRef> rhsRef = CFStringCreateWithCharacters(NULL, (const UniChar*)rhs, rhsLength); return static_cast<Result>(CFStringCompareWithOptionsAndLocale(lhsRef.get(), rhsRef.get(), CFRangeMake(0, CFStringGetLength(lhsRef.get())), kCFCompareLocalized, locale.get())); #endif }
JSValue IntlCollator::compareStrings(ExecState& state, StringView x, StringView y) { // 10.3.4 CompareStrings abstract operation (ECMA-402 2.0) if (!m_collator) { createCollator(state); if (!m_collator) return state.vm().throwException(&state, createError(&state, ASCIILiteral("Failed to compare strings."))); } UErrorCode status = U_ZERO_ERROR; UCharIterator iteratorX = createIterator(x); UCharIterator iteratorY = createIterator(y); auto result = ucol_strcollIter(m_collator, &iteratorX, &iteratorY, &status); if (U_FAILURE(status)) return state.vm().throwException(&state, createError(&state, ASCIILiteral("Failed to compare strings."))); return jsNumber(result); }