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