mhoyt       2004/02/25 12:48:00

  Modified:    c/Projects/Win32/VC6/AllInOne AllInOne.dsp
                        AllInOneWithICU.dsp
               c/src/xalanc/ICUBridge ICUBridge.cpp ICUBridge.hpp
               c/src/xalanc/TestXSLT process.cpp
               c/src/xalanc/XPath XPathExecutionContext.hpp
                        XPathExecutionContextDefault.cpp
                        XPathExecutionContextDefault.hpp
               c/src/xalanc/XSLT FunctionFormatNumber.cpp
                        FunctionFormatNumber.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp XSLTInit.cpp
               c/src/xalanc/XalanTransformer XalanTransformer.cpp
  Added:       c/src/xalanc/ICUBridge ICUFormatNumberFunctor.cpp
                        ICUFormatNumberFunctor.hpp
  Removed:     c/src/xalanc/ICUBridge FunctionICUFormatNumber.cpp
                        FunctionICUFormatNumber.hpp
               c/src/xalanc/PlatformSupport XalanDecimalFormat.cpp
                        XalanDecimalFormat.hpp
  Log:
  Fix to improve performance of ICU-enabled format-number()
  
  Revision  Changes    Path
  1.47      +0 -8      xml-xalan/c/Projects/Win32/VC6/AllInOne/AllInOne.dsp
  
  Index: AllInOne.dsp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/Projects/Win32/VC6/AllInOne/AllInOne.dsp,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- AllInOne.dsp      6 Jan 2004 03:34:44 -0000       1.46
  +++ AllInOne.dsp      25 Feb 2004 20:47:59 -0000      1.47
  @@ -591,14 +591,6 @@
   # End Source File
   # Begin Source File
   
  -SOURCE=..\..\..\..\src\xalanc\PlatformSupport\XalanDecimalFormat.cpp
  -# End Source File
  -# Begin Source File
  -
  -SOURCE=..\..\..\..\src\xalanc\PlatformSupport\XalanDecimalFormat.hpp
  -# End Source File
  -# Begin Source File
  -
   SOURCE=..\..\..\..\src\xalanc\PlatformSupport\XalanDecimalFormatSymbols.cpp
   # End Source File
   # Begin Source File
  
  
  
  1.44      +8 -16     
xml-xalan/c/Projects/Win32/VC6/AllInOne/AllInOneWithICU.dsp
  
  Index: AllInOneWithICU.dsp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/Projects/Win32/VC6/AllInOne/AllInOneWithICU.dsp,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- AllInOneWithICU.dsp       6 Jan 2004 03:34:44 -0000       1.43
  +++ AllInOneWithICU.dsp       25 Feb 2004 20:47:59 -0000      1.44
  @@ -591,14 +591,6 @@
   # End Source File
   # Begin Source File
   
  -SOURCE=..\..\..\..\src\xalanc\PlatformSupport\XalanDecimalFormat.cpp
  -# End Source File
  -# Begin Source File
  -
  -SOURCE=..\..\..\..\src\xalanc\PlatformSupport\XalanDecimalFormat.hpp
  -# End Source File
  -# Begin Source File
  -
   SOURCE=..\..\..\..\src\xalanc\PlatformSupport\XalanDecimalFormatSymbols.cpp
   # End Source File
   # Begin Source File
  @@ -2679,14 +2671,6 @@
   # PROP Default_Filter ""
   # Begin Source File
   
  -SOURCE=..\..\..\..\src\xalanc\ICUBridge\FunctionICUFormatNumber.cpp
  -# End Source File
  -# Begin Source File
  -
  -SOURCE=..\..\..\..\src\xalanc\ICUBridge\FunctionICUFormatNumber.hpp
  -# End Source File
  -# Begin Source File
  -
   SOURCE=..\..\..\..\src\xalanc\ICUBridge\ICUBridge.cpp
   # End Source File
   # Begin Source File
  @@ -2720,6 +2704,14 @@
   # Begin Source File
   
   SOURCE=..\..\..\..\src\xalanc\ICUBridge\ICUBridgeDefinitions.hpp
  +# End Source File
  +# Begin Source File
  +
  +SOURCE=..\..\..\..\src\xalanc\ICUBridge\ICUFormatNumberFunctor.cpp
  +# End Source File
  +# Begin Source File
  +
  +SOURCE=..\..\..\..\src\xalanc\ICUBridge\ICUFormatNumberFunctor.hpp
   # End Source File
   # Begin Source File
   
  
  
  
  1.4       +0 -99     xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.cpp
  
  Index: ICUBridge.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ICUBridge.cpp     6 Jan 2004 02:41:27 -0000       1.3
  +++ ICUBridge.cpp     25 Feb 2004 20:47:59 -0000      1.4
  @@ -60,21 +60,10 @@
   
   
   #include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  -#include <xalanc/PlatformSupport/XalanDecimalFormatSymbols.hpp>
  -
  -
  -
  -#include <xalanc/PlatformSupport/DoubleSupport.hpp>
   
   
   
   #include <unicode/coll.h>
  -#include <unicode/dcfmtsym.h>
  -#include <unicode/decimfmt.h>
  -
  -
  -
  -#include <xalanc/Include/XalanAutoPtr.hpp>
   
   
   
  @@ -294,93 +283,5 @@
        }
   #endif
   }
  -
  -
  -
  -static void
  -doFormatNumber(
  -                     const XalanDOMString&                           
thePattern,
  -                     double                                                  
        theNumber,
  -                     const XalanDecimalFormatSymbols&        theXalanDFS,
  -                     UErrorCode&                                             
        theStatus,
  -                     XalanDOMString&                                         
theResult)
  -{
  -     if (theStatus == U_ZERO_ERROR ||
  -             theStatus == U_USING_DEFAULT_WARNING)
  -     {
  -             // Use a XalanAutoPtr, to keep this safe until we construct the 
DecimalFormat instance.
  -             XalanAutoPtr<DecimalFormatSymbols>      theDFS(new 
DecimalFormatSymbols(theStatus));
  -
  -             // We got a XalanDecimalFormatSymbols, so set the
  -             // corresponding data in the ICU DecimalFormatSymbols.
  -             theDFS->setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, 
UChar(theXalanDFS.getZeroDigit()));
  -             
theDFS->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, 
UChar(theXalanDFS.getGroupingSeparator()));
  -             
theDFS->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, 
UChar(theXalanDFS.getDecimalSeparator()));
  -             theDFS->setSymbol(DecimalFormatSymbols::kPerMillSymbol, 
UChar(theXalanDFS.getPerMill()));
  -             theDFS->setSymbol(DecimalFormatSymbols::kPercentSymbol, 
UChar(theXalanDFS.getPercent()));
  -             theDFS->setSymbol(DecimalFormatSymbols::kDigitSymbol, 
UChar(theXalanDFS.getDigit()));
  -             
