jberry 2005/02/11 14:42:26 Modified: c/src/xercesc/util/Transcoders/MacOSUnicodeConverter MacOSUnicodeConverter.cpp MacOSUnicodeConverter.hpp Log: Explicitly create a unicode collator instead of relying on the "default" collator. This may get around potential race conditions with multi-threaded use of the string comparison routines as reported by Chris Cates on Jan 19th. Revision Changes Path 1.25 +27 -27 xml-xerces/c/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp Index: MacOSUnicodeConverter.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- MacOSUnicodeConverter.cpp 28 Dec 2004 19:04:03 -0000 1.24 +++ MacOSUnicodeConverter.cpp 11 Feb 2005 22:42:25 -0000 1.25 @@ -94,14 +94,32 @@ // 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 @@ // 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::compareNIString( const XMLCh* const comp1 +int MacOSUnicodeConverter::compareNIString( const XMLCh* const comp1 , const XMLCh* const comp2 , const unsigned int maxChars) { @@ -188,16 +198,8 @@ // 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 @@ 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), 1.13 +3 -2 xml-xerces/c/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp Index: MacOSUnicodeConverter.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Transcoders/MacOSUnicodeConverter/MacOSUnicodeConverter.hpp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- MacOSUnicodeConverter.hpp 8 Sep 2004 13:56:46 -0000 1.12 +++ MacOSUnicodeConverter.hpp 11 Feb 2005 22:42:25 -0000 1.13 @@ -111,7 +111,8 @@ 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
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]