From cb704dd883dc808acb1cecbc99247a87c01552c2 Mon Sep 17 00:00:00 2001
From: Bill Hoffman <bill.hoffman@kitware.com>
Date: Fri, 10 Mar 2006 16:52:28 -0500
Subject: [PATCH] ENH: fix find program to look for .com and .exe correctly and
 not return files with no extension on windows

---
 SystemTools.cxx | 89 ++++++++++++++++++++++---------------------------
 1 file changed, 40 insertions(+), 49 deletions(-)

diff --git a/SystemTools.cxx b/SystemTools.cxx
index 46908d63..f809dfd2 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -1922,7 +1922,11 @@ kwsys_stl::string SystemTools::FindProgram(
     {
     return "";
     }
+  bool extensionIncluded = false;
   kwsys_stl::string ext = SystemTools::GetExecutableExtension();
+  std::string searchName = name;
+  // check to see if the extension was included in the name
+  // if not, add it
   if(ext.size())
     {
     unsigned int len = strlen(name);
@@ -1930,84 +1934,71 @@ kwsys_stl::string SystemTools::FindProgram(
       {
       if(strcmp(name+(len-ext.size()), ext.c_str()) == 0)
         {
-        ext = ""; // name already has Executable extension
+        extensionIncluded = true;
+        }
+      else
+        {
+        searchName += ext;
         }
       }
-    }
-  // See if the executable exists as written.
-  if(SystemTools::FileExists(name) &&
-      !SystemTools::FileIsDirectory(name))
-    {
-    return SystemTools::CollapseFullPath(name);
-    }
-  if(ext.size())
-    {
-    kwsys_stl::string tryPath = name;
-    tryPath += ext;
-    if(SystemTools::FileExists(tryPath.c_str()) &&
-       !SystemTools::FileIsDirectory(tryPath.c_str()))
+    else
       {
-      return SystemTools::CollapseFullPath(tryPath.c_str());
+      searchName += ext;
       }
     }
+  // searchName now has the extension in it.
+
+  // See if the executable exists as written
+  if(SystemTools::FileExists(searchName.c_str()) &&
+      !SystemTools::FileIsDirectory(searchName.c_str()))
+    {
+    return SystemTools::CollapseFullPath(searchName.c_str());
+    }
   kwsys_stl::vector<kwsys_stl::string> path;
-  // Add the system search path to our path.
+  // Add the system search path to our path if asked for
   if (!no_system_path)
     {
     SystemTools::GetPath(path);
     }
-
   // now add the additional paths
-  for(kwsys_stl::vector<kwsys_stl::string>::const_iterator i = userPaths.begin();
-        i != userPaths.end(); ++i)
+  for(kwsys_stl::vector<kwsys_stl::string>::const_iterator i = 
+        userPaths.begin(); i != userPaths.end(); ++i)
     {
     path.push_back(*i);
     }
+  kwsys_stl::string tryPath;
+  // now search the paths specified
   for(kwsys_stl::vector<kwsys_stl::string>::iterator p = path.begin();
       p != path.end(); ++p)
     {
 #ifdef _WIN32
     // Remove double quotes from the path on windows
     SystemTools::ReplaceString(*p, "\"", "");
-#endif
-    kwsys_stl::string tryPath = *p;
-    tryPath += "/";
-    tryPath += name;
-    if(SystemTools::FileExists(tryPath.c_str()) &&
-      !SystemTools::FileIsDirectory(tryPath.c_str()))
-      {
-      return SystemTools::CollapseFullPath(tryPath.c_str());
-      }
-#ifdef _WIN32
-    // on windows try .com before .exe
-    if(ext.size() == 0)
+    // if the extension was not specified then look
+    // for .com before the ext version
+    if(!extensionIncluded)
       {
+      // first try .com instead .exe
+      kwsys_stl::string tryPath = *p;
+      tryPath += "/";
+      tryPath += searchName;
       SystemTools::ReplaceString(tryPath, ".exe", ".com");
       SystemTools::ReplaceString(tryPath, ".EXE", ".com");
-      }
-    else
-      {
-      tryPath += ".com";
-      }
-    if(SystemTools::FileExists(tryPath.c_str()) &&
-       !SystemTools::FileIsDirectory(tryPath.c_str()))
-      {
-      return SystemTools::CollapseFullPath(tryPath.c_str());
-      }
-#endif
-    // now try to add ext if it is different than name
-    if(ext.size())
-      {
-      tryPath = *p;
-      tryPath += "/";
-      tryPath += name;
-      tryPath += ext;
       if(SystemTools::FileExists(tryPath.c_str()) &&
          !SystemTools::FileIsDirectory(tryPath.c_str()))
         {
         return SystemTools::CollapseFullPath(tryPath.c_str());
         }
       }
+#endif
+    tryPath = *p;
+    tryPath += "/";
+    tryPath += searchName;
+    if(SystemTools::FileExists(tryPath.c_str()) &&
+      !SystemTools::FileIsDirectory(tryPath.c_str()))
+      {
+      return SystemTools::CollapseFullPath(tryPath.c_str());
+      }
     }
 
   // Couldn't find the program.
-- 
GitLab