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 2001/06/27 20:28:02 UTC

cvs commit: xml-xalan/c/src/XSLT Stylesheet.cpp Stylesheet.hpp

dbertoni    01/06/27 11:28:02

  Modified:    c/src/XSLT Stylesheet.cpp Stylesheet.hpp
  Log:
  Better template handling.
  
  Revision  Changes    Path
  1.57      +270 -257  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.56
  retrieving revision 1.57
  diff -u -r1.56 -r1.57
  --- Stylesheet.cpp	2001/06/25 15:20:05	1.56
  +++ Stylesheet.cpp	2001/06/27 18:27:58	1.57
  @@ -143,6 +143,16 @@
   	m_XSLTVerDeclared(1.0L),
   	m_isRoot(&root == this ? true: false),
   	m_patternTable(),
  +	m_patternTableEnd(m_patternTable.end()),
  +	m_textPatternList(),
  +	m_commentPatternList(),
  +	m_rootPatternList(),
  +	m_piPatternList(),
  +	m_nodePatternList(),
  +	m_anyPatternList(),
  +	m_anyPatternBegin(m_anyPatternList.begin()),
  +	m_anyPatternEnd(m_anyPatternList.end()),
  +	m_matchPattern2Container(),
   	m_patternCount(0),
   	m_attributeSets(),
   	m_surrogateChildren(*this),
  @@ -195,12 +205,12 @@
   			 m_attributeSets.end(),
   			 DeleteFunctor<ElemAttributeSet>());
   
  -	// Clean up the atribute sets vector
  +	// Clean up the top-level variables vector
   	for_each(m_topLevelVariables.begin(),
   			 m_topLevelVariables.end(),
   			 DeleteFunctor<ElemVariable>());
   
  -	// Clean up the atribute sets vector
  +	// Clean up the decimal formats vector
   	for_each(m_elemDecimalFormats.begin(),
   			 m_elemDecimalFormats.end(),
   			 DeleteFunctor<ElemDecimalFormat>());
  @@ -210,18 +220,6 @@
   			 m_extensionNamespaces.end(),
   			 MapValueDeleteFunctor<ExtensionNamespacesMapType>());
   
  -	// Clean up the match pattern vector
  -	for (PatternTableMapType::const_iterator	it = m_patternTable.begin();
  -			it != m_patternTable.end();
  -				++it)
  -	{
  -		const PatternTableListType&		theList = (*it).second;
  -
  -		for_each(theList.begin(),
  -				 theList.end(),
  -				 DeleteFunctor<MatchPattern2>());
  -	}
  -
   	delete m_wrapperlessTemplate;
   
   	delete m_firstTemplate;
  @@ -450,8 +448,37 @@
   			theCurrent->postConstruction(constructionContext, m_namespacesHandler);
   		}
   	}
  +
  +	const PatternTableListType::iterator	theNodeBegin = m_nodePatternList.begin();
  +	const PatternTableListType::iterator	theNodeEnd = m_nodePatternList.end();
  +
  +	m_textPatternList.insert(
  +		m_textPatternList.end(),
  +		theNodeBegin,
  +		theNodeEnd);
  +
  +	m_commentPatternList.insert(
  +		m_commentPatternList.end(),
  +		theNodeBegin,
  +		theNodeEnd);
  +
  +	m_piPatternList.insert(
  +		m_piPatternList.end(),
  +		theNodeBegin,
  +		theNodeEnd);
  +
  +	m_anyPatternList.insert(
  +		m_anyPatternList.end(),
  +		theNodeBegin,
  +		theNodeEnd);
  +
  +	m_anyPatternBegin = m_anyPatternList.begin();
  +	m_anyPatternEnd = m_anyPatternList.end();
  +
  +	m_patternCount = m_matchPattern2Container.size();
   
  -	m_patternCount = m_patternTable.size();
  +	// We don't need this any more, so clear it out...
  +	PatternTableListType().swap(m_nodePatternList);
   }
   
   
  @@ -568,14 +595,16 @@
   
   void
   Stylesheet::addTemplate(
  -			ElemTemplate*					tmpl,
  +			ElemTemplate*					theTemplate,
   			StylesheetConstructionContext&	constructionContext)
   {
  +	assert(theTemplate != 0);
  +
   	unsigned int	pos = 0;
   
   	if(0 == m_firstTemplate)
   	{
  -		m_firstTemplate = tmpl;
  +		m_firstTemplate = theTemplate;
   	}
   	else
   	{
  @@ -586,9 +615,9 @@
   		{
   			if(0 == next->getNextSiblingElem())
   			{
  -				next->setNextSiblingElem(tmpl);
  -				tmpl->setNextSiblingElem(0); // just to play it safe.
  -				tmpl->setPreviousSiblingElem(next);
  +				next->setNextSiblingElem(theTemplate);
  +				theTemplate->setNextSiblingElem(0); // just to play it safe.
  +				theTemplate->setPreviousSiblingElem(next);
   				break;
   			}
   
  @@ -600,13 +629,13 @@
   
   	// If it's a named template, then we need to
   	// and it to the map of named templates.
  -	const QName&	theName = tmpl->getName();
  +	const QName&	theName = theTemplate->getName();
   
   	if(theName.isEmpty() == false)
   	{
   		if (m_namedTemplates.find(theName) == m_namedTemplates.end())
   		{
  -			m_namedTemplates[theName] = tmpl;
  +			m_namedTemplates[theName] = theTemplate;
   		}
   		else
   		{
  @@ -623,13 +652,13 @@
   
   			theMessage += theName.getLocalPart();
   
  -			constructionContext.error(theMessage, 0, tmpl);
  +			constructionContext.error(theMessage, 0, theTemplate);
   		}
   	}
   
   	// Now, process the match pattern associated with the
   	// template.
  -	const XPath* const	xp = tmpl->getMatchPattern();
  +	const XPath* const	xp = theTemplate->getMatchPattern();
   
   	if(0 != xp)
   	{
  @@ -654,14 +683,66 @@
   			{
   				const XalanDOMString& target = strings[stringIndex];
   
  -				MatchPattern2* newMatchPat =
  -					new MatchPattern2(xp->getExpression().getCurrentPattern(), 
  -						xp, tmpl, pos, target, this);
  -
  -				// Put it in the map, on the front of the list for that
  -				// target string, so that templates later in the stylesheet
  -				// are always selected first.
  -				m_patternTable[target].push_front(newMatchPat);
  +				m_matchPattern2Container.push_back(
  +					MatchPattern2(
  +						*theTemplate,
  +						pos,
  +						target,
  +						*this,
  +						*xp,
  +						xp->getExpression().getCurrentPattern()));
  +
  +				MatchPattern2* newMatchPat = &m_matchPattern2Container.back();
  +
  +				// Always put things on the front of the list, so
  +				// templates later in the stylesheet are always
  +				// selected first.
  +				if (equals(target, XPath::PSEUDONAME_TEXT) == true)
  +				{
  +					m_textPatternList.insert(
  +						m_textPatternList.begin(),
  +						newMatchPat);
  +				}
  +				else if (equals(target, XPath::PSEUDONAME_COMMENT) == true)
  +				{
  +					m_commentPatternList.insert(
  +						m_commentPatternList.begin(),
  +						newMatchPat);
  +				}
  +				else if (equals(target, XPath::PSEUDONAME_ROOT) == true)
  +				{
  +					m_rootPatternList.insert(
  +						m_rootPatternList.begin(),
  +						newMatchPat);
  +				}
  +				else if (equals(target, XPath::PSEUDONAME_PI) == true)
  +				{
  +					m_piPatternList.insert(
  +						m_piPatternList.begin(),
  +						newMatchPat);
  +				}
  +				else if (equals(target, XPath::PSEUDONAME_NODE) == true)
  +				{
  +					m_nodePatternList.insert(
  +						m_nodePatternList.begin(),
  +						newMatchPat);
  +				}
  +				else if (equals(target, XPath::PSEUDONAME_ANY) == true)
  +				{
  +					m_anyPatternList.insert(
  +						m_anyPatternList.begin(),
  +						newMatchPat);
  +				}
  +				else
  +				{
  +					// Put it in the map.
  +					PatternTableListType&	theTable =
  +						m_patternTable[target];
  +
  +					theTable.insert(
  +						theTable.begin(),
  +						newMatchPat);
  +				}
   			}
   		}
   	}
  @@ -774,16 +855,44 @@
   
   
   
  +inline const Stylesheet::PatternTableListType* 
  +Stylesheet::locateMatchPatternList2(
  +			const XalanDOMString&	theName,
  +			bool&					usedWildcard) const
  +{
  +	assert(m_patternTableEnd == m_patternTable.end());
  +
  +	const PatternTableMapType::const_iterator	i =
  +		m_patternTable.find(theName);
  +
  +	if (i != m_patternTableEnd)
  +	{		
  +		usedWildcard = false;
  +
  +		return &(*i).second;
  +	}
  +	else
  +	{
  +		usedWildcard = true;
  +
  +		return &m_anyPatternList;
  +	}
  +}
  +
  +
  +
   const ElemTemplate*
   Stylesheet::findTemplate(
   			StylesheetExecutionContext& 	executionContext,
   			XalanNode*						targetNode, 
   			const QName&					mode,
  -			bool							useImports,
  +			bool							onlyUseImports,
   			const Stylesheet*&				foundStylesheet) const
   {
   	assert(targetNode != 0);
  -	assert(m_patternCount == m_patternTable.size());
  +	assert(m_patternCount == m_matchPattern2Container.size());
  +	assert(m_anyPatternBegin == m_anyPatternList.begin());
  +	assert(m_anyPatternEnd == m_anyPatternList.end());
   
   	const ElemTemplate*		theResult = 0;
   
  @@ -793,8 +902,6 @@
   	}
   	else
   	{
  -		bool					usedWildcard = false;
  -
   		const ElemTemplate*		bestMatchedRule = 0;
   		const MatchPattern2*	bestMatchedPattern = 0; // Syncs with bestMatchedRule
   		double					bestMatchPatPriority = XPath::s_MatchScoreNone;
  @@ -807,189 +914,194 @@
   		XalanArrayAutoPtr<const MatchPattern2*>		conflictsVector;
   
   		const MatchPattern2**	conflicts = 0;
  -
  -		if (m_patternCount > sizeof(conflictsArray) / sizeof(conflictsArray[0]))
  -		{
  -			conflictsVector.reset(new const MatchPattern2*[m_patternCount]);
  -
  -			conflicts = conflictsVector.get();
  -		}
  -		else
  -		{
  -			conflicts = conflictsArray;
  -		}
   
  -		if(useImports == false)
  +		if(onlyUseImports == false)
   		{
   			// Points to the current list of match patterns.  Note
   			// that this may point to more than one table.
   			const PatternTableListType* 	matchPatternList = 0;
   			const XalanNode::NodeType		targetNodeType = targetNode->getNodeType();
   
  +			// Assume we'll match a wildcard.  This will only change
  +			// for elements, attributes, and for our default catch-all,
  +			// but it will keep us from checking m_anyPatternList.
  +			bool							usedWildcard = true;
  +
   			switch(targetNodeType)
   			{
   			case XalanNode::ELEMENT_NODE:
  -				matchPatternList = locateMatchPatternList2(DOMServices::getLocalNameOfNode(*targetNode), true);
  +				matchPatternList =
  +					locateMatchPatternList2(
  +							DOMServices::getLocalNameOfNode(*targetNode),
  +							usedWildcard);
   				break;
   
   			case XalanNode::PROCESSING_INSTRUCTION_NODE:
  -				matchPatternList = locateMatchPatternList2(targetNode->getNodeName(), true);
  +				matchPatternList = &m_piPatternList;
   				break;
   
   			case XalanNode::ATTRIBUTE_NODE:
  -				matchPatternList = locateMatchPatternList2(DOMServices::getLocalNameOfNode(*targetNode), true);
  +				matchPatternList = locateMatchPatternList2(
  +							DOMServices::getLocalNameOfNode(*targetNode),
  +							usedWildcard);
   				break;
   
   			case XalanNode::CDATA_SECTION_NODE:
   			case XalanNode::TEXT_NODE:
  -				matchPatternList = locateMatchPatternList2(XPath::PSEUDONAME_TEXT, true);
  +				matchPatternList = &m_textPatternList;
   				break;
   
   			case XalanNode::COMMENT_NODE:
  -				matchPatternList = locateMatchPatternList2(XPath::PSEUDONAME_COMMENT, true);
  +				matchPatternList = &m_commentPatternList;
   				break;
   
   			case XalanNode::DOCUMENT_NODE:
  -				matchPatternList = locateMatchPatternList2(XPath::PSEUDONAME_ROOT, false);
  +				matchPatternList = &m_rootPatternList;
   				break;
   
   			case XalanNode::DOCUMENT_FRAGMENT_NODE:
  -				matchPatternList = locateMatchPatternList2(XPath::PSEUDONAME_ANY, false);
  +				matchPatternList = &m_anyPatternList;
   				break;
   
   			default:
  -				matchPatternList = locateMatchPatternList2(targetNode->getNodeName(), true);
  +				matchPatternList = locateMatchPatternList2(
  +							targetNode->getNodeName(),
  +							usedWildcard);
   				break;
   			}
   
  -			if (matchPatternList != 0)
  -			{
  -				const XalanDOMString*	prevPat = 0;
  -				const MatchPattern2*	prevMatchPat = 0;
  -				double					prevMatchPatPriority = XPath::s_MatchScoreNone;
  -
  -				// These are iterators into the current table.
  -				// Note that we may re-seat these iterators to
  -				// point into a different table, if we have
  -				// to match wildcards.
  -				PatternTableListType::const_iterator	theCurrentEntry =
  -					matchPatternList->begin();
  +			assert(matchPatternList != 0);
   
  -				PatternTableListType::const_iterator	theTableEnd =
  -					matchPatternList->end();
  +			const XalanDOMString*	prevPat = 0;
  +			const MatchPattern2*	prevMatchPat = 0;
  +			double					prevMatchPatPriority = XPath::s_MatchScoreNone;
  +
  +			// These are iterators into the current table.
  +			// Note that we may re-seat these iterators to
  +			// point into a different table, if we have
  +			// to match wildcards.
  +			PatternTableListType::const_iterator	theCurrentEntry =
  +				matchPatternList->begin();
   
  -				while(theCurrentEntry != theTableEnd)
  -				{
  -					const MatchPattern2*	matchPat = *theCurrentEntry;
  -					double					matchPatPriority = XPath::s_MatchScoreNone;
  -					assert(matchPat != 0);
  -
  -					const ElemTemplate*		rule = matchPat->getTemplate();
  -
  -					// We'll be needing to match rules according to what 
  -					// mode we're in.
  -					const QName&			ruleMode =
  +			PatternTableListType::const_iterator	theTableEnd =
  +				matchPatternList->end();
  +
  +			while(theCurrentEntry != theTableEnd)
  +			{
  +				const MatchPattern2*	matchPat = *theCurrentEntry;
  +				double					matchPatPriority = XPath::s_MatchScoreNone;
  +				assert(matchPat != 0);
  +
  +				const ElemTemplate*		rule = matchPat->getTemplate();
  +
  +				// We'll be needing to match rules according to what 
  +				// mode we're in.
  +				const QName&			ruleMode =
   						rule->getMode();
   
  -					// The logic here should be that if we are not in a mode AND
  -					// the rule does not have a node, then go ahead.
  -					// OR if we are in a mode, AND the rule has a node, 
  -					// AND the rules match, then go ahead.
  +				// The logic here should be that if we are not in a mode AND
  +				// the rule does not have a node, then go ahead.
  +				// OR if we are in a mode, AND the rule has a node, 
  +				// AND the rules match, then go ahead.
  +				bool haveMode = !mode.isEmpty();
  +				bool haveRuleMode = !ruleMode.isEmpty();
   
  -					bool haveMode = !mode.isEmpty();
  -					bool haveRuleMode = !ruleMode.isEmpty();
  +				if ( (!haveMode && !haveRuleMode) || (haveMode && haveRuleMode && ruleMode.equals(mode)))
  +				{
  +					const XalanDOMString*	patterns = matchPat->getPattern();
  +					assert(patterns != 0);
   
  -					if ( (!haveMode && !haveRuleMode) || (haveMode && haveRuleMode && ruleMode.equals(mode)))
  +					if(!isEmpty(*patterns) &&
  +					   !(prevMatchPat != 0 &&
  +					     (prevPat != 0 && equals(*prevPat, *patterns)) &&
  +						 prevMatchPat->getTemplate()->getPriority() == matchPat->getTemplate()->getPriority()))
   					{
  -						const XalanDOMString&	patterns = matchPat->getPattern();
  -
  -						if(!isEmpty(patterns) &&
  -						   !(prevMatchPat != 0 &&
  -						     (prevPat != 0 && equals(*prevPat, patterns)) &&
  -							 prevMatchPat->getTemplate()->getPriority() == matchPat->getTemplate()->getPriority()))
  -						{
  -							prevPat = &patterns;
  -							prevMatchPat = matchPat;
  -							prevMatchPatPriority = matchPatPriority;
  -							matchPatPriority = XPath::s_MatchScoreNone;
  +						prevPat = patterns;
  +						prevMatchPat = matchPat;
  +						prevMatchPatPriority = matchPatPriority;
  +						matchPatPriority = XPath::s_MatchScoreNone;
   
  -							const XPath* const	xpath = matchPat->getExpression();
  +						const XPath* const	xpath = matchPat->getExpression();
   
  -							double score =
  +						double score =
   								xpath->getMatchScore(targetNode, *this, executionContext);
   
  -							if(XPath::s_MatchScoreNone != score)
  -							{
  -								const double priorityVal = rule->getPriority();
  -								const double priorityOfRule 
  +						if(XPath::s_MatchScoreNone != score)
  +						{
  +							const double priorityVal = rule->getPriority();
  +							const double priorityOfRule 
   									  = (XPath::s_MatchScoreNone != priorityVal) 
   															  ? priorityVal : score;
   
  -								matchPatPriority = priorityOfRule;
  -								const double priorityOfBestMatched =
  +							matchPatPriority = priorityOfRule;
  +							const double priorityOfBestMatched =
   										(0 != bestMatchedPattern) ?
   												bestMatchPatPriority : 
   												XPath::s_MatchScoreNone;
   
  -								if(priorityOfRule > priorityOfBestMatched)
  -								{
  -									nConflicts = 0;
  +							if(priorityOfRule > priorityOfBestMatched)
  +							{
  +								nConflicts = 0;
   
  -									bestMatchedRule = rule;
  -									bestMatchedPattern = matchPat;
  -									bestMatchPatPriority = matchPatPriority;
  -								}
  -								else if(priorityOfRule == priorityOfBestMatched)
  +								bestMatchedRule = rule;
  +								bestMatchedPattern = matchPat;
  +								bestMatchPatPriority = matchPatPriority;
  +							}
  +							else if(priorityOfRule == priorityOfBestMatched)
  +							{
  +								if (conflicts == 0)
   								{
  -									// Add the best matched pattern so far.
  -									addObjectIfNotFound(bestMatchedPattern, conflicts, nConflicts);
  +									if (m_patternCount > sizeof(conflictsArray) / sizeof(conflictsArray[0]))
  +									{
  +										conflictsVector.reset(new const MatchPattern2*[m_patternCount]);
  +
  +										conflicts = conflictsVector.get();
  +									}
  +									else
  +									{
  +										conflicts = conflictsArray;
  +									}
  +								}
   
  -									// Add the pattern that caused the conflict...
  -									conflicts[nConflicts++] = matchPat;
  +								assert(conflicts != 0);
   
  -									bestMatchedRule = rule;
  -									bestMatchedPattern = matchPat;
  -									bestMatchPatPriority = matchPatPriority;
  -								}
  +								// Add the best matched pattern so far.
  +								addObjectIfNotFound(bestMatchedPattern, conflicts, nConflicts);
  +
  +								// Add the pattern that caused the conflict...
  +								conflicts[nConflicts++] = matchPat;
  +
  +								bestMatchedRule = rule;
  +								bestMatchedPattern = matchPat;
  +								bestMatchPatPriority = matchPatPriority;
   							}
   						}
   					}
  +				}
   
  -					theCurrentEntry++;
  +				theCurrentEntry++;
   
  -					// We also have to consider wildcard matches.
  -					if(theCurrentEntry == theTableEnd &&
  -					   equals(matchPat->getTargetString(),
  -							  Constants::PSEUDONAME_ANY) == false
  -//						&& (XalanNode::ELEMENT_NODE == targetNodeType || 
  -//							XalanNode::ATTRIBUTE_NODE == targetNodeType ||
  -//							XalanNode::PROCESSING_INSTRUCTION_NODE == targetNodeType)
  -						)
  -					{
  -						{
  -							assert(usedWildcard==false);	// Should only be here once ??
  -							usedWildcard = true;
  -							const PatternTableMapType::const_iterator 	theTableIterator =
  -								m_patternTable.find(Constants::PSEUDONAME_ANY);
  +				// We also have to consider wildcard matches.
  +				if(theCurrentEntry == theTableEnd &&
  +				   usedWildcard == false &&
  +				   m_anyPatternBegin != m_anyPatternEnd)
  +				{
  +					assert(targetNodeType != XalanNode::TEXT_NODE &&
  +						   targetNodeType != XalanNode::CDATA_SECTION_NODE &&
  +						   targetNodeType != XalanNode::DOCUMENT_NODE &&
  +						   targetNodeType != XalanNode::PROCESSING_INSTRUCTION_NODE &&
  +						   targetNodeType != XalanNode::COMMENT_NODE);
   
  -							assert(m_patternTable.size());
  -							if (theTableIterator != m_patternTable.end())
  -							{
  -								// Re-seat the iterators...
  -								theCurrentEntry = (*theTableIterator).second.begin();
  -								theTableEnd = (*theTableIterator).second.end();
  -							}
  -						}
  -					}
  -				}	// end while
  -			} // end if (matchPatternList != 0)
  +					usedWildcard = true;
  +
  +					// Re-seat the iterators...
  +					theCurrentEntry = m_anyPatternBegin;
  +
  +					theTableEnd = m_anyPatternEnd;
  +				}
  +			}	// end while
   		} // end if(useImports == false)
   
  -		// @@ JMD: Here we are using the imports anyway if bestMatchedRule is zero,
  -		// instead of just doing if (useImports) {...} else.  Is this right ??
  -		// Does this assume that bestMatchedRule will always be non-zero exit the
  -		// if clause, and, if so, is it an error if it's not ?
  -		// else
   		if(0 == bestMatchedRule)
   		{
   			const unsigned int	nImports = m_imports.size();
  @@ -1008,9 +1120,11 @@
   					break;
   			}
   		}
  -		
  +
   		if(nConflicts > 0)
   		{
  +			assert(conflicts != 0);
  +
   			const bool		quietConflictWarnings = executionContext.getQuietConflictWarnings();
   
   			XalanDOMString	conflictsString;
  @@ -1045,7 +1159,7 @@
   				if(quietConflictWarnings == false)
   				{
   					conflictsString += XalanDOMString(XALAN_STATIC_UCODE_STRING("\"")) +
  -										conflictPat->getPattern() +
  +										*conflictPat->getPattern() +
   										XalanDOMString(XALAN_STATIC_UCODE_STRING("\""));
   				}
   			}
  @@ -1069,107 +1183,6 @@
   	}
   
   	return theResult;
  -}
  -
  -
  -	
  -const Stylesheet::PatternTableListType*
  -Stylesheet::locateMatchPatternList2(XalanNode*	sourceNode) const
  -{
  -	assert(sourceNode != 0);
  -
  -	const PatternTableListType* 	matchPatternList = 0;
  -
  -	switch(sourceNode->getNodeType())
  -	{
  -	case XalanNode::ELEMENT_NODE:
  -		{
  -			const XalanDOMString&	targetName =
  -				DOMServices::getLocalNameOfNode(*sourceNode);
  -
  -			matchPatternList = locateMatchPatternList2(targetName, true);
  -		}
  -		break;
  -
  -	case XalanNode::PROCESSING_INSTRUCTION_NODE:
  -	case XalanNode::ATTRIBUTE_NODE:
  -		matchPatternList = locateMatchPatternList2(sourceNode->getNodeName(), true);
  -		break;
  -
  -	case XalanNode::CDATA_SECTION_NODE:
  -	case XalanNode::TEXT_NODE:
  -		matchPatternList = locateMatchPatternList2(Constants::PSEUDONAME_TEXT, false);
  -		break;
  -
  -	case XalanNode::COMMENT_NODE:
  -		matchPatternList = locateMatchPatternList2(Constants::PSEUDONAME_COMMENT, false);
  -		break;
  -
  -	case XalanNode::DOCUMENT_NODE:
  -		matchPatternList = locateMatchPatternList2(Constants::PSEUDONAME_ROOT, false);
  -		break;
  -
  -	default:
  -		matchPatternList = locateMatchPatternList2(sourceNode->getNodeName(), false);
  -		break;
  -	}
  -
  -	return matchPatternList;
  -}
  -
  -
  -
  -const Stylesheet::PatternTableListType* 
  -Stylesheet::locateMatchPatternList2(
  -			const XalanDOMString&	sourceElementType,
  -			bool					tryWildCard) const
  -{
  -	const PatternTableListType* 	theMatchList = 0;
  -
  -	PatternTableMapType::const_iterator 	i =
  -		m_patternTable.find(sourceElementType);
  -
  -	if (i != m_patternTable.end())
  -	{
  -		theMatchList = &(*i).second;
  -		assert(theMatchList != 0);
  -	}
  -	else if(tryWildCard == true)
  -	{
  -		i = m_patternTable.find(Constants::PSEUDONAME_ANY);
  -
  -		if (i != m_patternTable.end())
  -		{
  -			theMatchList = &(*i).second;
  -			assert(theMatchList != 0);
  -		}
  -	}
  -
  -	return theMatchList;
  -}
  -
  -
  -
  -Stylesheet::MatchPattern2::MatchPattern2(
  -			const XalanDOMString&	pat,
  -			const XPath*			exp,
  -			const ElemTemplate*		theTemplate,
  -			int 					posInStylesheet, 
  -			const XalanDOMString&	targetString,
  -			const Stylesheet* 		stylesheet) :
  -	m_stylesheet(stylesheet),
  -	m_targetString(targetString),
  -	m_expression(exp),
  -	m_posInStylesheet(posInStylesheet),
  -	m_pattern(pat),
  -	m_template(theTemplate)
  -{
  -}
  -
  -
  -
  -Stylesheet::MatchPattern2::~MatchPattern2()
  -{
   }
   
   
  
  
  
  1.37      +95 -55    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.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- Stylesheet.hpp	2001/06/06 21:55:30	1.36
  +++ Stylesheet.hpp	2001/06/27 18:27:59	1.37
  @@ -68,7 +68,7 @@
   
   
   
  -#include <list>
  +#include <deque>
   #include <map>
   #include <vector>
   
  @@ -103,7 +103,6 @@
   class ElemTemplateElement;
   class ElemVariable;
   class KeyTable;
  -class MatchPattern2;
   class NodeRefListBase;
   class PrefixResolver;
   class StylesheetConstructionContext;
  @@ -415,12 +414,12 @@
   	/**
   	 * Add a template to the list of names templates
   	 * 
  -	 * @param tmpl template to add
  +	 * @param theTemplate template to add
   	 * @param constructionContext context for construction
   	 */
   	void
   	addTemplate(
  -			ElemTemplate*					tmpl,
  +			ElemTemplate*					theTemplate,
   			StylesheetConstructionContext&	constructionContext);
   
   	/**
  @@ -688,7 +687,7 @@
   	 * @param executionContext current execution context
   	 * @param targetElem        element that needs a rule
   	 * @param mode              string indicating the display mode
  -	 * @param useImports        means that this is an xsl:apply-imports commend
  +	 * @param onlyUseImports    only use imports, do not use any templates from the stylesheet itself
   	 * @return pointer to rule that best matches targetElem
   	 */
   	const ElemTemplate*
  @@ -696,7 +695,7 @@
   			StylesheetExecutionContext& 	executionContext,
   			XalanNode*						targetNode, 
   			const QName&					mode,
  -			bool							useImports,
  +			bool							onlyUseImports,
   			const Stylesheet*&				foundStylesheet) const;
   
   	/**
  @@ -710,22 +709,42 @@
   		/**
   		 * Construct a match pattern from a pattern and template.
   		 *
  -		 * @param pat string that contains element pattern
  -		 * @param exp XPath expression for pattern
   		 * @param theTemplate node that contains the template for this pattern
   		 * @param posInStylesheet position in stylesheet
   		 * @param targetString target string
   		 * @param stylesheet stylesheet for pattern
  +		 * @param matchPattern the match pattern
  +		 * @param pattern the pattern string
   		 */
   		MatchPattern2(
  -				const XalanDOMString&	pat,
  -				const XPath*			exp,
  -				const ElemTemplate*		theTemplate,
  -				int 					posInStylesheet, 
  +				const ElemTemplate&		theTemplate,
  +				int 					posInStylesheet,
   				const XalanDOMString&	targetString,
  -				const Stylesheet* 		stylesheet); 
  +				const Stylesheet& 		stylesheet,
  +				const XPath&			matchPattern,
  +				const XalanDOMString&	pattern) :
  +			m_template(&theTemplate),
  +			m_posInStylesheet(posInStylesheet),
  +			m_targetString(targetString),
  +			m_stylesheet(&stylesheet),
  +			m_matchPattern(&matchPattern),
  +			m_pattern(&pattern)
  +		{
  +		}
  +
  +		MatchPattern2() :
  +			m_template(0),
  +			m_posInStylesheet(0),
  +			m_targetString(),
  +			m_stylesheet(0),
  +			m_matchPattern(0),
  +			m_pattern(0)
  +		{
  +		}
   
  -		~MatchPattern2();
  +		~MatchPattern2()
  +		{
  +		}
   
   		/**
   		 * Retrieve stylesheet associated with pattern.
  @@ -737,7 +756,7 @@
   		{
   			return m_stylesheet;
   		}
  -		
  +
   		/**
   		 * Retrieve string for target.
   		 * 
  @@ -745,21 +764,21 @@
   		 */
   		const XalanDOMString&
   		getTargetString() const
  -		{ 
  +		{
   			return m_targetString;
   		}
  -		
  +
   		/**
  -		 * Retrieve expression associated with pattern.
  +		 * Retrieve the match pattern associated with pattern.
   		 * 
  -		 * @return XPath expression for pattern
  +		 * @return XPath for pattern
   		 */
   		const XPath*
   		getExpression() const
   		{
  -			return m_expression;
  +			return m_matchPattern;
   		}
  -		
  +
   		/**
   		 * Retrieve position of pattern in stylesheet.
   		 * 
  @@ -770,18 +789,18 @@
   		{
   			return m_posInStylesheet;
   		}
  -		
  +
   		/**
   		 * Retrieve pattern string.
   		 * 
   		 * @return string that contains element pattern
   		 */
  -		const XalanDOMString&
  +		const XalanDOMString*
   		getPattern() const
   		{
   			return m_pattern;
   		}
  -		
  +
   		/**
   		 * Retrieve node that contains the template for this pattern.
   		 * 
  @@ -792,36 +811,36 @@
   		{
   			return m_template;
   		}
  -		
  +
   	private:
   
  -		const Stylesheet* const		m_stylesheet;
  -		const XalanDOMString		m_targetString;
  -		const XPath* const			m_expression;
  -		const int					m_posInStylesheet;
  -		const XalanDOMString		m_pattern;
  -		const ElemTemplate*	const	m_template; // ref to the corresponding template
  -
  -		// Not implemented...
  -		MatchPattern2();
  -		MatchPattern2& operator=(const MatchPattern2&);
  +		const ElemTemplate*		m_template;
  +		int						m_posInStylesheet;
  +		XalanDOMString			m_targetString;
  +		const Stylesheet*		m_stylesheet;
  +		const XPath*			m_matchPattern;
  +		const XalanDOMString*	m_pattern;
   	};
   
   #if defined(XALAN_NO_NAMESPACES)
  -	typedef list<MatchPattern2*>				PatternTableListType;
  +	typedef vector<MatchPattern2*>				PatternTableListType;
   
   	typedef vector<const MatchPattern2*>		PatternTableVectorType;
   
   	typedef map<XalanDOMString,
   			    PatternTableListType,
   				less<XalanDOMString> >			PatternTableMapType;
  +
  +	typedef deque<MatchPattern2>				MatchPattern2Container;
   #else
  -	typedef std::list<MatchPattern2*>			PatternTableListType;
  +	typedef std::vector<MatchPattern2*>			PatternTableListType;
   
   	typedef std::vector<const MatchPattern2*>	PatternTableVectorType;
   
   	typedef std::map<XalanDOMString,
   					 PatternTableListType>		PatternTableMapType;
  +
  +	typedef std::deque<MatchPattern2>			MatchPattern2Container;
   #endif
   
   	/**
  @@ -851,25 +870,17 @@
   			unsigned int&			theArraySize);
   
   	/**
  -	 * Given a source node, locate the start of a list of possible template
  -	 * matches, according to its type.
  +	 * Given a name, , locate the start of a list of 
  +	 * possible templates that match that name, also
  +	 * trying wild card matches.
   	 *
  -	 * @param sourceNode source node for search of match patterns
  +	 * @param theName The name to match
  +	 * @param usedWildCard Set to true if wild card matching was used, false if not.
   	 */
   	const PatternTableListType*
  -	locateMatchPatternList2(XalanNode*	sourceNode) const;
  -
  -	/**
  -	 * Given an element type, locate the start of a list of 
  -	 * possible template matches, possibly trying wild card matches.
  -	 *
  -	 * @param sourceElementType type of element to search
  -	 * @param tryWildCard		if true, use wild card matching
  -	 */
  -	const PatternTableListType*
   	locateMatchPatternList2(
  -			const XalanDOMString&	sourceElementType,
  -			bool					tryWildCard = false) const;
  +			const XalanDOMString&	theName,
  +			bool&					usedWildcard) const;
   
   	/**
   	 * Add an extension namespace handler. This provides methods for calling
  @@ -1258,11 +1269,40 @@
   	 */
   	PatternTableMapType 					m_patternTable;
   
  +	PatternTableMapType::const_iterator		m_patternTableEnd;
  +
  +	/**
  +	 * These tables are for text, comment, and root node templates.
  +	 */
  +	PatternTableListType					m_textPatternList;
  +
  +	PatternTableListType					m_commentPatternList;
  +
  +	PatternTableListType					m_rootPatternList;
  +
  +	PatternTableListType					m_piPatternList;
  +
  +	PatternTableListType					m_nodePatternList;
  +
  +	/**
  +	 * This table is for patterns that match "*"
  +	 */
  +	PatternTableListType					m_anyPatternList;
  +
  +	PatternTableListType::const_iterator	m_anyPatternBegin;
  +
  +	PatternTableListType::const_iterator	m_anyPatternEnd;
  +
  +	/**
  +	 * This will hold all of the MatchPattern2 instances for the
  +	 * stylesheet.
  +	 */
  +	MatchPattern2Container					m_matchPattern2Container;
  +
   	/**
  -	 * This caches the size of the pattern table, so we don't recompute the
  -	 * value each time.
  +	 * This caches the number of possible patterns we can match.
   	 */
  -	PatternTableMapType::size_type			m_patternCount;
  +	MatchPattern2Container::size_type		m_patternCount;
   
   	AttributeSetVectorType 					m_attributeSets;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org