diff --git a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp index d94b4066549437e0b9457f027cd3b85b4e0f64d6..900e720c05f1f5b910644b3104e7193f8df5765c 100644 --- a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp +++ b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp @@ -94,14 +94,32 @@ const XMLCh MacOSUnicodeConverter::fgMacLCPEncodingName[] = // MacOSUnicodeConverter: Constructors and Destructor // --------------------------------------------------------------------------- MacOSUnicodeConverter::MacOSUnicodeConverter() + : fCollator(NULL) { // Test for presense of unicode collation functions - mHasUnicodeCollation = (UCCompareTextDefault != (void*)kUnresolvedCFragSymbolAddress); + fHasUnicodeCollation = (UCCompareTextDefault != (void*)kUnresolvedCFragSymbolAddress); + + // Create a unicode collator for doing string comparisons + if (fHasUnicodeCollation) + { + // Configure collation options + UCCollateOptions collateOptions = + kUCCollateComposeInsensitiveMask + | kUCCollateWidthInsensitiveMask + | kUCCollateCaseInsensitiveMask + | kUCCollatePunctuationSignificantMask + ; + + OSStatus status = UCCreateCollator(NULL, 0, collateOptions, &fCollator); + } } MacOSUnicodeConverter::~MacOSUnicodeConverter() { + // Dispose our collator + if (fCollator != NULL) + UCDisposeCollator(&fCollator); } @@ -119,23 +137,15 @@ int MacOSUnicodeConverter::compareIString( const XMLCh* const comp1 // has a c library with a valid set of wchar routines, // fall back to the standard library. - if (mHasUnicodeCollation) + if (fHasUnicodeCollation && fCollator != NULL) { - // Use the Unicode Utilities to do the compare - UCCollateOptions collateOptions = - kUCCollateComposeInsensitiveMask - | kUCCollateWidthInsensitiveMask - | kUCCollateCaseInsensitiveMask - | kUCCollatePunctuationSignificantMask - ; - std::size_t cnt1 = XMLString::stringLen(comp1); std::size_t cnt2 = XMLString::stringLen(comp2); Boolean equivalent = false; SInt32 order = 0; - OSStatus status = UCCompareTextDefault( - collateOptions, + OSStatus status = UCCompareText( + fCollator, reinterpret_cast<const UniChar*>(comp1), cnt1, reinterpret_cast<const UniChar*>(comp2), @@ -176,7 +186,7 @@ int MacOSUnicodeConverter::compareIString( const XMLCh* const comp1 } -int MacOSUnicodeConverter::compareNIString( const XMLCh* const comp1 +int MacOSUnicodeConverter::compareNIString( const XMLCh* const comp1 , const XMLCh* const comp2 , const unsigned int maxChars) { @@ -188,16 +198,8 @@ int MacOSUnicodeConverter::compareNIString( const XMLCh* const comp1 // has a c library with a valid set of wchar routines, // fall back to the standard library. - if (mHasUnicodeCollation) + if (fHasUnicodeCollation && fCollator != NULL) { - // Use the Unicode Utilities to do the compare - UCCollateOptions collateOptions = - kUCCollateComposeInsensitiveMask - | kUCCollateWidthInsensitiveMask - | kUCCollateCaseInsensitiveMask - | kUCCollatePunctuationSignificantMask - ; - std::size_t cnt1 = XMLString::stringLen(comp1); std::size_t cnt2 = XMLString::stringLen(comp2); @@ -208,12 +210,10 @@ int MacOSUnicodeConverter::compareNIString( const XMLCh* const comp1 if (cnt2 > maxChars) cnt2 = maxChars; - // Do multiple passes over source, comparing each pass. - // The first pass that's not equal wins. Boolean equivalent = false; SInt32 order = 0; - OSStatus status = UCCompareTextDefault( - collateOptions, + OSStatus status = UCCompareText( + fCollator, reinterpret_cast<const UniChar*>(comp1), cnt1, reinterpret_cast<const UniChar*>(comp2), diff --git a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp index 474764aefd1dc526310f3e3e5e1e0d2950dd10b9..08299494cdb313df33926d3578cfe1d8c167bf85 100644 --- a/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp +++ b/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp @@ -111,7 +111,8 @@ private : static const XMLCh fgMyServiceId[]; // Name of the our unicode converter static const XMLCh fgMacLCPEncodingName[]; // Name of the LCP transcoder we create - bool mHasUnicodeCollation; // True if unicode collation is available + bool fHasUnicodeCollation; // True if unicode collation is available + CollatorRef fCollator; // Our collator // ----------------------------------------------------------------------- // Unimplemented constructors and operators