theDFS->setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol, 
UChar(theXalanDFS.getPatternSeparator()));
  -
  -             theDFS->setSymbol(DecimalFormatSymbols::kInfinitySymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getInfinity()));
  -             theDFS->setSymbol(DecimalFormatSymbols::kNaNSymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getNaN()));
  -             theDFS->setSymbol(DecimalFormatSymbols::kMinusSignSymbol, 
UChar(theXalanDFS.getMinusSign()));
  -             theDFS->setSymbol(DecimalFormatSymbols::kCurrencySymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getCurrencySymbol()));
  -             theDFS->setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getInternationalCurrencySymbol()));
  -             
theDFS->setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, 
UChar(theXalanDFS.getMonetaryDecimalSeparator()));
  -
  -             UnicodeString   theUnicodeResult;
  -
  -             // Construct a DecimalFormat.  Note that we release the 
XalanAutoPtr, since the
  -             // DecimalFormat will adopt the DecimalFormatSymbols instance.
  -             DecimalFormat   
theFormatter(ICUBridge::XalanDOMStringToUnicodeString(thePattern), 
theDFS.release(), theStatus);
  -
  -             if (U_SUCCESS(theStatus))
  -             {
  -                     // Do the format...
  -                     theFormatter.format(theNumber, theUnicodeResult);
  -
  -                     
ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult, theResult);
  -
  -                     theStatus = U_ZERO_ERROR;
  -             }
  -     }
  -}
  -
  -
  -
  -unsigned long
  -ICUBridge::FormatNumber(
  -                     const XalanDOMString&                           
thePattern,
  -                     double                                                  
        theNumber,
  -                     const XalanDecimalFormatSymbols*        theXalanDFS,
  -                     XalanDOMString&                                         
theResult)
  -{
  -     UErrorCode      theStatus = U_ZERO_ERROR;
  -
  -     if (theXalanDFS == 0)
  -     {
  -             XalanDecimalFormatSymbols       theDefaultSymbols;
  -
  -             doFormatNumber(
  -                             thePattern,
  -                             theNumber,
  -                             theDefaultSymbols,
  -                             theStatus,
  -                             theResult);
  -     }
  -     else
  -     {
  -             doFormatNumber(
  -                             thePattern,
  -                             theNumber,
  -                             *theXalanDFS,
  -                             theStatus,
  -                             theResult);
  -     }
  -
  -     return theStatus;
  -}
  -
  -
   
   XALAN_CPP_NAMESPACE_END
  
  
  
  1.4       +0 -9      xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.hpp
  
  Index: ICUBridge.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ICUBridge.hpp     6 Jan 2004 02:41:27 -0000       1.3
  +++ ICUBridge.hpp     25 Feb 2004 20:47:59 -0000      1.4
  @@ -77,8 +77,6 @@
   
   
   class Function;
  -class XalanDecimalFormatSymbols;
  -
   
   
   class XALAN_ICUBRIDGE_EXPORT ICUBridge
  @@ -103,13 +101,6 @@
        UnicodeStringToXalanDOMString(
                        const UnicodeString&    theString,
                        XalanDOMString&                 theResult);
  -
  -     static unsigned long
  -     FormatNumber(
  -                     const XalanDOMString&                           
thePattern,
  -                     double                                                  
        theNumber,
  -                     const XalanDecimalFormatSymbols*        theXalanDFS,
  -                     XalanDOMString&                                         
theResult);
   };
   
   
  
  
  
  1.1                  
xml-xalan/c/src/xalanc/ICUBridge/ICUFormatNumberFunctor.cpp
  
  Index: ICUFormatNumberFunctor.cpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999-2004 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  
  
  #include <algorithm>
  
  
  
  #include "ICUFormatNumberFunctor.hpp"
  
  
  
  #include <xalanc/ICUBridge/ICUBridge.hpp>
  
  
  
  #include <xalanc/Include/XalanAutoPtr.hpp>
  
  
  
  #include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  #include <xalanc/PlatformSupport/XalanDecimalFormatSymbols.hpp>
  #include <xalanc/PlatformSupport/XalanMessageLoader.hpp>
  
  
  
  #include <xalanc/XPath/XPathExecutionContext.hpp>
  
  
  
  XALAN_CPP_NAMESPACE_BEGIN
  
  
  
  ICUFormatNumberFunctor::ICUFormatNumberFunctor()
  {
        XalanDecimalFormatSymbols defaultXalanDFS;
  
        m_defaultDecimalFormat = createDecimalFormat(defaultXalanDFS);
  }
  
  
        
  ICUFormatNumberFunctor::~ICUFormatNumberFunctor()
  {
        delete m_defaultDecimalFormat;
  
        XALAN_USING_STD(for_each)
        for_each(
                m_decimalFormatCache.begin(),
                m_decimalFormatCache.end(),
                DecimalFormatCacheStruct::DecimalFormatDeleteFunctor());
  }
  
  
  
  void
  ICUFormatNumberFunctor::operator() (
                XPathExecutionContext&                          
executionContext,       
                double                                                          
theNumber,
                const XalanDOMString&                           thePattern,
                const XalanDecimalFormatSymbols*        theDFS,
                XalanDOMString&                                         
theResult,
                const XalanNode*                                        context,
                const LocatorType*                                      
locator) const 
  {
        if (!doFormat(theNumber, thePattern, theResult, theDFS))
        {
                executionContext.warn(
                        
XalanMessageLoader::getMessage(XalanMessages::FormatNumberFailed_1Param),
                        context,
                        locator);
        }               
  }
  
  
  
  ICUFormatNumberFunctor::DecimalFormatType * 
  ICUFormatNumberFunctor::getCachedDecimalFormat(const 
XalanDecimalFormatSymbols &theDFS) const
  {
        XALAN_USING_STD(find_if)
  
        DecimalFormatCacheListType&             theNonConstCache =
  #if defined(XALAN_NO_MUTABLE)
                (DecimalFormatCacheListType&)m_decimalFormatCache;
  #else
                m_decimalFormatCache;
  #endif
  
        DecimalFormatCacheListType::iterator i =
                find_if(
                        theNonConstCache.begin(),
                        theNonConstCache.end(),
                        
DecimalFormatCacheStruct::DecimalFormatFindFunctor(&theDFS));
  
        if (i == theNonConstCache.end())
        {
                return 0;
        }
        else
        {
                // Let's do a quick check to see if we found the first entry.
                // If so, we don't have to update the cache, so just return the
                // appropriate value...
                const DecimalFormatCacheListType::iterator      theBegin =
                        theNonConstCache.begin();
  
                if (i == theBegin)
                {
                        return (*i).m_formatter;
                }
                else
                {
                        // Save the formatter, because splice() may invalidate
                        // i.
                        DecimalFormatType* const                theFormatter = 
(*i).m_formatter;
  
                        // Move the entry to the beginning the cache
                        theNonConstCache.splice(theBegin, theNonConstCache, i);
  
                        return theFormatter;
                }
        }
  }
  
  
  
  bool
  ICUFormatNumberFunctor::doFormat(     
                double                                                          
theNumber,
                const XalanDOMString&                           thePattern,
                XalanDOMString&                                         
theResult,
                const XalanDecimalFormatSymbols*        theDFS) const
  {
        if (theDFS == 0)
        {
                return doICUFormat(theNumber,thePattern,theResult);
        }
  
        DecimalFormatType*      theFormatter = getCachedDecimalFormat(*theDFS);
  
        if (theFormatter != 0)
        {
                return doICUFormat(theNumber, thePattern, theResult, 
theFormatter);
        }
        else
        {
                XalanAutoPtr<DecimalFormatType> 
theDecimalFormatGuard(createDecimalFormat(*theDFS));
  
                if (theDecimalFormatGuard.get() !=0)
                {
                        // OK, there was no error, so cache the instance...
                        cacheDecimalFormat(theDecimalFormatGuard.get(), 
*theDFS);
  
                        // Release the collator, since it's in the cache and
                        // will be controlled by the cache...
                        DecimalFormatType * theDecimalFormat = 
theDecimalFormatGuard.release();
  
                        return doICUFormat(theNumber, thePattern, theResult, 
theDecimalFormat);
                }
                else
                {
                        return doICUFormat(theNumber,thePattern,theResult);
                }
        }
  }
  
  
  
  ICUFormatNumberFunctor::DecimalFormatType *
  ICUFormatNumberFunctor::createDecimalFormat(
                const XalanDecimalFormatSymbols&        theXalanDFS) const
  {
        UErrorCode theStatus = U_ZERO_ERROR;    
        
        // Use a XalanAutoPtr, to keep this safe until we construct the 
DecimalFormat instance.
        XalanAutoPtr<DecimalFormatSymbols>      theDFS(new 
DecimalFormatSymbols(theStatus));
        // We got a XalanDecimalFormatSymbols, so set the
        // corresponding data in the ICU DecimalFormatSymbols.
        theDFS->setSymbol(DecimalFormatSymbols::kZeroDigitSymbol, 
UChar(theXalanDFS.getZeroDigit()));
        theDFS->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, 
UChar(theXalanDFS.getGroupingSeparator()));
        theDFS->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, 
