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/12/19 23:02:02 UTC

cvs commit: xml-xalan/c/src/XPath XalanQName.cpp XalanQName.hpp XalanQNameByValue.cpp XalanQNameByValue.hpp

dbertoni    01/12/19 14:02:02

  Modified:    c/src/XPath XalanQName.cpp XalanQName.hpp
                        XalanQNameByValue.cpp XalanQNameByValue.hpp
  Log:
  Added validation support and better error report.
  
  Revision  Changes    Path
  1.3       +56 -0     xml-xalan/c/src/XPath/XalanQName.cpp
  
  Index: XalanQName.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XalanQName.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XalanQName.cpp	2001/09/26 20:58:46	1.2
  +++ XalanQName.cpp	2001/12/19 22:02:02	1.3
  @@ -221,3 +221,59 @@
   
   	return thePrefix;
   }
  +
  +
  +
  +bool
  +XalanQName::isValidNCName(const XalanDOMString&		theNCName)
  +{
  +	return isValidNCName(c_wstr(theNCName), length(theNCName));
  +}
  +
  +
  +
  +bool
  +XalanQName::isValidNCName(
  +			const XalanDOMChar*			theNCName,
  +			XalanDOMString::size_type	theLength)
  +{
  +	assert(theNCName != 0);
  +
  +	if (theLength == XalanDOMString::npos)
  +	{
  +		theLength = length(theNCName);
  +	}
  +
  +	if (theLength == 0)
  +	{
  +		return false;
  +	}
  +	else
  +	{
  +		XalanDOMChar	c = theNCName[0];
  +
  +		if(!(XalanXMLChar::isLetter(c) || c == XalanUnicode::charLowLine))
  +		  return false;
  +
  +		if(theLength > 1)
  +		{
  +			for(XalanDOMString::size_type i = 1; i < theLength; i++)
  +			{
  +				c = theNCName[i]; 
  +
  +				if(!(XalanXMLChar::isLetter(c) ||
  +					 XalanXMLChar::isDigit(c) ||
  +					 XalanXMLChar::isExtender(c) ||
  +					 XalanXMLChar::isCombiningChar(c) ||
  +					 c == XalanUnicode::charLowLine ||
  +					 c == XalanUnicode::charHyphenMinus ||
  +					 c == XalanUnicode::charFullStop))
  +				{
  +					return false;
  +				}
  +			}
  +		}
  +
  +		return true;
  +	}
  +}
  
  
  
  1.2       +19 -0     xml-xalan/c/src/XPath/XalanQName.hpp
  
  Index: XalanQName.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XalanQName.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XalanQName.hpp	2001/08/13 17:08:01	1.1
  +++ XalanQName.hpp	2001/12/19 22:02:02	1.2
  @@ -141,6 +141,17 @@
   	getNamespace() const = 0;
   
   	/**
  +	 * Determine if the qualified name is valid.
  +	 * 
  +	 * @return true if the instance is a valid QName, false if not.
  +	 */
  +	bool
  +	isValid() const
  +	{
  +		return isValidNCName(getLocalPart());
  +	}
  +
  +	/**
   	 * Whether the qualified name is empty.
   	 * 
   	 * @return true if namespace and local part are both empty
  @@ -224,6 +235,14 @@
   			const NamespacesStackType&	nsStack,
   			const XalanDOMString&		uri,
   			bool						reverse = true);
  +
  +	static bool
  +	isValidNCName(const XalanDOMString&		theNCName);
  +
  +	static bool
  +	isValidNCName(
  +			const XalanDOMChar*			theNCName,
  +			XalanDOMString::size_type	theLength = XalanDOMString::npos);
   
   protected:
   
  
  
  
  1.4       +48 -18    xml-xalan/c/src/XPath/XalanQNameByValue.cpp
  
  Index: XalanQNameByValue.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XalanQNameByValue.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XalanQNameByValue.cpp	2001/11/26 23:13:17	1.3
  +++ XalanQNameByValue.cpp	2001/12/19 22:02:02	1.4
  @@ -113,24 +113,26 @@
   
   XalanQNameByValue::XalanQNameByValue(
   			const XalanDOMString&		qname,
  -			const NamespacesStackType&	namespaces) :
  +			const NamespacesStackType&	namespaces,
  +			const Locator*				locator) :
   	m_namespace(),
   	m_localpart()
   {
  -	initialize(c_wstr(qname), namespaces);
  +	initialize(c_wstr(qname), namespaces, locator);
   }
   
   
   
   XalanQNameByValue::XalanQNameByValue(
   			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces) :
  +			const NamespacesStackType&	namespaces,
  +			const Locator*				locator) :
   	m_namespace(),
   	m_localpart()
   {
   	assert(qname != 0);
   
  -	initialize(qname, namespaces);
  +	initialize(qname, namespaces, locator);
   }
   
   
  @@ -139,24 +141,26 @@
   			const XalanDOMString&	qname,
   			const XalanElement*		namespaceContext,
   			const XPathEnvSupport&	envSupport,
  -			const DOMSupport& 		domSupport) :
  +			const DOMSupport& 		domSupport,
  +			const Locator*			locator) :
   	m_namespace(),
   	m_localpart()
   {
   	ElementPrefixResolverProxy	theProxy(namespaceContext, envSupport, domSupport);
   
  -	resolvePrefix(qname, &theProxy);
  +	resolvePrefix(qname, &theProxy, locator);
   }
   
   
   
   XalanQNameByValue::XalanQNameByValue(
   			const XalanDOMString&	qname,
  -			const PrefixResolver*	theResolver) :
  +			const PrefixResolver*	theResolver,
  +			const Locator*			locator) :
   	m_namespace(),
   	m_localpart()
   {
  -	resolvePrefix(qname, theResolver);
  +	resolvePrefix(qname, theResolver, locator);
   }
   
   
  @@ -184,13 +188,36 @@
   
   
   void
  +throwException(
  +			const XalanDOMString&	theMessage,
  +			const Locator*			theLocator)
  +{
  +	if (theLocator == 0)
  +	{
  +		throw XSLException(theMessage);
  +	}
  +	else
  +	{
  +		throw XSLException(*theLocator, theMessage);
  +	}
  +}
  +
  +
  +
  +
  +void
   XalanQNameByValue::initialize(
   			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces)
  +			const NamespacesStackType&	namespaces,
  +			const Locator*				locator)
   {
   	const XalanDOMString::size_type		indexOfNSSep = indexOf(qname, XalanUnicode::charColon);
   
  -	if(indexOfNSSep < length(qname))
  +	if (indexOfNSSep == 0)
  +	{
  +		throwException(TranscodeFromLocalCodePage("A prefix of length 0 was detected"), locator);
  +	}
  +	else if(indexOfNSSep < length(qname))
   	{
   		const XalanDOMString		prefix = substring(qname, 0, indexOfNSSep);
   
  @@ -202,7 +229,7 @@
   
   		if(theNamespace == 0 || 0 == length(*theNamespace))
   		{
  -			throw XSLException(TranscodeFromLocalCodePage("Prefix must resolve to a namespace: ") + prefix);
  +			throwException(TranscodeFromLocalCodePage("Prefix must resolve to a namespace: ") + prefix, locator);
   		}
   		else
   		{
  @@ -222,7 +249,8 @@
   void
   XalanQNameByValue::resolvePrefix(
   			const XalanDOMString&	qname,
  -			const PrefixResolver*	theResolver)
  +			const PrefixResolver*	theResolver,
  +			const Locator*			locator)
   {
   	const XalanDOMString::size_type		indexOfNSSep = indexOf(qname, XalanUnicode::charColon);
   	const XalanDOMString::size_type		theLength = length(qname);
  @@ -246,10 +274,11 @@
   		}
   		else if (theResolver == 0)
   		{
  -			throw XSLException(
  +			throwException(
   				TranscodeFromLocalCodePage("Unable to resolve prefix '") +
  -				prefix +
  -				TranscodeFromLocalCodePage("'"));
  +					prefix +
  +					TranscodeFromLocalCodePage("'"),
  +				locator);
   		}
   		else
   		{
  @@ -264,10 +293,11 @@
   
   		if(0 == length(m_namespace))
   		{
  -			throw XSLException(
  +			throwException(
   				TranscodeFromLocalCodePage("The prefix '") +
  -				 prefix +
  -				TranscodeFromLocalCodePage("' must resolve to a namespace."));
  +					prefix +
  +					TranscodeFromLocalCodePage("' must resolve to a namespace."),
  +				locator);
   		}
   
   		m_localpart = substring(qname, indexOfNSSep + 1);
  
  
  
  1.4       +15 -6     xml-xalan/c/src/XPath/XalanQNameByValue.hpp
  
  Index: XalanQNameByValue.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XalanQNameByValue.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XalanQNameByValue.hpp	2001/11/26 23:13:17	1.3
  +++ XalanQNameByValue.hpp	2001/12/19 22:02:02	1.4
  @@ -70,6 +70,7 @@
   
   
   class DOMSupport;
  +class Locator;
   
   
   
  @@ -117,7 +118,8 @@
   	 */
   	XalanQNameByValue(
   			const XalanDOMString&		qname,
  -			const NamespacesStackType&	namespaces);
  +			const NamespacesStackType&	namespaces,
  +			const Locator*				locator = 0);
   
   	/**
   	 * Construct a XalanQNameByValue from a string, resolving the prefix using the given
  @@ -128,7 +130,8 @@
   	 */
   	XalanQNameByValue(
   			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces);
  +			const NamespacesStackType&	namespaces,
  +			const Locator*				locator = 0);
   
   	/**
   	 * Construct a XalanQNameByValue from a string, resolving the prefix using the given
  @@ -143,7 +146,8 @@
   			const XalanDOMString&	qname,
   			const XalanElement*		namespaceContext,
   			const XPathEnvSupport&	envSupport,
  -			const DOMSupport& 		domSupport);
  +			const DOMSupport& 		domSupport,
  +			const Locator*			locator = 0);
   
   	/**
   	 * Construct a XalanQNameByValue from a string, resolving the prefix using the given
  @@ -154,7 +158,8 @@
   	 */
   	XalanQNameByValue(
   			const XalanDOMString&	qname,
  -			const PrefixResolver*	theResolver = 0);
  +			const PrefixResolver*	theResolver = 0,
  +			const Locator*			locator = 0);
   
   	virtual
   	~XalanQNameByValue();
  @@ -212,13 +217,17 @@
   	void
   	initialize(
   			const XalanDOMChar*			qname,
  -			const NamespacesStackType&	namespaces);
  +			const NamespacesStackType&	namespaces,
  +			const Locator*				locator);
   
   	void
   	resolvePrefix(
   			const XalanDOMString&	qname,
  -			const PrefixResolver*	theResolver);
  +			const PrefixResolver*	theResolver,
  +			const Locator*			locator);
   
  +
  +	// Data members...
   	XalanDOMString	m_namespace;
   
   	XalanDOMString	m_localpart;
  
  
  

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