/*	
 *	tixml.h
 *
 *	XML DOM parser
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Sat Nov 25 20:20:00 JST 2006 Naoyuki Sawa
 *	- 1st リリース。
 *	- TinyXml version 1.2.4 を参考にして、作成しました。
 *	  以下に、オリジナルの TinyXml version 1.2.4 から Copyright 文をを引用します。
 *	  ------------------------------------------------------------------------
 *	  Copyright (c) 2000 Lee Thomason (www.grinninglizard.com)
 *	  
 *	  This software is provided 'as-is', without any express or implied 
 *	  warranty. In no event will the authors be held liable for any 
 *	  damages arising from the use of this software.
 *	  
 *	  Permission is granted to anyone to use this software for any 
 *	  purpose, including commercial applications, and to alter it and 
 *	  redistribute it freely, subject to the following restrictions:
 *	  
 *	  1. The origin of this software must not be misrepresented; you must 
 *	  not claim that you wrote the original software. If you use this 
 *	  software in a product, an acknowledgment in the product documentation 
 *	  would be appreciated but is not required.
 *	  
 *	  2. Altered source versions must be plainly marked as such, and 
 *	  must not be misrepresented as being the original software.
 *	  
 *	  3. This notice may not be removed or altered from any source 
 *	  distribution.
 *	  ------------------------------------------------------------------------
 *	- 基本的には、TinyXml の設計そのままで、C++→C言語に移植しただけです。
 *	  ただし、エラー処理を削除して強制終了に変更する等、大幅に簡略化しました。
 *	- TinyXml version 1.2.4 はかなり旧いバージョンなので、いくつか誤りが有ります。
 *	  新しい、TinyXml version 2.5.2 のソースも参考し、気付いた誤りは修正しました。
 *	* Sun Nov 26 18:00:19 JST 2006 Naoyuki Sawa
 *	- 文字列クラスを、TiXmlString→StdStringに名前変更しました。
 *	  std::stringを基に、最低限必要な機能だけを実装したクラスなので、この名前の方が適切だからです。
 *	- StdStringは、XMLに特化していないので、一般の用途に利用することもできます。
 *	  もし今後、実際に、一般の用途に利用することが多くなったら、別のモジュールへ移すかも知れません。
 *	* Mon Nov 27 00:38:25 JST 2006 Naoyuki Sawa
 *	- 基底クラスへのキャストを行う関数(TiXml???_super())を、tixml.h→tixml.cへ移しました。
 *	  本モジュール内部だけでなく、本モジュールを利用するコードからも使うことがあると考えたからです。
 *	* Tue Dec 05 00:37:14 JST 2006 Naoyuki Sawa
 *	- StdStringクラスメソッドのメモリ割り当て回数を減らし、高速化しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Thu Apr 21 21:50:44 JST 2016 Naoyuki Sawa
 *	- TiXmlNode_ToDocument(),TiXmlNode_ToElement(),TiXmlNode_ToComment(),TiXmlNode_ToUnknown(),TiXmlNode_ToText(),TiXmlNode_ToDeclaration()の引数に、NULLポインタも指定出来るようにしました。
 *	  変更前は、以下のように書く必要があった処理を:
 *	  │TiXmlNode* node2 = TiXmlNode_FirstChild(node1, NULL);
 *	  │if(node2) {
 *	  │  TiXmlText* text = TiXmlNode_ToText(node2);
 *	  │  if(text) {
 *	  │    〜〜〜テキストノードに対する処理〜〜〜
 *	  │  }
 *	  │}
 *	  変更後は、以下のように簡潔に書く事も出来るようになりました:
 *	  │TiXmlText* text = TiXmlNode_ToText(TiXmlNode_FirstChild(node1, NULL));
 *	  │if(text) {
 *	  │    〜〜〜テキストノードに対する処理〜〜〜
 *	  │}
 *	  この変更による、既存のアプリケーションの処理への影響は無いので、既存のアプリケーションを修正する必要は有りません。
 *	* Sun May 08 23:30:59 JST 2016 Naoyuki Sawa
 *	- XMLの中に'\x80'〜'\xFF'の文字が有ると正しく処理出来ていなかった問題を修正しました。
 *	  この修正のためにStdString_append_char()を追加しました。
 *	- これまで問題が有った理由は、個々の関数の中で文字コードのint変数を「StdString_append(This->value, (char*)&c);」のようにして一文字追加しようとしていました。
 *	  c[31:8]が0である事を期待した処理だったのですが、実際にはcが'\x80'〜'\xFF'だとc[31:8]が1になって、2文字以上の不定な文字列として追加されてしまっていました。
 *	    問題が起きていたXMLの例: <comp name="コンポ 1">
 *	                                         ~~~~~~~~ この文字列を1文字づつ追加しようとして、実際にはそれぞれ1文字ではなく、2文字以上の不定な文字列を追加してしまっていた。
 *	  今回の修正によって、StdString_append_char()を呼び出すようにして、明示的にc[31:8]を0にクリアするようになったので、上記の問題は生じなくなりました。
 */
