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/08/05 06:57:50 UTC

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

dbertoni    2002/08/04 21:57:50

  Modified:    c/src/XSLT StylesheetHandler.cpp StylesheetHandler.hpp
  Log:
  Detect duplicate variable definitions.
  
  Revision  Changes    Path
  1.84      +95 -14    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.83
  retrieving revision 1.84
  diff -u -r1.83 -r1.84
  --- StylesheetHandler.cpp	26 Jul 2002 18:36:29 -0000	1.83
  +++ StylesheetHandler.cpp	5 Aug 2002 04:57:50 -0000	1.84
  @@ -152,8 +152,11 @@
   	m_LXSLTScriptLang(),
   	m_LXSLTScriptSrcURL(),
   	m_pLXSLTExtensionNSH(0),
  -	m_locatorsPushed(0)
  +	m_locatorsPushed(0),
  +	m_globalVariableNames(),
  +	m_inScopeVariableNamesStack()
   {
  +	m_inScopeVariableNamesStack.reserve(eVariablesStackDefault);
   }
   
   
  @@ -201,6 +204,12 @@
   			 m_strayElements.end(),
   			 DeleteFunctor<ElemTemplateElement>());
   
  +	// Clean up any template that's left over...
  +	if (m_pTemplate != m_stylesheet.getWrapperlessTemplate())
  +	{
  +		delete m_pTemplate;
  +	}
  +
   	m_elemStackParentedElements.clear();
   }
   
  @@ -511,9 +520,19 @@
   					break;
             
   				case Constants::ELEMNAME_VARIABLE:
  -					elem = new ElemVariable(m_constructionContext,
  -										  m_stylesheet,
  -										  atts, lineNumber, columnNumber);
  +					{
  +						XalanAutoPtr<ElemVariable>	newVar(
  +							new ElemVariable(
  +									m_constructionContext,
  +									m_stylesheet,
  +									atts,
  +									lineNumber,
  +									columnNumber));
  +
  +						checkForOrAddVariableName(newVar->getName(), locator);
  +
  +						elem = newVar.release();
  +					}
   					break;
   
   				case Constants::ELEMNAME_PARAMVARIABLE:
  @@ -690,6 +709,8 @@
   						}
   					}
   				}
  +
  +				m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
   			}
   		}
   		else if (!m_inTemplate && startsWith(ns, m_constructionContext.getXalanXSLNameSpaceURL()))
  @@ -716,6 +737,8 @@
   			}
   			else
   			{
  +				m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
  +
   				// BEGIN SANJIVA CODE
   				// is this an extension element call?
   				ExtensionNSHandler*		nsh = 0;
  @@ -837,7 +860,9 @@
   
   	m_pTemplate->appendChildElem(pElem);
   	m_inTemplate = true;
  -	
  +
  +	m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
  +
   	m_stylesheet.setWrapperlessTemplate(m_pTemplate);
   
   	m_foundStylesheet = true;
  @@ -931,6 +956,7 @@
   		m_elemStack.push_back(m_pTemplate);
   		m_elemStackParentedElements.insert(m_pTemplate);
   		m_inTemplate = true;
  +		m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
   		break;
   
   	case Constants::ELEMNAME_EXTENSION:
  @@ -953,10 +979,18 @@
   															atts, 
   															lineNumber, columnNumber);
   
  +			XalanAutoPtr<ElemVariable>	newVar(varelem);
  +
  +			checkForOrAddVariableName(varelem->getName(), locator);
  +
   			m_elemStack.push_back(varelem);
   			m_inTemplate = true; // fake it out
  +			m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
   			m_stylesheet.setTopLevelVariable(varelem);
   			m_elemStackParentedElements.insert(varelem);
  +
  +			newVar.release();
  +
   			varelem->setTopLevel(true);
   		}
   	break;
  @@ -981,6 +1015,7 @@
   	case Constants::ELEMNAME_DEFINEATTRIBUTESET:
   		{
   			m_inTemplate = true; // fake it out
  +			m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
   
   			ElemAttributeSet* attrSet = new ElemAttributeSet(m_constructionContext,
   															   m_stylesheet,
  @@ -1272,6 +1307,53 @@
   
   
   void
  +StylesheetHandler::checkForOrAddVariableName(
  +			const XalanQName&	theVariableName,
  +			const Locator*		theLocator)
  +{
  +	XalanQNameByValue	theLocalVariableName(theVariableName);
  +
  +	if (m_inTemplate == false)
  +	{
  +		assert(m_inScopeVariableNamesStack.empty() == true);
  +
  +		if (m_globalVariableNames.find(theLocalVariableName) != m_globalVariableNames.end())
  +		{
  +			error("A global variable with this name has already been declared", theLocator);
  +		}
  +		else
  +		{
  +			m_globalVariableNames.insert(theLocalVariableName);
  +		}
  +	}
  +	else
  +	{
  +		assert(m_inScopeVariableNamesStack.empty() == false);
  +
  +		QNameSetVectorType::iterator		theCurrent = m_inScopeVariableNamesStack.begin();
  +		const QNameSetVectorType::iterator	theEnd = m_inScopeVariableNamesStack.end();
  +
  +		while(theCurrent != theEnd)
  +		{
  +			QNameSetVectorType::value_type	theLocalScope = *theCurrent;
  +
  +			if (theLocalScope.find(theLocalVariableName) != theLocalScope.end())
  +			{
  +				error("A variable with this name has already been declared in this template", theLocator);
  +			}
  +
  +			++theCurrent;
  +		}
  +
  +		assert(theCurrent == theEnd);
  +
  +		m_inScopeVariableNamesStack.back().insert(theLocalVariableName);
  +	}
  +}
  +
  +
  +
  +void
   StylesheetHandler::processPreserveStripSpace(
   			const XalanDOMChar*		name,
   			const AttributeList&	atts,
  @@ -1611,6 +1693,13 @@
   
   	const int tok = m_lastPopped->getXSLToken();
   
  +	if (m_inTemplate == true)
  +	{
  +		assert(m_inScopeVariableNamesStack.empty() == false);
  +
  +		m_inScopeVariableNamesStack.pop_back();
  +	}
  +
   	if(Constants::ELEMNAME_TEMPLATE == tok)
   	{
   		m_inTemplate = false;
  @@ -1817,15 +1906,12 @@
   		{
   			while(!m_whiteSpaceElems.empty())
   			{
  -#if 1
   				assert(m_whiteSpaceElems.back() != 0);
   
   				appendChildElementToParent(
   					parent,
   					m_whiteSpaceElems.back());
  -#else
  -				parent->appendChildElem(m_whiteSpaceElems.back());
  -#endif
  +
   				m_whiteSpaceElems.pop_back();
   			}
   
  @@ -1852,14 +1938,9 @@
   
   				if(isPrevCharData && ! isLastPoppedXSLText)
   				{
  -#if 1
   					appendChildElementToParent(
   						parent,
   						elem.get());
  -
  -#else
  -					parent->appendChildElem(elem.get());
  -#endif
   
   					elem.release();
   
  
  
  
  1.33      +21 -2     xml-xalan/c/src/XSLT/StylesheetHandler.hpp
  
  Index: StylesheetHandler.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.hpp,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- StylesheetHandler.hpp	14 May 2002 15:47:15 -0000	1.32
  +++ StylesheetHandler.hpp	5 Aug 2002 04:57:50 -0000	1.33
  @@ -79,6 +79,10 @@
   
   
   
  +#include <XPath/XalanQNameByValue.hpp>
  +
  +
  +
   #include <XSLT/NamespacesHandler.hpp>
   #include <XSLT/Stylesheet.hpp>
   
  @@ -89,7 +93,6 @@
   class ElemTextLiteral;
   class ExtensionNSHandler;
   class StylesheetConstructionContext;
  -class XalanQName;
   
   
   
  @@ -110,11 +113,16 @@
   	typedef set<ElemTemplateElement*,
   				less<ElemTemplateElement*> >	ElemTemplateSetType;
   	typedef vector<bool>						BoolStackType;
  +	typedef set<XalanQNameByValue,
  +				less<XalanQNameByValue> >		QNameSetType;
  +	typedef vector<QNameSetType>				QNameSetVectorType;
   #else
   	typedef std::vector<ElemTemplateElement*>	ElemTemplateStackType;
   	typedef std::vector<ElemTextLiteral*>		ElemTextLiteralStackType;
   	typedef std::set<ElemTemplateElement*>		ElemTemplateSetType;
   	typedef std::vector<bool>					BoolStackType;
  +	typedef std::set<XalanQNameByValue>			QNameSetType;
  +	typedef std::vector<QNameSetType>			QNameSetVectorType;
   #endif
   
   	/**
  @@ -517,6 +525,11 @@
   			const AttributeList&	atts,
   			const Locator*			locator);
   
  +	void
  +	checkForOrAddVariableName(
  +			const XalanQName&	theVariableName,
  +			const Locator*		theLocator);
  +
   	// Data members...
   
   	/**
  @@ -601,9 +614,15 @@
   	XalanDOMString			m_LXSLTScriptSrcURL;
   	ExtensionNSHandler*		m_pLXSLTExtensionNSH;
   
  -	// Note that this variable must not be saved by
  +	// Note that these variables must not be saved by
   	// PushPopIncludeState...
   	unsigned long	m_locatorsPushed;
  +
  +	QNameSetType		m_globalVariableNames;
  +
  +	enum { eVariablesStackDefault = 20 };
  +
  +	QNameSetVectorType	m_inScopeVariableNamesStack;
   
   	/**
   	 * Init the wrapperless template
  
  
  

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