You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2002/09/26 03:38:16 UTC
cvs commit: xml-xalan/c/src/XSLT ElemLiteralResult.cpp ElemTemplateElement.cpp NamespacesHandler.cpp NamespacesHandler.hpp ResultTreeFrag.cpp ResultTreeFrag.hpp Stylesheet.cpp Stylesheet.hpp StylesheetHandler.cpp StylesheetRoot.cpp
dbertoni 2002/09/25 18:38:16
Modified: c/src/XSLT ElemLiteralResult.cpp ElemTemplateElement.cpp
NamespacesHandler.cpp NamespacesHandler.hpp
ResultTreeFrag.cpp ResultTreeFrag.hpp
Stylesheet.cpp Stylesheet.hpp StylesheetHandler.cpp
StylesheetRoot.cpp
Log:
New pooled string implementation.
Revision Changes Path
1.55 +13 -3 xml-xalan/c/src/XSLT/ElemLiteralResult.cpp
Index: ElemLiteralResult.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemLiteralResult.cpp,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- ElemLiteralResult.cpp 24 Sep 2002 01:42:34 -0000 1.54
+++ ElemLiteralResult.cpp 26 Sep 2002 01:38:15 -0000 1.55
@@ -248,6 +248,8 @@
// that will need namespace declarations...
m_attrCount = m_avts.size();
+ XalanDOMString thePrefix;
+
for(AVTVectorType::size_type i = 0; i < m_attrCount; ++i)
{
const AVT* const avt = m_avts[i];
@@ -258,7 +260,9 @@
if (theColonIndex != length(theName))
{
- m_namespacesHandler.addActivePrefix(XalanDOMString(theName, 0, theColonIndex));
+ theName.substr(thePrefix, 0, theColonIndex);
+
+ m_namespacesHandler.addActivePrefix(constructionContext, thePrefix);
}
}
@@ -406,13 +410,19 @@
{
if(equals(localName, Constants::ATTRNAME_EXTENSIONELEMENTPREFIXES))
{
- m_namespacesHandler.processExtensionElementPrefixes(attrValue, stylesheetTree.getNamespaces(), constructionContext);
+ m_namespacesHandler.processExtensionElementPrefixes(
+ constructionContext,
+ attrValue,
+ stylesheetTree.getNamespaces());
return true;
}
else if (equals(localName, Constants::ATTRNAME_EXCLUDE_RESULT_PREFIXES))
{
- m_namespacesHandler.processExcludeResultPrefixes(attrValue, stylesheetTree.getNamespaces(), constructionContext);
+ m_namespacesHandler.processExcludeResultPrefixes(
+ constructionContext,
+ attrValue,
+ stylesheetTree.getNamespaces());
return true;
}
1.80 +9 -4 xml-xalan/c/src/XSLT/ElemTemplateElement.cpp
Index: ElemTemplateElement.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.cpp,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -r1.79 -r1.80
--- ElemTemplateElement.cpp 24 Sep 2002 05:59:38 -0000 1.79
+++ ElemTemplateElement.cpp 26 Sep 2002 01:38:15 -0000 1.80
@@ -124,9 +124,11 @@
XalanElement(),
PrefixResolver(),
m_finishedConstruction(false),
- m_namespacesHandler(stylesheetTree.getNamespacesHandler(),
- stylesheetTree.getNamespaces(),
- stylesheetTree.getXSLTNamespaceURI()),
+ m_namespacesHandler(
+ constructionContext,
+ stylesheetTree.getNamespacesHandler(),
+ stylesheetTree.getNamespaces(),
+ stylesheetTree.getXSLTNamespaceURI()),
m_stylesheet(stylesheetTree),
m_lineNumber(lineNumber),
m_columnNumber(columnNumber),
@@ -1055,7 +1057,10 @@
StylesheetConstructionContext& constructionContext,
const NamespacesHandler& theParentHandler)
{
- m_namespacesHandler.postConstruction(getElementName(), &theParentHandler);
+ m_namespacesHandler.postConstruction(
+ constructionContext,
+ getElementName(),
+ &theParentHandler);
if (hasChildren() == true)
{
1.22 +119 -44 xml-xalan/c/src/XSLT/NamespacesHandler.cpp
Index: NamespacesHandler.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/NamespacesHandler.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- NamespacesHandler.cpp 5 Sep 2002 07:08:13 -0000 1.21
+++ NamespacesHandler.cpp 26 Sep 2002 01:38:15 -0000 1.22
@@ -78,6 +78,10 @@
+const XalanDOMString NamespacesHandler::NamespaceExtended::s_emptyString;
+
+
+
NamespacesHandler::NamespacesHandler() :
m_excludedResultPrefixes(),
m_namespaceDeclarations(),
@@ -91,9 +95,10 @@
NamespacesHandler::NamespacesHandler(
- const NamespacesHandler& /* stylesheetNamespacesHandler */,
- const NamespacesStackType& theCurrentNamespaces,
- const XalanDOMString& theXSLTNamespaceURI) :
+ StylesheetConstructionContext& theConstructionContext,
+ const NamespacesHandler& /* stylesheetNamespacesHandler */,
+ const NamespacesStackType& theCurrentNamespaces,
+ const XalanDOMString& theXSLTNamespaceURI) :
m_excludedResultPrefixes(),
m_namespaceDeclarations(),
m_extensionNamespaceURIs(),
@@ -131,13 +136,20 @@
{
if (m_namespaceDeclarations.count(thePrefix) == 0)
{
- m_namespaceDeclarations.insert(NamespacesMapType::value_type(thePrefix, theNamespace));
+ m_namespaceDeclarations.insert(
+ NamespacesMapType::value_type(
+ thePrefix,
+ NamespaceExtended(
+ theConstructionContext.getPooledString(theNamespace.getPrefix()),
+ theConstructionContext.getPooledString(theNamespace.getURI()))));
}
}
else
{
m_excludedResultPrefixes.insert(
- ExcludedResultPrefixesMapType::value_type(thePrefix, theURI));
+ ExcludedResultPrefixesMapType::value_type(
+ thePrefix,
+ &theConstructionContext.getPooledString(theURI)));
}
}
}
@@ -145,20 +157,18 @@
-NamespacesHandler::NamespacesHandler(const NamespacesHandler& theSource) :
- m_excludedResultPrefixes(theSource.m_excludedResultPrefixes),
- m_namespaceDeclarations(theSource.m_namespaceDeclarations),
- m_extensionNamespaceURIs(theSource.m_extensionNamespaceURIs),
- m_namespaceAliases(theSource.m_namespaceAliases),
- m_activePrefixes(theSource.m_activePrefixes),
- m_processAliases(theSource.m_processAliases)
+NamespacesHandler::~NamespacesHandler()
{
}
-NamespacesHandler::~NamespacesHandler()
+void
+NamespacesHandler::addExtensionNamespaceURI(
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theURI)
{
+ m_extensionNamespaceURIs.push_back(&theConstructionContext.getPooledString(theURI));
}
@@ -172,7 +182,7 @@
if (i != m_excludedResultPrefixes.end())
{
- return &(*i).second;
+ return (*i).second;
}
else
{
@@ -215,7 +225,7 @@
if (i != m_namespaceAliases.end())
{
- return &(*i).second;
+ return (*i).second;
}
else
{
@@ -227,10 +237,33 @@
void
+NamespacesHandler::setNamespaceAlias(
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theStylesheetNamespace,
+ const XalanDOMString& theResultNamespace)
+{
+ m_namespaceAliases[theStylesheetNamespace] =
+ &theConstructionContext.getPooledString(theResultNamespace);
+}
+
+
+
+void
+NamespacesHandler::addActivePrefix(
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& thePrefix)
+{
+ m_activePrefixes.push_back(
+ &theConstructionContext.getPooledString(thePrefix));
+}
+
+
+
+void
NamespacesHandler::processExcludeResultPrefixes(
+ StylesheetConstructionContext& theConstructionContext,
const XalanDOMChar* theValue,
- const NamespacesStackType& theCurrentNamespaces,
- StylesheetConstructionContext& theConstructionContext)
+ const NamespacesStackType& theCurrentNamespaces)
{
StringTokenizer tokenizer(
theValue,
@@ -259,7 +292,8 @@
theConstructionContext.error(theMessage);
}
- m_excludedResultPrefixes[thePrefix] = *theNamespace;
+ m_excludedResultPrefixes[thePrefix] =
+ &theConstructionContext.getPooledString(*theNamespace);
}
}
@@ -267,9 +301,9 @@
void
NamespacesHandler::processExtensionElementPrefixes(
+ StylesheetConstructionContext& theConstructionContext,
const XalanDOMChar* theValue,
- const NamespacesStackType& theCurrentNamespaces,
- StylesheetConstructionContext& theConstructionContext)
+ const NamespacesStackType& theCurrentNamespaces)
{
StringTokenizer tokenizer(
theValue,
@@ -296,7 +330,9 @@
theConstructionContext.error(theMessage);
}
- m_extensionNamespaceURIs.insert(*theNamespace);
+ assert(theNamespace != 0);
+
+ m_extensionNamespaceURIs.push_back(&theConstructionContext.getPooledString(*theNamespace));
}
}
@@ -304,8 +340,9 @@
void
NamespacesHandler::postConstruction(
- const XalanDOMString& theElementName,
- const NamespacesHandler* parentNamespacesHandler)
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theElementName,
+ const NamespacesHandler* parentNamespacesHandler)
{
// Copy everything from the parent handler, if there is one...
if (parentNamespacesHandler != 0)
@@ -328,12 +365,12 @@
substring(theElementName, thePrefix, 0, indexOfNSSep);
}
- processExcludeResultPrefixes(thePrefix);
+ processExcludeResultPrefixes(theConstructionContext, thePrefix);
// $$ ToDo: Does this happen before or after exclude-result-prefixes?
processNamespaceAliases();
- createResultAttributeNames();
+ createResultAttributeNames(theConstructionContext);
// We don't need these any more...
m_activePrefixes.clear();
@@ -367,7 +404,7 @@
{
// These are commone namespaces that are always excluded...
if(equals(theURI, theXSLTNamespaceURI)
- || m_extensionNamespaceURIs.find(theURI) != m_extensionNamespaceURIs.end()
+ || isExtensionNamespaceURI(theURI) == true
|| equals(theURI, DOMServices::s_XMLNamespaceURI))
{
return true;
@@ -401,7 +438,7 @@
for(; i != theEnd; ++i)
{
- const NameSpaceExtended& theNamespace = (*i).second;
+ const NamespaceExtended& theNamespace = (*i).second;
const XalanDOMString& thePrefix = theNamespace.getPrefix();
@@ -463,7 +500,9 @@
while(i != theEnd)
{
- if (equals((*i).second, theNamespaceURI) == true)
+ assert((*i).second != 0);
+
+ if (equals(*(*i).second, theNamespaceURI) == true)
{
return true;
}
@@ -478,6 +517,33 @@
+bool
+NamespacesHandler::findString(
+ const XalanDOMString& theString,
+ const XalanDOMStringPointerVectorType& theVector)
+{
+ const XalanDOMStringPointerVectorType::const_iterator theEnd = theVector.end();
+ XalanDOMStringPointerVectorType::const_iterator theCurrent = theVector.begin();
+
+ while(theCurrent != theEnd)
+ {
+ assert(*theCurrent != 0);
+
+ const XalanDOMString* const theCurrentString = *theCurrent;
+
+ if (theString == *theCurrentString)
+ {
+ return true;
+ }
+
+ ++theCurrent;
+ }
+
+ return false;
+}
+
+
+
void
NamespacesHandler::clear()
{
@@ -511,7 +577,7 @@
void
-NamespacesHandler::createResultAttributeNames()
+NamespacesHandler::createResultAttributeNames(StylesheetConstructionContext& theConstructionContext)
{
// Go through all of the result namespaces and create the attribute
// name that will be used when they're written to the result tree.
@@ -524,9 +590,11 @@
NamespacesMapType::iterator i =
m_namespaceDeclarations.begin();
+ XalanDOMString theName;
+
for(; i != theEnd; ++i)
{
- NameSpaceExtended& theNamespace = (*i).second;
+ NamespaceExtended& theNamespace = (*i).second;
const XalanDOMString& thePrefix = theNamespace.getPrefix();
@@ -534,15 +602,13 @@
{
// Create a name of the form xmlns:prefix, where "prefix" is the
// text of the prefix.
- XalanDOMString theName;
-
// Reserve the appropriate amount of space in the string.
reserve(theName, DOMServices::s_XMLNamespaceWithSeparatorLength + length(thePrefix) + 1);
- theName += DOMServices::s_XMLNamespaceWithSeparator;
+ theName = DOMServices::s_XMLNamespaceWithSeparator;
theName += thePrefix;
- theNamespace.setResultAttributeName(theName);
+ theNamespace.setResultAttributeName(theConstructionContext.getPooledString(theName));
}
else
{
@@ -556,7 +622,9 @@
void
-NamespacesHandler::processExcludeResultPrefixes(const XalanDOMString& theElementPrefix)
+NamespacesHandler::processExcludeResultPrefixes(
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theElementPrefix)
{
if (m_excludedResultPrefixes.empty() == false)
{
@@ -580,7 +648,7 @@
// Check for any result prefixes we should exclude...
while(i != theEnd)
{
- const NameSpace& theNamespace = (*i).second;
+ const NamespaceExtended& theNamespace = (*i).second;
const XalanDOMString& thePrefix = theNamespace.getPrefix();
const XalanDOMString& theURI = theNamespace.getURI();
@@ -588,16 +656,18 @@
// We can never exclude the prefix of our owner element, so
// check that first...
if (equals(thePrefix, theElementPrefix) == false &&
- m_activePrefixes.find(thePrefix) == m_activePrefixes.end() &&
+ isActivePrefix(thePrefix) == false &&
(isExcludedNamespaceURI(theURI) == true ||
- m_extensionNamespaceURIs.find(theURI) != m_extensionNamespaceURIs.end()))
+ isExtensionNamespaceURI(theURI) == true))
{
// It's excluded, so remove it...
theDeadEntries.push_back(i);
// Add it to the excluded prefixes, in case we need it later...
m_excludedResultPrefixes.insert(
- ExcludedResultPrefixesMapType::value_type(thePrefix, theURI));
+ ExcludedResultPrefixesMapType::value_type(
+ thePrefix,
+ &theConstructionContext.getPooledString(theURI)));
}
++i;
@@ -629,7 +699,7 @@
// alias as appropriate...
for(; i != theEnd; ++i)
{
- NameSpace& theNamespace = (*i).second;
+ NamespaceExtended& theNamespace = (*i).second;
const XalanDOMString& theURI =
theNamespace.getURI();
@@ -680,7 +750,7 @@
void
-NamespacesHandler::copyExtensionNamespaceURIs(const ExtensionNamespaceURISetType& theExtensionNamespaceURIs)
+NamespacesHandler::copyExtensionNamespaceURIs(const XalanDOMStringPointerVectorType& theExtensionNamespaceURIs)
{
if (theExtensionNamespaceURIs.empty() == false)
{
@@ -690,16 +760,21 @@
}
else
{
- const ExtensionNamespaceURISetType::const_iterator theEnd =
+ const XalanDOMStringPointerVectorType::const_iterator theEnd =
theExtensionNamespaceURIs.end();
- ExtensionNamespaceURISetType::const_iterator i =
+ XalanDOMStringPointerVectorType::const_iterator i =
theExtensionNamespaceURIs.begin();
// Add them in...
while(i != theEnd)
{
- m_extensionNamespaceURIs.insert(*i);
+ assert(*i != 0);
+
+ if (isExtensionNamespaceURI(**i) == false)
+ {
+ m_extensionNamespaceURIs.push_back(*i);
+ }
++i;
}
1.13 +159 -64 xml-xalan/c/src/XSLT/NamespacesHandler.hpp
Index: NamespacesHandler.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/NamespacesHandler.hpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- NamespacesHandler.hpp 5 Sep 2002 07:08:13 -0000 1.12
+++ NamespacesHandler.hpp 26 Sep 2002 01:38:15 -0000 1.13
@@ -92,25 +92,75 @@
{
public:
- class NameSpaceExtended : public NameSpace
+ class NamespaceExtended
{
public:
- NameSpaceExtended(
- const XalanDOMString& prefix = XalanDOMString(),
- const XalanDOMString& uri = XalanDOMString()) :
- NameSpace(prefix, uri),
- m_resultAttributeName()
+ NamespaceExtended() :
+ m_prefix(&s_emptyString),
+ m_uri(&s_emptyString),
+ m_resultAttributeName(&s_emptyString)
{
}
- NameSpaceExtended(const NameSpace& theNamespace) :
- NameSpace(theNamespace),
- m_resultAttributeName()
+ NamespaceExtended(
+ const XalanDOMString& prefix,
+ const XalanDOMString& uri) :
+ m_prefix(&prefix),
+ m_uri(&uri),
+ m_resultAttributeName(&s_emptyString)
{
}
/**
+ * Retrieve the prefix for namespace
+ *
+ * @return prefix string
+ */
+ const XalanDOMString&
+ getPrefix() const
+ {
+ assert(m_prefix != 0);
+
+ return *m_prefix;
+ }
+
+ /**
+ * Set the prefix for namespace
+ *
+ * @param prefix The new prefix value
+ */
+ void
+ setPrefix(const XalanDOMString& prefix)
+ {
+ m_prefix = &prefix;
+ }
+
+ /**
+ * Retrieve the URI for namespace
+ *
+ * @return URI string
+ */
+ const XalanDOMString&
+ getURI() const
+ {
+ assert(m_uri != 0);
+
+ return *m_uri;
+ }
+
+ /**
+ * Set the URI for namespace
+ *
+ * @param uri The new uri value
+ */
+ void
+ setURI(const XalanDOMString& uri)
+ {
+ m_uri = &uri;
+ }
+
+ /**
* Retrieve the name of the result attribute.
*
* @return name string
@@ -118,7 +168,9 @@
const XalanDOMString&
getResultAttributeName() const
{
- return m_resultAttributeName;
+ assert(m_resultAttributeName != 0);
+
+ return *m_resultAttributeName;
}
/**
@@ -129,12 +181,18 @@
void
setResultAttributeName(const XalanDOMString& name)
{
- m_resultAttributeName = name;
+ m_resultAttributeName = &name;
}
private:
- XalanDOMString m_resultAttributeName;
+ const XalanDOMString* m_prefix;
+
+ const XalanDOMString* m_uri;
+
+ const XalanDOMString* m_resultAttributeName;
+
+ static const XalanDOMString s_emptyString;
};
typedef XalanQName::NamespaceVectorType NamespaceVectorType;
@@ -142,33 +200,29 @@
#if defined(XALAN_NO_NAMESPACES)
typedef map<XalanDOMString,
- XalanDOMString,
+ const XalanDOMString*,
less<XalanDOMString> > ExcludedResultPrefixesMapType;
typedef map<XalanDOMString,
- NameSpaceExtended,
+ NamespaceExtended,
less<XalanDOMString> > NamespacesMapType;
typedef map<XalanDOMString,
- XalanDOMString,
+ const XalanDOMString*,
less<XalanDOMString> > NamespaceAliasesMapType;
- typedef set<XalanDOMString,
- less<XalanDOMString> > ExtensionNamespaceURISetType;
-
- typedef set<XalanDOMString,
- less<XalanDOMString> > ActivePrefixesSetType;
+ typedef vector<const XalanDOMString*> XalanDOMStringPointerVectorType;
#else
- typedef std::map<XalanDOMString, XalanDOMString> ExcludedResultPrefixesMapType;
-
typedef std::map<XalanDOMString,
- NameSpaceExtended> NamespacesMapType;
+ const XalanDOMString*> ExcludedResultPrefixesMapType;
- typedef std::map<XalanDOMString, XalanDOMString> NamespaceAliasesMapType;
+ typedef std::map<XalanDOMString,
+ NamespaceExtended> NamespacesMapType;
- typedef std::set<XalanDOMString> ExtensionNamespaceURISetType;
+ typedef std::map<XalanDOMString,
+ const XalanDOMString*> NamespaceAliasesMapType;
- typedef std::set<XalanDOMString> ActivePrefixesSetType;
+ typedef std::vector<const XalanDOMString*> XalanDOMStringPointerVectorType;
#endif
/**
@@ -181,55 +235,57 @@
* Create an instance namespace handler using the
* current namespaces in effect.
*
+ * @param theConstructionContext The current construction context.
* @param stylesheetNamespacesHandler The stylesheet's handler.
* @param theCurrentNamespaces The stack of active namespace declarations.
* @param theXSLTNamespaceURI The namespace URI for XSLT.
*/
NamespacesHandler(
- const NamespacesHandler& stylesheetNamespacesHandler,
- const NamespacesStackType& theCurrentNamespaces,
- const XalanDOMString& theXSLTNamespaceURI);
-
- NamespacesHandler(const NamespacesHandler& theSource);
+ StylesheetConstructionContext& theConstructionContext,
+ const NamespacesHandler& stylesheetNamespacesHandler,
+ const NamespacesStackType& theCurrentNamespaces,
+ const XalanDOMString& theXSLTNamespaceURI);
~NamespacesHandler();
/**
* Process an exclude-result-prefixes attribute.
*
+ * @param theConstructionContext The current construction context.
* @param theValue The attribute's value.
* @param theCurrentNamespaces The stack of active namespace declarations.
- * @param theConstructionContext The current construction context.
*/
void
processExcludeResultPrefixes(
+ StylesheetConstructionContext& theConstructionContext,
const XalanDOMChar* theValue,
- const NamespacesStackType& theCurrentNamespaces,
- StylesheetConstructionContext& theConstructionContext);
+ const NamespacesStackType& theCurrentNamespaces);
/**
* Process an extension-element-prefixes attribute.
*
+ * @param theConstructionContext The current construction context.
* @param theValue The attribute's value.
* @param theCurrentNamespaces The stack of active namespace declarations.
- * @param theConstructionContext The current construction context.
*/
void
processExtensionElementPrefixes(
+ StylesheetConstructionContext& theConstructionContext,
const XalanDOMChar* theValue,
- const NamespacesStackType& theCurrentNamespaces,
- StylesheetConstructionContext& theConstructionContext);
+ const NamespacesStackType& theCurrentNamespaces);
/**
* Notify the instance that the stylesheet is fully constructed.
*
+ * @param theConstructionContext The current construction context.
* @param theElementName The name of the owning element.
* @param parentNamespacesHandler The parent handler, if any.
*/
void
postConstruction(
- const XalanDOMString& theElementName = XalanDOMString(),
- const NamespacesHandler* parentNamespacesHandler = 0);
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theElementName = XalanDOMString(),
+ const NamespacesHandler* parentNamespacesHandler = 0);
NamespacesHandler&
operator=(const NamespacesHandler& theRHS);
@@ -249,13 +305,13 @@
/**
* Add a URI as an extension namespace prefixes.
*
+ * @param theConstructionContext The current construction context.
* @param theURI The namespace URI.
*/
void
- addExtensionNamespaceURI(const XalanDOMString& theURI)
- {
- m_extensionNamespaceURIs.insert(theURI);
- }
+ addExtensionNamespaceURI(
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theURI);
/**
* Get the namespace URI for the given prefix.
@@ -278,27 +334,26 @@
/**
* Set the namespace alias URI for the given namespace.
*
+ * @param theConstructionContext The current construction context.
* @param theStylesheetNamespace The namespace as declared in the stylesheet.
* @param theResultNamespace The namespace as it should appear in the result tree.
*/
void
setNamespaceAlias(
- const XalanDOMString& theStylesheetNamespace,
- const XalanDOMString& theResultNamespace)
- {
- m_namespaceAliases[theStylesheetNamespace] = theResultNamespace;
- }
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theStylesheetNamespace,
+ const XalanDOMString& theResultNamespace);
/**
* Add a prefix to the list of active prefixes.
*
+ * @param theConstructionContext The current construction context.
* @param thePrefix The prefix that is active and requires a namespace declaration.
*/
void
- addActivePrefix(const XalanDOMString& thePrefix)
- {
- m_activePrefixes.insert(thePrefix);
- }
+ addActivePrefix(
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& thePrefix);
/**
* Copy the aliases from the given NamespacesHandler.
@@ -355,17 +410,22 @@
/**
* Create all of the result attribute names.
+ *
+ * @param theConstructionContext The current construction context.
*/
void
- createResultAttributeNames();
+ createResultAttributeNames(StylesheetConstructionContext& theConstructionContext);
/**
* Process the exclude result prefix data.
*
+ * @param theConstructionContext The current construction context.
* @param theElementPrefix The prefix of the owning element.
*/
void
- processExcludeResultPrefixes(const XalanDOMString& theElementPrefix);
+ processExcludeResultPrefixes(
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& theElementPrefix);
/**
* Process the namespace aliases data.
@@ -382,12 +442,12 @@
copyNamespaceAliases(const NamespaceAliasesMapType& theNamespaceAliases);
/**
- * Copy the contents of the supplied set
+ * Copy the contents of the supplied vector
*
* @param theExtensionNamespaceURIs The set to copy.
*/
void
- copyExtensionNamespaceURIs(const ExtensionNamespaceURISetType& theExtensionNamespaceURIs);
+ copyExtensionNamespaceURIs(const XalanDOMStringPointerVectorType& theExtensionNamespaceURIs);
/**
* Copy the contents of the supplied map
@@ -413,32 +473,67 @@
const NameSpace& theNamespace) const;
/**
- * Determine of a given namespace should be excluded as a result of
+ * Determine if a given namespace should be excluded as a result of
* an exclude-result-prefixes declaration.
*
* @param theNamespaceURI The namespace URI to check.
- * @return true of the namespace should be excluded, false if not.
+ * @return true if the namespace should be excluded, false if not.
*/
bool
isExcludedNamespaceURI(const XalanDOMString& theNamespaceURI) const;
+ /**
+ * Determine if a given URI is an extension namespace URI
+ *
+ * @param theNamespaceURI The namespace URI to check.
+ * @return true if the namespace uri is an extension namespace URI, false if not.
+ */
+ bool
+ isExtensionNamespaceURI(const XalanDOMString& theNamespaceURI) const
+ {
+ return findString(theNamespaceURI, m_extensionNamespaceURIs);
+ }
+
+ /**
+ * Determine if a given prefix is active.
+ *
+ * @param thePrefix The prefix to check.
+ * @return true if the prefix is active, false if not.
+ */
+ bool
+ isActivePrefix(const XalanDOMString& thePrefix) const
+ {
+ return findString(thePrefix, m_activePrefixes);
+ }
+
+ /**
+ * Determine if a given string is present in the vector
+ *
+ * @param theString The string to find.
+ * @return true if the string is present, false if not.
+ */
+ static bool
+ findString(
+ const XalanDOMString& theString,
+ const XalanDOMStringPointerVectorType& theVector);
+
// Not implemented...
bool
operator==(const NamespacesHandler&) const;
// Data members...
- ExcludedResultPrefixesMapType m_excludedResultPrefixes;
+ ExcludedResultPrefixesMapType m_excludedResultPrefixes;
- NamespacesMapType m_namespaceDeclarations;
+ NamespacesMapType m_namespaceDeclarations;
- ExtensionNamespaceURISetType m_extensionNamespaceURIs;
+ XalanDOMStringPointerVectorType m_extensionNamespaceURIs;
- NamespaceAliasesMapType m_namespaceAliases;
+ NamespaceAliasesMapType m_namespaceAliases;
- ActivePrefixesSetType m_activePrefixes;
+ XalanDOMStringPointerVectorType m_activePrefixes;
// If true namespace aliases will be processed. If false, they will not.
- bool m_processAliases;
+ bool m_processAliases;
};
1.6 +113 -2 xml-xalan/c/src/XSLT/ResultTreeFrag.cpp
Index: ResultTreeFrag.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ResultTreeFrag.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ResultTreeFrag.cpp 23 Feb 2002 03:32:00 -0000 1.5
+++ ResultTreeFrag.cpp 26 Sep 2002 01:38:15 -0000 1.6
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -70,11 +70,16 @@
const XalanDOMString ResultTreeFrag::s_emptyString;
+static const unsigned int dummyPos = ~0u;
+
ResultTreeFrag::ResultTreeFrag(XalanSourceTreeDocumentFragment* theDocumentFragment) :
ResultTreeFragBase(),
XalanNodeList(),
- m_documentFragment(theDocumentFragment)
+ m_documentFragment(theDocumentFragment),
+ m_length(dummyPos),
+ m_lastIndex(dummyPos),
+ m_lastNode(0)
{
}
@@ -404,6 +409,38 @@
+void
+ResultTreeFrag::setDocumentFragment(XalanSourceTreeDocumentFragment* theDocumentFragment)
+{
+ m_documentFragment = theDocumentFragment;
+ m_length = dummyPos;
+ m_lastIndex = dummyPos;
+ m_lastNode = 0;
+}
+
+
+
+#if !defined(NDEBUG)
+const XalanNode*
+itemDebug(
+ const XalanDocumentFragment* theDocumentFragment,
+ unsigned int index)
+{
+ assert(theDocumentFragment != 0);
+
+ const XalanNode* theCurrentChild = theDocumentFragment->getFirstChild();
+
+ for(unsigned int i = 0; i < index && theCurrentChild != 0; ++i)
+ {
+ theCurrentChild = theCurrentChild->getNextSibling();
+ }
+
+ return theCurrentChild;
+}
+
+#endif
+
+
XalanNode*
ResultTreeFrag::item(unsigned int index) const
{
@@ -413,6 +450,62 @@
{
return 0;
}
+ else if (index == m_lastIndex)
+ {
+ assert(itemDebug(m_documentFragment, index) == m_lastNode);
+
+ return m_lastNode;
+ }
+ else if (m_lastIndex != dummyPos && index == m_lastIndex + 1)
+ {
+#if defined(XALAN_NO_MUTABLE)
+ ((ResultTreeFrag*)this)->m_lastIndex = index;
+#else
+ m_lastIndex = index;
+#endif
+
+ if (m_lastNode != 0)
+ {
+#if defined(XALAN_NO_MUTABLE)
+ ((ResultTreeFrag*)this)->m_lastNode = m_lastNode->getNextSibling()
+#else
+ m_lastNode = m_lastNode->getNextSibling();
+#endif
+ }
+ else
+ {
+#if defined(XALAN_NO_MUTABLE)
+ ((ResultTreeFrag*)this)->m_lastNode = 0
+#else
+ m_lastNode = 0;
+#endif
+ }
+
+ assert(itemDebug(m_documentFragment, index) == m_lastNode);
+
+ return m_lastNode;
+ }
+ else if (index > m_lastIndex)
+ {
+ XalanNode* theCurrentChild = m_lastNode;
+
+ for(unsigned int i = m_lastIndex; i < index && theCurrentChild != 0; ++i)
+ {
+ theCurrentChild = theCurrentChild->getNextSibling();
+ }
+
+#if defined(XALAN_NO_MUTABLE)
+ ((ResultTreeFrag*)this)->m_lastIndex = index;
+ ((ResultTreeFrag*)this)->m_lastNode = theCurrentChild
+#else
+ m_lastIndex = index;
+ m_lastNode = theCurrentChild;
+#endif
+
+ assert(itemDebug(m_documentFragment, index) == m_lastNode);
+
+ return m_lastNode;
+ }
else
{
XalanNode* theCurrentChild = m_documentFragment->getFirstChild();
@@ -422,6 +515,14 @@
theCurrentChild = theCurrentChild->getNextSibling();
}
+#if defined(XALAN_NO_MUTABLE)
+ ((ResultTreeFrag*)this)->m_lastIndex = index;
+ ((ResultTreeFrag*)this)->m_lastNode = theCurrentChild
+#else
+ m_lastIndex = index;
+ m_lastNode = theCurrentChild;
+#endif
+
return theCurrentChild;
}
}
@@ -435,6 +536,10 @@
{
return 0;
}
+ else if (m_length != dummyPos)
+ {
+ return m_length;
+ }
else
{
unsigned int theLength = 0;
@@ -446,6 +551,12 @@
++theLength;
theCurrentChild = theCurrentChild->getNextSibling();
}
+
+#if defined(XALAN_NO_MUTABLE)
+ ((ResultTreeFrag*)this)->m_length = theLength;
+#else
+ m_length = theLength;
+#endif
return theLength;
}
1.4 +9 -5 xml-xalan/c/src/XSLT/ResultTreeFrag.hpp
Index: ResultTreeFrag.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ResultTreeFrag.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ResultTreeFrag.hpp 23 Feb 2002 03:32:00 -0000 1.3
+++ ResultTreeFrag.hpp 26 Sep 2002 01:38:15 -0000 1.4
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -219,10 +219,7 @@
}
void
- setDocumentFragment(XalanSourceTreeDocumentFragment* theDocumentFragment)
- {
- m_documentFragment = theDocumentFragment;
- }
+ setDocumentFragment(XalanSourceTreeDocumentFragment* theDocumentFragment);
private:
@@ -244,6 +241,13 @@
// Data members...
XalanSourceTreeDocumentFragment* m_documentFragment;
+
+ // These are for caching results...
+ mutable unsigned int m_length;
+
+ mutable unsigned int m_lastIndex;
+
+ mutable XalanNode* m_lastNode;
static const XalanDOMString s_emptyString;
};
1.81 +9 -5 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.80
retrieving revision 1.81
diff -u -r1.80 -r1.81
--- Stylesheet.cpp 24 Sep 2002 01:42:35 -0000 1.80
+++ Stylesheet.cpp 26 Sep 2002 01:38:15 -0000 1.81
@@ -456,7 +456,7 @@
}
// Call postConstruction() on our own namespaces handler...
- m_namespacesHandler.postConstruction();
+ m_namespacesHandler.postConstruction(constructionContext);
{
@@ -1213,12 +1213,13 @@
void
Stylesheet::addExtensionNamespace(
- const XalanDOMString& uri,
- ExtensionNSHandler* nsh)
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& uri,
+ ExtensionNSHandler* nsh)
{
m_extensionNamespaces.insert(ExtensionNamespacesMapType::value_type(uri, nsh));
- m_namespacesHandler.addExtensionNamespaceURI(uri);
+ m_namespacesHandler.addExtensionNamespaceURI(theConstructionContext, uri);
}
@@ -1358,7 +1359,10 @@
// $$$ ToDo: Enable other code. Perhaps an error?
m_prefixAliases[*stylesheetNamespace] = *resultNamespace;
- m_namespacesHandler.setNamespaceAlias(*stylesheetNamespace, *resultNamespace);
+ m_namespacesHandler.setNamespaceAlias(
+ constructionContext,
+ *stylesheetNamespace,
+ *resultNamespace);
#else
const PrefixAliasesMapType::iterator i =
m_prefixAliases.find(*stylesheetNamespace);
1.48 +8 -7 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.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- Stylesheet.hpp 24 Jul 2002 23:19:43 -0000 1.47
+++ Stylesheet.hpp 26 Sep 2002 01:38:15 -0000 1.48
@@ -381,19 +381,19 @@
/**
* See if a namespace should be excluded.
*
- * @param theValue the prefix of the namespace.
* @param theConstructionContext the current construction context.
+ * @param theValue the prefix of the namespace.
* @return
*/
void
processExcludeResultPrefixes(
- const XalanDOMChar* theValue,
- StylesheetConstructionContext& theConstructionContext)
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMChar* theValue)
{
m_namespacesHandler.processExcludeResultPrefixes(
+ theConstructionContext,
theValue,
- m_namespaces,
- theConstructionContext);
+ m_namespaces);
}
/**
@@ -879,8 +879,9 @@
*/
void
addExtensionNamespace(
- const XalanDOMString& uri,
- ExtensionNSHandler* nsh);
+ StylesheetConstructionContext& theConstructionContext,
+ const XalanDOMString& uri,
+ ExtensionNSHandler* nsh);
/**
* Return the handler for a given extension namespace.
1.90 +2 -2 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.89
retrieving revision 1.90
diff -u -r1.89 -r1.90
--- StylesheetHandler.cpp 24 Sep 2002 06:57:42 -0000 1.89
+++ StylesheetHandler.cpp 26 Sep 2002 01:38:15 -0000 1.90
@@ -1109,7 +1109,7 @@
if(equals(aname, Constants::ATTRNAME_EXCLUDE_RESULT_PREFIXES))
{
- m_stylesheet.processExcludeResultPrefixes(atts.getValue(i), m_constructionContext);
+ m_stylesheet.processExcludeResultPrefixes(m_constructionContext, atts.getValue(i));
}
else if(equals(aname, Constants::ATTRNAME_EXTENSIONELEMENTPREFIXES))
{
@@ -1126,7 +1126,7 @@
ExtensionNSHandler* const nsh = new ExtensionNSHandler(extns);
- m_stylesheet.addExtensionNamespace(extns, nsh);
+ m_stylesheet.addExtensionNamespace(m_constructionContext, extns, nsh);
}
}
else if(equals(aname, Constants::ATTRNAME_ID))
1.64 +20 -4 xml-xalan/c/src/XSLT/StylesheetRoot.cpp
Index: StylesheetRoot.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.cpp,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -r1.63 -r1.64
--- StylesheetRoot.cpp 24 Sep 2002 06:57:42 -0000 1.63
+++ StylesheetRoot.cpp 26 Sep 2002 01:38:16 -0000 1.64
@@ -730,6 +730,8 @@
StylesheetExecutionContext& executionContext,
KeyTablesTableType& theKeysTable) const
{
+ assert(nodelist.empty() == true || nodelist.getDocumentOrder() == true);
+
if(m_needToBuildKeysTable == true)
{
assert(m_keyDeclarations.empty() == false);
@@ -739,9 +741,16 @@
if (i != theKeysTable.end())
{
- const NodeRefListBase& nl = (*i).second->getNodeSetByKey(qname, ref);
+ const MutableNodeRefList& nl = (*i).second->getNodeSetByKey(qname, ref);
- nodelist.addNodesInDocOrder(nl, executionContext);
+ if (nodelist.empty() == true)
+ {
+ nodelist = nl;
+ }
+ else
+ {
+ nodelist.addNodesInDocOrder(nl, executionContext);
+ }
}
else
{
@@ -754,9 +763,16 @@
theKeysTable[doc] = kt;
- const NodeRefListBase& nl = kt->getNodeSetByKey(qname, ref);
+ const MutableNodeRefList& nl = kt->getNodeSetByKey(qname, ref);
- nodelist.addNodesInDocOrder(nl, executionContext);
+ if (nodelist.empty() == true)
+ {
+ nodelist = nl;
+ }
+ else
+ {
+ nodelist.addNodesInDocOrder(nl, executionContext);
+ }
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org