#ifndef __TIXML_H__
#define __TIXML_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/****************************************************************************
 *	
 ****************************************************************************/

typedef struct _StdString StdString;

typedef struct _TiXmlBase TiXmlBase;
/*├*/typedef struct _TiXmlNode TiXmlNode;
/*│　　├*/typedef struct _TiXmlElement TiXmlElement;
/*│　　├*/typedef struct _TiXmlComment TiXmlComment;
/*│　　├*/typedef struct _TiXmlText TiXmlText;
/*│　　├*/typedef struct _TiXmlDeclaration TiXmlDeclaration;
/*│　　├*/typedef struct _TiXmlUnknown TiXmlUnknown;
/*│　　└*/typedef struct _TiXmlDocument TiXmlDocument;
/*└*/typedef struct _TiXmlAttribute TiXmlAttribute;
typedef struct _TiXmlAttributeSet TiXmlAttributeSet;

typedef struct _TiXmlBase_vtbl TiXmlBase_vtbl;
/*├*/typedef struct _TiXmlNode_vtbl TiXmlNode_vtbl;
/*│　　├*/typedef struct _TiXmlElement_vtbl TiXmlElement_vtbl;
/*│　　├*/typedef struct _TiXmlComment_vtbl TiXmlComment_vtbl;
/*│　　├*/typedef struct _TiXmlText_vtbl TiXmlText_vtbl;
/*│　　├*/typedef struct _TiXmlDeclaration_vtbl TiXmlDeclaration_vtbl;
/*│　　├*/typedef struct _TiXmlUnknown_vtbl TiXmlUnknown_vtbl;
/*│　　└*/typedef struct _TiXmlDocument_vtbl TiXmlDocument_vtbl;
/*└*/typedef struct _TiXmlAttribute_vtbl TiXmlAttribute_vtbl;
typedef struct _TiXmlAttributeSet_vtbl TiXmlAttributeSet_vtbl;

/* 基底クラスへのキャストを行う関数です。
 * - コード中に直接キャストを記述すると、誤ったキャストによるバグが発見しづらいため、
 *   基底クラスへのキャストを行う場合は、必ず、以下の関数を介して行うことにしました。
 *   こうしておけば、コンパイラが型の不一致を検出して警告を発するので、バグの発見が容易です。
 */
static inline TiXmlBase* TiXmlNode_super       (TiXmlNode* This       ) { return (TiXmlBase*)This; }
static inline TiXmlNode* TiXmlElement_super    (TiXmlElement* This    ) { return (TiXmlNode*)This; }
static inline TiXmlNode* TiXmlComment_super    (TiXmlComment* This    ) { return (TiXmlNode*)This; }
static inline TiXmlNode* TiXmlText_super       (TiXmlText* This       ) { return (TiXmlNode*)This; }
static inline TiXmlNode* TiXmlDeclaration_super(TiXmlDeclaration* This) { return (TiXmlNode*)This; }
static inline TiXmlNode* TiXmlUnknown_super    (TiXmlUnknown* This    ) { return (TiXmlNode*)This; }
static inline TiXmlNode* TiXmlDocument_super   (TiXmlDocument* This   ) { return (TiXmlNode*)This; }
static inline TiXmlBase* TiXmlAttribute_super  (TiXmlAttribute* This  ) { return (TiXmlBase*)This; }

