From 479beca9f471a22dc80df3bbd5cb15622462b4f7 Mon Sep 17 00:00:00 2001
From: Andy Cedilnik <andy.cedilnik@kitware.com>
Date: Sun, 10 Oct 2004 12:14:58 -0400
Subject: [PATCH] ENH: Add method to retrieve parent directory and for checking
 if directory is a subdirectory of another directory

---
 SystemTools.cxx    | 40 ++++++++++++++++++++++++++++++++++++++++
 SystemTools.hxx.in |  6 ++++++
 2 files changed, 46 insertions(+)

diff --git a/SystemTools.cxx b/SystemTools.cxx
index 937c4ee7..591e4960 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -2010,6 +2010,46 @@ bool SystemTools::SetPermissions(const char* file, mode_t mode)
   return true;
 }
 
+std::string SystemTools::GetParentDirectory(const char* fileOrDir)
+{
+  if ( !fileOrDir || !*fileOrDir )
+    {
+    return "";
+    }
+  std::string res = fileOrDir;
+  SystemTools::ConvertToUnixSlashes(res);
+  std::string::size_type cc = res.size()-1;
+  if ( res[cc] == '/' )
+    {
+    cc --;
+    }
+  for ( ; cc > 0; cc -- )
+    {
+    if ( res[cc] == '/' )
+      {
+      break;
+      }
+    }
+  return res.substr(0, cc);
+}
+
+bool SystemTools::IsSubDirectory(const char* cSubdir, const char* cDir)
+{
+  std::string subdir = cSubdir;
+  std::string dir = cDir;
+  SystemTools::ConvertToUnixSlashes(dir);
+  std::string path = subdir;
+  do
+    {
+    path = SystemTools::GetParentDirectory(path.c_str());
+    if ( dir == path )
+      {
+      return true;
+      }
+    }
+  while ( path.size() > dir.size() );
+  return false;
+}
 
 // These must NOT be initialized.  Default initialization to zero is
 // necessary.
diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index e5881b05..33e7904c 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -316,6 +316,12 @@ public:
   static bool GetPermissions(const char* file, mode_t& mode);
   static bool SetPermissions(const char* file, mode_t mode);
 
+  /** Get the parent directory of the directory or file */
+  static std::string GetParentDirectory(const char* fileOrDir);
+
+  /** Check if the given file or directory is in subdirectory of dir */
+  static bool IsSubDirectory(const char* fileOrDir, const char* dir);
+
 protected:
   // these two functions can be called from ConvertToOutputPath
   /**
-- 
GitLab