mirror of https://github.com/axmolengine/axmol.git
issue #7, add xml parser
This commit is contained in:
parent
8ab8a1bb57
commit
a35d71a4fe
|
@ -40,7 +40,7 @@
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
Optimization="0"
|
Optimization="0"
|
||||||
AdditionalIncludeDirectories=".\include;.\Res;..\..\PRJ_TG3\Include;..\..\PRJ_TG3\Include\MTAPI;..\..\PRJ_TG3\Include\ThirdParty\gles;..\..\PRJ_TG3\Include\TCOM;..\..\PRJ_TG3\TG3\Include;..\..\PRJ_TG3\TG3\TG3_Implement;..\..\PRJ_TG3\EOS_SYS;..\..\PRJ_TG3\Common\SoftSupport;..\..\PRJ_TG3\Common\ICU\Include;.\"
|
AdditionalIncludeDirectories="..\..\PRJ_TG3\Include\ThirdParty\iconv;..\..\PRJ_TG3\Include\ThirdParty\libxml2;.\include;.\Res;..\..\PRJ_TG3\Include;..\..\PRJ_TG3\Include\MTAPI;..\..\PRJ_TG3\Include\ThirdParty\gles;..\..\PRJ_TG3\Include\TCOM;..\..\PRJ_TG3\TG3\Include;..\..\PRJ_TG3\TG3\TG3_Implement;..\..\PRJ_TG3\EOS_SYS;..\..\PRJ_TG3\Common\SoftSupport;..\..\PRJ_TG3\Common\ICU\Include;.\"
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_TRANZDA_VM_;SS_MAKEDLL;__TG3_PURE_DLL__"
|
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_TRANZDA_VM_;SS_MAKEDLL;__TG3_PURE_DLL__"
|
||||||
MinimalRebuild="true"
|
MinimalRebuild="true"
|
||||||
BasicRuntimeChecks="3"
|
BasicRuntimeChecks="3"
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="WS2_32.Lib EosConfig.lib SoftSupport.lib TG3_DLL.lib libEGL.lib libgles_cl.lib libgles_cm.lib"
|
AdditionalDependencies="WS2_32.Lib EosConfig.lib SoftSupport.lib TG3_DLL.lib libEGL.lib libgles_cl.lib libgles_cm.lib libxml2.lib"
|
||||||
OutputFile="$(OutDir)/libcocos2d.dll"
|
OutputFile="$(OutDir)/libcocos2d.dll"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
AdditionalLibraryDirectories="../../PRJ_TG3/Common/ICU/lib;../../PRJ_TG3/Mtapi/Win32/lib;../../PRJ_TG3/LIB/Win32Lib;../../PRJ_TG3/Common/SoftSupport"
|
AdditionalLibraryDirectories="../../PRJ_TG3/Common/ICU/lib;../../PRJ_TG3/Mtapi/Win32/lib;../../PRJ_TG3/LIB/Win32Lib;../../PRJ_TG3/Common/SoftSupport"
|
||||||
|
@ -192,6 +192,10 @@
|
||||||
<Filter
|
<Filter
|
||||||
Name="base_nodes"
|
Name="base_nodes"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\base_nodes\CCAtlasNode.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\base_nodes\CCNode.cpp"
|
RelativePath=".\base_nodes\CCNode.cpp"
|
||||||
>
|
>
|
||||||
|
|
|
@ -22,9 +22,154 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <stack>
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
#include <libxml/tree.h>
|
||||||
|
#include <libxml/xmlmemory.h>
|
||||||
#include "CCFileUtils.h"
|
#include "CCFileUtils.h"
|
||||||
#include <string.h>
|
#include "Cocos2dDefine.h"
|
||||||
|
|
||||||
|
typedef std::pair<std::string, void*> Pair;
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SAX_NONE = 0,
|
||||||
|
SAX_KEY,
|
||||||
|
SAX_DICT,
|
||||||
|
SAX_INT,
|
||||||
|
SAX_REAL
|
||||||
|
}CCSAXState;
|
||||||
|
|
||||||
|
class CCDictMaker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCDictionary *m_pRootDict;
|
||||||
|
CCDictionary *m_pCurDict;
|
||||||
|
std::stack<CCDictionary*> m_tDictStack;
|
||||||
|
std::string m_sCurKey;///< parsed key
|
||||||
|
CCSAXState m_tState;
|
||||||
|
public:
|
||||||
|
CCDictMaker()
|
||||||
|
{
|
||||||
|
m_pRootDict = NULL;
|
||||||
|
m_pCurDict = NULL;
|
||||||
|
m_tState = SAX_NONE;
|
||||||
|
}
|
||||||
|
~CCDictMaker()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
CCDictionary *dictionaryWithContentsOfFile(const char *pFileName)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
if( !(fp = fopen(pFileName, "r")) )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
fseek(fp,0,SEEK_END);
|
||||||
|
int size = ftell(fp);
|
||||||
|
fseek(fp,0,SEEK_SET);
|
||||||
|
char *buffer = new char[size];
|
||||||
|
fread(buffer,sizeof(char),size,fp);
|
||||||
|
/*
|
||||||
|
* this initialize the library and check potential ABI mismatches
|
||||||
|
* between the version it was compiled for and the actual shared
|
||||||
|
* library used.
|
||||||
|
*/
|
||||||
|
LIBXML_TEST_VERSION
|
||||||
|
xmlSAXHandler saxHandler;
|
||||||
|
memset( &saxHandler, 0, sizeof(saxHandler) );
|
||||||
|
// Using xmlSAXVersion( &saxHandler, 2 ) generate crash as it sets plenty of other pointers...
|
||||||
|
saxHandler.initialized = XML_SAX2_MAGIC; // so we do this to force parsing as SAX2.
|
||||||
|
saxHandler.startElement = &startElement;
|
||||||
|
saxHandler.endElement = &endElement;
|
||||||
|
saxHandler.characters = &characters;
|
||||||
|
|
||||||
|
int result = xmlSAXUserParseMemory( &saxHandler, this, buffer, size );
|
||||||
|
if ( result != 0 )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Cleanup function for the XML library.
|
||||||
|
*/
|
||||||
|
xmlCleanupParser();
|
||||||
|
/*
|
||||||
|
* this is to debug memory for regression tests
|
||||||
|
*/
|
||||||
|
xmlMemoryDump();
|
||||||
|
delete []buffer;
|
||||||
|
return m_pRootDict;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
void startElement(void *ctx, const xmlChar *name, const xmlChar **atts)
|
||||||
|
{
|
||||||
|
CCDictMaker *pMaker = static_cast<CCDictMaker*>(ctx);
|
||||||
|
std::string sName((char*)name);
|
||||||
|
if( sName == "dict" )
|
||||||
|
{
|
||||||
|
CCDictionary *pNewDict = new CCDictionary();
|
||||||
|
if(! pMaker->m_pRootDict)
|
||||||
|
{
|
||||||
|
pMaker->m_pRootDict = pNewDict;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSAssert(pMaker->m_pCurDict && !pMaker->m_sCurKey.empty(), "");
|
||||||
|
pMaker->m_pCurDict->insert( Pair(pMaker->m_sCurKey, pNewDict) );
|
||||||
|
pMaker->m_sCurKey.clear();
|
||||||
|
}
|
||||||
|
pMaker->m_pCurDict = pNewDict;
|
||||||
|
pMaker->m_tDictStack.push(pMaker->m_pCurDict);
|
||||||
|
pMaker->m_tState = SAX_DICT;
|
||||||
|
}
|
||||||
|
else if(sName == "key")
|
||||||
|
{
|
||||||
|
pMaker->m_tState = SAX_KEY;
|
||||||
|
}
|
||||||
|
else if(sName == "integer")
|
||||||
|
{
|
||||||
|
pMaker->m_tState = SAX_INT;
|
||||||
|
}
|
||||||
|
else if(sName == "real")
|
||||||
|
{
|
||||||
|
pMaker->m_tState = SAX_REAL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pMaker->m_tState = SAX_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void endElement(void *ctx, const xmlChar *name)
|
||||||
|
{
|
||||||
|
CCDictMaker * pMaker = static_cast<CCDictMaker*>(ctx);
|
||||||
|
std::string sName((char*)name);
|
||||||
|
if( sName == "dict" )
|
||||||
|
{
|
||||||
|
pMaker->m_tDictStack.pop();
|
||||||
|
if ( !pMaker->m_tDictStack.empty() )
|
||||||
|
{
|
||||||
|
pMaker->m_pCurDict = static_cast<CCDictionary*>(pMaker->m_tDictStack.top());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void characters(void *ctx, const xmlChar *ch, int len)
|
||||||
|
{
|
||||||
|
CCDictMaker * pMaker = static_cast<CCDictMaker*>(ctx);
|
||||||
|
std::string *pText = new std::string((char*)ch,0,len);
|
||||||
|
switch(pMaker->m_tState)
|
||||||
|
{
|
||||||
|
case SAX_KEY:
|
||||||
|
pMaker->m_sCurKey = *pText;
|
||||||
|
break;
|
||||||
|
case SAX_INT:
|
||||||
|
case SAX_REAL:
|
||||||
|
{
|
||||||
|
NSAssert(!pMaker->m_sCurKey.empty(), "not found key : <integet/real>");
|
||||||
|
pMaker->m_pCurDict->insert( Pair(pMaker->m_sCurKey, pText) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
|
char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
|
||||||
{
|
{
|
||||||
// do not convert an absolute path (starting with '/')
|
// do not convert an absolute path (starting with '/')
|
||||||
|
@ -44,3 +189,9 @@ char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
|
||||||
|
|
||||||
return pszRet;
|
return pszRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CCDictionary *CCFileUtils::dictionaryWithContentsOfFile(const char *pFileName)
|
||||||
|
{
|
||||||
|
CCDictMaker tMaker;
|
||||||
|
return tMaker.dictionaryWithContentsOfFile(pFileName);
|
||||||
|
}
|
||||||
|
|
|
@ -25,13 +25,17 @@ THE SOFTWARE.
|
||||||
#ifndef __PLATFORM_UPHONE_CCFILE_UTILS_H__
|
#ifndef __PLATFORM_UPHONE_CCFILE_UTILS_H__
|
||||||
#define __PLATFORM_UPHONE_CCFILE_UTILS_H__
|
#define __PLATFORM_UPHONE_CCFILE_UTILS_H__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
#include <ssFile.h>
|
#include <ssFile.h>
|
||||||
|
|
||||||
|
typedef std::map<std::string, void*> CCDictionary;
|
||||||
// Helper class to handle file operations
|
// Helper class to handle file operations
|
||||||
class CCFileUtils
|
class CCFileUtils
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static char* fullPathFromRelativePath(const char *pszRealPath);
|
static char* fullPathFromRelativePath(const char *pszRealPath);
|
||||||
|
static std::map<std::string, void*> *dictionaryWithContentsOfFile(const char *pFileName);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __PLATFORM_UPHONE_CCFILE_UTILS_H__
|
#endif // __PLATFORM_UPHONE_CCFILE_UTILS_H__
|
||||||
|
|
Loading…
Reference in New Issue