/****************************************************************************
 *	StdString
 ****************************************************************************/

/* 文字列を保持します。
 */
struct _StdString {
	char* buf;	/* 文字列バッファ */
			/* 初期化オーバーヘッド低減のために、NULLは空文字列("")を意味します。 */
			/* bufを直接参照せずに、StdString_c_str()経由でアクセスしてください。 */
};

StdString* StdString_new(const char* p/*=NULL*/);
void StdString_delete(StdString* This);
void _StdString_construct(StdString* This, const char* p/*=NULL*/);
void _StdString_destruct(StdString* This);
/*public:*/
const char* StdString_c_str(StdString* This);
void StdString_assign(StdString* This, const char* p/*=NULL*/);
void StdString_append(StdString* This, const char* p/*=NULL*/);
void StdString_append_char(StdString* This, int c/*'\0'不可*/);	//{{2016/05/08追加:XMLの中に'\x80'〜'\xFF'の文字が有ると正しく処理出来ていなかった問題を修正しました。この修正のためにStdString_append_char()を追加しました。}}

/****************************************************************************
 *	TiXmlBase
 ****************************************************************************/

/* XML DOMの抽象基底クラスです。
 */
struct _TiXmlBase {
	const TiXmlBase_vtbl* vptr;
	/*↑TiXmlBase↑*/
};

struct _TiXmlBase_vtbl {
	void (*destruct)(TiXmlBase* This);
	void (*Print)(TiXmlBase* This, FILE* fp, int depth); /*=0*/
	/*↑TiXmlBase_vtbl↑*/
};

//TiXmlBase* TiXmlBase_new(); 派生クラスからのみ生成
void TiXmlBase_delete(TiXmlBase* This);
void _TiXmlBase_construct(TiXmlBase* This);
/*virtual*/ void _TiXmlBase_destruct(TiXmlBase* This);

/****************************************************************************
 *	TiXmlNode
 ****************************************************************************/

/* XMLノードの抽象基底クラスです。
 */
struct _TiXmlNode /*:TiXmlBase*/ {
	const TiXmlNode_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* value;		/* 派生クラス毎に用途が異なります */
	TiXmlNode* firstChild;		/* 先頭の子ノード。空ならばNULL */
	TiXmlNode* lastChild;		/* 末尾の子ノード。空ならばNULL */
	TiXmlNode* prev;		/* 前の兄弟ノード。先頭ならばNULL */
	TiXmlNode* next;		/* 次の兄弟ノード。末尾ならばNULL */
	/*↑TiXmlNode↑*/
};

struct _TiXmlNode_vtbl /*:TiXmlBase_vtbl*/ {
	void (*destruct)(TiXmlNode* This);
	void (*Print)(TiXmlNode* This, FILE* fp, int depth); /*=0*/
	/*↑TiXmlBase_vtbl↑*/
	TiXmlNode* (*Clone)(TiXmlNode* This); /*=0*/
	const char* (*Parse)(TiXmlNode* This, const char* p); /*=0*/
	/*↑TiXmlNode_vtbl↑*/
};