UChar(theXalanDFS.getDecimalSeparator()));
        theDFS->setSymbol(DecimalFormatSymbols::kPerMillSymbol, 
UChar(theXalanDFS.getPerMill()));
        theDFS->setSymbol(DecimalFormatSymbols::kPercentSymbol, 
UChar(theXalanDFS.getPercent()));
        theDFS->setSymbol(DecimalFormatSymbols::kDigitSymbol, 
UChar(theXalanDFS.getDigit()));
        theDFS->setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol, 
UChar(theXalanDFS.getPatternSeparator()));
  
        theDFS->setSymbol(DecimalFormatSymbols::kInfinitySymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getInfinity()));
        theDFS->setSymbol(DecimalFormatSymbols::kNaNSymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getNaN()));
        theDFS->setSymbol(DecimalFormatSymbols::kMinusSignSymbol, 
UChar(theXalanDFS.getMinusSign()));
        theDFS->setSymbol(DecimalFormatSymbols::kCurrencySymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getCurrencySymbol()));
        theDFS->setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, 
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getInternationalCurrencySymbol()));
        theDFS->setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, 
UChar(theXalanDFS.getMonetaryDecimalSeparator()));
  
        // Construct a DecimalFormat.  Note that we release the XalanAutoPtr, 
since the
        // DecimalFormat will adopt the DecimalFormatSymbols instance.
        DecimalFormatType * theFormatter= new DecimalFormatType("", 
theDFS.release(), theStatus);
  
        if (U_SUCCESS(theStatus))
        {
                return theFormatter;
        } 
        else 
        {
                delete theFormatter;
                return 0;
        }
  }
  
  
  
  void
  ICUFormatNumberFunctor::cacheDecimalFormat(
        DecimalFormatType *                                             
theFormatter,
        const XalanDecimalFormatSymbols&                theDFS) const
  {
  
        assert(theFormatter != 0);
  
        DecimalFormatCacheListType&             theNonConstCache =
  #if defined(XALAN_NO_MUTABLE)
                (DecimalFormatCacheListType&)m_decimalFormatCache;
  #else
                m_decimalFormatCache;
  #endif
  
        // Is the cache full?
        if (theNonConstCache.size() == eCacheMax)
        {
                // Yes, so guard the collator instance, in case pop_back() 
throws...
                XalanAutoPtr<DecimalFormatType> 
theDecimalFormatGuard(theNonConstCache.back().m_formatter);
  
                theNonConstCache.pop_back();
        }
  
  
        theNonConstCache.push_front(DecimalFormatCacheListType::value_type());
  
        DecimalFormatCacheListType::value_type&         theEntry = 
                theNonConstCache.front();
  
        theEntry.m_formatter = theFormatter;
        theEntry.m_DFS = theDFS;
  }
  
  
  
  bool
  ICUFormatNumberFunctor::doICUFormat(
                double                                                          
theNumber,
                const XalanDOMString&                           thePattern,
                XalanDOMString&                                         
theResult,
                DecimalFormatType*                                      
theFormatter) const
  {
        UErrorCode theStatus = U_ZERO_ERROR;
  
        if (theFormatter == 0)
        {
                if (m_defaultDecimalFormat != 0) 
                {
                        theFormatter = m_defaultDecimalFormat;
                }
                else
                {
                        return false;
                }
        }
  
        
theFormatter->applyPattern(ICUBridge::XalanDOMStringToUnicodeString(thePattern),theStatus);
  
        if (U_SUCCESS(theStatus))
        {
                // Do the format...
                UnicodeString   theUnicodeResult;
                theFormatter->format(theNumber, theUnicodeResult);
                ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult, 
theResult);
        }
        return U_SUCCESS(theStatus);
  }
  
  
  
  XALAN_CPP_NAMESPACE_END
  
  
  
  1.1                  
