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