//TiXmlNode* TiXmlNode_new(); 派生クラスからのみ生成
void TiXmlNode_delete(TiXmlNode* This);
void _TiXmlNode_construct(TiXmlNode* This);
/*virtual*/ void _TiXmlNode_destruct(TiXmlNode* This);
/*public:*/
const char* TiXmlNode_Value(TiXmlNode* This);
void TiXmlNode_SetValue(TiXmlNode* This, const char* value);
void TiXmlNode_Clear(TiXmlNode* This);
TiXmlNode* TiXmlNode_FirstChild(TiXmlNode* This, const char* value/*=NULL*/);
TiXmlNode* TiXmlNode_LastChild(TiXmlNode* This, const char* value/*=NULL*/);
TiXmlNode* TiXmlNode_IterateChildren(TiXmlNode* This, const char* value/*=NULL*/, TiXmlNode* previous);
void TiXmlNode_InsertEndChild(TiXmlNode* This, TiXmlNode* addThis);
void TiXmlNode_InsertBeforeChild(TiXmlNode* This, TiXmlNode* beforeThis, TiXmlNode* addThis);
void TiXmlNode_InsertAfterChild(TiXmlNode* This, TiXmlNode* afterThis, TiXmlNode* addThis);
void TiXmlNode_ReplaceChild(TiXmlNode* This, TiXmlNode* replaceThis, TiXmlNode* withThis);
void TiXmlNode_RemoveChild(TiXmlNode* This, TiXmlNode* removeThis);
TiXmlNode* TiXmlNode_NextSibling(TiXmlNode* This, const char* value/*=NULL*/);
TiXmlNode* TiXmlNode_PreviousSibling(TiXmlNode* This, const char* value/*=NULL*/);
TiXmlElement* TiXmlNode_NextSiblingElement(TiXmlNode* This, const char* value/*=NULL*/);
TiXmlElement* TiXmlNode_FirstChildElement(TiXmlNode* This, const char* value/*=NULL*/);
//{{2016/04/21変更:TiXmlNode_ToDocument(),TiXmlNode_ToElement(),TiXmlNode_ToComment(),TiXmlNode_ToUnknown(),TiXmlNode_ToText(),TiXmlNode_ToDeclaration()の引数に、NULLポインタも指定出来るようにしました。
//TiXmlDocument   * TiXmlNode_ToDocument   (TiXmlNode* This);
//TiXmlElement    * TiXmlNode_ToElement    (TiXmlNode* This);
//TiXmlComment    * TiXmlNode_ToComment    (TiXmlNode* This);
//TiXmlUnknown    * TiXmlNode_ToUnknown    (TiXmlNode* This);
//TiXmlText       * TiXmlNode_ToText       (TiXmlNode* This);
//TiXmlDeclaration* TiXmlNode_ToDeclaration(TiXmlNode* This);
//↓2016/04/21変更:TiXmlNode_ToDocument(),TiXmlNode_ToElement(),TiXmlNode_ToComment(),TiXmlNode_ToUnknown(),TiXmlNode_ToText(),TiXmlNode_ToDeclaration()の引数に、NULLポインタも指定出来るようにしました。
TiXmlDocument   * TiXmlNode_ToDocument   (TiXmlNode* This/*NULL可*/);
TiXmlElement    * TiXmlNode_ToElement    (TiXmlNode* This/*NULL可*/);
TiXmlComment    * TiXmlNode_ToComment    (TiXmlNode* This/*NULL可*/);
TiXmlUnknown    * TiXmlNode_ToUnknown    (TiXmlNode* This/*NULL可*/);
TiXmlText       * TiXmlNode_ToText       (TiXmlNode* This/*NULL可*/);
TiXmlDeclaration* TiXmlNode_ToDeclaration(TiXmlNode* This/*NULL可*/);
//}}2016/04/21変更:TiXmlNode_ToDocument(),TiXmlNode_ToElement(),TiXmlNode_ToComment(),TiXmlNode_ToUnknown(),TiXmlNode_ToText(),TiXmlNode_ToDeclaration()の引数に、NULLポインタも指定出来るようにしました。

/****************************************************************************
 *	TiXmlElement
 ****************************************************************************/

/* 要素ノードを表します。
 */
