diff options
author | Ken Martin <ken.martin@kitware.com> | 2004-10-04 16:31:09 (GMT) |
---|---|---|
committer | Ken Martin <ken.martin@kitware.com> | 2004-10-04 16:31:09 (GMT) |
commit | 1066af45278f29e7a5f1b5ba3d7d12bce15719e4 (patch) | |
tree | 6beeea084d3bb262b2d9ada6c562a4ac7109e34c /Source/kwsys | |
parent | 7e3c70082ae433e7793afad6d9a3366bf6c1e215 (diff) | |
download | CMake-1066af45278f29e7a5f1b5ba3d7d12bce15719e4.zip CMake-1066af45278f29e7a5f1b5ba3d7d12bce15719e4.tar.gz CMake-1066af45278f29e7a5f1b5ba3d7d12bce15719e4.tar.bz2 |
ENH: Mathieus support for path conversions
Diffstat (limited to 'Source/kwsys')
-rw-r--r-- | Source/kwsys/SystemTools.cxx | 139 | ||||
-rw-r--r-- | Source/kwsys/SystemTools.hxx.in | 23 |
2 files changed, 129 insertions, 33 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index f08a50f..9488e56 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -68,6 +68,17 @@ inline int Chdir(const char* dir) return _chdir(dir); #endif } +inline char *Realpath(const char *path, char *resolved_path) +{ + char *ptemp; + char fullpath[MAX_PATH]; + if( GetFullPathName(path, sizeof(fullpath), fullpath, &ptemp) ) + { + return strcpy(resolved_path, fullpath); + } + + return 0; +} #else #include <sys/types.h> #include <fcntl.h> @@ -88,6 +99,10 @@ inline int Chdir(const char* dir) { return chdir(dir); } +inline char *Realpath(const char *path, char *resolved_path) +{ + return realpath(path, resolved_path); +} #endif #if !defined(_WIN32) && defined(__COMO__) @@ -753,12 +768,6 @@ void SystemTools::ConvertToUnixSlashes(kwsys_stl::string& path) path = kwsys_stl::string(getenv("HOME")) + path.substr(1); } } - - // if there is a /tmp_mnt in a path get rid of it! - if(path.find("/tmp_mnt") == 0) - { - path = path.substr(8); - } } // change // to /, and escape any spaces in the path @@ -1346,7 +1355,8 @@ kwsys_stl::string SystemTools::GetCurrentWorkingDirectory() { path = cwd; } - return path; + + return SystemTools::CollapseFullPath(path.c_str()); } kwsys_stl::string SystemTools::GetProgramPath(const char* in_name) @@ -1452,15 +1462,77 @@ kwsys_stl::string SystemTools::CollapseFullPath(const char* in_relative) return SystemTools::CollapseFullPath(in_relative, 0); } +kwsys_stl::map<kwsys_stl::string,kwsys_stl::string> SystemTools::TranslationMap; + +void SystemTools::AddTranslationPath(const char * a, const char * b) +{ + kwsys_stl::string path_a = a; + kwsys_stl::string path_b = b; + SystemTools::ConvertToUnixSlashes(path_a); + SystemTools::ConvertToUnixSlashes(path_b); + // First check this is a directory path, since we don't want the table to grow + // too fat + if( SystemTools::FileIsDirectory( path_a.c_str() ) ) + { + // Make sure the path is a full path and does not contain no '..' + if( SystemTools::FileIsFullPath(path_b.c_str()) && path_b.find("..") == kwsys_stl::string::npos ) + { + // Before inserting make sure path ends with '/' + path_a += '/'; path_b += '/'; + if( !(path_a == path_b) ) + { + TranslationMap.insert( + kwsys_stl::pair<kwsys_stl::string,kwsys_stl::string>(path_a, path_b)); + } + } + } +} + +void SystemTools::AddKeepPath(const char* dir) +{ + kwsys_stl::string cdir = SystemTools::CollapseFullPath(dir); + SystemTools::AddTranslationPath(cdir.c_str(), dir); +} + +void SystemTools::CheckTranslationPath(kwsys_stl::string & path) +{ + // In case a file was specified we still have to go through this: + // Now convert any path found in the table back to the one desired: + kwsys_stl::map<kwsys_stl::string,kwsys_stl::string>::const_iterator it; + for(it = TranslationMap.begin(); + it != TranslationMap.end(); + ++it ) + { + // We need to check of the path is a substring of the other path + // But also check that the last character is a '/' otherwise we could + // have some weird case such as /tmp/VTK and /tmp/VTK-bin + if(path.size() > 1 && path[path.size()-1] != '/') + { + // Do not append '/' on a program name: + if( SystemTools::FileIsDirectory( path.c_str() ) ) + { + path += "/"; + } + } + if(path.find( it->first ) == 0) + { + path = path.replace( 0, it->first.size(), it->second); + } + } +} + kwsys_stl::string SystemTools::CollapseFullPath(const char* in_relative, - const char* in_base) + const char* in_base) { - // Save original working directory. - kwsys_stl::string orig = SystemTools::GetCurrentWorkingDirectory(); + static int initialized = 0; + + kwsys_stl::string orig; // Change to base of relative path. if(in_base) { + // Save original working directory. + orig = SystemTools::GetCurrentWorkingDirectory(); Chdir(in_base); } @@ -1473,19 +1545,6 @@ kwsys_stl::string SystemTools::CollapseFullPath(const char* in_relative, dir = "/"; } -#ifdef _WIN32 - // Follow relative path. - if(!(dir == "")) - { - Chdir(dir.c_str()); - } - - // Get the resulting directory. - kwsys_stl::string newDir = SystemTools::GetCurrentWorkingDirectory(); - - // Add the file back on to the directory. - SystemTools::ConvertToUnixSlashes(newDir); -#else # ifdef MAXPATHLEN char resolved_name[MAXPATHLEN]; # else @@ -1493,29 +1552,26 @@ kwsys_stl::string SystemTools::CollapseFullPath(const char* in_relative, char resolved_name[PATH_MAX]; # else char resolved_name[5024]; -# endif -# endif +# endif //PATH_MAX +# endif //MAXPATHLEN // Resolve relative path. kwsys_stl::string newDir; if(!(dir == "")) { - realpath(dir.c_str(), resolved_name); + Realpath(dir.c_str(), resolved_name); newDir = resolved_name; } else { newDir = SystemTools::GetCurrentWorkingDirectory(); } - // if there is a /tmp_mnt in a path get rid of it! - if(newDir.find("/tmp_mnt") == 0) + + if(in_base) { - newDir = newDir.substr(8); + // Restore original working directory. + Chdir(orig.c_str()); } -#endif - - // Restore original working directory. - Chdir(orig.c_str()); // Construct and return the full path. kwsys_stl::string newPath = newDir; @@ -1527,6 +1583,23 @@ kwsys_stl::string SystemTools::CollapseFullPath(const char* in_relative, } newPath += file; } + + // If the table has never been initialized, add default path: + if(!initialized) + { + initialized = 1; + //Also add some good default one: + // This one should always be there it fix a bug on sgi + SystemTools::AddTranslationPath("/tmp_mnt/", "/"); + + //This is a good default also: + SystemTools::AddKeepPath("/tmp/"); + } + + // Now we need to update the translation table with this potentially new path + SystemTools::AddTranslationPath(newPath.c_str(), in_relative); + SystemTools::CheckTranslationPath(newPath); + return newPath; } diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in index 1c48af7..128e0c2 100644 --- a/Source/kwsys/SystemTools.hxx.in +++ b/Source/kwsys/SystemTools.hxx.in @@ -17,6 +17,7 @@ #include <@KWSYS_NAMESPACE@/ios/iosfwd> #include <@KWSYS_NAMESPACE@/stl/string> #include <@KWSYS_NAMESPACE@/stl/vector> +#include <@KWSYS_NAMESPACE@/stl/map> #include <@KWSYS_NAMESPACE@/Configure.h> @@ -291,6 +292,22 @@ public: static int GetTerminalWidth(); /** + * Add an entry in the path translation table. + */ + static void AddTranslationPath(const char * dir, const char * refdir); + + /** + * If dir is different after CollapseFullPath is called, + * Then insert it into the path translation table + */ + static void AddKeepPath(const char* dir); + + /** + * Update path by going through the Path Translation table; + */ + static void CheckTranslationPath(kwsys_stl::string & path); + + /** * Get and set permissions of the file. */ static bool GetPermissions(const char* file, mode_t& mode); @@ -312,6 +329,12 @@ protected: */ static kwsys_stl::string ConvertToWindowsOutputPath(const char*); +private: + /** + * Path translation table from dir to refdir + * Each time 'dir' will be found it will be replace by 'refdir' + */ + static kwsys_stl::map<kwsys_stl::string,kwsys_stl::string> TranslationMap; }; } // namespace @KWSYS_NAMESPACE@ |