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