You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ca...@apache.org on 2007/07/23 19:26:05 UTC

svn commit: r558806 - in /xerces/c/branches/xerces-2.7/src/xercesc: dom/impl/ framework/psvi/ util/ validators/datatype/

Author: cargilld
Date: Mon Jul 23 10:26:03 2007
New Revision: 558806

URL: http://svn.apache.org/viewvc?view=rev&rev=558806
Log:
Performance patch for xerces-1657 from Christian Will

Modified:
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMImplementationImpl.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/XSValue.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.hpp
    xerces/c/branches/xerces-2.7/src/xercesc/validators/datatype/NameDatatypeValidator.cpp

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp?view=diff&rev=558806&r1=558805&r2=558806
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentImpl.cpp Mon Jul 23 10:26:03 2007
@@ -527,9 +527,9 @@
 bool DOMDocumentImpl::isXMLName(const XMLCh *s)
 {
     if (XMLString::equals(fVersion, XMLUni::fgVersion1_1))
-        return XMLChar1_1::isValidName(s, XMLString::stringLen(s));
+        return XMLChar1_1::isValidName(s);
     else
-        return XMLChar1_0::isValidName(s, XMLString::stringLen(s));
+        return XMLChar1_0::isValidName(s);
 }
 
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp?view=diff&rev=558806&r1=558805&r2=558806
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMDocumentTypeImpl.cpp Mon Jul 23 10:26:03 2007
@@ -147,7 +147,7 @@
         }
         else {
             // document is not there yet, so assume XML 1.0
-            if (!XMLChar1_0::isValidName(newName, index) || !XMLChar1_0::isValidName(qualifiedName+index+1, XMLString::stringLen(qualifiedName)-index-1))
+            if (!XMLChar1_0::isValidName(newName) || !XMLChar1_0::isValidName(qualifiedName+index+1))
                 throw DOMException(DOMException::NAMESPACE_ERR, 0, GetDOMNodeMemoryManager);
         }
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMImplementationImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMImplementationImpl.cpp?view=diff&rev=558806&r1=558805&r2=558806
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMImplementationImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMImplementationImpl.cpp Mon Jul 23 10:26:03 2007
@@ -215,7 +215,7 @@
 	const XMLCh * publicId, const XMLCh *systemId)
 {
     // assume XML 1.0 since we do not know its version yet.
-    if(!XMLChar1_0::isValidName(qualifiedName, XMLString::stringLen(qualifiedName)))
+    if(!XMLChar1_0::isValidName(qualifiedName))
         throw DOMException(DOMException::INVALID_CHARACTER_ERR, 0);
 
     //to do: do we need to create with user's memorymanager???

Modified: xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/XSValue.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/XSValue.cpp?view=diff&rev=558806&r1=558805&r2=558806
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/XSValue.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/framework/psvi/XSValue.cpp Mon Jul 23 10:26:03 2007
@@ -947,8 +947,8 @@
             }            
         case XSValue::dt_Name:
             isValid = (version == ver_10) ? 
-                XMLChar1_0::isValidName(content, XMLString::stringLen(content)) :
-                XMLChar1_1::isValidName(content, XMLString::stringLen(content));
+                XMLChar1_0::isValidName(content) :
+                XMLChar1_1::isValidName(content);
             break;
         case XSValue::dt_NCName:
         case XSValue::dt_ID:
@@ -988,7 +988,7 @@
         default:
             status = st_NotSupported;
             isValid = false;        
-            break;
+            break;        
     }
 
     if (isValid == false && status == st_Init) {
@@ -1139,11 +1139,11 @@
 
     catch (SchemaDateTimeException &e)
     {
-        status = checkTimeZoneError(datatype, e)? XSValue::st_FODT0003 : st_FOCA0002;
+        status = checkTimeZoneError(datatype, e)? XSValue::st_FODT0003 : st_FOCA0002;       
     }
     catch (const NumberFormatException&)
     {
-        status = st_FOCA0002;
+        status = st_FOCA0002;        
     }
     return 0;
 }
@@ -1228,16 +1228,16 @@
             break;
         default:
             return 0;
-            break;
+            break;        
     }
 
     return 0;
 }
 
-XSValue*
+XSValue*  
 XSValue::getActValNumerics(const XMLCh*         const content    
                          ,       DataType             datatype
-                         ,       Status&              status    
+                         ,       Status&              status
                          ,       bool                 toValidate
                          ,       MemoryManager* const manager)
 {
@@ -1415,11 +1415,11 @@
     }
     catch (const NumberFormatException&)
     {
-        status = st_FOCA0002; 
+        status = st_FOCA0002;        
     }
     return 0; 
 }
-
+             
 XSValue*  
 XSValue::getActValDateTimes(const XMLCh*         const input_content    
                           ,       DataType             datatype
@@ -1505,13 +1505,13 @@
     }
     catch (SchemaDateTimeException const &e)
     {
-        status = checkTimeZoneError(datatype, e)? XSValue::st_FODT0003 : st_FOCA0002;
+        status = checkTimeZoneError(datatype, e)? XSValue::st_FODT0003 : st_FOCA0002;        
     }
     catch (const NumberFormatException&)
     {
-        status = st_FOCA0002;
+        status = st_FOCA0002;         
     }