xml-xalan/c/src/xalanc/ICUBridge/ICUFormatNumberFunctor.hpp
  
  Index: ICUFormatNumberFunctor.hpp
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999-2004 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written 
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.ibm.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  #if !defined(FUNCTIONICUFORMATNUMBERFUNCTOR_HEADER_GUARD_1357924680)
  #define FUNCTIONICUFORMATNUMBERFUNCTOR_HEADER_GUARD_1357924680
  
  
  
  // Base header file.  Must be first.
  #include <xalanc/ICUBridge/ICUBridgeDefinitions.hpp>
  
  
  
  #include <xalanc/PlatformSupport/XalanDecimalFormatSymbols.hpp>
  
  
  
  #include <xalanc/XSLT/StylesheetExecutionContextDefault.hpp>
  
  
  
  #include <xalanc/XPath/XPathExecutionContext.hpp>
  
  
  
  #include <unicode/decimfmt.h>
  
  
  
  #include <list>
  
  
  
  XALAN_CPP_NAMESPACE_BEGIN
  
  typedef StylesheetExecutionContextDefault::FormatNumberFunctor 
FormatNumberFunctor;
  // Class that implements the XSLT function format-number using the ICU.
  //
  class XALAN_ICUBRIDGE_EXPORT ICUFormatNumberFunctor : public 
FormatNumberFunctor
  {
  public:
  
        ICUFormatNumberFunctor();
  
        virtual
        ~ICUFormatNumberFunctor();
  
        virtual void
                operator() (
                XPathExecutionContext&                          
executionContext,
                double                                                          
theNumber,
                const XalanDOMString&                           thePattern,
                const XalanDecimalFormatSymbols*        theDFS,
                XalanDOMString&                                         
theResult,
                const XalanNode*                                        context 
= 0,
                const LocatorType*                                      locator 
= 0) const;
        
  #if defined(XALAN_HAS_CPP_NAMESPACE)
        typedef U_ICU_NAMESPACE::DecimalFormat  DecimalFormatType;
  #else
        typedef DecimalFormat                                   
DecimalFormatType;
  #endif
        struct DecimalFormatCacheStruct
        {
                DecimalFormatCacheStruct(
                                const XalanDecimalFormatSymbols&        theDFS,
                                DecimalFormatType*                              
        theFormatter):
                        m_DFS(theDFS),
                        m_formatter(theFormatter)
                {
                }
  
                DecimalFormatCacheStruct() :
                        m_DFS(),
                        m_formatter(0)
                {
                }
  
  #if defined(XALAN_NO_SELECTIVE_TEMPLATE_INSTANTIATION)
                bool
                operator<(const DecimalFormatCacheStruct&  theRHS) const
                {
                        return this < &theRHS;
                }
  
                bool
                operator==(const DecimalFormatCacheStruct&      theRHS) const
                {
                        return this == &theRHS;
                }
  #endif
  
                XalanDecimalFormatSymbols       m_DFS;
  
                DecimalFormatType *     m_formatter;
  
                struct DecimalFormatDeleteFunctor
                {
                        void
                        operator()(DecimalFormatCacheStruct&    theStruct) const
                        {
                                delete theStruct.m_formatter;
                        }
                };
  
                struct DecimalFormatFindFunctor
                {
                        DecimalFormatFindFunctor(const 
XalanDecimalFormatSymbols*       theDFS) :
                                m_DFS(theDFS)
                        {
                        }
  
                        bool
                        operator()(DecimalFormatCacheStruct&    theStruct) const
                        {
                                return theStruct.m_DFS == (*m_DFS);
                        }
  
                        const XalanDecimalFormatSymbols * const m_DFS;
                };
        };
  
  #if defined(XALAN_NO_STD_NAMESPACE)
        typedef list<DecimalFormatCacheStruct>                  
DecimalFormatCacheListType;
  #else
        typedef std::list<DecimalFormatCacheStruct>             
DecimalFormatCacheListType;
  #endif
  
        DecimalFormatType * getCachedDecimalFormat(const 
XalanDecimalFormatSymbols &theDFS) const;
  
        bool
        doFormat(       
                double                                                          
theNumber,
                const XalanDOMString&                           thePattern,
                XalanDOMString&                                         
theResult,
                const XalanDecimalFormatSymbols*        theDFS = 0) const;
  
        bool
        doICUFormat(
                double                                                          
theNumber,
                const XalanDOMString&                           thePattern,
                XalanDOMString&                                         
theResult,
                DecimalFormatType*                                      
theFormatter = 0) const;
  
        void
        cacheDecimalFormat(
                DecimalFormatType*                                      
theFormatter,
                const XalanDecimalFormatSymbols&        theDFS) const;
  
        DecimalFormat *
        createDecimalFormat(
                const XalanDecimalFormatSymbols&        theXalanDFS) const;
  
        enum { eCacheMax = 10 };
  
        DecimalFormatType * m_defaultDecimalFormat;
        
        mutable DecimalFormatCacheListType m_decimalFormatCache;
  
        ICUFormatNumberFunctor&
        operator=(const ICUFormatNumberFunctor&);
  
        bool
        operator==(const ICUFormatNumberFunctor&) const;
  
  };
  
  XALAN_CPP_NAMESPACE_END
  
  #endif        // FUNCTIONICUFORMATNUMBERFUNCTOR_HEADER_GUARD_1357924680
  
  
  
  1.7       +0 -6      xml-xalan/c/src/xalanc/TestXSLT/process.cpp
  
  Index: process.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/TestXSLT/process.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- process.cpp       6 Jan 2004 02:41:31 -0000       1.6
  +++ process.cpp       25 Feb 2004 20:47:59 -0000      1.7
  @@ -158,7 +158,6 @@
   
   //#define XALAN_USE_ICU
   #if defined(XALAN_USE_ICU)
  -#include <xalanc/ICUBridge/FunctionICUFormatNumber.hpp>
   #include <xalanc/ICUBridge/ICUBridgeCollationCompareFunctor.hpp>
   #endif
   
  @@ -819,11 +818,6 @@
        // we're done with the subsystem, since its destructor shuts down
        // the subsystem.
        XSLTInit        theInit;
  -
  -#if defined(XALAN_USE_ICU)
  -     // Create an installer to install the substitute format-number() 
function.
  -     FunctionICUFormatNumber::FunctionICUFormatNumberInstaller       
theInstaller;
  -#endif
   
        const XalanDOMString    
