dbertoni    00/05/08 10:29:46

  Modified:    c/src/XSLT ElemDecimalFormat.hpp ElemNumber.cpp
                        ElemNumber.hpp FunctionFormatNumber.cpp
                        FunctionFormatNumber.hpp Stylesheet.cpp
                        Stylesheet.hpp StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        StylesheetHandler.cpp XSLTEngineImpl.cpp
                        XSLTInputSource.cpp
  Log:
  Changes for ICU integration and fixes for import/include and relative URIs.
  
  Revision  Changes    Path
  1.3       +7 -7      xml-xalan/c/src/XSLT/ElemDecimalFormat.hpp
  
  Index: ElemDecimalFormat.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemDecimalFormat.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ElemDecimalFormat.hpp     2000/04/19 17:32:27     1.2
  +++ ElemDecimalFormat.hpp     2000/05/08 17:29:34     1.3
  @@ -69,7 +69,7 @@
   
   
   
  -#include <PlatformSupport/DecimalFormatSymbols.hpp>
  +#include <PlatformSupport/XalanDecimalFormatSymbols.hpp>
   
   
   
  @@ -110,7 +110,7 @@
                        XalanNode*                                              
sourceNode,
                        const QName&                                    mode) 
const;
   
  -     const DecimalFormatSymbols&
  +     const XalanDecimalFormatSymbols&
        getDecimalFormatSymbols() const
        {
                return m_decimalFormatSymbols;
  @@ -124,13 +124,13 @@
   
   private:
   
  -     const XPath*                    m_countMatchPattern;
  -     const XPath*                    m_fromMatchPattern;
  -     const XPath*                    m_valueExpr;
  +     const XPath*                            m_countMatchPattern;
  +     const XPath*                            m_fromMatchPattern;
  +     const XPath*                            m_valueExpr;
   
  -     XalanDOMString                  m_name_avt;
  +     XalanDOMString                          m_name_avt;
   
  -     DecimalFormatSymbols    m_decimalFormatSymbols;
  +     XalanDecimalFormatSymbols       m_decimalFormatSymbols;
   };
   
   
  
  
  
  1.16      +8 -8      xml-xalan/c/src/XSLT/ElemNumber.cpp
  
  Index: ElemNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- ElemNumber.cpp    2000/05/01 16:41:11     1.15
  +++ ElemNumber.cpp    2000/05/08 17:29:34     1.16
  @@ -67,7 +67,7 @@
   
   
   #include <PlatformSupport/DOMStringHelper.hpp>
  -#include <PlatformSupport/NumberFormat.hpp>
  +#include <PlatformSupport/XalanNumberFormat.hpp>
   
   
   
  @@ -576,17 +576,17 @@
   #endif
   
   
  -NumberFormat*
  +XalanNumberFormat*
   ElemNumber::getNumberFormatter(
                        StylesheetExecutionContext&             
executionContext,
                        XalanNode*                                              
contextNode) const
   {
   #if ! defined(__GNUC__)
  -     std::locale loc = getLocale(executionContext, contextNode);
  +//   std::locale loc = getLocale(executionContext, contextNode);
   #endif
  -    
  +
       // Helper to format local specific numbers to strings.
  -     std::auto_ptr<NumberFormat>             formatter(new NumberFormat);
  +     std::auto_ptr<XalanNumberFormat>        
formatter(executionContext.createXalanNumberFormat());
   
        XalanDOMString  digitGroupSepValue;
        if (0 != m_groupingSeparator_avt)
  @@ -604,7 +604,7 @@
        {
                formatter->setGroupingUsed(true);
                formatter->setGroupingSeparator(digitGroupSepValue);
  -             formatter->setGroupingSize(nDigitsPerGroupValue);
  +             
formatter->setGroupingSize(DOMStringToUnsignedLong(nDigitsPerGroupValue));
        }
   
        return formatter.release();
  @@ -642,7 +642,7 @@
        NumberFormatStringTokenizer             formatTokenizer(formatValue);
   
   #if ! defined(__GNUC__)
  -     std::locale             loc = getLocale(executionContext, contextNode);
  +//   std::locale             loc = getLocale(executionContext, contextNode);
   #endif
   
        typedef vector<XalanDOMString>          StringVectorType;
  @@ -713,7 +713,7 @@
                        int                                                     
        listElement) const
   {
   
  -     std::auto_ptr<NumberFormat> formatter(
  +     StylesheetExecutionContext::XalanNumberFormatAutoPtr    formatter(
                        getNumberFormatter(executionContext, contextNode));
   
        XalanDOMString  padString = formatter->format(0);
  
  
  
  1.13      +3 -3      xml-xalan/c/src/XSLT/ElemNumber.hpp
  
  Index: ElemNumber.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.hpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- ElemNumber.hpp    2000/05/01 16:41:11     1.12
  +++ ElemNumber.hpp    2000/05/08 17:29:34     1.13
  @@ -58,7 +58,7 @@
   #define XALAN_ELEMNUMBER_HEADER_GUARD 
   
   /**
  - * $Id: ElemNumber.hpp,v 1.12 2000/05/01 16:41:11 dbertoni Exp $
  + * $Id: ElemNumber.hpp,v 1.13 2000/05/08 17:29:34 dbertoni Exp $
    * 
    * $State: Exp $
    * 
  @@ -89,8 +89,8 @@
   
   
   
  -class NumberFormat;
   class QName;
  +class XalanNumberFormat;
   class XPath;
   class XPathExecutionContext;
   
  @@ -238,7 +238,7 @@
                        XalanNode*                                              
contextNode) const;
   #endif
   
  -     NumberFormat*
  +     XalanNumberFormat*
        getNumberFormatter(
                        StylesheetExecutionContext&             
executionContext,
                        XalanNode*                                              
contextNode) const;
  
  
  
  1.3       +34 -19    xml-xalan/c/src/XSLT/FunctionFormatNumber.cpp
  
  Index: FunctionFormatNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionFormatNumber.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FunctionFormatNumber.cpp  2000/04/11 15:09:27     1.2
  +++ FunctionFormatNumber.cpp  2000/05/08 17:29:35     1.3
  @@ -58,12 +58,8 @@
   
   
   
  -#include <dom/DOMString.hpp>
  -
  -
  -
  -#include <PlatformSupport/DecimalFormat.hpp>
  -#include <PlatformSupport/DecimalFormatSymbols.hpp>
  +#include <PlatformSupport/XalanDecimalFormat.hpp>
  +#include <PlatformSupport/XalanDecimalFormatSymbols.hpp>
   #include <PlatformSupport/DOMStringHelper.hpp>
   
   
  @@ -109,20 +105,15 @@
        }
        else
        {
  -             
executionContext.warn(XALAN_STATIC_UCODE_STRING("format-number() is not fully 
implemented!"),
  -                                                       context);
  -
                assert(args[0] != 0);
                assert(args[1] != 0);
                assert(theSize == 2 || args[2] != 0);
   
  -             DecimalFormat                                   theFormatter;
  +             const double                                            
theNumber = args[0]->num();
  +             const XalanDOMString                            thePattern = 
args[1]->str();
   
  -             const double                                    theNumber = 
args[0]->num();
  -             const XalanDOMString                    theFormatString = 
args[1]->str();
  +             const XalanDecimalFormatSymbols*        theDFS = 0;
   
  -             const DecimalFormatSymbols*             theDFS = 0;
  -
                if (theSize == 3)
                {
                        const XalanDOMString                            
theDecimalFormatName = args[2]->str();
  @@ -141,13 +132,15 @@
                {
                        theDFS = 
executionContext.getDecimalFormatSymbols(Constants::DEFAULT_DECIMAL_FORMAT);
                }
  -
  -             theFormatter.setDecimalFormatSymbols(theDFS == 0 ? 
DecimalFormatSymbols() : *theDFS);
   
  -             theFormatter.applyLocalizedPattern(theFormatString);
  +             const XalanDOMString    theString = doFormat(
  +                                             executionContext,
  +                                             context,
  +                                             theNumber,
  +                                             thePattern,
  +                                             theDFS);
   
  -             // $$$ ToDo: This is not really working according to the spec.
  -             return 
executionContext.getXObjectFactory().createString(theFormatter.format(theNumber));
  +             return 
executionContext.getXObjectFactory().createString(theString);
        }
   }
   
  @@ -161,4 +154,26 @@
   FunctionFormatNumber::clone() const
   {
        return new FunctionFormatNumber(*this);
  +}
  +
  +
  +
  +XalanDOMString
  +FunctionFormatNumber::doFormat(
  +                     XPathExecutionContext&                          
executionContext,
  +                     XalanNode*                                              
        context,
  +                     double                                                  
        theNumber,
  +                     const XalanDOMString&                           
thePattern,
  +                     const XalanDecimalFormatSymbols*        theDFS)
  +{
  +     executionContext.warn(XALAN_STATIC_UCODE_STRING("format-number() is not 
fully implemented!"),
  +                                               context);
  +
  +     XalanDecimalFormat      theFormatter;
  +
  +     theFormatter.setDecimalFormatSymbols(theDFS != 0 ? *theDFS : 
XalanDecimalFormatSymbols());
  +
  +     theFormatter.applyLocalizedPattern(thePattern);
  +
  +     return theFormatter.format(theNumber);
   }
  
  
  
  1.5       +15 -0     xml-xalan/c/src/XSLT/FunctionFormatNumber.hpp
  
  Index: FunctionFormatNumber.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionFormatNumber.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FunctionFormatNumber.hpp  2000/04/18 15:27:52     1.4
  +++ FunctionFormatNumber.hpp  2000/05/08 17:29:35     1.5
  @@ -68,10 +68,15 @@
   
   
   
  +#include <XalanDOM/XalanDOMString.hpp>
  +
  +
  +
   #include <XPath/Function.hpp>
   
   
   
  +class XalanDecimalFormatSymbols;
   class XObject;
   class XPathExecutionContext;
   
  @@ -103,6 +108,16 @@
        virtual FunctionFormatNumber*
   #endif
        clone() const;
  +
  +protected:
  +
  +     virtual XalanDOMString
  +     doFormat(
  +                     XPathExecutionContext&                          
executionContext,
  +                     XalanNode*                                              
        context,
  +                     double                                                  
        theNumber,
  +                     const XalanDOMString&                           
thePattern,
  +                     const XalanDecimalFormatSymbols*        theDFS);
   
   private:
   
  
  
  
  1.15      +2 -2      xml-xalan/c/src/XSLT/Stylesheet.cpp
  
  Index: Stylesheet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.cpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- Stylesheet.cpp    2000/05/01 15:13:10     1.14
  +++ Stylesheet.cpp    2000/05/08 17:29:35     1.15
  @@ -1213,10 +1213,10 @@
   
   
   
  -const DecimalFormatSymbols*
  +const XalanDecimalFormatSymbols*
   Stylesheet::getDecimalFormatSymbols(const XalanDOMString&    name) const
   {
  -     const DecimalFormatSymbols*                                     dfs = 0;
  +     const XalanDecimalFormatSymbols*                                dfs = 0;
   
        const ElemDecimalFormatVectorType::size_type    theSize =
                m_elemDecimalFormats.size();
  
  
  
  1.11      +3 -3      xml-xalan/c/src/XSLT/Stylesheet.hpp
  
  Index: Stylesheet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Stylesheet.hpp    2000/05/01 15:13:10     1.10
  +++ Stylesheet.hpp    2000/05/08 17:29:35     1.11
  @@ -92,7 +92,7 @@
   
   class AttributeList;
   class ExtensionNSHandler;
  -class DecimalFormatSymbols;
  +class XalanDecimalFormatSymbols;
   class ElemAttributeSet;
   class ElemDecimalFormat;
   class ElemTemplate;
  @@ -391,13 +391,13 @@
                        StylesheetConstructionContext&  constructionContext);
   
        /**
  -      * Retrieve the DecimalFormatSymbols instance associated with
  +      * Retrieve the XalanDecimalFormatSymbols instance associated with
         * the name.
         *
         * @param name the name for the lookup
         * @return a pointer to the matching instance, or 0 if none was found
         */
  -     const DecimalFormatSymbols*
  +     const XalanDecimalFormatSymbols*
        getDecimalFormatSymbols(const XalanDOMString&   name) const;
   
        /**
  
  
  
  1.11      +20 -3     xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
  
  Index: StylesheetExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- StylesheetExecutionContext.hpp    2000/05/01 15:13:10     1.10
  +++ StylesheetExecutionContext.hpp    2000/05/08 17:29:35     1.11
  @@ -66,8 +66,8 @@
   
   
   
  -// std stream forward declarations.
   #include <iosfwd>
  +#include <memory>
   
   
   
  @@ -98,9 +98,10 @@
   class Stylesheet;
   class StylesheetRoot;
   class TextOutputStream;
  +class XalanDocument;
   class XalanElement;
   class XalanNode;
  -class XalanDocument;
  +class XalanNumberFormat;
   class XPath;
   class XObject;
   
  @@ -914,6 +915,22 @@
                StylesheetExecutionContext&                     
m_executionContext;
        };
   
  +
  +#if defined(XALAN_NO_NAMESPACES)
  +     typedef auto_ptr<XalanNumberFormat>                     
XalanNumberFormatAutoPtr;
  +#else
  +     typedef std::auto_ptr<XalanNumberFormat>        
XalanNumberFormatAutoPtr;
  +#endif
  +
  +     /**
  +      * Create a new XalanNumberFormat instance.
  +      *
  +      * @return an auto_ptr that owns a new XalanNumberFormat instance.
  +      */
  +     virtual XalanNumberFormatAutoPtr
  +     createXalanNumberFormat() = 0;
  +
  +
        // These interfaces are inherited from XPathExecutionContext...
   
        virtual XalanNode*
  @@ -1059,7 +1076,7 @@
                        XalanDocument*                  theDocument) = 0;
   
   
  -     virtual const DecimalFormatSymbols*
  +     virtual const XalanDecimalFormatSymbols*
        getDecimalFormatSymbols(const XalanDOMString&   name) = 0;
   
        virtual PrintWriter*
  
  
  
  1.9       +58 -1     
xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp
  
  Index: StylesheetExecutionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- StylesheetExecutionContextDefault.cpp     2000/05/01 15:13:10     1.8
  +++ StylesheetExecutionContextDefault.cpp     2000/05/08 17:29:35     1.9
  @@ -68,6 +68,7 @@
   
   #include <PlatformSupport/STLHelper.hpp>
   #include <PlatformSupport/TextOutputStream.hpp>
  +#include <PlatformSupport/XalanNumberFormat.hpp>
   
   
   
  @@ -94,6 +95,13 @@
   
   
   
  +StylesheetExecutionContextDefault::XalanNumberFormatFactory          
StylesheetExecutionContextDefault::s_defaultXalanNumberFormatFactory;
  +
  +StylesheetExecutionContextDefault::XalanNumberFormatFactory* 
StylesheetExecutionContextDefault::s_xalanNumberFormatFactory =
  +             
&StylesheetExecutionContextDefault::getDefaultXalanNumberFormatFactory();
  +
  +
  +
   StylesheetExecutionContextDefault::StylesheetExecutionContextDefault(
                        XSLTEngineImpl&                 xsltProcessor,
                        XPathEnvSupport&                theXPathEnvSupport,
  @@ -724,6 +732,55 @@
   
   
   
  +StylesheetExecutionContextDefault::XalanNumberFormatAutoPtr
  +StylesheetExecutionContextDefault::createXalanNumberFormat()
  +{
  +     return XalanNumberFormatAutoPtr(s_xalanNumberFormatFactory->create());
  +}
  +
  +
  +
  
+StylesheetExecutionContextDefault::XalanNumberFormatFactory::XalanNumberFormatFactory()
  +{
  +}
  +
  +
  +
  
+StylesheetExecutionContextDefault::XalanNumberFormatFactory::~XalanNumberFormatFactory()
  +{
  +}
  +
  +
  +
  +XalanNumberFormat*
  +StylesheetExecutionContextDefault::XalanNumberFormatFactory::create()
  +{
  +     return new XalanNumberFormat();
  +}
  +
  +
  +
  +StylesheetExecutionContextDefault::XalanNumberFormatFactory*
  
+StylesheetExecutionContextDefault::installXalanNumberFormatFactory(XalanNumberFormatFactory*
 theFactory)
  +{
  +     XalanNumberFormatFactory* const         theOldFactory =
  +             s_xalanNumberFormatFactory;
  +
  +     if (theFactory == 0)
  +     {
  +             s_xalanNumberFormatFactory = &s_defaultXalanNumberFormatFactory;
  +     }
  +     else
  +     {
  +             s_xalanNumberFormatFactory = theFactory;
  +     }
  +
  +     return theOldFactory;
  +}
  +
  +
  +
  +
   XalanNode*
   StylesheetExecutionContextDefault::getCurrentNode() const
   {
  @@ -1051,7 +1108,7 @@
   
   
   
  -const DecimalFormatSymbols*
  +const XalanDecimalFormatSymbols*
   StylesheetExecutionContextDefault::getDecimalFormatSymbols(const 
XalanDOMString&     name)
   {
        if (m_stylesheetRoot == 0)
  
  
  
  1.10      +45 -6     
xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp
  
  Index: StylesheetExecutionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- StylesheetExecutionContextDefault.hpp     2000/05/01 15:13:10     1.9
  +++ StylesheetExecutionContextDefault.hpp     2000/05/08 17:29:36     1.10
  @@ -335,7 +335,42 @@
        virtual const ElemTemplateElement*
        popElementRecursionStack();
   
  +     virtual XalanNumberFormatAutoPtr
  +     createXalanNumberFormat();
   
  +
  +     // A basic class to create XalanNumberFormat instances...
  +     class XALAN_XSLT_EXPORT XalanNumberFormatFactory
  +     {
  +     public:
  +
  +             explicit
  +             XalanNumberFormatFactory();
  +
  +             virtual
  +             ~XalanNumberFormatFactory();
  +
  +             virtual XalanNumberFormat*
  +             create();
  +     };
  +
  +     static XalanNumberFormatFactory&
  +     getDefaultXalanNumberFormatFactory()
  +     {
  +             return s_defaultXalanNumberFormatFactory;
  +     }
  +
  +     /**
  +      * Static function to install a new XalanNumberFormatFactory.
  +      * The caller owns the XalanNumberFormatFactory instance.
  +      *
  +      * @param a pointer to the new factory instance to use.
  +      * @return a pointer to the old factory instance.
  +      */
  +     // 
  +     static XalanNumberFormatFactory*
  +     installXalanNumberFormatFactory(XalanNumberFormatFactory*       
theFactory);
  +
        // These interfaces are inherited from XPathExecutionContext...
   
        virtual XalanNode*
  @@ -481,7 +516,7 @@
                        XalanDocument*                  theDocument);
   
   
  -     virtual const DecimalFormatSymbols*
  +     virtual const XalanDecimalFormatSymbols*
        getDecimalFormatSymbols(const XalanDOMString&   name);
   
        virtual PrintWriter*
  @@ -535,16 +570,20 @@
        typedef std::set<PrintWriter*>                                          
PrintWriterSetType;
        typedef std::set<TextOutputStream*>                                     
TextOutputStreamSetType;
   #endif
  +
  +     ElementRecursionStackType                       m_elementRecursionStack;
  +
  +     const PrefixResolver*                           m_prefixResolver;
   
  -     ElementRecursionStackType               m_elementRecursionStack;
  +     StylesheetRoot*                                         
m_stylesheetRoot;
   
  -     const PrefixResolver*                   m_prefixResolver;
  +     PrintWriterSetType                                      m_printWriters;
   
  -     StylesheetRoot*                                 m_stylesheetRoot;
  +     TextOutputStreamSetType                         m_textOutputStreams;
   
  -     PrintWriterSetType                              m_printWriters;
  +     static XalanNumberFormatFactory         
s_defaultXalanNumberFormatFactory;
   
  -     TextOutputStreamSetType                 m_textOutputStreams;
  +     static XalanNumberFormatFactory*        s_xalanNumberFormatFactory;
   };
   
   
  
  
  
  1.23      +9 -4      xml-xalan/c/src/XSLT/StylesheetHandler.cpp
  
  Index: StylesheetHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- StylesheetHandler.cpp     2000/05/01 15:13:10     1.22
  +++ StylesheetHandler.cpp     2000/05/08 17:29:36     1.23
  @@ -1106,10 +1106,13 @@
   
                        const XalanDOMString    href = atts.getValue(i);
   
  -                     const XMLURL* const             hrefUrl = 
m_processor.getURLFromString(href, m_stylesheet.getBaseIdentifier());
  +                     Stylesheet::URLStackType& includeStack = 
m_stylesheet.getIncludeStack();
  +                     assert(includeStack.size() > 0);
  +
  +                     const XMLURL* const             hrefUrl = 
m_processor.getURLFromString(href, includeStack.back()->getURLText());
                        assert(hrefUrl != 0);
   
  -                     StylesheetRoot::URLStackType& importStack = 
m_stylesheet.getStylesheetRoot().getImportStack();
  +                     Stylesheet::URLStackType& importStack = 
m_stylesheet.getStylesheetRoot().getImportStack();
   
                        if(stackContains(importStack, *hrefUrl))
                        {
  @@ -1120,14 +1123,16 @@
   
                        importStack.push_back(hrefUrl);
   
  +                     const XalanDOMString    
theImportURI(hrefUrl->getURLText());
  +
                        Stylesheet* pImportedStylesheet = new Stylesheet(
                                m_stylesheet.getStylesheetRoot(), 
  -                             m_stylesheet.getBaseIdentifier(),
  +                             theImportURI,
                                m_constructionContext);
   
                        StylesheetHandler tp(m_processor, *pImportedStylesheet, 
m_constructionContext);
   
  -                     
pImportedStylesheet->setBaseIdentifier(hrefUrl->getURLText());
  +//                   pImportedStylesheet->setBaseIdentifier();
   
                        m_processor.parseXML(*hrefUrl, &tp, 
pImportedStylesheet);
   
  
  
  
  1.32      +179 -44   xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
  
  Index: XSLTEngineImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- XSLTEngineImpl.cpp        2000/05/01 15:13:10     1.31
  +++ XSLTEngineImpl.cpp        2000/05/08 17:29:36     1.32
  @@ -517,12 +517,14 @@
   #if !defined(XALAN_NO_NAMESPACES)
                using std::auto_ptr;
   #endif
  -
  +#if 0
                auto_ptr<XMLURL> url(getURLFromString(xsldocURLString));
                assert(url.get() != 0);
   
                XSLTInputSource         input(url->getURLText(), 0);
  -
  +#else
  +             XSLTInputSource         input(c_wstr(xsldocURLString));
  +#endif
                return processStylesheet(input, constructionContext);
        }
        catch(SAXException& se)
  @@ -921,8 +923,6 @@
                const XalanDOMString    localName =
                        m_xpathSupport.getLocalNameOfNode(node);
   
  -             // $$$ ToDo: Why can't this iterator be a 
  -             // const_iterator?      VC++ pukes if it is.
                const ElementKeysMapType::const_iterator                j =
                                                s_elementKeys.find(localName);
                if(j != s_elementKeys.end())
  @@ -961,16 +961,8 @@
   
   
   void
  -XSLTEngineImpl::outputToResultTree(
  -                     const XObject&          value)
  +XSLTEngineImpl::outputToResultTree(const XObject&    value)
   {
  -      // java:
  -    // Make the return object into an XObject because it 
  -    // will be easier below.  One of the reasons to do this 
  -    // is to keep all the conversion functionality in the 
  -    // XObject classes.
  -      // JMD: Has to be an XObject
  -
        const int       type = value.getType();
   
        XalanDOMString s;
  @@ -1040,6 +1032,7 @@
        case XObject::eTypeResultTreeFrag:
                outputResultTreeFragment(value);
                break;
  +
        case XObject::eTypeNull:
        case XObject::eTypeUnknown:
        case XObject::eUnknown:
  @@ -1539,16 +1532,33 @@
                        const XalanDOMString&   aname,
                        const XalanDOMString&   value)
   {
  -     assert(length(value) > 0);
  -
        const bool      isPrefix = startsWith(aname, 
DOMServices::s_XMLNamespaceWithSeparator);
  +
        if (equals(aname, DOMServices::s_XMLNamespace) || isPrefix == true) 
        {
                const XalanDOMString            p = isPrefix == true ? 
substring(aname, 6) : XalanDOMString();
                addResultNamespaceDecl(p, value);
        }
  +
        attList.removeAttribute(c_wstr(aname));
  -     attList.addAttribute(c_wstr(aname), 
c_wstr(XALAN_STATIC_UCODE_STRING("CDATA")), c_wstr(value));
  +
  +     if (length(value) > 0)
  +     {
  +             attList.addAttribute(
  +                     c_wstr(aname),
  +                     c_wstr(XALAN_STATIC_UCODE_STRING("CDATA")),
  +                     c_wstr(value));
  +     }
  +     else
  +     {
  +             const XMLCh             theDummy = 0;
  +
  +             attList.addAttribute(
  +                     c_wstr(aname),
  +                     c_wstr(XALAN_STATIC_UCODE_STRING("CDATA")),
  +                     &theDummy);
  +     }
  +
   }
   
   
  @@ -3562,7 +3572,7 @@
   
   
   XMLURL*
  -XSLTEngineImpl::getURLFromString (const XalanDOMString&      urlString) const
  +XSLTEngineImpl::getURLFromString(const XalanDOMString&       urlString) const
   {
   #if !defined(XALAN_NO_NAMESPACES)
        using std::auto_ptr;
  @@ -3572,62 +3582,187 @@
   
        try 
        {
  -             url->setURL(c_wstr(urlString));
  -     }
  -     // 'urlString' not a valid url, try to construct a file url
  -     catch (const MalformedURLException&)
  -     {
  -             XalanDOMString fullpath("file:///");
  +             // Let's see what sort of URI we have...
  +             const unsigned int      index = indexOf(urlString, ':');
   
  -             try 
  +             if (index == 1 || index == length(urlString))
                {
  -//                   XMLCh* lastPart = 
XMLPlatformUtils::getBasePath(c_wstr(urlString));
  -//                   fullpath += lastPart;
  +                     // OK, it's some sort of file specification,
  +                     // so prepend "file:///"
  +                     XalanDOMString fullpath("file:///");
  +
                        fullpath += urlString;
  +
                        url->setURL(c_wstr(fullpath));
                }
  -             catch (MalformedURLException& e2)
  +             else
                {
  -                     diag("Error! Cannot create url for: " + fullpath);
  -                     throw e2;
  +                     // OK, assume it's already got a protocol
  +                     url->setURL(c_wstr(urlString));
                }
        }
  +     catch (...)
  +     {
  +             diag("Error! Cannot create url for: " + urlString);
  +
  +             throw;
  +     }
   
        return url.release();
   }
   
   
   
  +XalanDOMString
  +NormalizeURI(
  +                     const XalanDOMString&   uriString,
  +                     XalanDOMChar                    theOldSeparator,
  +                     XalanDOMChar                    theNewSeparator)
  +{
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::vector;
  +#endif
  +
  +     vector<XalanDOMChar>    theBuffer;
  +
  +     const unsigned int              theLength = length(uriString);
  +
  +     // Reserve enough characters in the buffer...
  +     theBuffer.reserve(theLength);
  +
  +     // See if we have a hybrid DOS-style URI, like
  +     // file:///c:\foo\foo.xml
  +     const unsigned int      i1 = indexOf(uriString, ':');
  +     const unsigned int      i2 = lastIndexOf(uriString, ':');
  +
  +     bool                            fHybrid = i1 == i2 ? false : true;
  +     assert(fHybrid == false || theNewSeparator == '\\');
  +
  +     for(unsigned int i = 0; i < theLength; ++i)
  +     {
  +             const XalanDOMChar      theChar = charAt(uriString, i);
  +
  +             if (fHybrid == true)
  +             {
  +                     if (theChar == theOldSeparator && i > i2)
  +                     {
  +                             theBuffer.push_back(theNewSeparator);
  +                     }
  +                     else
  +                     {
  +                             theBuffer.push_back(theChar);
  +                     }
  +             }
  +             else if (theChar == theOldSeparator)
  +             {
  +                     theBuffer.push_back(theNewSeparator);
  +             }
  +             else
  +             {
  +                     theBuffer.push_back(theChar);
  +             }
  +     }
  +
  +     return XalanDOMString(&theBuffer[0], theBuffer.size());
  +}
  +
  +
  +
   XMLURL* XSLTEngineImpl::getURLFromString(const XalanDOMString&       
urlString, const XalanDOMString& base) const
   {
  -     if (isEmpty(base))
  -             return getURLFromString(urlString);
  +     XalanDOMString  context;
  +
  +     bool                    fNormalizeToSlash = false;
  +     bool                    fNormalizeToBackslash = false;
  +
  +     if (isEmpty(base) == false)
  +     {
  +             // We'll only do the really simple case for now:
  +             // base is a complete file URL and urlString is a forward 
relative path, i.e. 
  +             // in the same directory as the urlString or a subdirectory
  +
  +             // just to be robust, we'll accept a forward or back slash
  +             const unsigned int      theLength = length(base);
  +
  +             const unsigned int      i1 = lastIndexOf(base,'/');
  +             const unsigned int      i2 = lastIndexOf(base,'\\');
  +
  +             unsigned int            i = 0;
  +
  +             if (i1 > i2 && i1 < theLength)
  +             {
  +                     i = i1;
  +
  +                     fNormalizeToSlash = true;
  +             }
  +             else if (i2 < theLength)
  +             {
  +                     i = i2;
  +
  +                     fNormalizeToBackslash = true;
  +             }
  +             else
  +             {
  +                     i = i1;
   
  -     // We'll only do the really simple case for now:
  -     // base is a complete file URL and urlString is a forward relative 
path, i.e. 
  -     // in the same directory as the urlString or a subdirectory
  +                     assert(i2 == theLength);
  +             }
   
  -     XalanDOMString context;
  +             if (i < theLength)
  +             {
  +                     context = substring(base, 0, i + 1);
  +             }
  +     }
   
  -     // just to be robust, we'll accept a forward or back slash
  -     const unsigned int      theLength = length(base);
  +     // OK, now let's look at the urlString...
   
  -     const unsigned int      i1 = lastIndexOf(base,'/');
  -     const unsigned int      i2 = lastIndexOf(base,'\\');
  +     // Is there a colon, indicating some sort of drive spec, or protocol?
  +     const unsigned int      theLength = length(urlString);
  +     const unsigned int      theColonIndex = indexOf(urlString, ':');
   
  -     const unsigned int      i = i1 > i2 && i1 < theLength ? i1 : i2 < 
theLength ? i2 : i1;
  +     if (theColonIndex == theLength)
  +     {
  +             // No colon, so just use the urlString as is...
  +             context += urlString;
  +     }
  +     else if (theColonIndex == 1)
  +     {
  +             // Ahh, it's a drive letter, so ignore the context...
  +             context = urlString;
  +     }
  +     else
  +     {
  +             // Assume it's a protocol...
  +             const XalanDOMString    theProtocol(substring(urlString, 0, 
theColonIndex));
   
  -     if (i < theLength)
  -             context = substring(base, 0, i + 1);
  +             if (startsWith(context, theProtocol) == true)
  +             {
  +                     // OK, everything looks good, so strip off the protocol 
and colon...
  +                     context += substring(urlString, theColonIndex + 1, 
theLength);
  +             }
  +             else
  +             {
  +                     // OK, not the same protocol, so what can we do???
  +                     context = urlString;
  +             }
  +     }
   
  -     context += urlString;
  +     if (fNormalizeToSlash == true)
  +     {
  +             context = NormalizeURI(context, '\\', '/');
  +     }
  +     else if (fNormalizeToBackslash == true)
  +     {
  +             context = NormalizeURI(context, '/', '\\');
  +     }
   
        return getURLFromString(context);
   }    
   
   
  +
   void
  -XSLTEngineImpl::setFormatter(Formatter*      formatter)
  +XSLTEngineImpl::setFormatter(Formatter*              formatter)
   {
        flushPending();
   
  
  
  
  1.6       +1 -1      xml-xalan/c/src/XSLT/XSLTInputSource.cpp
  
  Index: XSLTInputSource.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTInputSource.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XSLTInputSource.cpp       2000/04/25 19:54:18     1.5
  +++ XSLTInputSource.cpp       2000/05/08 17:29:36     1.6
  @@ -176,7 +176,7 @@
                        // It could be a DOS-style file spec...
                        const unsigned int      theBackslashIndex = 
indexOf(theSystemID, '\\');
   
  -                     if (theBackslashIndex < theLength && theBackslashIndex 
== 3)
  +                     if (theBackslashIndex < theLength && theBackslashIndex 
== 2)
                        {
                                // OK, another shot at a file...
                                theResult = new BinFileInputStream(theSystemID);
  
  
  

Reply via email to