mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
** Big Maps Projects code (incl. Multiplayer v1.5 ** ********************************************************** - Merged Big Maps Project code from BMP+MP trunk (Revision: 3340) o Complete SVN Revision history: https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP - Before THIS merge, I made a branch of the existing 1.13 source o SVN Branch: https://81.169.133.124/source/ja2/branches/JA2_rev.3336/src - Removed old VS 6.0 and VS 2003 project and solutions files, because compilation is broken long time ago - I will add VS 2010 projects and solution file in the next few days git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@3341 3b4a5df2-a311-0410-b5c6-a8a6f20db521
98 lines
2.4 KiB
C++
98 lines
2.4 KiB
C++
#ifndef _XML_PARSER_H_
|
|
#define _XML_PARSER_H_
|
|
|
|
#include "expat.h"
|
|
#include "XML.h"
|
|
|
|
class IXMLParser
|
|
{
|
|
public:
|
|
const XML_Char* ElementName;
|
|
public:
|
|
IXMLParser(const XML_Char *element_name, XML_Parser &parser, IXMLParser* caller=NULL)
|
|
: _parser(parser), _caller(caller), ElementName(element_name) {};
|
|
~IXMLParser() {};
|
|
|
|
/**
|
|
* Interface
|
|
*/
|
|
static void onStartCallback(void *userData, const XML_Char* name, const XML_Char** atts)
|
|
{
|
|
((IXMLParser*)userData)->onStartElement(name,atts);
|
|
}
|
|
static void onEndCallback(void *userData, const XML_Char* name)
|
|
{
|
|
((IXMLParser*)userData)->onEndElement(name);
|
|
// test if we are done here
|
|
if( ((IXMLParser*)userData)->_caller && (strcmp(name, ((IXMLParser*)userData)->ElementName) == 0) )
|
|
{
|
|
((IXMLParser*)userData)->_caller->grabParser();
|
|
}
|
|
}
|
|
static void onTextCallback(void *userData, const XML_Char *str, int len)
|
|
{
|
|
((IXMLParser*)userData)->onTextElement(str,len);
|
|
}
|
|
void grabParser()
|
|
{
|
|
XML_SetUserData(_parser,this);
|
|
XML_SetElementHandler(_parser, IXMLParser::onStartCallback, IXMLParser::onEndCallback);
|
|
XML_SetCharacterDataHandler(_parser, IXMLParser::onTextCallback);
|
|
}
|
|
|
|
/**
|
|
* Override these methods in your parser
|
|
*/
|
|
virtual void onStartElement(const XML_Char* name, const XML_Char** atts)
|
|
{};
|
|
virtual void onEndElement(const XML_Char* name)
|
|
{};
|
|
virtual void onTextElement(const XML_Char *str, int len)
|
|
{};
|
|
protected:
|
|
XML_Char const* getAttribute(const XML_Char* attr_name, const XML_Char** atts)
|
|
{
|
|
while(*atts)
|
|
{
|
|
if(strcmp(*atts++,attr_name) == 0)
|
|
{
|
|
return *atts;
|
|
}
|
|
atts++;
|
|
}
|
|
return "";
|
|
}
|
|
bool getAttributeAsInt(const XML_Char* attr_name, const XML_Char** attr, int &value)
|
|
{
|
|
XML_Char const* result = getAttribute(attr_name,attr);
|
|
if( strcmp(result,"") != 0)
|
|
{
|
|
value = (int)atol(result);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
bool getAttributeAsFloat(const XML_Char* attr_name, const XML_Char** attr, float &value)
|
|
{
|
|
XML_Char const* result = getAttribute(attr_name,attr);
|
|
if( strcmp(result,"") != 0)
|
|
{
|
|
value = (float)atof(result);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int getCurrentLineNumber()
|
|
{
|
|
return XML_GetCurrentLineNumber(this->_parser);
|
|
}
|
|
protected:
|
|
std::string sCharData;
|
|
|
|
XML_Parser& _parser;
|
|
IXMLParser* _caller;
|
|
};
|
|
|
|
#endif // _XML_PARSER_H_
|