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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to