mimeEncoding(XALAN_STATIC_UCODE_STRING("UTF-8"));
        const XalanDOMString    encoding(XALAN_STATIC_UCODE_STRING("UTF-8"));
  
  
  
  1.7       +31 -7     xml-xalan/c/src/xalanc/XPath/XPathExecutionContext.hpp
  
  Index: XPathExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XPath/XPathExecutionContext.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XPathExecutionContext.hpp 6 Jan 2004 02:41:32 -0000       1.6
  +++ XPathExecutionContext.hpp 25 Feb 2004 20:47:59 -0000      1.7
  @@ -694,16 +694,40 @@
                        const XalanDOMString&   theURI,
                        XalanDocument*                  theDocument) = 0;
   
  +     /**
  +      * Formats a number according to the specified pattern.
  +      * 
  +      * @param number the number to be formatted
  +      * @param pattern the format pattern
  +      * @param theResult the formatted number
  +      * @param context the source node
  +      * @param locator the locator 
  +      */
  +     virtual void formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0) = 0;
   
        /**
  -      * Retrieve the XalanDecimalFormatSymbols instance associated with
  -      * the name.
  -      *
  -      * @param qname the QName for the lookup
  -      * @return a pointer to the matching instance, or 0 if none was found
  +      * Formats a number according to the specified pattern.
  +      * 
  +      * @param number the number to be formatted
  +      * @param pattern the format pattern
  +      * @param dfsName the name of decimal format to use 
  +      * @param theResult the formatted number
  +      * @param context the source node
  +      * @param locator the locator 
  +      * @return a pointer to the functor, 0 if none was found
         */
  -     virtual const XalanDecimalFormatSymbols*
  -     getDecimalFormatSymbols(const XalanQName&       qname) = 0;
  +     virtual void formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     const XalanDOMString&                           dfsName,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0) = 0;
   
        // These interfaces are inherited from ExecutionContext...
   
  
  
  
  1.6       +78 -3     
xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.cpp
  
  Index: XPathExecutionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XPathExecutionContextDefault.cpp  6 Jan 2004 02:41:32 -0000       1.5
  +++ XPathExecutionContextDefault.cpp  25 Feb 2004 20:47:59 -0000      1.6
  @@ -72,6 +72,10 @@
   
   #include <xalanc/PlatformSupport/PrefixResolver.hpp>
   #include <xalanc/PlatformSupport/XalanLocator.hpp>
  +#include <xalanc/PlatformSupport/DoubleSupport.hpp>
  +#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  +#include <xalanc/PlatformSupport/XalanDecimalFormatSymbols.hpp>
  +#include <xalanc/PlatformSupport/XalanMessageLoader.hpp>
   
   
   
  @@ -703,10 +707,81 @@
   
   
   
  -const XalanDecimalFormatSymbols*
  -XPathExecutionContextDefault::getDecimalFormatSymbols(const XalanQName&      
        /* qname */)
  +void XPathExecutionContextDefault::formatNumber(
  +             double                                                          
number,
  +             const XalanDOMString&                           pattern,
  +             XalanDOMString&                                         
theResult,
  +             const XalanNode*                                        context,
  +             const LocatorType*                                      
locator) 
   {
  -     return 0;
  +     doFormatNumber(number,pattern,0,theResult,context,locator);
  +}
  +
  +
  +
  +void XPathExecutionContextDefault::formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     const XalanDOMString&                           dfsName,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context,
  +                     const LocatorType*                                      
locator) 
  +{
  +     doFormatNumber(number,pattern,0,theResult,context,locator);
  +}
  +
  +
  +     
  +void XPathExecutionContextDefault::doFormatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     const XalanDecimalFormatSymbols*        theDFS,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context,
  +                     const LocatorType*                                      
locator) 
  +{
  +     if (DoubleSupport::isNaN(number) == true)
  +     {
  +             if (theDFS != 0)
  +             {
  +                     theResult = theDFS->getNaN();
  +             }
  +             else
  +             {
  +                     DoubleToDOMString(number, theResult);
  +             }
  +     }
  +     else if (DoubleSupport::isNegativeInfinity(number) == true)
  +     {
  +             if (theDFS != 0)
  +             {
  +                     theResult = theDFS->getMinusSign();
  +                     theResult += theDFS->getInfinity();
  +             }
  +             else
  +             {
  +                     DoubleToDOMString(number, theResult);
  +             }
  +     }
  +     else if (DoubleSupport::isPositiveInfinity(number) == true )
  +     {
  +             if (theDFS != 0)
  +             {
  +                     theResult = theDFS->getInfinity();
  +             }
  +             else
  +             {
  +                     DoubleToDOMString(number, theResult);
  +             }
  +     }
  +     else
  +     {
  +         warn( 
  +                     
XalanMessageLoader::getMessage(XalanMessages::FunctionIsNotImplemented_1Param,"format-number()"),
  +                     context, 
  +                     locator);
  +             DoubleToDOMString(number,theResult);
  +     }
   }
   
   
  
  
  
  1.6       +23 -3     
xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.hpp
  
  Index: XPathExecutionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XPathExecutionContextDefault.hpp  6 Jan 2004 02:41:32 -0000       1.5
  +++ XPathExecutionContextDefault.hpp  25 Feb 2004 20:47:59 -0000      1.6
  @@ -216,6 +216,14 @@
   #endif
        }
   
  +     virtual void doFormatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     const XalanDecimalFormatSymbols*        theDFS,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0);
  +
        // These interfaces are inherited from XPathExecutionContext...
   
        virtual void
  @@ -342,11 +350,23 @@
                        const XalanDOMString&   theURI,
                        XalanDocument*                  theDocument);
   
  -     virtual const XalanDecimalFormatSymbols*
  -     getDecimalFormatSymbols(const XalanQName&       qname);
  +     // These interfaces are inherited from ExecutionContext...
   
  +     virtual void formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0);
  +
  +     virtual void formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     const XalanDOMString&                           dfsName,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0);
   
  -     // These interfaces are inherited from ExecutionContext...
   
        virtual void
        error(
  
  
  
  1.5       +15 -169   xml-xalan/c/src/xalanc/XSLT/FunctionFormatNumber.cpp
  
  Index: FunctionFormatNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/FunctionFormatNumber.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FunctionFormatNumber.cpp  6 Jan 2004 02:41:36 -0000       1.4
  +++ FunctionFormatNumber.cpp  25 Feb 2004 20:47:59 -0000      1.5
  @@ -58,20 +58,8 @@
   
   
   
  -#include <xalanc/PlatformSupport/DoubleSupport.hpp>
  -#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  -#include <xalanc/PlatformSupport/XalanDecimalFormat.hpp>
  -#include <xalanc/PlatformSupport/XalanDecimalFormatSymbols.hpp>
   #include <xalanc/PlatformSupport/XalanMessageLoader.hpp>
  -
  -
  -
   #include <xalanc/XPath/XObjectFactory.hpp>
  -#include <xalanc/XPath/XalanQNameByValue.hpp>
  -
  -
  -
  -#include "Constants.hpp"
   
   
   
  @@ -91,10 +79,6 @@
   
   
   
  -static const XalanQNameByValue       theEmptyQName;
  -
  -
  -
   XObjectPtr
   FunctionFormatNumber::execute(
                        XPathExecutionContext&  executionContext,
  @@ -108,25 +92,16 @@
        const double                                            theNumber = 
arg1->num();
        const XalanDOMString&                           thePattern = 
arg2->str();
        
  -     const XalanDecimalFormatSymbols*        theDFS = 0;
  -
  -     if (theDFS == 0)
  -     {
  -             theDFS = 
executionContext.getDecimalFormatSymbols(theEmptyQName);
  -     }
  -
        typedef XPathExecutionContext::GetAndReleaseCachedString        
GetAndReleaseCachedString;
   
        GetAndReleaseCachedString       theString(executionContext);
   
  -     doFormat(
  -                     executionContext,
  -                     context,
  -                     theNumber,
  -                     thePattern,
  -                     theDFS,
  -                     theString.get(),
  -                     locator);
  +     executionContext.formatNumber(
  +                     theNumber, 
  +                     thePattern, 
  +                     theString.get(), 
  +                     context, 
  +                     locator);       
   
        return executionContext.getXObjectFactory().createString(theString);
   }
  @@ -147,116 +122,24 @@
        const double                                            theNumber = 
arg1->num();
        const XalanDOMString&                           thePattern = 
arg2->str();
   
  -     const XalanDOMString&                           theDecimalFormatName = 
arg3->str();
  -     assert(length(theDecimalFormatName) != 0);
  -
  -     const XalanQNameByValue                         
theQName(theDecimalFormatName, executionContext.getPrefixResolver());
  -
  -     const XalanDecimalFormatSymbols*        theDFS =
  -                     executionContext.getDecimalFormatSymbols(theQName);
  -
  -     if (theDFS == 0)
  -     {
  -             executionContext.warn(
  -                             s_warningNotFoundString,
  -                             context,
  -                             locator);
  -
  -             theDFS = 
executionContext.getDecimalFormatSymbols(theEmptyQName);
  +     const XalanDOMString&                           theDFSName = 
arg3->str();
  +     assert(length(theDFSName) != 0);
        
  -     }       
  -
        typedef XPathExecutionContext::GetAndReleaseCachedString        
GetAndReleaseCachedString;
   
        GetAndReleaseCachedString       theString(executionContext);
   
  -     doFormat(
  -                     executionContext,
  -                     context,
  -                     theNumber,
  -                     thePattern,
  -                     theDFS,
  -                     theString.get(),
  -                     locator);
  +     executionContext.formatNumber(
  +             theNumber, 
  +             thePattern,
  +             theDFSName,
  +             theString.get(),
  +             context, 
  +             locator);
   
        return executionContext.getXObjectFactory().createString(theString);
   }
   
  -
  -
  -void
  -FunctionFormatNumber::doFormat(
  -                     XPathExecutionContext&                          
executionContext,
  -                     XalanNode*                                              
        context,
  -                     double                                                  
        theNumber,
  -                     const XalanDOMString&                           
thePattern,
  -                     const XalanDecimalFormatSymbols*        theDFS,
  -                     XalanDOMString&                                         
theResult,
  -                     const LocatorType*                                      
locator,
  -                     bool                                                    
        fWarn) const
  -{
  -     if (DoubleSupport::isNaN(theNumber) == true)
  -     {
  -             if (theDFS != 0)
  -             {
  -                     theResult = theDFS->getNaN();
  -             }
  -             else
  -             {
  -                     DoubleToDOMString(theNumber, theResult);
  -             }
  -     }
  -     else if (DoubleSupport::isNegativeInfinity(theNumber) == true)
  -     {
  -             if (theDFS != 0)
  -             {
  -                     theResult = theDFS->getMinusSign();
  -                     theResult += theDFS->getInfinity();
  -             }
  -             else
  -             {
  -                     DoubleToDOMString(theNumber, theResult);
  -             }
  -     }
  -     else if (DoubleSupport::isPositiveInfinity(theNumber) == true )
  -     {
  -             if (theDFS != 0)
  -             {
  -                     theResult = theDFS->getInfinity();
  -             }
  -             else
  -             {
  -                     DoubleToDOMString(theNumber, theResult);
  -             }
  -     }
  -     else
  -     {
  -             if (fWarn == true)
  -             {
  -                     executionContext.warn(s_warningNotImplementedString, 
context, locator);
  -             }
  -
  -             if (theDFS != 0)
  -             {
  -                     XalanDecimalFormat      theFormatter(s_emptyString, 
*theDFS);
  -
  -                     theFormatter.applyLocalizedPattern(thePattern);
  -
  -                     theFormatter.format(theNumber, theResult);
  -             }
  -             else
  -             {
  -                     XalanDecimalFormat      theFormatter(s_emptyString, 
m_decimalFormatSymbols);
  -
  -                     theFormatter.applyLocalizedPattern(thePattern);
  -
  -                     theFormatter.format(theNumber, theResult);
  -             }
  -     }
  -}
  -
  -
  -
   #if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
   Function*
   #else
  @@ -267,47 +150,10 @@
        return new FunctionFormatNumber(*this);
   }
   
  -
  -
   const XalanDOMString
   FunctionFormatNumber::getError() const
   {
        return 
XalanMessageLoader::getMessage(XalanMessages::FunctionTakesTwoOrThreeArguments_1Param,"format-number()");
   }
  -
  -
  -
  -static XalanDOMString        s_staticWarningNotImplementedString;
  -static XalanDOMString        s_staticWarningNotFoundString;
  -
  -
  -const XalanDOMString&        