struct _TiXmlElement /*:TiXmlNode*/ {
	const TiXmlElement_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* value;		/* 要素名 */
	TiXmlNode* firstChild;		/* 先頭の子ノード。空ならばNULL */
	TiXmlNode* lastChild;		/* 末尾の子ノード。空ならばNULL */
	TiXmlNode* prev;		/* 前の兄弟ノード。先頭ならばNULL */
	TiXmlNode* next;		/* 次の兄弟ノード。末尾ならばNULL */
	/*↑TiXmlNode↑*/
	TiXmlAttributeSet* attributeSet;	/* 属性セット */
	/*↑TiXmlElement↑*/
};

struct _TiXmlElement_vtbl /*:TiXmlNode_vtbl*/ {
	void (*destruct)(TiXmlElement* This);
	void (*Print)(TiXmlElement* This, FILE* fp, int depth);
	/*↑TiXmlBase_vtbl↑*/
	TiXmlNode* (*Clone)(TiXmlElement* This);
	const char* (*Parse)(TiXmlElement* This, const char* p);
	/*↑TiXmlNode_vtbl↑*/
	/*↑TiXmlElement_vtbl↑*/
};

TiXmlElement* TiXmlElement_new(const char* value/*=NULL*/);
void TiXmlElement_delete(TiXmlElement* This);
void _TiXmlElement_construct(TiXmlElement* This, const char* value/*=NULL*/);
/*virtual*/ void _TiXmlElement_destruct(TiXmlElement* This);
/*public:*/
const char* TiXmlElement_Attribute(TiXmlElement* This, const char* name);
void TiXmlElement_SetAttribute(TiXmlElement* This, const char* name, const char* value);
void TiXmlElement_RemoveAttribute(TiXmlElement* This, const char* name);
TiXmlAttribute* TiXmlElement_FirstAttribute(TiXmlElement* This);
TiXmlAttribute* TiXmlElement_LastAttribute(TiXmlElement* This);
/*virtual*/ TiXmlNode* _TiXmlElement_Clone(TiXmlElement* This);
/*virtual*/ void _TiXmlElement_Print(TiXmlElement* This, FILE* fp, int depth);
/*protected:*/
/*virtual*/ const char* _TiXmlElement_Parse(TiXmlElement* This, const char* p);
const char* TiXmlElement_ReadValue(TiXmlElement* This, const char* p);

/****************************************************************************
 *	TiXmlComment
 ****************************************************************************/

/* コメントノードを表します。
 */
struct _TiXmlComment /*:TiXmlNode*/ {
	const TiXmlComment_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* value;		/* コメントの内容 */
	TiXmlNode* firstChild;		/* 先頭の子ノード。空ならばNULL */
	TiXmlNode* lastChild;		/* 末尾の子ノード。空ならばNULL */
	TiXmlNode* prev;		/* 前の兄弟ノード。先頭ならばNULL */
	TiXmlNode* next;		/* 次の兄弟ノード。末尾ならばNULL */
	/*↑TiXmlNode↑*/
	/*↑TiXmlComment↑*/
};

struct _TiXmlComment_vtbl /*:TiXmlNode_vtbl*/ {
	void (*destruct)(TiXmlComment* This);
	void (*Print)(TiXmlComment* This, FILE* fp, int depth);
	/*↑TiXmlBase_vtbl↑*/
	TiXmlNode* (*Clone)(TiXmlComment* This);
	const char* (*Parse)(TiXmlComment* This, const char* p);
	/*↑TiXmlNode_vtbl↑*/
	/*↑TiXmlComment_vtbl↑*/
};

TiXmlComment* TiXmlComment_new();
void TiXmlComment_delete(TiXmlComment* This);
void _TiXmlComment_construct(TiXmlComment* This);
/*virtual*/ void _TiXmlComment_destruct(TiXmlComment* This);
/*public:*/
/*virtual*/ TiXmlNode* _TiXmlComment_Clone(TiXmlComment* This);
/*virtual*/ void _TiXmlComment_Print(TiXmlComment* This, FILE* fp, int depth);
/*protected:*/
/*virtual*/ const char* _TiXmlComment_Parse(TiXmlComment* This, const char* p);

/****************************************************************************
 *	TiXmlText
 ****************************************************************************/

