dbertoni    02/05/29 11:22:02

  Modified:    c/src/ICUBridge ICUBridgeCollationCompareFunctor.cpp
                        ICUBridgeCollationCompareFunctor.hpp
                        ICUBridgeCollationCompareFunctorImpl.cpp
                        ICUBridgeCollationCompareFunctorImpl.hpp
  Log:
  Implemented "case-order" attribute of xsl:sort.
  
  Revision  Changes    Path
  1.21      +6 -4      
xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctor.cpp
  
  Index: ICUBridgeCollationCompareFunctor.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctor.cpp,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- ICUBridgeCollationCompareFunctor.cpp      4 Jan 2002 19:12:43 -0000       
1.20
  +++ ICUBridgeCollationCompareFunctor.cpp      29 May 2002 18:22:02 -0000      
1.21
  @@ -81,9 +81,10 @@
   int
   ICUBridgeCollationCompareFunctor::operator()(
                        const XalanDOMChar*             theLHS,
  -                     const XalanDOMChar*             theRHS) const
  +                     const XalanDOMChar*             theRHS,
  +                     eCaseOrder                              theCaseOrder) 
const
   {
  -     return (*m_impl)(theLHS, theRHS);
  +     return (*m_impl)(theLHS, theRHS, theCaseOrder);
   }
   
   
  @@ -92,7 +93,8 @@
   ICUBridgeCollationCompareFunctor::operator()(
                        const XalanDOMChar*             theLHS,
                        const XalanDOMChar*             theRHS,
  -                     const XalanDOMChar*             theLocale) const
  +                     const XalanDOMChar*             theLocale,
  +                     eCaseOrder                              theCaseOrder) 
const
   {
  -     return (*m_impl)(theLHS, theRHS, theLocale);
  +     return (*m_impl)(theLHS, theRHS, theLocale, theCaseOrder);
   }
  
  
  
  1.9       +8 -3      
xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctor.hpp
  
  Index: ICUBridgeCollationCompareFunctor.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctor.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ICUBridgeCollationCompareFunctor.hpp      4 Jan 2002 19:12:43 -0000       
1.8
  +++ ICUBridgeCollationCompareFunctor.hpp      29 May 2002 18:22:02 -0000      
1.9
  @@ -72,10 +72,13 @@
   
   
   
  -class XALAN_ICUBRIDGE_EXPORT ICUBridgeCollationCompareFunctor  : public 
StylesheetExecutionContextDefault::CollationCompareFunctor
  +class XALAN_ICUBRIDGE_EXPORT ICUBridgeCollationCompareFunctor : public 
StylesheetExecutionContextDefault::CollationCompareFunctor
   {
   public:
   
  +     typedef StylesheetExecutionContextDefault::eCaseOrder   eCaseOrder;
  +
  +
        ICUBridgeCollationCompareFunctor();
   
        virtual
  @@ -84,13 +87,15 @@
        virtual int
        operator()(
                        const XalanDOMChar*             theLHS,
  -                     const XalanDOMChar*             theRHS) const;
  +                     const XalanDOMChar*             theRHS,
  +                     eCaseOrder                              theCaseOrder = 
StylesheetExecutionContextDefault::eDefault) const;
   
        virtual int
        operator()(
                        const XalanDOMChar*             theLHS,
                        const XalanDOMChar*             theRHS,
  -                     const XalanDOMChar*             theLocale) const;
  +                     const XalanDOMChar*             theLocale,
  +                     eCaseOrder                              theCaseOrder = 
StylesheetExecutionContextDefault::eDefault) const;
   private:
   
        ICUBridgeCollationCompareFunctorImpl* const             m_impl;
  
  
  
  1.2       +99 -25    
xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.cpp
  
  Index: ICUBridgeCollationCompareFunctorImpl.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ICUBridgeCollationCompareFunctorImpl.cpp  4 Jan 2002 18:41:42 -0000       
1.1
  +++ ICUBridgeCollationCompareFunctorImpl.cpp  29 May 2002 18:22:02 -0000      
