Przeglądaj źródła

accept a nBytes argument for Parse()

Lee Thomason (grinliz) 13 lat temu
rodzic
commit
e2bcb32494
3 zmienionych plików z 22 dodań i 7 usunięć
  1. 8 6
      tinyxml2.cpp
  2. 6 1
      tinyxml2.h
  3. 8 0
      xmltest.cpp

+ 8 - 6
tinyxml2.cpp

@@ -1622,7 +1622,7 @@ int XMLDocument::SaveFile( FILE* fp, bool compact )
 }
 }
 
 
 
 
-int XMLDocument::Parse( const char* p )
+int XMLDocument::Parse( const char* p, size_t len )
 {
 {
 	DeleteChildren();
 	DeleteChildren();
 	InitDocument();
 	InitDocument();
@@ -1631,6 +1631,13 @@ int XMLDocument::Parse( const char* p )
 		SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
 		SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
 		return errorID;
 		return errorID;
 	}
 	}
+	if ( len == (size_t)(-1) ) {
+		len = strlen( p );
+	}
+	charBuffer = new char[ len+1 ];
+	memcpy( charBuffer, p, len );
+	charBuffer[len] = 0;
+
 	p = XMLUtil::SkipWhiteSpace( p );
 	p = XMLUtil::SkipWhiteSpace( p );
 	p = XMLUtil::ReadBOM( p, &writeBOM );
 	p = XMLUtil::ReadBOM( p, &writeBOM );
 	if ( !p || !*p ) {
 	if ( !p || !*p ) {
@@ -1638,11 +1645,6 @@ int XMLDocument::Parse( const char* p )
 		return errorID;
 		return errorID;
 	}
 	}
 
 
-	size_t len = strlen( p );
-	charBuffer = new char[ len+1 ];
-	memcpy( charBuffer, p, len+1 );
-
-
 	ParseDeep( charBuffer, 0 );
 	ParseDeep( charBuffer, 0 );
 	return errorID;
 	return errorID;
 }
 }

+ 6 - 1
tinyxml2.h

@@ -1072,8 +1072,13 @@ public:
 		Parse an XML file from a character string.
 		Parse an XML file from a character string.
 		Returns XML_NO_ERROR (0) on success, or
 		Returns XML_NO_ERROR (0) on success, or
 		an errorID.
 		an errorID.
+
+		You may optionally pass in the 'nBytes', which is
+		the number of bytes which will be parsed. If not
+		specified, TinyXML will assume 'xml' points to a
+		null terminated string.
 	*/
 	*/
-	int Parse( const char* xml );
+	int Parse( const char* xml, size_t nBytes=(size_t)(-1) );
 
 
 	/**
 	/**
 		Load an XML file from disk.
 		Load an XML file from disk.

+ 8 - 0
xmltest.cpp

@@ -947,6 +947,14 @@ int main( int /*argc*/, const char ** /*argv*/ )
 		XMLTest( "Non-alpha element lead letter parses.", doc.Error(), false );
 		XMLTest( "Non-alpha element lead letter parses.", doc.Error(), false );
 	}
 	}
 
 
+	{
+		const char* xml = "<element/>WOA THIS ISN'T GOING TO PARSE";
+		XMLDocument doc;
+		doc.Parse( xml, 10 );
+		//doc.Print();
+		XMLTest( "Set length of incoming data", doc.Error(), false );
+	}
+
 	// ----------- Whitespace ------------
 	// ----------- Whitespace ------------
 	{
 	{
 		const char* xml = "<element>"
 		const char* xml = "<element>"