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]

Reply via email to