ENH: Add XML parser
This commit is contained in:
parent
b37b661087
commit
dcadffbe00
|
@ -1,56 +1,58 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 1.5)
|
CMAKE_MINIMUM_REQUIRED(VERSION 1.5)
|
||||||
|
|
||||||
SET(SRCS
|
SET(SRCS
|
||||||
cmake.cxx
|
cmCacheManager.cxx
|
||||||
cmakewizard.cxx
|
cmCacheManager.h
|
||||||
cmMakeDepend.cxx
|
cmCommands.cxx
|
||||||
cmMakefile.cxx
|
cmCommands.h
|
||||||
cmSourceFile.cxx
|
cmCustomCommand.cxx
|
||||||
cmSystemTools.cxx
|
cmCustomCommand.h
|
||||||
cmDocumentation.cxx
|
cmDocumentation.cxx
|
||||||
cmDynamicLoader.cxx
|
cmDynamicLoader.cxx
|
||||||
cmCommands.cxx
|
cmDynamicLoader.h
|
||||||
cmTarget.cxx
|
cmGeneratedFileStream.cxx
|
||||||
cmCustomCommand.cxx
|
cmGlob.cxx
|
||||||
cmCacheManager.cxx
|
cmGlobalGenerator.cxx
|
||||||
cmSourceGroup.cxx
|
cmGlobalGenerator.h
|
||||||
cmListFileCache.cxx
|
cmGlobalUnixMakefileGenerator.cxx
|
||||||
cmListFileLexer.c
|
cmGlobalUnixMakefileGenerator.h
|
||||||
cmGeneratedFileStream.cxx
|
cmListFileCache.cxx
|
||||||
cmGlob.cxx
|
cmListFileCache.h
|
||||||
cmGlobalGenerator.cxx
|
cmListFileLexer.c
|
||||||
cmGlobalUnixMakefileGenerator.cxx
|
cmLocalGenerator.cxx
|
||||||
cmLocalGenerator.cxx
|
cmLocalGenerator.h
|
||||||
cmLocalUnixMakefileGenerator.cxx
|
cmLocalUnixMakefileGenerator.cxx
|
||||||
cmLocalUnixMakefileGenerator2.cxx
|
cmLocalUnixMakefileGenerator.h
|
||||||
cmVariableWatch.cxx
|
cmLocalUnixMakefileGenerator2.cxx
|
||||||
cmVersion.cxx
|
cmMakeDepend.cxx
|
||||||
cmake.h
|
cmMakeDepend.h
|
||||||
cmakewizard.h
|
cmMakefile.cxx
|
||||||
cmMakeDepend.h
|
cmMakefile.h
|
||||||
cmMakefile.h
|
cmSourceFile.cxx
|
||||||
cmSourceFile.h
|
cmSourceFile.h
|
||||||
cmSystemTools.h
|
cmSourceGroup.cxx
|
||||||
cmDynamicLoader.h
|
cmSourceGroup.h
|
||||||
cmCommands.h
|
cmSystemTools.cxx
|
||||||
cmTarget.h
|
cmSystemTools.h
|
||||||
cmCustomCommand.h
|
cmTarget.cxx
|
||||||
cmCacheManager.h
|
cmTarget.h
|
||||||
cmSourceGroup.h
|
cmVariableWatch.cxx
|
||||||
cmListFileCache.h
|
cmVariableWatch.h
|
||||||
cmGlobalGenerator.h
|
cmVersion.cxx
|
||||||
cmGlobalUnixMakefileGenerator.h
|
cmVersion.h
|
||||||
cmLocalGenerator.h
|
cmXMLParser.cxx
|
||||||
cmLocalUnixMakefileGenerator.h
|
cmXMLParser.h
|
||||||
cmVariableWatch.h
|
cmake.cxx
|
||||||
cmVersion.h
|
cmake.h
|
||||||
)
|
cmakewizard.cxx
|
||||||
|
cmakewizard.h
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# configure the .h file
|
# configure the .h file
|
||||||
CONFIGURE_FILE(
|
CONFIGURE_FILE(
|
||||||
${CMake_SOURCE_DIR}/Source/cmConfigure.cmake.h.in
|
${CMake_SOURCE_DIR}/Source/cmConfigure.cmake.h.in
|
||||||
${CMake_BINARY_DIR}/Source/cmConfigure.h )
|
${CMake_BINARY_DIR}/Source/cmConfigure.h )
|
||||||
|
|
||||||
# add the include path to find the .h
|
# add the include path to find the .h
|
||||||
INCLUDE_DIRECTORIES(${CMake_BINARY_DIR}/Source)
|
INCLUDE_DIRECTORIES(${CMake_BINARY_DIR}/Source)
|
||||||
|
@ -129,7 +131,7 @@ SET(CMTEST_SRCS ctest.cxx cmCTest.cxx
|
||||||
CTest/cmCTestScriptHandler.cxx
|
CTest/cmCTestScriptHandler.cxx
|
||||||
CTest/cmCTestTestHandler.cxx
|
CTest/cmCTestTestHandler.cxx
|
||||||
CTest/cmCTestUpdateHandler.cxx
|
CTest/cmCTestUpdateHandler.cxx
|
||||||
)
|
)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Source/CTest)
|
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Source/CTest)
|
||||||
|
|
||||||
|
@ -168,7 +170,7 @@ IF(CMAKE_BUILD_WX_DIALOG)
|
||||||
ENDIF(CMAKE_BUILD_WX_DIALOG)
|
ENDIF(CMAKE_BUILD_WX_DIALOG)
|
||||||
|
|
||||||
IF (NOT DART_ROOT)
|
IF (NOT DART_ROOT)
|
||||||
SET(MAKEPROGRAM ${CMAKE_MAKE_PROGRAM})
|
SET(MAKEPROGRAM ${CMAKE_MAKE_PROGRAM})
|
||||||
ENDIF (NOT DART_ROOT)
|
ENDIF (NOT DART_ROOT)
|
||||||
|
|
||||||
IF(BUILD_TESTING)
|
IF(BUILD_TESTING)
|
||||||
|
@ -192,7 +194,7 @@ IF(BUILD_TESTING)
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--build-project CommandLineTest
|
--build-project CommandLineTest
|
||||||
--test-command CommandLineTest)
|
--test-command CommandLineTest)
|
||||||
|
|
||||||
ADD_TEST(CustomCommand ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(CustomCommand ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/CustomCommand"
|
"${CMake_SOURCE_DIR}/Tests/CustomCommand"
|
||||||
|
@ -234,7 +236,7 @@ IF(BUILD_TESTING)
|
||||||
--build-project StringFileTest
|
--build-project StringFileTest
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--test-command StringFileTest)
|
--test-command StringFileTest)
|
||||||
|
|
||||||
ADD_TEST(TryCompile ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(TryCompile ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/TryCompile"
|
"${CMake_SOURCE_DIR}/Tests/TryCompile"
|
||||||
|
@ -247,8 +249,8 @@ IF(BUILD_TESTING)
|
||||||
|
|
||||||
ADD_TEST(simple ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(simple ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/Simple"
|
"${CMake_SOURCE_DIR}/Tests/Simple"
|
||||||
"${CMake_BINARY_DIR}/Tests/Simple"
|
"${CMake_BINARY_DIR}/Tests/Simple"
|
||||||
--build-generator ${CMAKE_GENERATOR}
|
--build-generator ${CMAKE_GENERATOR}
|
||||||
--build-project Simple
|
--build-project Simple
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
|
@ -257,8 +259,8 @@ IF(BUILD_TESTING)
|
||||||
|
|
||||||
ADD_TEST(PreOrder ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(PreOrder ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/PreOrder"
|
"${CMake_SOURCE_DIR}/Tests/PreOrder"
|
||||||
"${CMake_BINARY_DIR}/Tests/PreOrder"
|
"${CMake_BINARY_DIR}/Tests/PreOrder"
|
||||||
--build-generator ${CMAKE_GENERATOR}
|
--build-generator ${CMAKE_GENERATOR}
|
||||||
--build-project PreOrder
|
--build-project PreOrder
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
|
@ -286,7 +288,7 @@ IF(BUILD_TESTING)
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--build-two-config
|
--build-two-config
|
||||||
--build-options
|
--build-options
|
||||||
"-DCMAKE_INSTALL_PREFIX:PATH=${SimpleInstallInstallDir}"
|
"-DCMAKE_INSTALL_PREFIX:PATH=${SimpleInstallInstallDir}"
|
||||||
--test-command ${SimpleInstallInstallDir}/bin/SimpleInstall)
|
--test-command ${SimpleInstallInstallDir}/bin/SimpleInstall)
|
||||||
ADD_TEST(SimpleInstall-Stage2 ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(SimpleInstall-Stage2 ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
|
@ -297,8 +299,8 @@ IF(BUILD_TESTING)
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--build-two-config
|
--build-two-config
|
||||||
--build-options
|
--build-options
|
||||||
"-DCMAKE_INSTALL_PREFIX:PATH=${SimpleInstallInstallDir}"
|
"-DCMAKE_INSTALL_PREFIX:PATH=${SimpleInstallInstallDir}"
|
||||||
"-DSTAGE2:BOOL=1"
|
"-DSTAGE2:BOOL=1"
|
||||||
--test-command ${SimpleInstallInstallDir}/bin/SimpleInstallS2)
|
--test-command ${SimpleInstallInstallDir}/bin/SimpleInstallS2)
|
||||||
|
|
||||||
ADD_TEST(X11 ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(X11 ${CMAKE_CTEST_COMMAND}
|
||||||
|
@ -393,7 +395,7 @@ IF(BUILD_TESTING)
|
||||||
--build-exe-dir "${CMake_BINARY_DIR}/Tests/Testing/bin"
|
--build-exe-dir "${CMake_BINARY_DIR}/Tests/Testing/bin"
|
||||||
--test-command testing
|
--test-command testing
|
||||||
)
|
)
|
||||||
|
|
||||||
ADD_TEST(wrapping ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(wrapping ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/Wrapping"
|
"${CMake_SOURCE_DIR}/Tests/Wrapping"
|
||||||
|
@ -462,14 +464,14 @@ IF(BUILD_TESTING)
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/Dependency"
|
"${CMake_SOURCE_DIR}/Tests/Dependency"
|
||||||
"${CMake_BINARY_DIR}/Tests/Dependency/WithLibOut"
|
"${CMake_BINARY_DIR}/Tests/Dependency/WithLibOut"
|
||||||
--build-exe-dir "${CMake_BINARY_DIR}/Tests/Dependency/WithLibOut/Exec"
|
--build-exe-dir "${CMake_BINARY_DIR}/Tests/Dependency/WithLibOut/Exec"
|
||||||
--build-project Dependency
|
--build-project Dependency
|
||||||
--build-generator ${CMAKE_GENERATOR}
|
--build-generator ${CMAKE_GENERATOR}
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--build-options
|
--build-options
|
||||||
-DLIBRARY_OUTPUT_PATH:PATH=${CMake_BINARY_DIR}/Tests/Dependency/WithLibOut/Lib
|
-DLIBRARY_OUTPUT_PATH:PATH=${CMake_BINARY_DIR}/Tests/Dependency/WithLibOut/Lib
|
||||||
--test-command exec
|
--test-command exec
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
ADD_TEST(dependency_wo_lib_out ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(dependency_wo_lib_out ${CMAKE_CTEST_COMMAND}
|
||||||
|
@ -532,7 +534,7 @@ IF(BUILD_TESTING)
|
||||||
--build-options
|
--build-options
|
||||||
-DLIBRARY_OUTPUT_PATH:PATH=${CMake_BINARY_DIR}/Tests/Jump/WithLibOut/Lib
|
-DLIBRARY_OUTPUT_PATH:PATH=${CMake_BINARY_DIR}/Tests/Jump/WithLibOut/Lib
|
||||||
--test-command jumpExecutable
|
--test-command jumpExecutable
|
||||||
)
|
)
|
||||||
|
|
||||||
ADD_TEST(JumpNoLibOut ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(JumpNoLibOut ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
|
@ -544,7 +546,7 @@ IF(BUILD_TESTING)
|
||||||
--build-generator ${CMAKE_GENERATOR}
|
--build-generator ${CMAKE_GENERATOR}
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--test-command jumpExecutable
|
--test-command jumpExecutable
|
||||||
)
|
)
|
||||||
|
|
||||||
ADD_TEST(linkline ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(linkline ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
|
@ -599,33 +601,33 @@ IF(BUILD_TESTING)
|
||||||
--test-command test1
|
--test-command test1
|
||||||
)
|
)
|
||||||
|
|
||||||
IF (WIN32)
|
IF (WIN32)
|
||||||
ADD_TEST(SubDir ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(SubDir ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/SubDir"
|
"${CMake_SOURCE_DIR}/Tests/SubDir"
|
||||||
"${CMake_BINARY_DIR}/Tests/SubDir"
|
"${CMake_BINARY_DIR}/Tests/SubDir"
|
||||||
--build-exe-dir "${CMake_BINARY_DIR}/Tests/SubDir/Executable"
|
--build-exe-dir "${CMake_BINARY_DIR}/Tests/SubDir/Executable"
|
||||||
--build-generator ${CMAKE_GENERATOR}
|
--build-generator ${CMAKE_GENERATOR}
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--build-project SUBDIR
|
--build-project SUBDIR
|
||||||
--test-command test
|
--test-command test
|
||||||
"${CMake_BINARY_DIR}/Tests/SubDir/ShouldBeHere"
|
"${CMake_BINARY_DIR}/Tests/SubDir/ShouldBeHere"
|
||||||
"${CMake_BINARY_DIR}/Tests/SubDir/testfromsubdir.obj"
|
"${CMake_BINARY_DIR}/Tests/SubDir/testfromsubdir.obj"
|
||||||
)
|
)
|
||||||
ELSE (WIN32)
|
ELSE (WIN32)
|
||||||
ADD_TEST(SubDir ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(SubDir ${CMAKE_CTEST_COMMAND}
|
||||||
--build-and-test
|
--build-and-test
|
||||||
"${CMake_SOURCE_DIR}/Tests/SubDir"
|
"${CMake_SOURCE_DIR}/Tests/SubDir"
|
||||||
"${CMake_BINARY_DIR}/Tests/SubDir"
|
"${CMake_BINARY_DIR}/Tests/SubDir"
|
||||||
--build-exe-dir "${CMake_BINARY_DIR}/Tests/SubDir/Executable"
|
--build-exe-dir "${CMake_BINARY_DIR}/Tests/SubDir/Executable"
|
||||||
--build-generator ${CMAKE_GENERATOR}
|
--build-generator ${CMAKE_GENERATOR}
|
||||||
--build-makeprogram ${MAKEPROGRAM}
|
--build-makeprogram ${MAKEPROGRAM}
|
||||||
--build-project SUBDIR
|
--build-project SUBDIR
|
||||||
--test-command test
|
--test-command test
|
||||||
"${CMake_BINARY_DIR}/Tests/SubDir/ShouldBeHere"
|
"${CMake_BINARY_DIR}/Tests/SubDir/ShouldBeHere"
|
||||||
"${CMake_BINARY_DIR}/Tests/SubDir/testfromsubdir.o"
|
"${CMake_BINARY_DIR}/Tests/SubDir/testfromsubdir.o"
|
||||||
)
|
)
|
||||||
ENDIF (WIN32)
|
ENDIF (WIN32)
|
||||||
|
|
||||||
IF(${CMAKE_GENERATOR} MATCHES "Visual Studio")
|
IF(${CMAKE_GENERATOR} MATCHES "Visual Studio")
|
||||||
ADD_TEST(VSExternalInclude ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(VSExternalInclude ${CMAKE_CTEST_COMMAND}
|
||||||
|
@ -717,7 +719,7 @@ ENDIF (WIN32)
|
||||||
ENDIF(JNI_H)
|
ENDIF(JNI_H)
|
||||||
ENDIF(JAVA_COMPILE AND JAVA_RUNTIME AND JAVA_ARCHIVE)
|
ENDIF(JAVA_COMPILE AND JAVA_RUNTIME AND JAVA_ARCHIVE)
|
||||||
ENDIF(CMAKE_GENERATOR MATCHES "Makefiles")
|
ENDIF(CMAKE_GENERATOR MATCHES "Makefiles")
|
||||||
|
|
||||||
IF (CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE OR WXWINDOWS_INCLUDE_DIR)
|
IF (CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE OR WXWINDOWS_INCLUDE_DIR)
|
||||||
# Will be set if the wxwindows gui is on
|
# Will be set if the wxwindows gui is on
|
||||||
ADD_TEST(UseWX ${CMAKE_CTEST_COMMAND}
|
ADD_TEST(UseWX ${CMAKE_CTEST_COMMAND}
|
||||||
|
@ -730,12 +732,12 @@ ENDIF (WIN32)
|
||||||
--build-project UsewxWindows
|
--build-project UsewxWindows
|
||||||
--build-options -DCMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE:FILEPATH=${CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE}
|
--build-options -DCMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE:FILEPATH=${CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE}
|
||||||
--test-command UseWX
|
--test-command UseWX
|
||||||
)
|
)
|
||||||
ENDIF (CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE OR WXWINDOWS_INCLUDE_DIR)
|
ENDIF (CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE OR WXWINDOWS_INCLUDE_DIR)
|
||||||
|
|
||||||
IF(UNIX)
|
IF(UNIX)
|
||||||
STRING(COMPARE EQUAL "${CMAKE_INSTALL_PREFIX}" "${CMake_BINARY_DIR}/Tests/TestShellInstall/Prefix"
|
STRING(COMPARE EQUAL "${CMAKE_INSTALL_PREFIX}" "${CMake_BINARY_DIR}/Tests/TestShellInstall/Prefix"
|
||||||
PREFIX_IS_FOR_TEST)
|
PREFIX_IS_FOR_TEST)
|
||||||
IF(PREFIX_IS_FOR_TEST)
|
IF(PREFIX_IS_FOR_TEST)
|
||||||
CONFIGURE_FILE(
|
CONFIGURE_FILE(
|
||||||
${CMake_SOURCE_DIR}/Tests/TestInstall.sh.in
|
${CMake_SOURCE_DIR}/Tests/TestInstall.sh.in
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: CMake - Cross-Platform Makefile Generator
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
|
||||||
|
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
|
||||||
|
|
||||||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||||||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. See the above copyright notices for more information.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#include "cmXMLParser.h"
|
||||||
|
|
||||||
|
#include <cmexpat/expat.h>
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
cmXMLParser::cmXMLParser()
|
||||||
|
{
|
||||||
|
this->Parser = 0;
|
||||||
|
this->ParseError = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
cmXMLParser::~cmXMLParser()
|
||||||
|
{
|
||||||
|
if ( this->Parser )
|
||||||
|
{
|
||||||
|
this->CleanupParser();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::Parse(const char* string)
|
||||||
|
{
|
||||||
|
return this->InitializeParser() &&
|
||||||
|
this->ParseChunk(string, strlen(string)) &&
|
||||||
|
this->CleanupParser();
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmXMLParser::ParseFile(const char* file)
|
||||||
|
{
|
||||||
|
if ( !file )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ifstream ifs(file);
|
||||||
|
if ( !ifs )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ostringstream str;
|
||||||
|
str << ifs.rdbuf();
|
||||||
|
return this->Parse(str.str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::InitializeParser()
|
||||||
|
{
|
||||||
|
if ( this->Parser )
|
||||||
|
{
|
||||||
|
std::cerr << "Parser already initialized" << std::endl;
|
||||||
|
this->ParseError = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the expat XML parser.
|
||||||
|
this->Parser = XML_ParserCreate(0);
|
||||||
|
XML_SetElementHandler(static_cast<XML_Parser>(this->Parser),
|
||||||
|
&cmXMLParserStartElement,
|
||||||
|
&cmXMLParserEndElement);
|
||||||
|
XML_SetCharacterDataHandler(static_cast<XML_Parser>(this->Parser),
|
||||||
|
&cmXMLParserCharacterDataHandler);
|
||||||
|
XML_SetUserData(static_cast<XML_Parser>(this->Parser), this);
|
||||||
|
this->ParseError = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::ParseChunk(const char* inputString, unsigned int length)
|
||||||
|
{
|
||||||
|
if ( !this->Parser )
|
||||||
|
{
|
||||||
|
std::cerr << "Parser not initialized" << std::endl;
|
||||||
|
this->ParseError = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int res;
|
||||||
|
res = this->ParseBuffer(inputString, length);
|
||||||
|
if ( res == 0 )
|
||||||
|
{
|
||||||
|
this->ParseError = 1;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::CleanupParser()
|
||||||
|
{
|
||||||
|
if ( !this->Parser )
|
||||||
|
{
|
||||||
|
std::cerr << "Parser not initialized" << std::endl;
|
||||||
|
this->ParseError = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int result = !this->ParseError;
|
||||||
|
if(result)
|
||||||
|
{
|
||||||
|
// Tell the expat XML parser about the end-of-input.
|
||||||
|
if(!XML_Parse(static_cast<XML_Parser>(this->Parser), "", 0, 1))
|
||||||
|
{
|
||||||
|
this->ReportXmlParseError();
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up the parser.
|
||||||
|
XML_ParserFree(static_cast<XML_Parser>(this->Parser));
|
||||||
|
this->Parser = 0;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::ParseBuffer(const char* buffer, unsigned int count)
|
||||||
|
{
|
||||||
|
// Pass the buffer to the expat XML parser.
|
||||||
|
if(!XML_Parse(static_cast<XML_Parser>(this->Parser), buffer, count, 0))
|
||||||
|
{
|
||||||
|
this->ReportXmlParseError();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::ParseBuffer(const char* buffer)
|
||||||
|
{
|
||||||
|
return this->ParseBuffer(buffer, static_cast<int>(strlen(buffer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::ParsingComplete()
|
||||||
|
{
|
||||||
|
// Default behavior is to parse to end of stream.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXMLParser::StartElement(const char * name,
|
||||||
|
const char ** /*atts*/)
|
||||||
|
{
|
||||||
|
std::cout << "Start element: " << name << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXMLParser::EndElement(const char * name)
|
||||||
|
{
|
||||||
|
std::cout << "End element: " << name << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXMLParser::CharacterDataHandler(const char* /*inData*/,
|
||||||
|
int /*inLength*/)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int cmXMLParser::IsSpace(char c)
|
||||||
|
{
|
||||||
|
return isspace(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXMLParserStartElement(void* parser, const char *name,
|
||||||
|
const char **atts)
|
||||||
|
{
|
||||||
|
// Begin element handler that is registered with the XML_Parser.
|
||||||
|
// This just casts the user data to a cmXMLParser and calls
|
||||||
|
// StartElement.
|
||||||
|
static_cast<cmXMLParser*>(parser)->StartElement(name, atts);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXMLParserEndElement(void* parser, const char *name)
|
||||||
|
{
|
||||||
|
// End element handler that is registered with the XML_Parser. This
|
||||||
|
// just casts the user data to a cmXMLParser and calls EndElement.
|
||||||
|
static_cast<cmXMLParser*>(parser)->EndElement(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXMLParserCharacterDataHandler(void* parser, const char* data,
|
||||||
|
int length)
|
||||||
|
{
|
||||||
|
// Character data handler that is registered with the XML_Parser.
|
||||||
|
// This just casts the user data to a cmXMLParser and calls
|
||||||
|
// CharacterDataHandler.
|
||||||
|
static_cast<cmXMLParser*>(parser)->CharacterDataHandler(data, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXMLParser::ReportXmlParseError()
|
||||||
|
{
|
||||||
|
std::cerr << "Error parsing XML in stream at line "
|
||||||
|
<< XML_GetCurrentLineNumber(static_cast<XML_Parser>(this->Parser))
|
||||||
|
<< ": "
|
||||||
|
<< XML_ErrorString(XML_GetErrorCode(
|
||||||
|
static_cast<XML_Parser>(this->Parser))) << std::endl;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: CMake - Cross-Platform Makefile Generator
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
|
||||||
|
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
|
||||||
|
|
||||||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||||||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. See the above copyright notices for more information.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#ifndef cmXMLParser_h
|
||||||
|
#define cmXMLParser_h
|
||||||
|
|
||||||
|
#include "cmStandardIncludes.h"
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
void cmXMLParserStartElement(void*, const char*, const char**);
|
||||||
|
void cmXMLParserEndElement(void*, const char*);
|
||||||
|
void cmXMLParserCharacterDataHandler(void*, const char*, int);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \class cmXMLParser
|
||||||
|
* \brief Helper class for performing XML parsing
|
||||||
|
*
|
||||||
|
* Superclass for all XML parsers.
|
||||||
|
*/
|
||||||
|
class cmXMLParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cmXMLParser();
|
||||||
|
virtual ~cmXMLParser();
|
||||||
|
|
||||||
|
//! Parse given XML string
|
||||||
|
virtual int Parse(const char* string);
|
||||||
|
|
||||||
|
//! Parse given XML file
|
||||||
|
virtual int ParseFile(const char* file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When parsing fragments of XML or streaming XML, use the following three
|
||||||
|
* methods. InitializeParser method initialize parser but does not perform
|
||||||
|
* any actual parsing. ParseChunk parses framgent of XML. This has to match
|
||||||
|
* to what was already parsed. CleanupParser finishes parsing. If there were
|
||||||
|
* errors, CleanupParser will report them.
|
||||||
|
*/
|
||||||
|
virtual int InitializeParser();
|
||||||
|
virtual int ParseChunk(const char* inputString, unsigned int length);
|
||||||
|
virtual int CleanupParser();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//! This variable is true if there was a parse error while parsing in chunks.
|
||||||
|
int ParseError;
|
||||||
|
|
||||||
|
//1 Expat parser structure. Exists only during call to Parse().
|
||||||
|
void* Parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called before each block of input is read from the stream to check if
|
||||||
|
* parsing is complete. Can be replaced by subclasses to change the
|
||||||
|
* terminating condition for parsing. Parsing always stops when the end of
|
||||||
|
* file is reached in the stream.
|
||||||
|
*/
|
||||||
|
|
||||||
|
virtual int ParsingComplete();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a new element is opened in the XML source. Should be replaced
|
||||||
|
* by subclasses to handle each element.
|
||||||
|
* name = Name of new element.
|
||||||
|
* atts = Null-terminated array of attribute name/value pairs. Even
|
||||||
|
* indices are attribute names, and odd indices are values.
|
||||||
|
*/
|
||||||
|
virtual void StartElement(const char* name, const char** atts);
|
||||||
|
|
||||||
|
//! Called at the end of an element in the XML source opened when StartElement
|
||||||
|
// was called.
|
||||||
|
virtual void EndElement(const char* name);
|
||||||
|
|
||||||
|
//! Called when there is character data to handle.
|
||||||
|
virtual void CharacterDataHandler(const char* data, int length);
|
||||||
|
|
||||||
|
//! Called by Parse to report an XML syntax error.
|
||||||
|
virtual void ReportXmlParseError();
|
||||||
|
|
||||||
|
//! Utility for convenience of subclasses. Wraps isspace C library
|
||||||
|
// routine.
|
||||||
|
static int IsSpace(char c);
|
||||||
|
|
||||||
|
//! Send the given buffer to the XML parser.
|
||||||
|
virtual int ParseBuffer(const char* buffer, unsigned int count);
|
||||||
|
|
||||||
|
//! Send the given c-style string to the XML parser.
|
||||||
|
int ParseBuffer(const char* buffer);
|
||||||
|
|
||||||
|
//! Callbacks for the expat
|
||||||
|
friend void cmXMLParserStartElement(void*, const char*, const char**);
|
||||||
|
friend void cmXMLParserEndElement(void*, const char*);
|
||||||
|
friend void cmXMLParserCharacterDataHandler(void*, const char*, int);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue