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,