element and attribute code compiling
diff --git a/tinyxml2.h b/tinyxml2.h
index 23f21a5..fcf3afd 100644
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -30,6 +30,10 @@
namespace tinyxml2
{
class XMLDocument;
+class XMLElement;
+class XMLAttribute;
+class XMLComment;
+class XMLNode;
// internal - move to separate namespace
struct CharBuffer
@@ -42,19 +46,13 @@
};
-class XMLNode
+class XMLBase
{
- friend class XMLDocument;
public:
-
- XMLNode* InsertEndChild( XMLNode* addThis );
- virtual void Print( FILE* cfile, int depth );
+ XMLBase() {}
+ virtual ~XMLBase() {}
protected:
- XMLNode( XMLDocument* );
- virtual ~XMLNode();
-
- // Utility
static const char* SkipWhiteSpace( const char* p ) { while( isspace( *p ) ) { ++p; } return p; }
static char* SkipWhiteSpace( char* p ) { while( isspace( *p ) ) { ++p; } return p; }
@@ -68,18 +66,33 @@
}
return false;
}
- inline static int IsUTF8Continuation( char p ) { return p & 0x80; }
+ inline static int IsUTF8Continuation( unsigned char p ) { return p & 0x80; }
+ inline static int IsAlphaNum( unsigned char anyByte ) { return ( anyByte <= 127 ) ? isalnum( anyByte ) : 1; }
+ inline static int IsAlpha( unsigned char anyByte ) { return ( anyByte <= 127 ) ? isalpha( anyByte ) : 1; }
- /* Parses text. (Not a text node.)
- - [ ] EOL normalization.
- - [X] Do not trim leading whitespace
- - [X] Do not trim trailing whitespace.
- - [X] Leaves inner whitespace
- */
const char* ParseText( char* in, const char* endTag, char** next );
+ const char* ParseName( char* in, char** next );
+ char* Identify( XMLDocument* document, char* p, XMLNode** node );
+};
+
+
+class XMLNode : public XMLBase
+{
+ friend class XMLDocument;
+ friend class XMLElement;
+public:
+ virtual ~XMLNode();
+
+ XMLNode* InsertEndChild( XMLNode* addThis );
+ virtual void Print( FILE* cfile, int depth );
+
+ virtual XMLElement* ToElement() { return 0; }
virtual char* ParseDeep( char* ) { TIXMLASSERT( 0 ); }
+protected:
+ XMLNode( XMLDocument* );
+
XMLDocument* document;
XMLNode* parent;
@@ -103,15 +116,56 @@
virtual void Print( FILE* cfile, int depth );
-protected:
+ const char* Value() const { return value; }
+
char* ParseDeep( char* );
+protected:
+
private:
const char* value;
};
-class XMLDocument
+class XMLAttribute : public XMLBase
+{
+ friend class XMLElement;
+public:
+ XMLAttribute( XMLElement* element ) : value( 0 ), next( 0 ) {}
+ virtual ~XMLAttribute() {}
+
+private:
+ char* ParseDeep( char* p );
+
+ const char* value;
+ XMLAttribute* next;
+};
+
+
+class XMLElement : public XMLNode
+{
+public:
+ XMLElement( XMLDocument* doc );
+ virtual ~XMLElement();
+
+ const char* Name() const { return name; }
+
+ virtual XMLElement* ToElement() { return this; }
+ bool Closing() const { return closing; }
+
+ char* ParseDeep( char* p );
+
+protected:
+
+private:
+ const char* name;
+ bool closing;
+ XMLAttribute* rootAttribute;
+ XMLAttribute* lastAttribute;
+};
+
+
+class XMLDocument : public XMLBase
{
public:
XMLDocument();
@@ -123,9 +177,15 @@
XMLNode* Root() { return root; }
XMLNode* RootElement();
+ enum {
+ ERROR_ELEMENT_MISMATCH,
+ ERROR_PARSING_ELEMENT,
+ ERROR_PARSING_ATTRIBUTE
+ };
+ void SetError( int error, const char* str1, const char* str2 ) {}
+
private:
XMLDocument( const XMLDocument& ); // intentionally not implemented
- char* Identify( char* p, XMLNode** node );
XMLNode* root;
CharBuffer* charBuffer;