Просмотр исходного кода

Merge remote-tracking branch 'martinsh/issue#53-fix'

Lee Thomason 13 лет назад
Родитель
Сommit
0aecb5c770
3 измененных файлов с 30 добавлено и 13 удалено
  1. 2 7
      tinyxml2.cpp
  2. 14 6
      tinyxml2.h
  3. 14 0
      xmltest.cpp

+ 2 - 7
tinyxml2.cpp

@@ -136,12 +136,7 @@ char* StrPair::ParseName( char* p )
         return 0;
     }
 
-    while( *p && (
-                XMLUtil::IsAlphaNum( (unsigned char) *p )
-                || *p == '_'
-                || *p == ':'
-                || (*p == '-' && p>start )		// can be in a name, but not lead it.
-                || (*p == '.' && p>start ) )) {	// can be in a name, but not lead it.
+    while( *p && ( p == start ? XMLUtil::IsNameStartChar( *p ) : XMLUtil::IsNameChar( *p ) )) {
         ++p;
     }
 
@@ -1357,7 +1352,7 @@ char* XMLElement::ParseAttributes( char* p )
         }
 
         // attribute.
-        if ( XMLUtil::IsAlpha( *p ) ) {
+        if (XMLUtil::IsNameStartChar( *p ) ) {
             XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
             attrib->_memPool = &_document->_attributePool;
 			attrib->_memPool->SetTracked();

+ 14 - 6
tinyxml2.h

@@ -464,6 +464,19 @@ public:
     static bool IsWhiteSpace( char p )					{
         return !IsUTF8Continuation(p) && isspace( static_cast<unsigned char>(p) );
     }
+    
+    inline static bool IsNameStartChar( unsigned char ch ) {
+        return ( ( ch < 128 ) ? isalpha( ch ) : 1 )
+               || ch == ':'
+               || ch == '_';
+    }
+    
+    inline static bool IsNameChar( unsigned char ch ) {
+        return IsNameStartChar( ch )
+               || isdigit( ch )
+               || ch == '.'
+               || ch == '-';
+    }
 
     inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX )  {
         int n = 0;
@@ -480,15 +493,10 @@ public:
         }
         return false;
     }
+    
     inline static int IsUTF8Continuation( const char p ) {
         return p & 0x80;
     }
-    inline static int IsAlphaNum( unsigned char anyByte )	{
-        return ( anyByte < 128 ) ? isalnum( anyByte ) : 1;
-    }
-    inline static int IsAlpha( unsigned char anyByte )		{
-        return ( anyByte < 128 ) ? isalpha( anyByte ) : 1;
-    }
 
     static const char* ReadBOM( const char* p, bool* hasBOM );
     // p is the starting location,

+ 14 - 0
xmltest.cpp

@@ -1050,6 +1050,20 @@ int main( int argc, const char ** argv )
 		doc.Parse( xml );
 		XMLTest( "Non-alpha element lead letter parses.", doc.Error(), false );
 	}
+    
+    {
+        const char* xml = "<element _attr1=\"foo\" :attr2=\"bar\"></element>";
+        XMLDocument doc;
+        doc.Parse( xml );
+        XMLTest("Non-alpha attribute lead character parses.", doc.Error(), false);
+    }
+    
+    {
+        const char* xml = "<3lement></3lement>";
+        XMLDocument doc;
+        doc.Parse( xml );
+        XMLTest("Element names with lead digit fail to parse.", doc.Error(), true);
+    }
 
 	{
 		const char* xml = "<element/>WOA THIS ISN'T GOING TO PARSE";