FunctionFormatNumber::s_warningNotImplementedString =
  -             s_staticWarningNotImplementedString;
  -
  -const XalanDOMString&        FunctionFormatNumber::s_warningNotFoundString =
  -             s_staticWarningNotFoundString;
  -
  -const XalanDOMString FunctionFormatNumber::s_emptyString;
  -
  -
  -void
  -FunctionFormatNumber::initialize()
  -{
  -     s_staticWarningNotImplementedString = 
XalanMessageLoader::getMessage(XalanMessages::FunctionIsNotImplemented_1Param,"format-number()");
  -
  -     s_staticWarningNotFoundString = 
XalanMessageLoader::getMessage(XalanMessages::Decimal_formatElementNotFound_1Param,"format-number()");
  -}
  -
  -
  -
  -void
  -FunctionFormatNumber::terminate()
  -{
  -     releaseMemory(s_staticWarningNotImplementedString);
  -
  -     releaseMemory(s_staticWarningNotFoundString);
  -}
  -
  -
   
   XALAN_CPP_NAMESPACE_END
  
  
  
  1.3       +0 -53     xml-xalan/c/src/xalanc/XSLT/FunctionFormatNumber.hpp
  
  Index: FunctionFormatNumber.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/FunctionFormatNumber.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FunctionFormatNumber.hpp  6 Jan 2004 02:41:36 -0000       1.2
  +++ FunctionFormatNumber.hpp  25 Feb 2004 20:47:59 -0000      1.3
  @@ -64,32 +64,12 @@
   
   
   
  -#include <vector>
  -
  -
  -
  -#include <xalanc/XalanDOM/XalanDOMString.hpp>
  -
  -
  -
  -#include <xalanc/PlatformSupport/XalanDecimalFormatSymbols.hpp>
  -
  -
  -
   #include <xalanc/XPath/Function.hpp>
   
   
   
   XALAN_CPP_NAMESPACE_BEGIN
   
  -
  -
  -class XalanDecimalFormatSymbols;
  -class XObject;
  -class XPathExecutionContext;
  -
  -
  -
   // Implementation of the XSLT function format-number.
   //
   class XALAN_XSLT_EXPORT FunctionFormatNumber : public Function
  @@ -98,18 +78,6 @@
   
        typedef Function        ParentType;
   
  -     /**
  -      * Perform static initialization.  See class XSLTInit.
  -      */
  -     static void
  -     initialize();
  -
  -     /**
  -      * Perform static shut down.  See class XSLTInit.
  -      */
  -     static void
  -     terminate();
  -
        FunctionFormatNumber();
   
        virtual
  @@ -145,19 +113,6 @@
   #endif
        clone() const;
   
  -protected:
  -
  -     virtual void
  -     doFormat(
  -                     XPathExecutionContext&                          
executionContext,
  -                     XalanNode*                                              
        context,
  -                     double                                                  
        theNumber,
  -                     const XalanDOMString&                           
thePattern,
  -                     const XalanDecimalFormatSymbols*        theDFS,
  -                     XalanDOMString&                                         
theResult,
  -                     const LocatorType*                                      
locator,
  -                     bool                                                    
        fWarn = true) const;
  -
   private:
   
        const XalanDOMString
  @@ -170,14 +125,6 @@
        bool
        operator==(const FunctionFormatNumber&) const;
   
  -     // Data members...
  -     const XalanDecimalFormatSymbols         m_decimalFormatSymbols;
  -
  -     static const XalanDOMString&            s_warningNotImplementedString;
  -
  -     static const XalanDOMString&            s_warningNotFoundString;
  -
  -     static const XalanDOMString                     s_emptyString;
   };
   
   
  
  
  
  1.19      +99 -1     
xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.cpp
  
  Index: StylesheetExecutionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.cpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- StylesheetExecutionContextDefault.cpp     6 Feb 2004 18:01:50 -0000       
1.18
  +++ StylesheetExecutionContextDefault.cpp     25 Feb 2004 20:47:59 -0000      
1.19
  @@ -136,6 +136,8 @@
   
   
   
  +
  +
   StylesheetExecutionContextDefault::StylesheetExecutionContextDefault(
                        XSLTEngineImpl&                 xsltProcessor,
                        XPathEnvSupport&                theXPathEnvSupport,
  @@ -160,6 +162,7 @@
        m_printWriters(),
        m_outputStreams(),
        m_collationCompareFunctor(0),
  +     m_formatNumberFunctor(0),
        m_variablesStack(),
        m_matchPatternCache(),
        m_keyTables(),
  @@ -202,6 +205,7 @@
        m_printWriters(),
        m_outputStreams(),
        m_collationCompareFunctor(0),
  +     m_formatNumberFunctor(0),
        m_variablesStack(),
        m_matchPatternCache(),
        m_keyTables(),
  @@ -1645,6 +1649,100 @@
   
   
   
  +static const XalanQNameByValue       theEmptyQName;
  +
  +
  +
  +void 
  +StylesheetExecutionContextDefault::formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context,
  +                     const LocatorType*                                      
locator)
  +{
  +     const XalanDecimalFormatSymbols * theDFS = 
getDecimalFormatSymbols(theEmptyQName);
  +
  +     if (m_formatNumberFunctor == 0) 
  +     {
  +             m_xpathExecutionContextDefault.doFormatNumber(number,pattern, 
theDFS, theResult,context,locator);
  +     } 
  +     else 
  +     {
  +             (*m_formatNumberFunctor)(*this, number, pattern, theDFS, 
theResult, context, locator);
  +     }
  +}
  + 
  +
  +
  +void 
  +StylesheetExecutionContextDefault::formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     const XalanDOMString&                           dfsName,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context,
  +                     const LocatorType*                                      
locator)
  +{
  +     XalanQNameByValue&      theDFSQName = 
m_xpathExecutionContextDefault.getScratchQName();
  +     theDFSQName.set(dfsName, getPrefixResolver(), locator);
  +
  +     const XalanDecimalFormatSymbols*        theDFS = 
getDecimalFormatSymbols(theDFSQName);
  +
  +     if (theDFS == 0)
  +     {
  +             warn(
  +                             
XalanMessageLoader::getMessage(XalanMessages::Decimal_formatElementNotFound_1Param,"format-number()"),
  +                             context,
  +                             locator);       
  +             theDFS = getDecimalFormatSymbols(theEmptyQName);
  +             
  +     }
  +
  +     if (m_formatNumberFunctor == 0) 
  +     {
  +             
m_xpathExecutionContextDefault.doFormatNumber(number,pattern,theDFS,theResult,context,locator);
  +     } 
  +     else 
  +     {       
  +             (*m_formatNumberFunctor)(*this, number, pattern, theDFS, 
theResult, context, locator);
  +     }
  +}
  +
  +
  +
  +const StylesheetExecutionContextDefault::FormatNumberFunctor*
  
