From 0d59114448afe7ab907f65860c26d89a3c47a9b9 Mon Sep 17 00:00:00 2001 From: Andy Cedilnik <andy.cedilnik@kitware.com> Date: Sun, 17 Oct 2004 18:50:49 -0400 Subject: [PATCH] ENH: Add method to find file in parent directories if it exists --- SystemTools.cxx | 23 +++++++++++++++++++++++ SystemTools.hxx.in | 6 ++++++ 2 files changed, 29 insertions(+) diff --git a/SystemTools.cxx b/SystemTools.cxx index 3f5d0e34..f257b976 100644 --- a/SystemTools.cxx +++ b/SystemTools.cxx @@ -2071,6 +2071,29 @@ bool SystemTools::IsSubDirectory(const char* cSubdir, const char* cDir) return false; } +kwsys_stl::string SystemTools::FileExistsInParentDirectories(const char* fname, + const char* directory, const char* toplevel) +{ + kwsys_stl::string file = fname; + SystemTools::ConvertToUnixSlashes(file); + kwsys_stl::string dir = directory; + SystemTools::ConvertToUnixSlashes(dir); + while ( 1 ) + { + kwsys_stl::string path = dir + "/" + file; + if ( SystemTools::FileExists(path.c_str()) ) + { + return path; + } + if ( dir.size() < strlen(toplevel) ) + { + break; + } + dir = SystemTools::GetParentDirectory(dir.c_str()); + } + return ""; +} + // These must NOT be initialized. Default initialization to zero is // necessary. unsigned int SystemToolsManagerCount; diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in index f80c9370..2b73b7c6 100644 --- a/SystemTools.hxx.in +++ b/SystemTools.hxx.in @@ -322,6 +322,12 @@ public: /** Check if the given file or directory is in subdirectory of dir */ static bool IsSubDirectory(const char* fileOrDir, const char* dir); + /** Check if the given file exists in one of the parent directory of the + * given file or directory and if it does, return the name of the file. + * Toplevel specifies the top-most directory to where it will look.*/ + static kwsys_stl::string FileExistsInParentDirectories(const char* fname, + const char* directory, const char* toplevel); + protected: // these two functions can be called from ConvertToOutputPath /** -- GitLab