/* テキストノードを表します。
 */
struct _TiXmlText /*:TiXmlNode*/ {
	const TiXmlText_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* value;		/* テキストの内容 */
	TiXmlNode* firstChild;		/* 先頭の子ノード。空ならばNULL */
	TiXmlNode* lastChild;		/* 末尾の子ノード。空ならばNULL */
	TiXmlNode* prev;		/* 前の兄弟ノード。先頭ならばNULL */
	TiXmlNode* next;		/* 次の兄弟ノード。末尾ならばNULL */
	/*↑TiXmlNode↑*/
	/*↑TiXmlText↑*/
};

struct _TiXmlText_vtbl /*:TiXmlNode_vtbl*/ {
	void (*destruct)(TiXmlText* This);
	void (*Print)(TiXmlText* This, FILE* fp, int depth);
	/*↑TiXmlBase_vtbl↑*/
	TiXmlNode* (*Clone)(TiXmlText* This);
	const char* (*Parse)(TiXmlText* This, const char* p);
	/*↑TiXmlNode_vtbl↑*/
	/*↑TiXmlText_vtbl↑*/
};

TiXmlText* TiXmlText_new();
void TiXmlText_delete(TiXmlText* This);
void _TiXmlText_construct(TiXmlText* This);
/*virtual*/ void _TiXmlText_destruct(TiXmlText* This);
/*public:*/
/*virtual*/ TiXmlNode* _TiXmlText_Clone(TiXmlText* This);
/*virtual*/ void _TiXmlText_Print(TiXmlText* This, FILE* fp, int depth);
/*protected:*/
/*virtual*/ const char* _TiXmlText_Parse(TiXmlText* This, const char* p);

/****************************************************************************
 *	TiXmlDeclaration
 ****************************************************************************/

/* 宣言ノードを表します。
 */
struct _TiXmlDeclaration /*:TiXmlNode*/ {
	const TiXmlDeclaration_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* value;		/* (使いません) */
	TiXmlNode* firstChild;		/* 先頭の子ノード。空ならばNULL */
	TiXmlNode* lastChild;		/* 末尾の子ノード。空ならばNULL */
	TiXmlNode* prev;		/* 前の兄弟ノード。先頭ならばNULL */
	TiXmlNode* next;		/* 次の兄弟ノード。末尾ならばNULL */
	/*↑TiXmlNode↑*/
	StdString* version;		/* バージョン(必須) */
	StdString* encoding;		/* エンコーディング(任意) */
	StdString* standalone;	/* スタンドアローン(任意) */
	/*↑TiXmlDeclaration↑*/
};

struct _TiXmlDeclaration_vtbl /*:TiXmlNode_vtbl*/ {
	void (*destruct)(TiXmlDeclaration* This);
	void (*Print)(TiXmlDeclaration* This, FILE* fp, int depth);
	/*↑TiXmlBase_vtbl↑*/
	TiXmlNode* (*Clone)(TiXmlDeclaration* This);
	const char* (*Parse)(TiXmlDeclaration* This, const char* p);
	/*↑TiXmlNode_vtbl↑*/
	/*↑TiXmlDeclaration_vtbl↑*/
};

TiXmlDeclaration* TiXmlDeclaration_new(const char* version/*=NULL*/, const char* encoding/*=NULL*/, const char* standalone/*=NULL*/);
void TiXmlDeclaration_delete(TiXmlDeclaration* This);
void _TiXmlDeclaration_construct(TiXmlDeclaration* This, const char* version/*=NULL*/, const char* encoding/*=NULL*/, const char* standalone/*=NULL*/);
/*virtual*/ void _TiXmlDeclaration_destruct(TiXmlDeclaration* This);
/*public:*/
const char* TiXmlDeclaration_Version(TiXmlDeclaration* This);
const char* TiXmlDeclaration_Encoding(TiXmlDeclaration* This);
const char* TiXmlDeclaration_Standalone(TiXmlDeclaration* This);
/*virtual*/ TiXmlNode* _TiXmlDeclaration_Clone(TiXmlDeclaration* This);
/*virtual*/ void _TiXmlDeclaration_Print(TiXmlDeclaration* This, FILE* fp, int depth);
/*protected:*/
/*virtual*/ const char* _TiXmlDeclaration_Parse(TiXmlDeclaration* This, const char* p);