1.2
  @@ -77,17 +77,25 @@
   
   
   
  +inline Collator*
  +createCollator(UErrorCode&   theStatus)
  +{
  +#if defined(XALAN_ICU_DEFAULT_LOCALE_PROBLEM)
  +     return Collator::createInstance(Locale::US, theStatus);
  +#else
  +     return Collator::createInstance(theStatus);
  +#endif
  +}
  +
  +
  +
   ICUBridgeCollationCompareFunctorImpl::ICUBridgeCollationCompareFunctorImpl() 
:
        m_isValid(false),
        m_defaultCollator(0)
   {
        UErrorCode      theStatus = U_ZERO_ERROR;
   
  -#if defined(XALAN_ICU_DEFAULT_LOCALE_PROBLEM)
  -     m_defaultCollator = Collator::createInstance(Locale::US, theStatus);
  -#else
  -     m_defaultCollator = Collator::createInstance(theStatus);
  -#endif
  +     m_defaultCollator = createCollator(theStatus);
   
        if (theStatus == U_ZERO_ERROR ||
            (theStatus >= U_ERROR_INFO_START && theStatus < U_ERROR_INFO_LIMIT))
  @@ -105,32 +113,91 @@
   
   
   
  +inline int
  +doCompare(
  +                     const Collator&                 theCollator,
  +                     const XalanDOMChar*             theLHS,
  +                     const XalanDOMChar*             theRHS)
  +{
  +#if defined(XALAN_USE_WCHAR_CAST_HACK)
  +     return theCollator.compare(
  +                             (const wchar_t*)theLHS,
  +                             length(theLHS),
  +                             (const wchar_t*)theRHS,
  +                             length(theRHS));
  +#else
  +     return theCollator.compare(
  +                             theLHS,
  +                             length(theLHS),
  +                             theRHS,
  +                             length(theRHS));
  +#endif
  +}
  +
  +
  +
  +inline UColAttributeValue
  +caseOrderConvert(ICUBridgeCollationCompareFunctorImpl::eCaseOrder    
theCaseOrder)
  +{
  +     switch(theCaseOrder)
  +     {
  +     case StylesheetExecutionContext::eLowerFirst:
  +             return UCOL_LOWER_FIRST;
  +             break;
  +
  +     case StylesheetExecutionContext::eUpperFirst:
  +             return UCOL_UPPER_FIRST;
  +             break;
  +
  +     case StylesheetExecutionContext::eDefault:
  +             break;
  +
  +     default:
  +             assert(false);
  +             break;
  +     }
  +
  +     return UCOL_DEFAULT;
  +}
  +
  +
  +
   int
   ICUBridgeCollationCompareFunctorImpl::doDefaultCompare(
                        const XalanDOMChar*             theLHS,
  -                     const XalanDOMChar*             theRHS) const
  +                     const XalanDOMChar*             theRHS,
  +                     eCaseOrder                              theCaseOrder) 
const
   {
        if (isValid() == false)
        {
  -             return s_defaultFunctor(theLHS, theRHS);
  +             return s_defaultFunctor(theLHS, theRHS, theCaseOrder);
        }
  -     else
  +     else if (theCaseOrder == StylesheetExecutionContext::eDefault)
        {
                assert(m_defaultCollator != 0);
   
  -#if defined(XALAN_USE_WCHAR_CAST_HACK)
  -             return m_defaultCollator->compare(
  -                                     (const wchar_t*)theLHS,
  -                                     length(theLHS),
  -                                     (const wchar_t*)theRHS,
  -                                     length(theRHS));
  -#else
  -             return m_defaultCollator->compare(
  -                                     theLHS,
  -                                     length(theLHS),
  -                                     theRHS,
  -                                     length(theRHS));
  -#endif
  +             return doCompare(*m_defaultCollator, theLHS, theRHS);
  +     }
  +     else
  +     {
  +             UErrorCode      theStatus = U_ZERO_ERROR;
  +
  +             XalanAutoPtr<Collator>  theCollator(createCollator(theStatus));
  +
  +             if (theStatus == U_ZERO_ERROR ||
  +                     (theStatus >= U_ERROR_INFO_START && theStatus < 
U_ERROR_INFO_LIMIT))
  +             {
  +                     theCollator->setAttribute(
  +                                     UCOL_CASE_FIRST,
  +                                     caseOrderConvert(theCaseOrder),
  +                                     theStatus);
  +
  +                     return doCompare(*theCollator.get(), theLHS, theRHS);
  +             }
  +             else
  +             {
  +                     return s_defaultFunctor(theLHS, theRHS, theCaseOrder);
  +             }
        }
   }
   
  @@ -139,9 +206,10 @@
   int
   ICUBridgeCollationCompareFunctorImpl::operator()(
                        const XalanDOMChar*             theLHS,
  -                     const XalanDOMChar*             theRHS) const
  +                     const XalanDOMChar*             theRHS,
  +                     eCaseOrder                              theCaseOrder) 
