Move Directory class to its own file Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.h Added: trunk/reactos/tools/rbuild/directory.cpp Modified: trunk/reactos/tools/rbuild/rbuild.h Modified: trunk/reactos/tools/rbuild/rbuild.mak _____
Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp --- trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-11-22 21:32:11 UTC (rev 19468) +++ trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-11-22 21:58:50 UTC (rev 19469) @@ -19,20 +19,8 @@
#include "mingw.h" #include <assert.h> -#ifdef _MSC_VER -#define popen _popen -#define pclose _pclose -#else -#include <dirent.h> -#endif//_MSC_VER #include "modulehandler.h"
-#ifdef WIN32 -#define MKDIR(s) mkdir(s) -#else -#define MKDIR(s) mkdir(s, 0755) -#endif - using std::string; using std::vector; using std::set; @@ -62,180 +50,6 @@ }
-Directory::Directory ( const string& name_ ) - : name(name_) -{ -} - -void -Directory::Add ( const char* subdir ) -{ - size_t i; - string s1 = string ( subdir ); - if ( ( i = s1.find ( '$' ) ) != string::npos ) - { - throw InvalidOperationException ( __FILE__, - __LINE__, - "No environment variables can be used here. Path was %s", - subdir ); - } - - const char* p = strpbrk ( subdir, "/\" ); - if ( !p ) - p = subdir + strlen(subdir); - string s ( subdir, p-subdir ); - if ( subdirs.find(s) == subdirs.end() ) - subdirs[s] = new Directory(s); - if ( *p && *++p ) - subdirs[s]->Add ( p ); -} - -bool -Directory::mkdir_p ( const char* path ) -{ -#ifndef _MSC_VER - DIR *directory; - directory = opendir ( path ); - if ( directory != NULL ) - { - closedir ( directory ); - return false; - } -#endif//_MSC_VER - - if ( MKDIR ( path ) != 0 ) - { -#ifdef _MSC_VER - if ( errno == EEXIST ) - return false; -#endif//_MSC_VER - throw AccessDeniedException ( string ( path ) ); - } - return true; -} - -bool -Directory::CreateDirectory ( string path ) -{ - size_t index = 0; - size_t nextIndex; - if ( isalpha ( path[0] ) && path[1] == ':' && path[2] == cSep ) - { - nextIndex = path.find ( cSep, 3); - } - else - nextIndex = path.find ( cSep ); - - bool directoryWasCreated = false; - while ( nextIndex != string::npos ) - { - nextIndex = path.find ( cSep, index + 1 ); - directoryWasCreated = mkdir_p ( path.substr ( 0, nextIndex ).c_str () ); - index = nextIndex; - } - return directoryWasCreated; -} - -string -Directory::ReplaceVariable ( string name, - string value, - string path ) -{ - size_t i = path.find ( name ); - if ( i != string::npos ) - return path.replace ( i, name.length (), value ); - else - return path; -} - -void -Directory::ResolveVariablesInPath ( char* buf, - string path ) -{ - string s = ReplaceVariable ( "$(INTERMEDIATE)", Environment::GetIntermediatePath (), path ); - s = ReplaceVariable ( "$(OUTPUT)", Environment::GetOutputPath (), s ); - s = ReplaceVariable ( "$(INSTALL)", Environment::GetInstallPath (), s ); - strcpy ( buf, s.c_str () ); -} - -void -Directory::GenerateTree ( const string& parent, - bool verbose ) -{ - string path; - - if ( parent.size () > 0 ) - { - char buf[256]; - - path = parent + sSep + name; - ResolveVariablesInPath ( buf, path ); - if ( CreateDirectory ( buf ) && verbose ) - printf ( "Created %s\n", buf ); - } - else - path = name; - - for ( directory_map::iterator i = subdirs.begin (); - i != subdirs.end (); - ++i ) - { - i->second->GenerateTree ( path, verbose ); - } -} - -string -Directory::EscapeSpaces ( string path ) -{ - string newpath; - char* p = &path[0]; - while ( *p != 0 ) - { - if ( *p == ' ' ) - newpath = newpath + "\ "; - else - newpath = newpath + *p; - *p++; - } - return newpath; -} - -void -Directory::CreateRule ( FILE* f, - const string& parent ) -{ - string path; - - if ( parent.size() > 0 ) - { - string escapedParent = EscapeSpaces ( parent ); - fprintf ( f, - "%s%c%s: | %s\n", - escapedParent.c_str (), - cSep, - EscapeSpaces ( name ).c_str (), - escapedParent.c_str () ); - - fprintf ( f, - "\t$(ECHO_MKDIR)\n" ); - - fprintf ( f, - "\t${mkdir} $@\n" ); - - path = parent + sSep + name; - } - else - path = name; - - for ( directory_map::iterator i = subdirs.begin(); - i != subdirs.end(); - ++i ) - { - i->second->CreateRule ( f, path ); - } -} - - static class MingwFactory : public Backend::Factory { public: _____
Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.h --- trunk/reactos/tools/rbuild/backend/mingw/mingw.h 2005-11-22 21:32:11 UTC (rev 19468) +++ trunk/reactos/tools/rbuild/backend/mingw/mingw.h 2005-11-22 21:58:50 UTC (rev 19469) @@ -32,33 +32,7 @@
extern std::string v2s ( const string_list& v, int wrap_at );
-typedef std::mapstd::string,Directory* directory_map;
- -class Directory -{ -public: - std::string name; - directory_map subdirs; - Directory ( const std::string& name ); - void Add ( const char* subdir ); - void GenerateTree ( const std::string& parent, - bool verbose ); - std::string EscapeSpaces ( std::string path ); - void CreateRule ( FILE* f, - const std::string& parent ); -private: - bool mkdir_p ( const char* path ); - std::string ReplaceVariable ( std::string name, - std::string value, - std::string path ); - std::string GetEnvironmentVariable ( const std::string& name ); - void ResolveVariablesInPath ( char* buf, - std::string path ); - bool CreateDirectory ( std::string path ); -}; - - class MingwBackend : public Backend { public: _____
Added: trunk/reactos/tools/rbuild/directory.cpp --- trunk/reactos/tools/rbuild/directory.cpp 2005-11-22 21:32:11 UTC (rev 19468) +++ trunk/reactos/tools/rbuild/directory.cpp 2005-11-22 21:58:50 UTC (rev 19469) @@ -0,0 +1,209 @@
+/* + * Copyright (C) 2005 Casper S. Hornstrup + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include "pch.h" +#include <assert.h> + +#include "rbuild.h" +#ifdef _MSC_VER +#define popen _popen +#define pclose _pclose +#else +#include <dirent.h> +#endif//_MSC_VER + +#ifdef WIN32 +#define MKDIR(s) mkdir(s) +#else +#define MKDIR(s) mkdir(s, 0755) +#endif + +using std::string; +using std::vector; + +Directory::Directory ( const string& name_ ) + : name(name_) +{ +} + +void +Directory::Add ( const char* subdir ) +{ + size_t i; + string s1 = string ( subdir ); + if ( ( i = s1.find ( '$' ) ) != string::npos ) + { + throw InvalidOperationException ( __FILE__, + __LINE__, + "No environment variables can be used here. Path was %s", + subdir ); + } + + const char* p = strpbrk ( subdir, "/\" ); + if ( !p ) + p = subdir + strlen(subdir); + string s ( subdir, p-subdir ); + if ( subdirs.find(s) == subdirs.end() ) + subdirs[s] = new Directory(s); + if ( *p && *++p ) + subdirs[s]->Add ( p ); +} + +bool +Directory::mkdir_p ( const char* path ) +{ +#ifndef _MSC_VER + DIR *directory; + directory = opendir ( path ); + if ( directory != NULL ) + { + closedir ( directory ); + return false; + } +#endif//_MSC_VER + + if ( MKDIR ( path ) != 0 ) + { +#ifdef _MSC_VER + if ( errno == EEXIST ) + return false; +#endif//_MSC_VER + throw AccessDeniedException ( string ( path ) ); + } + return true; +} + +bool +Directory::CreateDirectory ( string path ) +{ + size_t index = 0; + size_t nextIndex; + if ( isalpha ( path[0] ) && path[1] == ':' && path[2] == cSep ) + { + nextIndex = path.find ( cSep, 3); + } + else + nextIndex = path.find ( cSep ); + + bool directoryWasCreated = false; + while ( nextIndex != string::npos ) + { + nextIndex = path.find ( cSep, index + 1 ); + directoryWasCreated = mkdir_p ( path.substr ( 0, nextIndex ).c_str () ); + index = nextIndex; + } + return directoryWasCreated; +} + +string +Directory::ReplaceVariable ( string name, + string value, + string path ) +{ + size_t i = path.find ( name ); + if ( i != string::npos ) + return path.replace ( i, name.length (), value ); + else + return path; +} + +void +Directory::ResolveVariablesInPath ( char* buf, + string path ) +{ + string s = ReplaceVariable ( "$(INTERMEDIATE)", Environment::GetIntermediatePath (), path ); + s = ReplaceVariable ( "$(OUTPUT)", Environment::GetOutputPath (), s ); + s = ReplaceVariable ( "$(INSTALL)", Environment::GetInstallPath (), s ); + strcpy ( buf, s.c_str () ); +} + +void +Directory::GenerateTree ( const string& parent, + bool verbose ) +{ + string path; + + if ( parent.size () > 0 ) + { + char buf[256]; + + path = parent + sSep + name; + ResolveVariablesInPath ( buf, path ); + if ( CreateDirectory ( buf ) && verbose ) + printf ( "Created %s\n", buf ); + } + else + path = name; + + for ( directory_map::iterator i = subdirs.begin (); + i != subdirs.end (); + ++i ) + { + i->second->GenerateTree ( path, verbose ); + } +} + +string +Directory::EscapeSpaces ( string path ) +{ + string newpath; + char* p = &path[0]; + while ( *p != 0 ) + { + if ( *p == ' ' ) + newpath = newpath + "\ "; + else + newpath = newpath + *p; + *p++; + } + return newpath; +} + +void +Directory::CreateRule ( FILE* f, + const string& parent ) +{ + string path; + + if ( parent.size() > 0 ) + { + string escapedParent = EscapeSpaces ( parent ); + fprintf ( f, + "%s%c%s: | %s\n", + escapedParent.c_str (), + cSep, + EscapeSpaces ( name ).c_str (), + escapedParent.c_str () ); + + fprintf ( f, + "\t$(ECHO_MKDIR)\n" ); + + fprintf ( f, + "\t${mkdir} $@\n" ); + + path = parent + sSep + name; + } + else + path = name; + + for ( directory_map::iterator i = subdirs.begin(); + i != subdirs.end(); + ++i ) + { + i->second->CreateRule ( f, path ); + } +} Property changes on: trunk/reactos/tools/rbuild/directory.cpp ___________________________________________________________________ Name: svn:eol-style + native _____
Modified: trunk/reactos/tools/rbuild/rbuild.h --- trunk/reactos/tools/rbuild/rbuild.h 2005-11-22 21:32:11 UTC (rev 19468) +++ trunk/reactos/tools/rbuild/rbuild.h 2005-11-22 21:58:50 UTC (rev 19469) @@ -66,6 +66,7 @@
#define MS_VS_DEF_VERSION "7.10"
+class Directory; class Project; class IfableData; class Module; @@ -96,6 +97,32 @@ class SourceFileTest;
+typedef std::mapstd::string,Directory* directory_map; + +class Directory +{ +public: + std::string name; + directory_map subdirs; + Directory ( const std::string& name ); + void Add ( const char* subdir ); + void GenerateTree ( const std::string& parent, + bool verbose ); + std::string EscapeSpaces ( std::string path ); + void CreateRule ( FILE* f, + const std::string& parent ); +private: + bool mkdir_p ( const char* path ); + std::string ReplaceVariable ( std::string name, + std::string value, + std::string path ); + std::string GetEnvironmentVariable ( const std::string& name ); + void ResolveVariablesInPath ( char* buf, + std::string path ); + bool CreateDirectory ( std::string path ); +}; + + class Configuration { public: _____
Modified: trunk/reactos/tools/rbuild/rbuild.mak --- trunk/reactos/tools/rbuild/rbuild.mak 2005-11-22 21:32:11 UTC (rev 19468) +++ trunk/reactos/tools/rbuild/rbuild.mak 2005-11-22 21:58:50 UTC (rev 19469) @@ -160,6 +160,7 @@
compilerflag.cpp \ configuration.cpp \ define.cpp \ + directory.cpp \ exception.cpp \ filesupportcode.cpp \ include.cpp \ @@ -291,6 +292,10 @@ $(ECHO_CC) ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@
+$(RBUILD_INT_)directory.o: $(RBUILD_BASE_)directory.cpp $(RBUILD_HEADERS) | $(RBUILD_INT) + $(ECHO_CC) + ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@ + $(RBUILD_INT_)exception.o: $(RBUILD_BASE_)exception.cpp $(RBUILD_HEADERS) | $(RBUILD_INT) $(ECHO_CC) ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@