/****************************************************************************
 *	TiXmlUnknown
 ****************************************************************************/

/* 不明なXMLノードを表します。
 * - たとえば「<!DOCTYPE〜>」などを、このクラスのオブジェクトとして扱います。
 */
struct _TiXmlUnknown /*:TiXmlNode*/ {
	const TiXmlUnknown_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* value;		/* 任意の内容 */
	TiXmlNode* firstChild;		/* 先頭の子ノード。空ならばNULL */
	TiXmlNode* lastChild;		/* 末尾の子ノード。空ならばNULL */
	TiXmlNode* prev;		/* 前の兄弟ノード。先頭ならばNULL */
	TiXmlNode* next;		/* 次の兄弟ノード。末尾ならばNULL */
	/*↑TiXmlNode↑*/
	/*↑TiXmlUnknown↑*/
};

struct _TiXmlUnknown_vtbl /*:TiXmlNode_vtbl*/ {
	void (*destruct)(TiXmlUnknown* This);
	void (*Print)(TiXmlUnknown* This, FILE* fp, int depth);
	/*↑TiXmlBase_vtbl↑*/
	TiXmlNode* (*Clone)(TiXmlUnknown* This);
	const char* (*Parse)(TiXmlUnknown* This, const char* p);
	/*↑TiXmlNode_vtbl↑*/
	/*↑TiXmlUnknown_vtbl↑*/
};

TiXmlUnknown* TiXmlUnknown_new();
void TiXmlUnknown_delete(TiXmlUnknown* This);
void _TiXmlUnknown_construct(TiXmlUnknown* This);
/*virtual*/ void _TiXmlUnknown_destruct(TiXmlUnknown* This);
/*public:*/
/*virtual*/ TiXmlNode* _TiXmlUnknown_Clone(TiXmlUnknown* This);
/*virtual*/ void _TiXmlUnknown_Print(TiXmlUnknown* This, FILE* fp, int depth);
/*protected:*/
/*virtual*/ const char* _TiXmlUnknown_Parse(TiXmlUnknown* This, const char* p);

/****************************************************************************
 *	TiXmlDocument
 ****************************************************************************/

/* XMLドキュメントを表します。
 */
struct _TiXmlDocument /*:TiXmlNode*/ {
	const TiXmlDocument_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* value;		/* ファイル名 */
	TiXmlNode* firstChild;		/* 先頭の子ノード。空ならばNULL */
	TiXmlNode* lastChild;		/* 末尾の子ノード。空ならばNULL */
	TiXmlNode* prev;		/* 前の兄弟ノード。先頭ならばNULL */
	TiXmlNode* next;		/* 次の兄弟ノード。末尾ならばNULL */
	/*↑TiXmlNode↑*/
	/*↑TiXmlDocument↑*/
};

struct _TiXmlDocument_vtbl /*:TiXmlNode_vtbl*/ {
	void (*destruct)(TiXmlDocument* This);
	void (*Print)(TiXmlDocument* This, FILE* fp, int depth);
	/*↑TiXmlBase_vtbl↑*/
	TiXmlNode* (*Clone)(TiXmlDocument* This);
	const char* (*Parse)(TiXmlDocument* This, const char* p);
	/*↑TiXmlNode_vtbl↑*/
	/*↑TiXmlDocument_vtbl↑*/
};