-    return 0; 
+    return 0;
 }
 
 XSValue*  
@@ -1612,7 +1612,7 @@
             break;
         default:
             return 0;
-            break;
+            break;        
     }
 
     return 0; 
@@ -1628,7 +1628,7 @@
                            ,       DataType             datatype)
 {
     char *nptr = XMLString::transcode(content, manager);
-    ArrayJanitor<char> jan(nptr, manager);
+    ArrayJanitor<char> jan(nptr, manager);    
     char *endptr = 0;
     errno = 0;
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.cpp?view=diff&rev=558806&r1=558805&r2=558806
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.cpp Mon Jul 23 10:26:03 2007
@@ -116,6 +116,25 @@
     return true;
 }
 
+bool XMLChar1_0::isValidName(const   XMLCh* const    toCheck)
+{
+    const XMLCh* curCh = toCheck;
+
+    if ((fgCharCharsTable1_0[*curCh++] & gFirstNameCharMask))
+	{
+		while ((fgCharCharsTable1_0[*curCh] & gNameCharMask))
+		{
+			curCh++;
+		}
+
+		if (*curCh == 0)
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
 /**
   * isValidQName
   *
@@ -4523,6 +4542,76 @@
                 }
             }
             gotLeadingSurrogate = false;
+        }
+    }
+    return true;
+}
+
+bool XMLChar1_1::isValidName(const   XMLCh* const    toCheck)
+{
+    const XMLCh* curCh = toCheck;
+
+    XMLCh nextCh = *curCh++;
+    if ((nextCh >= 0xD800) && (nextCh <= 0xDB7F))
+	{
+        nextCh = *curCh++;
+        if ((nextCh < 0xDC00) || (nextCh > 0xDFFF))
+		{
+            return false;
+		}
+    }
+    else if (!(fgCharCharsTable1_1[nextCh] & gFirstNameCharMask))
+	{
+            return false;
+	}
+
+    bool    gotLeadingSurrogate = false;
+
+    while (*curCh != 0)
+    {
+        nextCh = *curCh++;
+
+        // Deal with surrogate pairs
+        if ((nextCh >= 0xD800) && (nextCh <= 0xDBFF))
+        {
+            //  Its a leading surrogate. If we already got one, then
+            //  issue an error, else set leading flag to make sure that
+            //  we look for a trailing next time.
+            if (nextCh > 0xDB7F || gotLeadingSurrogate)
+            {
+                return false;
+            }
+            else
+			{
+                gotLeadingSurrogate = true;
+			}
+        }
+        else
+        {
+            //  If its a trailing surrogate, make sure that we are
+            //  prepared for that. Else, its just a regular char so make
+            //  sure that we were not expected a trailing surrogate.
+           if ((nextCh >= 0xDC00) && (nextCh <= 0xDFFF))
+           {
+                // Its trailing, so make sure we were expecting it
+                if (!gotLeadingSurrogate)
+                    return false;
+            }
+            else
+            {
+                //  Its just a char, so make sure we were not expecting a
+                //  trailing surrogate.
+                if (gotLeadingSurrogate)
+				{
+                    return false;
+                }
+                // Its got to at least be a valid XML character
+                else if (!(fgCharCharsTable1_1[nextCh] & gNameCharMask))
+                {
+                    return false;
+                }
+            }
+           gotLeadingSurrogate = false;
         }
     }
     return true;

Modified: xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.hpp?view=diff&rev=558806&r1=558805&r2=558806
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.hpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/util/XMLChar.hpp Mon Jul 23 10:26:03 2007
@@ -71,6 +71,11 @@
         , const unsigned int    count
     );
 
+    static bool isValidName
+    (
+        const   XMLCh* const    toCheck
+    );
+
     static bool isValidNCName
     (
         const   XMLCh* const    toCheck
@@ -270,6 +275,11 @@
     (
         const   XMLCh* const    toCheck
         , const unsigned int    count
+    );
+
+    static bool isValidName
+    (
+        const   XMLCh* const    toCheck
     );
 
     static bool isValidNCName

Modified: xerces/c/branches/xerces-2.7/src/xercesc/validators/datatype/NameDatatypeValidator.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/validators/datatype/NameDatatypeValidator.cpp?view=diff&rev=558806&r1=558805&r2=558806
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/validators/datatype/NameDatatypeValidator.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/validators/datatype/NameDatatypeValidator.cpp Mon Jul 23 10:26:03 2007
@@ -23,6 +23,7 @@
 // ---------------------------------------------------------------------------
 #include <xercesc/validators/datatype/NameDatatypeValidator.hpp>
 #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
+#include <xercesc/util/XMLChar.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -97,7 +98,7 @@
     //
     // 3.3.6 check must: "Name"
     //
-    if ( !XMLString::isValidName(content))
+    if ( !XMLChar1_0::isValidName(content))
     {
         ThrowXMLwithMemMgr2(InvalidDatatypeValueException
                 , XMLExcepts::VALUE_Invalid_Name



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org