+StylesheetExecutionContextDefault::installFormatNumberFunctor(FormatNumberFunctor*
   theFunctor)
  +{
  +     assert(theFunctor != 0);
  +
  +     const FormatNumberFunctor * const       temp = m_formatNumberFunctor;
  +
  +     m_formatNumberFunctor = theFunctor;
  +
  +     return temp;
  +}
  +
  +
  +
  +StylesheetExecutionContextDefault::FormatNumberFunctor*
  +StylesheetExecutionContextDefault::uninstallFormatNumberFunctor() {
  +     if (m_formatNumberFunctor == 0)
  +     {
  +             return 0;
  +     }
  +     else
  +     {
  +             FormatNumberFunctor * const     temp = m_formatNumberFunctor;
  +
  +             m_formatNumberFunctor = 0;
  +
  +             return temp;
  +     }
  +}
  +
  +
  +
   bool
   StylesheetExecutionContextDefault::getInConstruction(const KeyDeclaration&   
keyDeclaration) const
   {
  @@ -2062,7 +2160,7 @@
   {
        if (m_stylesheetRoot == 0)
        {
  -             return 
m_xpathExecutionContextDefault.getDecimalFormatSymbols(qname);
  +             return 0; 
        }
        else
        {
  
  
  
  1.14      +50 -3     
xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.hpp
  
  Index: StylesheetExecutionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.hpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- StylesheetExecutionContextDefault.hpp     6 Feb 2004 18:01:50 -0000       
1.13
  +++ StylesheetExecutionContextDefault.hpp     25 Feb 2004 20:47:59 -0000      
1.14
  @@ -769,6 +769,50 @@
        CollationCompareFunctor*
        uninstallCollationCompareFunctor();
   
  +
  +     class  FormatNumberFunctor
  +     {
  +     public:
  +             FormatNumberFunctor() {};
  +
  +             virtual
  +             ~FormatNumberFunctor() {};
  +
  +             virtual void
  +             operator() (
  +                     XPathExecutionContext&                          
executionContext,
  +                     double                                                  
        theNumber,
  +                     const XalanDOMString&                           
thePattern,
  +                     const XalanDecimalFormatSymbols*        theDFS,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0) const =0;
  +     };
  +
  +     void 
  +     formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0);
  +
  +     void 
  +     formatNumber(
  +                     double                                                  
        number,
  +                     const XalanDOMString&                           pattern,
  +                     const XalanDOMString&                           dfsName,
  +                     XalanDOMString&                                         
theResult,
  +                     const XalanNode*                                        
context = 0,
  +                     const LocatorType*                                      
locator = 0);
  +
  +
  +     const FormatNumberFunctor * 
  +     installFormatNumberFunctor(FormatNumberFunctor * formatNumberFunctor);
  +     
  +     FormatNumberFunctor *
  +     uninstallFormatNumberFunctor();
  +
        virtual bool
        getInConstruction(const KeyDeclaration&         keyDeclaration) const;
   
  @@ -778,9 +822,6 @@
        virtual void
        endConstruction(const KeyDeclaration&   keyDeclaration);
   
  -     virtual const XalanDecimalFormatSymbols*
  -     getDecimalFormatSymbols(const XalanQName&       qname);
  -
        virtual PrintWriter*
        createPrintWriter(XalanOutputStream*            theTextOutputStream);
   
  @@ -1009,6 +1050,9 @@
        virtual bool
        returnFormatterToText(FormatterToText*  theFormatter);
   
  +     virtual const XalanDecimalFormatSymbols*
  +     getDecimalFormatSymbols(const XalanQName&       qname);
  +
   private:
   
        /**
  @@ -1091,6 +1135,8 @@
   
        CollationCompareFunctor*                        
m_collationCompareFunctor;
   
  +     FormatNumberFunctor *                           m_formatNumberFunctor;
  +
        /**
         * Holds all information about variables during execution.
         */
  @@ -1158,6 +1204,7 @@
        static XalanNumberFormatFactory*        s_xalanNumberFormatFactory;
   
        static const DefaultCollationCompareFunctor             
s_defaultCollationFunctor;
  +
   };
   
   
  
  
  
  1.4       +0 -5      xml-xalan/c/src/xalanc/XSLT/XSLTInit.cpp
  
  Index: XSLTInit.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/XSLTInit.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XSLTInit.cpp      6 Jan 2004 02:41:36 -0000       1.3
  +++ XSLTInit.cpp      25 Feb 2004 20:47:59 -0000      1.4
  @@ -61,7 +61,6 @@
   
   #include "Constants.hpp"
   #include "ElemNumber.hpp"
  -#include "FunctionFormatNumber.hpp"
   #include "StylesheetHandler.hpp"
   #include "XSLTEngineImpl.hpp"
   
  @@ -111,8 +110,6 @@
   
        ElemNumber::initialize();
   
  -     FunctionFormatNumber::initialize();
  -
        XSLTEngineImpl::initialize();
   
        StylesheetHandler::initialize();
  @@ -126,8 +123,6 @@
        StylesheetHandler::terminate();
   
        XSLTEngineImpl::terminate();
  -
  -     FunctionFormatNumber::terminate();
   
        ElemNumber::terminate();
   
  
  
  
  1.14      +6 -9      
xml-xalan/c/src/xalanc/XalanTransformer/XalanTransformer.cpp
  
  Index: XalanTransformer.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/xalanc/XalanTransformer/XalanTransformer.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- XalanTransformer.cpp      28 Jan 2004 20:20:27 -0000      1.13
  +++ XalanTransformer.cpp      25 Feb 2004 20:48:00 -0000      1.14
  @@ -116,9 +116,9 @@
   
   //#define XALAN_USE_ICU
   #if defined(XALAN_USE_ICU)
  -#include <xalanc/ICUBridge/FunctionICUFormatNumber.hpp>
   #include <xalanc/ICUBridge/ICUBridgeCleanup.hpp>
   #include <xalanc/ICUBridge/ICUBridgeCollationCompareFunctor.hpp>
  +#include <xalanc/ICUBridge/ICUFormatNumberFunctor.hpp>
   #endif
   
   
  @@ -169,7 +169,11 @@
   
        
m_stylesheetExecutionContext->installCollationCompareFunctor(theICUFunctor.get());
   
  +     XalanAutoPtr<ICUFormatNumberFunctor>  theFormatNumberFunctor(new 
ICUFormatNumberFunctor());
  +     
m_stylesheetExecutionContext->installFormatNumberFunctor(theFormatNumberFunctor.get());
        theICUFunctor.release();
  +     theFormatNumberFunctor.release();
  +
   #endif
   }
   
  @@ -197,6 +201,7 @@
   #if defined(XALAN_USE_ICU)
        // Uninstall the ICU collation compare functor, and destroy it...
        delete m_stylesheetExecutionContext->uninstallCollationCompareFunctor();
  +     delete m_stylesheetExecutionContext->uninstallFormatNumberFunctor();
   #endif
   
        delete m_stylesheetExecutionContext;
  @@ -218,14 +223,6 @@
        XalanEXSLTSetFunctionsInstaller::installGlobal();
        XalanEXSLTStringFunctionsInstaller::installGlobal();
        XalanEXSLTDateTimeFunctionsInstaller::installGlobal();
  -
  -
  -#if defined(XALAN_USE_ICU)
  -     // Install the ICU version of format-number...
  -     XPath::installFunction(
  -                     XPathFunctionTable::s_formatNumber,
  -                     FunctionICUFormatNumber());
  -#endif
   
        s_xsltInit = initGuard.release();
        s_emptyInputSource = inputSourceGuard.release();
  
  
  

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

Reply via email to