TiXmlDocument* TiXmlDocument_new(const char* documentName/*=NULL*/);
void TiXmlDocument_delete(TiXmlDocument* This);
void _TiXmlDocument_construct(TiXmlDocument* This, const char* documentName/*=NULL*/);
/*virtual*/ void _TiXmlDocument_destruct(TiXmlDocument* This);
/*public:*/
void TiXmlDocument_LoadFile(TiXmlDocument* This, const char* filename/*=NULL*/);
void TiXmlDocument_SaveFile(TiXmlDocument* This, const char* filename/*=NULL*/);
/*virtual*/ void _TiXmlDocument_Print(TiXmlDocument* This, FILE* fp, int depth);
/*virtual*/ TiXmlNode* _TiXmlDocument_Clone(TiXmlDocument* This);
/*virtual*/ const char* _TiXmlDocument_Parse(TiXmlDocument* This, const char* p);

/****************************************************************************
 *	TiXmlAttribute
 ****************************************************************************/

/* 属性を表します。
 */
struct _TiXmlAttribute /*:TiXmlBase*/ {
	const TiXmlAttribute_vtbl* vptr;
	/*↑TiXmlBase↑*/
	StdString* name;		/* 属性名 */
	StdString* value;		/* 属性値 */
	TiXmlAttribute* prev;		/* 前の属性。先頭ならばTiXmlAttributeSet.sentinelにリンク */
	TiXmlAttribute* next;		/* 次の属性。末尾ならばTiXmlAttributeSet.sentinelにリンク */
	/*↑TiXmlAttribute↑*/
};

struct _TiXmlAttribute_vtbl /*:TiXmlBase_vtbl*/ {
	void (*destruct)(TiXmlAttribute* This);
	void (*Print)(TiXmlAttribute* This, FILE* fp, int depth);
	/*↑TiXmlBase_vtbl↑*/
	/*↑TiXmlAttribute_vtbl↑*/
};

TiXmlAttribute* TiXmlAttribute_new(const char* name/*=NULL*/, const char* value/*=NULL*/);
void TiXmlAttribute_delete(TiXmlAttribute* This);
void _TiXmlAttribute_construct(TiXmlAttribute* This, const char* name/*=NULL*/, const char* value/*=NULL*/);
/*virtual*/ void _TiXmlAttribute_destruct(TiXmlAttribute* This);
/*public:*/
const char* TiXmlAttribute_Name(TiXmlAttribute* This);
const char* TiXmlAttribute_Value(TiXmlAttribute* This);
void TiXmlAttribute_SetName(TiXmlAttribute* This, const char* name);
void TiXmlAttribute_SetValue(TiXmlAttribute* This, const char* value);
TiXmlAttribute* TiXmlAttribute_Next(TiXmlAttribute* This);
TiXmlAttribute* TiXmlAttribute_Previous(TiXmlAttribute* This);
/*virtual*/ void _TiXmlAttribute_Print(TiXmlAttribute* This, FILE* fp, int depth);
const char* TiXmlAttribute_Parse(TiXmlAttribute* This, const char* p);

/****************************************************************************
 *	TiXmlAttributeSet
 ****************************************************************************/

/* 属性のセットを保持します。
 */
struct _TiXmlAttributeSet {
	TiXmlAttribute* sentinel;	/* 属性のリストヘッダの役割。空ならばsentinel自身にリンク */
	/*↑TiXmlAttributeSet↑*/
};

TiXmlAttributeSet* TiXmlAttributeSet_new();
void TiXmlAttributeSet_delete(TiXmlAttributeSet* This);
void _TiXmlAttributeSet_construct(TiXmlAttributeSet* This);
void _TiXmlAttributeSet_destruct(TiXmlAttributeSet* This);
/*public:*/
void TiXmlAttributeSet_Add(TiXmlAttributeSet* This, TiXmlAttribute* addThis);
void TiXmlAttributeSet_Remove(TiXmlAttributeSet* This, TiXmlAttribute* removeThis);
TiXmlAttribute* TiXmlAttributeSet_First(TiXmlAttributeSet* This);
TiXmlAttribute* TiXmlAttributeSet_Last(TiXmlAttributeSet* This);
TiXmlAttribute* TiXmlAttributeSet_Find(TiXmlAttributeSet* This, const char* name);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__TIXML_H__*/
