dbertoni    00/07/12 14:45:41

  Modified:    c/src/ICUBridge FunctionICUFormatNumber.cpp ICUBridge.cpp
                        ICUBridge.hpp ICUBridgeCollationCompareFunctor.cpp
  Log:
  Changes to allow for Linux integration.  Cleaned up interfaces.
  
  Revision  Changes    Path
  1.2       +6 -40     xml-xalan/c/src/ICUBridge/FunctionICUFormatNumber.cpp
  
  Index: FunctionICUFormatNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/ICUBridge/FunctionICUFormatNumber.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FunctionICUFormatNumber.cpp       2000/05/08 17:13:13     1.1
  +++ FunctionICUFormatNumber.cpp       2000/07/12 21:45:38     1.2
  @@ -112,16 +112,6 @@
   
   
   
  -ICUBridge::UTF16VectorType
  -makeUTF16VectorType(const XalanDOMString&    theString)
  -{
  -     return ICUBridge::UTF16VectorType(
  -             c_wstr(theString),
  -             c_wstr(theString) + length(theString));
  -}
  -
  -
  -
   XalanDOMString
   FunctionICUFormatNumber::doFormat(
                        XPathExecutionContext&                          
executionContext,
  @@ -130,39 +120,15 @@
                        const XalanDOMString&                           
thePattern,
                        const XalanDecimalFormatSymbols*        theDFS)
   {
  -     ICUBridge::UTF16VectorType                      theResultString;
  +     XalanDOMString  theResultString;
   
  -     unsigned long           theResult = 0;
  +     unsigned long   theResult = 0;
   
  -     if (theDFS == 0)
  -     {
  -             // Nothing special, so use the default call...
  -             theResult = ICUBridge::FormatNumber(
  -                                     makeUTF16VectorType(thePattern),
  +     theResult = ICUBridge::FormatNumber(
  +                                     thePattern,
                                        theNumber,
  +                                     theDFS,
                                        theResultString);
  -     }
  -     else
  -     {
  -             // DecimalFormatSymbols specified, so use those values...
  -             theResult = ICUBridge::FormatNumber(
  -                                     makeUTF16VectorType(thePattern),
  -                                     theNumber,
  -                                     
makeUTF16VectorType(theDFS->getCurrencySymbol()),
  -                                     theDFS->getDecimalSeparator(),
  -                                     theDFS->getDigit(),
  -                                     theDFS->getGroupingSeparator(),
  -                                     
makeUTF16VectorType(theDFS->getInfinity()),
  -                                     
makeUTF16VectorType(theDFS->getInternationalCurrencySymbol()),
  -                                     theDFS->getMinusSign(),
  -                                     theDFS->getMonetaryDecimalSeparator(),
  -                                     makeUTF16VectorType(theDFS->getNaN()),
  -                                     theDFS->getPatternSeparator(),
  -                                     theDFS->getPercent(),
  -                                     theDFS->getPerMill(),
  -                                     theDFS->getZeroDigit(),
  -                                     theResultString);
  -     }
   
        if (theResult != 0)
        {
  @@ -181,6 +147,6 @@
        }
        else
        {
  -             return XalanDOMString(theResultString.begin(), 
theResultString.size());
  +             return theResultString;
        }
   }
  
  
  
  1.4       +179 -90   xml-xalan/c/src/ICUBridge/ICUBridge.cpp
  
  Index: ICUBridge.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/ICUBridge/ICUBridge.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ICUBridge.cpp     2000/07/10 22:46:56     1.3
  +++ ICUBridge.cpp     2000/07/12 21:45:38     1.4
  @@ -59,6 +59,11 @@
   
   
   
  +#include <PlatformSupport/DOMStringHelper.hpp>
  +#include <PlatformSupport/XalanDecimalFormatSymbols.hpp>
  +
  +
  +
   #include <memory>
   
   
  @@ -69,103 +74,198 @@
   
   
   
  -unsigned long
  -ICUBridge::FormatNumber(
  -                     const UTF16VectorType&          thePattern,
  -                     double                                          
theNumber,
  -                     UTF16VectorType&                        theResult)
  +#if defined(XALAN_NO_NAMESPACES)
  +     typedef vector<UChar>                                   UCharVectorType;
  +#else
  +     typedef std::vector<UChar>                              UCharVectorType;
  +#endif
  +
  +
  +
  +const UnicodeString
  +ICUBridge::XalanDOMCharStringToUnicodeString(const XalanDOMChar*     
theString)
   {
  -     const UnicodeString             theUnicodePattern(&thePattern[0], 
thePattern.size());
  +     if (theString == 0)
  +     {
  +             return UnicodeString();
  +     }
  +     else
  +     {
  +#if defined(XALAN_ICU_BRIDGE_UCHAR_MISMATCH)
   
  -     UErrorCode                              theStatus = U_ZERO_ERROR;
  +             // Create a buffer to copy out the UnicodeString data...
  +             UCharVectorType         theBuffer;
   
  -     UnicodeString                   theUnicodeResult;
  +             const unsigned int      theLength = length(theString);
   
  -     DecimalFormat                   theFormatter(theUnicodePattern, 
theStatus);
  +             // Resize the buffer appropriately...
  +             theBuffer.reserve(theLength);
   
  -     if (theStatus == U_ZERO_ERROR ||
  -             theStatus == U_USING_DEFAULT_ERROR)
  -     {
  -             // Do the format...
  -             theFormatter.format(theNumber, theUnicodeResult);
  +             // Copy the data, truncating each character...
  +             for (unsigned int i = 0; i < theLength; ++i)
  +             {
  +                     // There should be no truncation, since XalanDOMChars
  +                     // hold UTF-16 code points, but assert, just in case...
  +                     assert(theString[i] == UChar(theString[i]));
  +                     theBuffer.push_back(theString[i]);
  +             }
   
  -             const int32_t   theLength = theUnicodeResult.length();
  +             return UnicodeString(&theBuffer[0], theBuffer.size());
   
  -             // Resize the vector to the appropriate length...
  -             theResult.clear();
  -             theResult.resize(theLength);
  +#else
   
  -             theUnicodeResult.extract(0, theLength, &theResult[0]);
  +             return UnicodeString(theString, length(theString));
   
  -             theStatus = U_ZERO_ERROR;
  +#endif
        }
  +}
   
  -     return theStatus;
  +
  +
  +const UnicodeString
  +ICUBridge::XalanDOMStringToUnicodeString(const XalanDOMString&       
theString)
  +{
  +     // Just call up to the XalanDOMChar* version...
  +     return XalanDOMCharStringToUnicodeString(c_wstr(theString));
  +}
  +
  +
  +
  +const XalanDOMString
  +ICUBridge::UnicodeStringToXalanDOMString(const UnicodeString&                
theString)
  +{
  +#if defined(XALAN_ICU_BRIDGE_UCHAR_MISMATCH)
  +
  +     // If XalanDOMChar is larger than the ICU's UChar, we have to more 
work...
  +     const int32_t   theLength = theString.length();
  +
  +     // Create a buffer...
  +     XalanDOMCharVectorType  theBuffer;
  +
  +     // Reserve the appropriate amount of space...
  +     theBuffer.reserve(theLength);
  +
  +     // Copy the data...
  +     for (int32_t i = 0; i < theLength; ++i)
  +     {
  +             theBuffer.push_back(theString[i]);
  +     }
  +
  +     return XalanDOMString(&theBuffer[0], theBuffer.size());
  +
  +#else
  +
  +     // Create a buffer to copy out the UnicodeString data...
  +     UCharVectorType         theResult;
  +
  +     const int32_t   theLength = theString.length();
  +
  +     // Resize the buffer appropriately...
  +     theResult.resize(theLength);
  +
  +     // Extract the data...
  +     theString.extract(0, theLength, &theResult[0]);
  +
  +     return XalanDOMString(&theResult[0], theResult.size());
  +
  +#endif
   }
   
   
   
  +void
  +ICUBridge::UnicodeStringToXalanDOMString(
  +                     const UnicodeString&    theString,
  +                     XalanDOMString&                 theResult)
  +{
  +#if defined(XALAN_ICU_BRIDGE_UCHAR_MISMATCH)
  +     
  +     // If XalanDOMChar is larger than the ICU's UChar, we have to more work.
  +     // Don't bother to provide the optimized version, just call to the
  +     // previous function.
  +
  +     theResult = UnicodeStringToXalanDOMString(theString);
  +
  +#else
  +
  +#if defined(XALAN_NO_NAMESPACES)
  +     typedef vector<UChar>                                   UCharVectorType;
  +#else
  +     typedef std::vector<UChar>                              UCharVectorType;
  +#endif
  +
  +     // Create a buffer to copy out the UnicodeString data...
  +     UCharVectorType         theBuffer;
  +
  +     const int32_t   theLength = theString.length();
  +
  +     // Resize the buffer appropriately...
  +     theBuffer.resize(theLength);
  +
  +     // Extract the data...
  +     theString.extract(0, theLength, &theBuffer[0]);
  +
  +     theResult = XalanDOMString(&theBuffer[0], theBuffer.size());
  +
  +#endif
  +}
  +
  +
  +
   unsigned long
   ICUBridge::FormatNumber(
  -                     const UTF16VectorType&  thePattern,
  -                     double                                  theNumber,
  -                     const UTF16VectorType&  theCurrencySymbolString,
  -                     unsigned short                  theDecimalSeparatorChar,
  -                     unsigned short                  theDigitChar,
  -                     unsigned short                  
theGroupingSeparatorChar,
  -                     const UTF16VectorType&  theInfinityString,
  -                     const UTF16VectorType&  
theInternationalCurrencySymbolString,
  -                     unsigned short                  theMinusSignChar,
  -                     unsigned short                  
theMonetaryDecimalSeparatorChar,
  -                     const UTF16VectorType&  theNaNString,
  -                     unsigned short                  thePatternSeparatorChar,
  -                     unsigned short                  thePercentChar,
  -                     unsigned short                  thePerMillChar,
  -                     unsigned short                  theZeroDigitChar,
  -                     UTF16VectorType&                theResult)
  +                     const XalanDOMString&                           
thePattern,
  +                     double                                                  
        theNumber,
  +                     const XalanDecimalFormatSymbols*        theXalanDFS,
  +                     XalanDOMString&                                         
theResult)
   {
  -     const UnicodeString             theUnicodePattern(&thePattern[0], 
thePattern.size());
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::auto_ptr;
  +#endif
   
        UErrorCode                              theStatus = U_ZERO_ERROR;
   
  -     UnicodeString                   theUnicodeResult;
  +     // Use an auto_ptr, to keep this safe until we construct the 
DecimalFormat instance.
  +     const auto_ptr<DecimalFormatSymbols>    theDFS(new 
DecimalFormatSymbols(theStatus));
   
  -     DecimalFormatSymbols    theDFS(theStatus);
  -
  -     theDFS.setZeroDigit(theZeroDigitChar);
  -     theDFS.setGroupingSeparator(theGroupingSeparatorChar);
  -     theDFS.setDecimalSeparator(theDecimalSeparatorChar);
  -     theDFS.setPerMill(thePerMillChar);
  -     theDFS.setPercent(thePercentChar);
  -     theDFS.setDigit(theDigitChar);
  -     theDFS.setPatternSeparator(thePatternSeparatorChar);
  -     theDFS.setInfinity(UnicodeString(&theInfinityString[0], 
theInfinityString.size()));
  -     theDFS.setNaN(UnicodeString(&theNaNString[0], theNaNString.size()));
  -//   theDFS.setPlusSign(theZeroDigitChar);
  -     theDFS.setMinusSign(theMinusSignChar);
  -//   theDFS.setExponentialSymbol(theZeroDigitChar);
  -     theDFS.setCurrencySymbol(UnicodeString(&theCurrencySymbolString[0], 
theCurrencySymbolString.size()));
  -     
theDFS.setInternationalCurrencySymbol(UnicodeString(&theInternationalCurrencySymbolString[0],
 theInternationalCurrencySymbolString.size()));
  -     theDFS.setMonetaryDecimalSeparator(theMonetaryDecimalSeparatorChar);
  -
        if (theStatus == U_ZERO_ERROR ||
                theStatus == U_USING_DEFAULT_ERROR)
        {
  -             DecimalFormat                   theFormatter(theUnicodePattern, 
theDFS, theStatus);
  +             if (theXalanDFS != 0)
  +             {
  +                     // We got a XalanDecimalFormatSymbols, so set the
  +                     // corresponding data in the ICU DecimalFormatSymbols.
  +                     theDFS->setZeroDigit(theXalanDFS->getZeroDigit());
  +                     
theDFS->setGroupingSeparator(theXalanDFS->getGroupingSeparator());
  +                     
theDFS->setDecimalSeparator(theXalanDFS->getDecimalSeparator());
  +                     theDFS->setPerMill(theXalanDFS->getPerMill());
  +                     theDFS->setPercent(theXalanDFS->getPercent());
  +                     theDFS->setDigit(theXalanDFS->getDigit());
  +                     
theDFS->setPatternSeparator(theXalanDFS->getPatternSeparator());
  +
  +                     
theDFS->setInfinity(XalanDOMStringToUnicodeString(theXalanDFS->getInfinity()));
  +                     
theDFS->setNaN(XalanDOMStringToUnicodeString(theXalanDFS->getNaN()));
  +             //      theDFS->setPlusSign(theZeroDigitChar);
  +                     theDFS->setMinusSign(theXalanDFS->getMinusSign());
  +             //      theDFS->setExponentialSymbol(theZeroDigitChar);
  +                     
theDFS->setCurrencySymbol(XalanDOMStringToUnicodeString(theXalanDFS->getCurrencySymbol()));
  +                     
theDFS->setInternationalCurrencySymbol(XalanDOMStringToUnicodeString(theXalanDFS->getInternationalCurrencySymbol()));
  +                     
theDFS->setMonetaryDecimalSeparator(theXalanDFS->getMonetaryDecimalSeparator());
  +             }
  +
  +             UnicodeString   theUnicodeResult;
   
  +             // Construct a DecimalFormat.  Note that we release the 
auto_ptr, since the
  +             // DecimalFormat will adopt the DecimalFormatSymbols instance.
  +             DecimalFormat   
theFormatter(XalanDOMStringToUnicodeString(thePattern), theDFS.release(), 
theStatus);
  +
                if (theStatus == U_ZERO_ERROR ||
                        theStatus == U_USING_DEFAULT_ERROR)
                {
                        // Do the format...
                        theFormatter.format(theNumber, theUnicodeResult);
  -
  -                     const int32_t   theLength = theUnicodeResult.length();
  -
  -                     // Resize the vector to the appropriate length...
  -                     theResult.clear();
  -                     theResult.resize(theLength);
   
  -                     theUnicodeResult.extract(0, theLength, &theResult[0]);
  +                     UnicodeStringToXalanDOMString(theUnicodeResult, 
theResult);
   
                        theStatus = U_ZERO_ERROR;
                }
  @@ -177,51 +277,40 @@
   
   
   int
  -ICUBridge::strLength(const UnicodeCharType*          theString)
  +ICUBridge::collationCompare(
  +                     const XalanDOMString&   theLHS,
  +                     const XalanDOMString&   theRHS)
   {
  -     if (theString == 0)
  -     {
  -             return 0;
  -     }
  -     else
  -     {
  -             const UnicodeCharType*  current = theString;
  -
  -             while(*current)
  -             {
  -                     ++current;
  -             }
  -
  -             return current - theString;
  -     }
  +     // Just call to the XalanDOMChar* version...
  +     return collationCompare(c_wstr(theLHS), c_wstr(theRHS));
   }
   
   
   
   int
   ICUBridge::collationCompare(
  -                     const UnicodeCharType*          theLHS,
  -                     const UnicodeCharType*          theRHS)
  +                     const XalanDOMChar*             theLHS,
  +                     const XalanDOMChar*             theRHS)
   {
   #if !defined(XALAN_NO_NAMESPACES)
        using std::auto_ptr;
   #endif
   
  -     const UnicodeString             theUnicodeLHS(theLHS, 
strLength(theLHS));
  -     const UnicodeString             theUnicodeRHS(theRHS, 
strLength(theRHS));
  -
        UErrorCode                              theStatus = U_ZERO_ERROR;
   
  -     auto_ptr<Collator>      
theCollator(Collator::createInstance(theStatus));
  +     // Create a collcator, and keep it in an auto_ptr
  +     const auto_ptr<Collator>        
theCollator(Collator::createInstance(theStatus));
   
        if (theStatus == U_ZERO_ERROR || theStatus == U_USING_DEFAULT_ERROR)
        {
  +             // OK, do the compare...
                return theCollator->compare(
  -                                     theUnicodeLHS,
  -                                     theUnicodeRHS);
  +                                     
XalanDOMCharStringToUnicodeString(theLHS),
  +                                     
XalanDOMCharStringToUnicodeString(theRHS));
        }
        else
        {
  -             return theUnicodeLHS.compare(theUnicodeRHS);
  +             // If creating the ICU Collator failed, fall back to the 
default...
  +             return collationCompare(theLHS, theRHS);
        }
   }
  
  
  
  1.3       +29 -30    xml-xalan/c/src/ICUBridge/ICUBridge.hpp
  
  Index: ICUBridge.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/ICUBridge/ICUBridge.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ICUBridge.hpp     2000/07/10 01:04:59     1.2
  +++ ICUBridge.hpp     2000/07/12 21:45:39     1.3
  @@ -68,50 +68,49 @@
   
   
   
  +#include <XalanDOM/XalanDOMString.hpp>
  +
  +
  +
  +class UnicodeString;
  +class XalanDecimalFormatSymbols;
  +
  +
  +
   class XALAN_ICUBRIDGE_EXPORT ICUBridge
   {
   public:
   
  -     typedef wchar_t                                                 
UnicodeCharType;
  +     static const UnicodeString
  +     XalanDOMCharStringToUnicodeString(const XalanDOMChar*   theString);
   
  -#if defined(XALAN_NO_NAMESPACES
  -     typedef vector<unsigned short>                  UTF16VectorType;
  -#else
  -     typedef std::vector<unsigned short>             UTF16VectorType;
  -#endif
  +     static const UnicodeString
  +     XalanDOMStringToUnicodeString(const XalanDOMString&             
theString);
   
  -     static unsigned long
  -     FormatNumber(
  -                     const UTF16VectorType&          thePattern,
  -                     double                                          
theNumber,
  -                     UTF16VectorType&                        theResult);
  +     static const XalanDOMString
  +     UnicodeStringToXalanDOMString(const UnicodeString&      theString);
   
  +     static void
  +     UnicodeStringToXalanDOMString(
  +                     const UnicodeString&    theString,
  +                     XalanDOMString&                 theResult);
  +
        static unsigned long
        FormatNumber(
  -                     const UTF16VectorType&          thePattern,
  -                     double                                          
theNumber,
  -                     const UTF16VectorType&          theCurrencySymbolString,
  -                     unsigned short                          
theDecimalSeparatorChar,
  -                     unsigned short                          theDigitChar,
  -                     unsigned short                          
theGroupingSeparatorChar,
  -                     const UTF16VectorType&          theInfinityString,
  -                     const UTF16VectorType&          
theInternationalCurrencySymbolString,
  -                     unsigned short                          
theMinusSignChar,
  -                     unsigned short                          
theMonetaryDecimalSeparatorChar,
  -                     const UTF16VectorType&          theNaNString,
  -                     unsigned short                          
thePatternSeparatorChar,
  -                     unsigned short                          thePercentChar,
  -                     unsigned short                          thePerMillChar,
  -                     unsigned short                          
theZeroDigitChar,
  -                     UTF16VectorType&                        theResult);
  +                     const XalanDOMString&                           
thePattern,
  +                     double                                                  
        theNumber,
  +                     const XalanDecimalFormatSymbols*        theXalanDFS,
  +                     XalanDOMString&                                         
theResult);
   
        static int
        collationCompare(
  -                     const UnicodeCharType*          theLHS,
  -                     const UnicodeCharType*          theRHS);
  +                     const XalanDOMString&   theLHS,
  +                     const XalanDOMString&   theRHS);
   
        static int
  -     strLength(const UnicodeCharType*        theString);
  +     collationCompare(
  +                     const XalanDOMChar*             theLHS,
  +                     const XalanDOMChar*             theRHS);
   };
   
   
  
  
  
  1.2       +6 -5      
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ICUBridgeCollationCompareFunctor.cpp      2000/07/10 01:04:35     1.1
  +++ ICUBridgeCollationCompareFunctor.cpp      2000/07/12 21:45:39     1.2
  @@ -60,6 +60,10 @@
   
   
   
  +#include <PlatformSupport/DOMStringHelper.hpp>
  +
  +
  +
   #include <unicode/coll.h>
   
   
  @@ -104,11 +108,8 @@
        {
                assert(m_collator != 0);
   
  -             const UnicodeString             theUnicodeLHS(theLHS, 
ICUBridge::strLength(theLHS));
  -             const UnicodeString             theUnicodeRHS(theRHS, 
ICUBridge::strLength(theRHS));
  -
                return m_collator->compare(
  -                                     theUnicodeLHS,
  -                                     theUnicodeRHS);
  +                                     
ICUBridge::XalanDOMCharStringToUnicodeString(theLHS),
  +                                     
ICUBridge::XalanDOMCharStringToUnicodeString(theRHS));
        }
   }
  
  
  

Reply via email to