each XMLElement now stores a pointer to it's parent node, so the tree
can be traversed from the bottom
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
2005-01-04 13:40:05 UTC (rev 12786)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
2005-01-04 14:02:04 UTC (rev 12787)
@@ -177,7 +177,8 @@
{
}
-void XMLFile::close()
+void
+XMLFile::close()
{
while ( _f.size() )
{
@@ -188,7 +189,8 @@
_p = _end = NULL;
}
-bool XMLFile::open(const string& filename)
+bool
+XMLFile::open(const string& filename)
{
close();
FILE* f = fopen ( filename.c_str(), "rb" );
@@ -208,24 +210,28 @@
// an xml element or a text element, basically it's a glorified
// skipspace, normally the user of this class won't need to call
// this function
-void XMLFile::next_token()
+void
+XMLFile::next_token()
{
_p += strspn ( _p, WS );
}
-bool XMLFile::next_is_text()
+bool
+XMLFile::next_is_text()
{
return *_p != '<';
}
-bool XMLFile::more_tokens()
+bool
+XMLFile::more_tokens()
{
return _p != _end;
}
// get_token() is used to return a token, and move the pointer
// past the token
-bool XMLFile::get_token(string& token)
+bool
+XMLFile::get_token(string& token)
{
const char* tokend;
if ( *_p == '<' )
@@ -258,11 +264,12 @@
XMLAttribute::XMLAttribute(const string& name_,
const string& value_)
-: name(name_), value(value_)
+ : name(name_), value(value_)
{
}
XMLElement::XMLElement()
+ : parentElement(NULL)
{
}
@@ -275,14 +282,22 @@
delete subElements[i];
}
+void
+XMLElement::AddSubElement ( XMLElement* e )
+{
+ subElements.push_back ( e );
+ e->parentElement = this;
+}
+
// Parse()
// This function takes a single xml tag ( i.e. beginning with '<' and
// ending with '>', and parses out it's tag name and constituent
// attributes.
// Return Value: returns true if you need to look for a </tag> for
// the one it just parsed...
-bool XMLElement::Parse(const string& token,
- bool& end_tag)
+bool
+XMLElement::Parse(const string& token,
+ bool& end_tag)
{
const char* p = token.c_str();
assert ( *p == '<' );
@@ -392,9 +407,10 @@
// Return Value: an XMLElement allocated via the new operator that
contains
// it's parsed data. Keep calling this function until it returns NULL
// (no more data)
-XMLElement* XMLParse(XMLFile& f,
- const Path& path,
- bool* pend_tag = NULL)
+XMLElement*
+XMLParse(XMLFile& f,
+ const Path& path,
+ bool* pend_tag = NULL)
{
string token;
if ( !f.get_token(token) )
@@ -424,7 +440,7 @@
XMLElement* e2 = XMLParse (
fInc, path2 );
if ( !e2 )
break;
- e->subElements.push_back ( e2 );
+ e->AddSubElement ( e2 );
}
}
}
@@ -471,7 +487,7 @@
delete e2;
break;
}
- e->subElements.push_back ( e2 );
+ e->AddSubElement ( e2 );
}
}
return e;
@@ -483,7 +499,8 @@
delete modules[i];
}
-void Project::ProcessXML ( const XMLElement& e, const string& path )
+void
+Project::ProcessXML ( const XMLElement& e, const string& path )
{
const XMLAttribute *att;
string subpath(path);
@@ -515,7 +532,8 @@
ProcessXML ( *e.subElements[i], subpath );
}
-int main ( int argc, char** argv )
+int
+main ( int argc, char** argv )
{
// store the current directory for path calculations
working_directory.resize ( _MAX_PATH );
@@ -525,12 +543,15 @@
XMLFile f;
Path path;
- if ( !f.open ( "ReactOS.xml" ) )
+ string xml_file ( "ReactOS.xml" );
+ if ( !f.open ( xml_file ) )
{
printf ( "couldn't open ReactOS.xml!\n" );
return -1;
}
+ vector<string> xml_dependencies;
+ xml_dependencies.push_back ( xml_file );
for ( ;; )
{
XMLElement* head = XMLParse ( f, path );
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
2005-01-04 13:40:05 UTC (rev 12786)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
2005-01-04 14:02:04 UTC (rev 12787)
@@ -55,6 +55,7 @@
public:
std::string name;
std::vector<XMLAttribute*> attributes;
+ XMLElement* parentElement;
std::vector<XMLElement*> subElements;
std::string value;
@@ -62,6 +63,7 @@
~XMLElement();
bool Parse(const std::string& token,
bool& end_tag);
+ void AddSubElement ( XMLElement* e );
XMLAttribute* GetAttribute ( const std::string& attribute,
bool required);
const XMLAttribute* GetAttribute ( const std::string& attribute,