You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by jb...@apache.org on 2005/02/11 23:42:26 UTC

cvs commit: xml-xerces/c/src/xercesc/util/Transcoders/MacOSUnicodeConverter MacOSUnicodeConverter.cpp MacOSUnicodeConverter.hpp

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: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org