ENH: fix find program to look for .com and .exe correctly and not return files with no extension on windows

This commit is contained in:
Bill Hoffman 2006-03-10 16:52:28 -05:00
parent 8e7d92049e
commit 7387cb5850
1 changed files with 40 additions and 49 deletions

View File

@ -1922,7 +1922,11 @@ kwsys_stl::string SystemTools::FindProgram(
{ {
return ""; return "";
} }
bool extensionIncluded = false;
kwsys_stl::string ext = SystemTools::GetExecutableExtension(); 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()) if(ext.size())
{ {
unsigned int len = strlen(name); unsigned int len = strlen(name);
@ -1930,84 +1934,71 @@ kwsys_stl::string SystemTools::FindProgram(
{ {
if(strcmp(name+(len-ext.size()), ext.c_str()) == 0) if(strcmp(name+(len-ext.size()), ext.c_str()) == 0)
{ {
ext = ""; // name already has Executable extension extensionIncluded = true;
}
else
{
searchName += ext;
} }
} }
} else
// 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()))
{ {
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; 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) if (!no_system_path)
{ {
SystemTools::GetPath(path); SystemTools::GetPath(path);
} }
// now add the additional paths // now add the additional paths
for(kwsys_stl::vector<kwsys_stl::string>::const_iterator i = userPaths.begin(); for(kwsys_stl::vector<kwsys_stl::string>::const_iterator i =
i != userPaths.end(); ++i) userPaths.begin(); i != userPaths.end(); ++i)
{ {
path.push_back(*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(); for(kwsys_stl::vector<kwsys_stl::string>::iterator p = path.begin();
p != path.end(); ++p) p != path.end(); ++p)
{ {
#ifdef _WIN32 #ifdef _WIN32
// Remove double quotes from the path on windows // Remove double quotes from the path on windows
SystemTools::ReplaceString(*p, "\"", ""); SystemTools::ReplaceString(*p, "\"", "");
#endif // if the extension was not specified then look
kwsys_stl::string tryPath = *p; // for .com before the ext version
tryPath += "/"; if(!extensionIncluded)
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)
{ {
// first try .com instead .exe
kwsys_stl::string tryPath = *p;
tryPath += "/";
tryPath += searchName;
SystemTools::ReplaceString(tryPath, ".exe", ".com"); SystemTools::ReplaceString(tryPath, ".exe", ".com");
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()) && if(SystemTools::FileExists(tryPath.c_str()) &&
!SystemTools::FileIsDirectory(tryPath.c_str())) !SystemTools::FileIsDirectory(tryPath.c_str()))
{ {
return SystemTools::CollapseFullPath(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. // Couldn't find the program.