get rid of ugly pointer typedefs

This commit is contained in:
Glenn Maynard
2004-07-23 02:27:37 +00:00
parent 6dc160f9de
commit d0e67f9ffb
2 changed files with 99 additions and 107 deletions
+57 -58
View File
@@ -26,7 +26,7 @@ static const XENTITY x_EntityTable[] = {
PARSEINFO piDefault;
DISP_OPT optDefault;
XENTITYS entityDefault((LPXENTITY)x_EntityTable, sizeof(x_EntityTable)/sizeof(x_EntityTable[0]) );
XENTITYS entityDefault((XENTITY*)x_EntityTable, sizeof(x_EntityTable)/sizeof(x_EntityTable[0]) );
// skip spaces
char* tcsskip( const char* psz )
@@ -158,7 +158,7 @@ void XNode::Close()
for( i = 0 ; i < childs.size(); i ++)
{
LPXNode p = childs[i];
XNode *p = childs[i];
if( p )
{
delete p; childs[i] = NULL;
@@ -168,7 +168,7 @@ void XNode::Close()
for( i = 0 ; i < attrs.size(); i ++)
{
LPXAttr p = attrs[i];
XAttr *p = attrs[i];
if( p )
{
delete p; attrs[i] = NULL;
@@ -189,7 +189,7 @@ void XNode::Close()
// Coder Date Desc
// bro 2002-10-29
//========================================================
char* XNode::LoadAttributes( const char* pszAttrs , LPPARSEINFO pi /*= &piDefault*/)
char* XNode::LoadAttributes( const char* pszAttrs , PARSEINFO *pi /*= &piDefault*/)
{
char* xml = (char*)pszAttrs;
@@ -219,7 +219,7 @@ char* XNode::LoadAttributes( const char* pszAttrs , LPPARSEINFO pi /*= &piDefaul
return NULL;
}
LPXAttr attr = new XAttr;
XAttr *attr = new XAttr;
attr->parent = this;
// XML Attr Name
@@ -286,7 +286,7 @@ char* XNode::LoadAttributes( const char* pszAttrs , LPPARSEINFO pi /*= &piDefaul
// Coder Date Desc
// bro 2002-10-29
//========================================================
char* XNode::Load( const char* pszXml, LPPARSEINFO pi /*= &piDefault*/ )
char* XNode::Load( const char* pszXml, PARSEINFO *pi /*= &piDefault*/ )
{
// Close it
Close();
@@ -379,7 +379,7 @@ char* XNode::Load( const char* pszXml, LPPARSEINFO pi /*= &piDefault*/ )
// generate child nodes
while( xml && *xml )
{
LPXNode node = new XNode;
XNode *node = new XNode;
node->parent = this;
xml = node->Load( xml,pi );
@@ -489,7 +489,7 @@ char* XNode::Load( const char* pszXml, LPPARSEINFO pi /*= &piDefault*/ )
// Coder Date Desc
// bro 2002-10-29
//========================================================
bool XAttr::GetXML( RageFile &f, LPDISP_OPT opt /*= &optDefault*/ )
bool XAttr::GetXML( RageFile &f, DISP_OPT *opt /*= &optDefault*/ )
{
return f.Write(name + "='" + (opt->reference_value&&opt->entitys?opt->entitys->Entity2Ref(value):value) + "' ") != -1;
}
@@ -503,9 +503,8 @@ bool XAttr::GetXML( RageFile &f, LPDISP_OPT opt /*= &optDefault*/ )
// Coder Date Desc
// bro 2002-10-29
//========================================================
bool XNode::GetXML( RageFile &f, LPDISP_OPT opt /*= &optDefault*/ )
bool XNode::GetXML( RageFile &f, DISP_OPT *opt /*= &optDefault*/ )
{
// tab
if( opt && opt->newline )
{
@@ -632,11 +631,11 @@ void XNode::SetValue(const DateTime &v) { value = v.GetString(); }
// Coder Date Desc
// bro 2002-10-29
//========================================================
const LPXAttr XNode::GetAttr( const char* attrname ) const
const XAttr *XNode::GetAttr( const char* attrname ) const
{
for( unsigned i = 0 ; i < attrs.size(); i++ )
{
LPXAttr attr = attrs[i];
XAttr *attr = attrs[i];
if( attr )
{
if( attr->name == attrname )
@@ -646,11 +645,11 @@ const LPXAttr XNode::GetAttr( const char* attrname ) const
return NULL;
}
LPXAttr XNode::GetAttr( const char* attrname )
XAttr *XNode::GetAttr( const char* attrname )
{
for( unsigned i = 0 ; i < attrs.size(); i++ )
{
LPXAttr attr = attrs[i];
XAttr *attr = attrs[i];
if( attr )
{
if( attr->name == attrname )
@@ -674,7 +673,7 @@ XAttrs XNode::GetAttrs( const char* name )
XAttrs attrs;
for( unsigned i = 0 ; i < attrs.size(); i++ )
{
LPXAttr attr = attrs[i];
XAttr *attr = attrs[i];
if( attr )
{
if( attr->name == name )
@@ -695,7 +694,7 @@ XAttrs XNode::GetAttrs( const char* name )
//========================================================
const char* XNode::GetAttrValue( const char* attrname )
{
LPXAttr attr = GetAttr( attrname );
XAttr *attr = GetAttr( attrname );
return attr ? (const char*)attr->value : NULL;
}
@@ -718,7 +717,7 @@ XNodes XNode::GetChilds( const char* name )
XNodes nodes;
for( unsigned i = 0 ; i < childs.size(); i++ )
{
LPXNode node = childs[i];
XNode *node = childs[i];
if( node )
{
if( node->name == name )
@@ -737,7 +736,7 @@ XNodes XNode::GetChilds( const char* name )
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode XNode::GetChild( int i )
XNode *XNode::GetChild( int i )
{
if( i >= 0 && i < (int)childs.size() )
return childs[i];
@@ -767,11 +766,11 @@ int XNode::GetChildCount()
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode XNode::GetChild( const char* name )
XNode *XNode::GetChild( const char* name )
{
for( unsigned i = 0 ; i < childs.size(); i++ )
{
LPXNode node = childs[i];
XNode *node = childs[i];
if( node )
{
if( node->name == name )
@@ -781,11 +780,11 @@ LPXNode XNode::GetChild( const char* name )
return NULL;
}
const LPXNode XNode::GetChild( const char* name ) const
const XNode *XNode::GetChild( const char* name ) const
{
for( unsigned i = 0 ; i < childs.size(); i++ )
{
LPXNode node = childs[i];
XNode *node = childs[i];
if( node )
{
if( node->name == name )
@@ -806,19 +805,19 @@ const LPXNode XNode::GetChild( const char* name ) const
//========================================================
const char* XNode::GetChildValue( const char* name )
{
LPXNode node = GetChild( name );
XNode *node = GetChild( name );
return (node != NULL)? (const char*)node->value : NULL;
}
LPXAttr XNode::GetChildAttr( const char* name, const char* attrname )
XAttr *XNode::GetChildAttr( const char* name, const char* attrname )
{
LPXNode node = GetChild(name);
XNode *node = GetChild(name);
return node ? node->GetAttr(attrname) : NULL;
}
const char* XNode::GetChildAttrValue( const char* name, const char* attrname )
{
LPXAttr attr = GetChildAttr( name, attrname );
XAttr *attr = GetChildAttr( name, attrname );
return attr ? (const char*)attr->value : NULL;
}
@@ -832,7 +831,7 @@ const char* XNode::GetChildAttrValue( const char* name, const char* attrname )
// Coder Date Desc
// bro 2002-10-29
//========================================================
XNodes::iterator XNode::GetChildIterator( LPXNode node )
XNodes::iterator XNode::GetChildIterator( XNode *node )
{
XNodes::iterator it = childs.begin();
for( ; it != childs.end() ; ++(it) )
@@ -852,11 +851,11 @@ XNodes::iterator XNode::GetChildIterator( LPXNode node )
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode XNode::AppendChild( const char* name, const char* value ) { XNode *p = new XNode; p->name = name; p->value = value; return AppendChild( p ); }
LPXNode XNode::AppendChild( const char* name, float value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
LPXNode XNode::AppendChild( const char* name, int value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
LPXNode XNode::AppendChild( const char* name, unsigned value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
LPXNode XNode::AppendChild( const char* name, const DateTime &value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
XNode *XNode::AppendChild( const char* name, const char* value ) { XNode *p = new XNode; p->name = name; p->value = value; return AppendChild( p ); }
XNode *XNode::AppendChild( const char* name, float value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
XNode *XNode::AppendChild( const char* name, int value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
XNode *XNode::AppendChild( const char* name, unsigned value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
XNode *XNode::AppendChild( const char* name, const DateTime &value ) { XNode *p = new XNode; p->name = name; p->SetValue( value ); return AppendChild( p ); }
//========================================================
// Name : AppendChild
@@ -867,7 +866,7 @@ LPXNode XNode::AppendChild( const char* name, const DateTime &value ) { XNode *p
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode XNode::AppendChild( LPXNode node )
XNode *XNode::AppendChild( XNode *node )
{
node->parent = this;
childs.push_back( node );
@@ -883,7 +882,7 @@ LPXNode XNode::AppendChild( LPXNode node )
// Coder Date Desc
// bro 2002-10-29
//========================================================
bool XNode::RemoveChild( LPXNode node )
bool XNode::RemoveChild( XNode *node )
{
XNodes::iterator it = GetChildIterator( node );
if( it != childs.end() )
@@ -904,7 +903,7 @@ bool XNode::RemoveChild( LPXNode node )
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr XNode::GetAttr( int i )
XAttr *XNode::GetAttr( int i )
{
if( i >= 0 && i < (int)attrs.size() )
return attrs[i];
@@ -915,12 +914,12 @@ LPXAttr XNode::GetAttr( int i )
// Name : GetAttrIterator
// Desc : get attribute iterator
// Param :
// Return : std::vector<LPXAttr>::iterator
// Return : std::vector<XAttr*>::iterator
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
XAttrs::iterator XNode::GetAttrIterator( LPXAttr attr )
XAttrs::iterator XNode::GetAttrIterator( XAttr *attr )
{
XAttrs::iterator it = attrs.begin();
for( ; it != attrs.end() ; ++(it) )
@@ -940,7 +939,7 @@ XAttrs::iterator XNode::GetAttrIterator( LPXAttr attr )
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr XNode::AppendAttr( LPXAttr attr )
XAttr *XNode::AppendAttr( XAttr *attr )
{
attr->parent = this;
attrs.push_back( attr );
@@ -956,7 +955,7 @@ LPXAttr XNode::AppendAttr( LPXAttr attr )
// Coder Date Desc
// bro 2002-10-29
//========================================================
bool XNode::RemoveAttr( LPXAttr attr )
bool XNode::RemoveAttr( XAttr *attr )
{
XAttrs::iterator it = GetAttrIterator( attr );
if( it != attrs.end() )
@@ -977,9 +976,9 @@ bool XNode::RemoveAttr( LPXAttr attr )
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode XNode::CreateNode( const char* name /*= NULL*/, const char* value /*= NULL*/ )
XNode *XNode::CreateNode( const char* name /*= NULL*/, const char* value /*= NULL*/ )
{
LPXNode node = new XNode;
XNode *node = new XNode;
node->name = name;
node->value = value;
return node;
@@ -994,9 +993,9 @@ LPXNode XNode::CreateNode( const char* name /*= NULL*/, const char* value /*= NU
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr XNode::CreateAttr( const char* name /*= NULL*/, const char* value /*= NULL*/ )
XAttr *XNode::CreateAttr( const char* name /*= NULL*/, const char* value /*= NULL*/ )
{
LPXAttr attr = new XAttr;
XAttr *attr = new XAttr;
attr->name = name;
attr->value = value;
return attr;
@@ -1011,14 +1010,14 @@ LPXAttr XNode::CreateAttr( const char* name /*= NULL*/, const char* value /*= NU
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr XNode::AppendAttr( const char* name /*= NULL*/, const char* value /*= NULL*/ )
XAttr *XNode::AppendAttr( const char* name /*= NULL*/, const char* value /*= NULL*/ )
{
return AppendAttr( CreateAttr( name, value ) );
}
LPXAttr XNode::AppendAttr( const char* name, float value ){ return AppendAttr(name,ssprintf("%f",value)); }
LPXAttr XNode::AppendAttr( const char* name, int value ) { return AppendAttr(name,ssprintf("%d",value)); }
LPXAttr XNode::AppendAttr( const char* name, unsigned value ) { return AppendAttr(name,ssprintf("%u",value)); }
XAttr *XNode::AppendAttr( const char* name, float value ){ return AppendAttr(name,ssprintf("%f",value)); }
XAttr *XNode::AppendAttr( const char* name, int value ) { return AppendAttr(name,ssprintf("%d",value)); }
XAttr *XNode::AppendAttr( const char* name, unsigned value ) { return AppendAttr(name,ssprintf("%u",value)); }
//========================================================
// Name : DetachChild
@@ -1029,7 +1028,7 @@ LPXAttr XNode::AppendAttr( const char* name, unsigned value ) { return AppendAtt
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode XNode::DetachChild( LPXNode node )
XNode *XNode::DetachChild( XNode *node )
{
XNodes::iterator it = GetChildIterator( node );
if( it != childs.end() )
@@ -1049,7 +1048,7 @@ LPXNode XNode::DetachChild( LPXNode node )
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr XNode::DetachAttr( LPXAttr attr )
XAttr *XNode::DetachAttr( XAttr *attr )
{
XAttrs::iterator it = GetAttrIterator( attr );
if( it != attrs.end() )
@@ -1060,23 +1059,23 @@ LPXAttr XNode::DetachAttr( LPXAttr attr )
return NULL;
}
XENTITYS::XENTITYS( LPXENTITY entities, int count )
XENTITYS::XENTITYS( XENTITY *entities, int count )
{
for( int i = 0; i < count; i++)
push_back( entities[i] );
}
LPXENTITY XENTITYS::GetEntity( int entity )
XENTITY *XENTITYS::GetEntity( int entity )
{
for( unsigned i = 0 ; i < size(); i ++ )
{
if( at(i).entity == entity )
return LPXENTITY(&at(i));
return (XENTITY *) (&at(i));
}
return NULL;
}
LPXENTITY XENTITYS::GetEntity( char* entity )
XENTITY *XENTITYS::GetEntity( char* entity )
{
for( unsigned i = 0 ; i < size(); i ++ )
{
@@ -1086,7 +1085,7 @@ LPXENTITY XENTITYS::GetEntity( char* entity )
if( *ref++ != *ps++ )
break;
if( ref && !*ref ) // found!
return LPXENTITY(&at(i));
return (XENTITY *) (&at(i));
}
return NULL;
}
@@ -1107,7 +1106,7 @@ int XENTITYS::Ref2Entity( const char* estr, char* str, int strlen )
char* ps_end = ps+strlen;
while( pes && *pes && ps < ps_end )
{
LPXENTITY ent = GetEntity( pes );
XENTITY *ent = GetEntity( pes );
if( ent )
{
// copy entity meanning char
@@ -1131,7 +1130,7 @@ int XENTITYS::Entity2Ref( const char* str, char* estr, int estrlen )
char* pes_end = pes+estrlen;
while( ps && *ps && pes < pes_end )
{
LPXENTITY ent = GetEntity( *ps );
XENTITY *ent = GetEntity( *ps );
if( ent )
{
// copy entity string
@@ -1194,7 +1193,7 @@ CString XEntity2Ref( const char* str )
return entityDefault.Entity2Ref( str );
}
bool XNode::LoadFromFile( CString sFile, LPPARSEINFO pi )
bool XNode::LoadFromFile( CString sFile, PARSEINFO *pi )
{
RageFile f;
if( !f.Open(sFile, RageFile::READ) )
@@ -1219,7 +1218,7 @@ bool XNode::LoadFromFile( CString sFile, LPPARSEINFO pi )
return true;
}
bool XNode::SaveToFile( CString sFile, LPDISP_OPT opt )
bool XNode::SaveToFile( CString sFile, DISP_OPT *opt )
{
RageFile f;
if( !f.Open(sFile, RageFile::WRITE) )
+42 -49
View File
@@ -24,11 +24,9 @@ struct DateTime;
class RageFile;
struct XAttr;
typedef XAttr* LPXAttr;
typedef std::vector<LPXAttr> XAttrs;
typedef std::vector<XAttr*> XAttrs;
struct XNode;
typedef XNode* LPXNode;
typedef std::vector<LPXNode> XNodes, *LPXNodes;
typedef std::vector<XNode*> XNodes;
// Entity Encode/Decode Support
struct XENTITY
@@ -37,12 +35,11 @@ struct XENTITY
TCHAR ref[10]; // entity reference ( &amp; &quot; etc )
int ref_len; // entity reference length
};
typedef XENTITY* LPXENTITY;
struct XENTITYS : public std::vector<XENTITY>
{
LPXENTITY GetEntity( int entity );
LPXENTITY GetEntity( char* entity );
XENTITY *GetEntity( int entity );
XENTITY *GetEntity( char* entity );
int GetEntityCount( const char* str );
int Ref2Entity( const char* estr, char* str, int strlen );
int Entity2Ref( const char* str, char* estr, int estrlen );
@@ -50,9 +47,8 @@ struct XENTITYS : public std::vector<XENTITY>
CString Entity2Ref( const char* str );
XENTITYS(){};
XENTITYS( LPXENTITY entities, int count );
XENTITYS( XENTITY *entities, int count );
};
typedef XENTITYS* LPXENTITYS;
extern XENTITYS entityDefault;
CString XRef2Entity( const char* estr );
CString XEntity2Ref( const char* str );
@@ -72,7 +68,7 @@ struct PARSEINFO
{
bool trim_value; // [set] do trim when parse?
bool entity_value; // [set] do convert from reference to entity? ( &lt; -> < )
LPXENTITYS entitys; // [set] entity table for entity decode
XENTITYS *entitys; // [set] entity table for entity decode
TCHAR escape_value; // [set] escape value (default '\\')
char* xml; // [get] xml source
@@ -83,7 +79,6 @@ struct PARSEINFO
PARSEINFO() { trim_value = true; entity_value = true; entitys = &entityDefault; xml = NULL; erorr_occur = false; error_pointer = NULL; error_code = PIE_PARSE_WELFORMED; escape_value = 0; }
};
typedef PARSEINFO* LPPARSEINFO;
extern PARSEINFO piDefault;
// display optional environment
@@ -91,13 +86,12 @@ struct DISP_OPT
{
bool newline; // newline when new tag
bool reference_value; // do convert from entity to reference ( < -> &lt; )
LPXENTITYS entitys; // entity table for entity encode
XENTITYS *entitys; // entity table for entity encode
CString stylesheet; // empty string = none
int tab_base; // internal usage
DISP_OPT() { newline = true; reference_value = true; entitys = &entityDefault; tab_base = 0; }
};
typedef DISP_OPT* LPDISP_OPT;
extern DISP_OPT optDefault;
// XAttr : Attribute Implementation
@@ -114,9 +108,8 @@ struct XAttr
XNode* parent;
bool GetXML( RageFile &f, LPDISP_OPT opt = &optDefault );
bool GetXML( RageFile &f, DISP_OPT *opt = &optDefault );
};
typedef XAttr* LPXAttr;
// XMLNode structure
struct XNode
@@ -137,21 +130,21 @@ struct XNode
void SetValue(const DateTime &v);
// internal variables
LPXNode parent; // parent node
XNode *parent; // parent node
XNodes childs; // child node
XAttrs attrs; // attributes
// Load/Save XML
char* Load( const char* pszXml, LPPARSEINFO pi = &piDefault );
char* LoadAttributes( const char* pszAttrs, LPPARSEINFO pi = &piDefault );
bool GetXML( RageFile &f, LPDISP_OPT opt = &optDefault );
char* Load( const char* pszXml, PARSEINFO *pi = &piDefault );
char* LoadAttributes( const char* pszAttrs, PARSEINFO *pi = &piDefault );
bool GetXML( RageFile &f, DISP_OPT *opt = &optDefault );
bool LoadFromFile( CString sFile, LPPARSEINFO pi = &piDefault );
bool SaveToFile( CString sFile, LPDISP_OPT opt = &optDefault );
bool LoadFromFile( CString sFile, PARSEINFO *pi = &piDefault );
bool SaveToFile( CString sFile, DISP_OPT *opt = &optDefault );
// in own attribute list
const LPXAttr GetAttr( const char* attrname ) const;
LPXAttr GetAttr( const char* attrname );
const XAttr *GetAttr( const char* attrname ) const;
XAttr *GetAttr( const char* attrname );
const char* GetAttrValue( const char* attrname );
bool GetAttrValue(const char* name,CString &out) const { const XAttr* pAttr=GetAttr(name); if(pAttr==NULL) return false; pAttr->GetValue(out); return true; }
bool GetAttrValue(const char* name,int &out) const { const XAttr* pAttr=GetAttr(name); if(pAttr==NULL) return false; pAttr->GetValue(out); return true; }
@@ -162,8 +155,8 @@ struct XNode
XAttrs GetAttrs( const char* name );
// in one level child nodes
const LPXNode GetChild( const char* name ) const;
LPXNode GetChild( const char* name );
const XNode *GetChild( const char* name ) const;
XNode *GetChild( const char* name );
const char* GetChildValue( const char* name );
bool GetChildValue(const char* name,CString &out) const { const XNode* pChild=GetChild(name); if(pChild==NULL) return false; pChild->GetValue(out); return true; }
bool GetChildValue(const char* name,int &out) const { const XNode* pChild=GetChild(name); if(pChild==NULL) return false; pChild->GetValue(out); return true; }
@@ -174,38 +167,38 @@ struct XNode
XNodes GetChilds( const char* name );
XNodes GetChilds();
LPXAttr GetChildAttr( const char* name, const char* attrname );
XAttr *GetChildAttr( const char* name, const char* attrname );
const char* GetChildAttrValue( const char* name, const char* attrname );
// modify DOM
int GetChildCount();
LPXNode GetChild( int i );
XNodes::iterator GetChildIterator( LPXNode node );
LPXNode CreateNode( const char* name = NULL, const char* value = NULL );
LPXNode AppendChild( const char* name = NULL, const char* value = NULL );
LPXNode AppendChild( const char* name, float value );
LPXNode AppendChild( const char* name, int value );
LPXNode AppendChild( const char* name, unsigned value );
LPXNode AppendChild( const char* name, const DateTime &value );
LPXNode AppendChild( LPXNode node );
bool RemoveChild( LPXNode node );
LPXNode DetachChild( LPXNode node );
XNode *GetChild( int i );
XNodes::iterator GetChildIterator( XNode *node );
XNode *CreateNode( const char* name = NULL, const char* value = NULL );
XNode *AppendChild( const char* name = NULL, const char* value = NULL );
XNode *AppendChild( const char* name, float value );
XNode *AppendChild( const char* name, int value );
XNode *AppendChild( const char* name, unsigned value );
XNode *AppendChild( const char* name, const DateTime &value );
XNode *AppendChild( XNode *node );
bool RemoveChild( XNode *node );
XNode *DetachChild( XNode *node );
LPXAttr GetAttr( int i );
XAttrs::iterator GetAttrIterator( LPXAttr node );
LPXAttr CreateAttr( const char* anem = NULL, const char* value = NULL );
LPXAttr AppendAttr( const char* name = NULL, const char* value = NULL );
LPXAttr AppendAttr( const char* name, float value );
LPXAttr AppendAttr( const char* name, int value );
LPXAttr AppendAttr( const char* name, unsigned value );
LPXAttr AppendAttr( const char* name, const DateTime &value );
LPXAttr AppendAttr( LPXAttr attr );
bool RemoveAttr( LPXAttr attr );
LPXAttr DetachAttr( LPXAttr attr );
XAttr *GetAttr( int i );
XAttrs::iterator GetAttrIterator( XAttr *node );
XAttr *CreateAttr( const char* anem = NULL, const char* value = NULL );
XAttr *AppendAttr( const char* name = NULL, const char* value = NULL );
XAttr *AppendAttr( const char* name, float value );
XAttr *AppendAttr( const char* name, int value );
XAttr *AppendAttr( const char* name, unsigned value );
XAttr *AppendAttr( const char* name, const DateTime &value );
XAttr *AppendAttr( XAttr *attr );
bool RemoveAttr( XAttr *attr );
XAttr *DetachAttr( XAttr *attr );
// operator overloads
LPXNode operator [] ( int i ) { return GetChild(i); }
XNode* operator [] ( int i ) { return GetChild(i); }
XNode() { parent = NULL; }
~XNode();