const
   {
  -     return doDefaultCompare(theLHS, theRHS);
  +     return doDefaultCompare(theLHS, theRHS, theCaseOrder);
   }
   
   
  @@ -189,7 +257,8 @@
   ICUBridgeCollationCompareFunctorImpl::operator()(
                        const XalanDOMChar*             theLHS,
                        const XalanDOMChar*             theRHS,
  -                     const XalanDOMChar*             theLocale) const
  +                     const XalanDOMChar*             theLocale,
  +                     eCaseOrder                              theCaseOrder) 
const
   {
        UErrorCode      theStatus = U_ZERO_ERROR;
   
  @@ -200,6 +269,11 @@
        {
                assert(theCollator.get() != 0);
   
  +             theCollator->setAttribute(
  +                             UCOL_CASE_FIRST,
  +                             caseOrderConvert(theCaseOrder),
  +                             theStatus);
  +
   #if defined(XALAN_USE_WCHAR_CAST_HACK)
                return theCollator->compare(
                                        (const wchar_t*)theLHS,
  @@ -216,6 +290,6 @@
        }
        else
        {
  -             return s_defaultFunctor(theLHS, theRHS);
  +             return s_defaultFunctor(theLHS, theRHS, theCaseOrder);
        }
   }
  
  
  
  1.2       +11 -5     
xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.hpp
  
  Index: ICUBridgeCollationCompareFunctorImpl.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ICUBridgeCollationCompareFunctorImpl.hpp  4 Jan 2002 18:41:42 -0000       
1.1
  +++ ICUBridgeCollationCompareFunctorImpl.hpp  29 May 2002 18:22:02 -0000      
1.2
  @@ -73,10 +73,13 @@
   
   
   
  -class XALAN_ICUBRIDGE_EXPORT ICUBridgeCollationCompareFunctorImpl
  +class XALAN_ICUBRIDGE_EXPORT ICUBridgeCollationCompareFunctorImpl : public 
StylesheetExecutionContextDefault::CollationCompareFunctor
   {
   public:
   
  +     typedef StylesheetExecutionContextDefault::eCaseOrder   eCaseOrder;
  +
  +
        ICUBridgeCollationCompareFunctorImpl();
   
        ~ICUBridgeCollationCompareFunctorImpl();
  @@ -84,13 +87,15 @@
        int
        operator()(
                        const XalanDOMChar*             theLHS,
  -                     const XalanDOMChar*             theRHS) const;
  +                     const XalanDOMChar*             theRHS,
  +                     eCaseOrder                              theCaseOrder = 
StylesheetExecutionContextDefault::eDefault) const;
   
        int
        operator()(
                        const XalanDOMChar*             theLHS,
                        const XalanDOMChar*             theRHS,
  -                     const XalanDOMChar*             theLocale) const;
  +                     const XalanDOMChar*             theLocale,
  +                     eCaseOrder                              theCaseOrder = 
StylesheetExecutionContextDefault::eDefault) const;
   
        bool
        isValid() const
  @@ -103,9 +108,10 @@
        int
        doDefaultCompare(
                        const XalanDOMChar*             theLHS,
  -                     const XalanDOMChar*             theRHS) const;
  +                     const XalanDOMChar*             theRHS,
  +                     eCaseOrder                              theCaseOrder) 
const;
   
  -     bool            m_isValid;
  +     bool    m_isValid;
   
   #if defined(XALAN_NO_NAMESPACES)
        Collator*                       m_defaultCollator;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to