ENH: optimization of cwd and do not leak library handle

This commit is contained in:
Bill Hoffman 2005-04-12 13:25:19 -04:00
parent ee7fbdf058
commit 266d5d16df
2 changed files with 18 additions and 10 deletions

View File

@ -1258,7 +1258,11 @@ kwsys_stl::string SystemTools::ConvertToOutputPath(const char* path)
// remove double slashes not at the start // remove double slashes not at the start
kwsys_stl::string SystemTools::ConvertToWindowsOutputPath(const char* path) kwsys_stl::string SystemTools::ConvertToWindowsOutputPath(const char* path)
{ {
kwsys_stl::string ret = path; kwsys_stl::string ret;
// make it big enough for all of path and double quotes
ret.reserve(strlen(path)+3);
// put path into the string
ret.insert(0,path);
kwsys_stl::string::size_type pos = 0; kwsys_stl::string::size_type pos = 0;
// first convert all of the slashes // first convert all of the slashes
while((pos = ret.find('/', pos)) != kwsys_stl::string::npos) while((pos = ret.find('/', pos)) != kwsys_stl::string::npos)
@ -1289,12 +1293,11 @@ kwsys_stl::string SystemTools::ConvertToWindowsOutputPath(const char* path)
} }
// now double quote the path if it has spaces in it // now double quote the path if it has spaces in it
// and is not already double quoted // and is not already double quoted
if(ret.find(" ") != kwsys_stl::string::npos if(ret.find(' ') != kwsys_stl::string::npos
&& ret[0] != '\"') && ret[0] != '\"')
{ {
kwsys_stl::string result; ret.insert(0, 1, '\"');
result = "\"" + ret + "\""; ret.append(1, '\"');
ret = result;
} }
return ret; return ret;
} }
@ -1970,7 +1973,7 @@ int SystemTools::ChangeDirectory(const char *dir)
return Chdir(dir); return Chdir(dir);
} }
kwsys_stl::string SystemTools::GetCurrentWorkingDirectory() kwsys_stl::string SystemTools::GetCurrentWorkingDirectory(bool collapse)
{ {
char buf[2048]; char buf[2048];
const char* cwd = Getcwd(buf, 2048); const char* cwd = Getcwd(buf, 2048);
@ -1979,8 +1982,11 @@ kwsys_stl::string SystemTools::GetCurrentWorkingDirectory()
{ {
path = cwd; path = cwd;
} }
if(collapse)
return SystemTools::CollapseFullPath(path.c_str()); {
return SystemTools::CollapseFullPath(path.c_str());
}
return path;
} }
kwsys_stl::string SystemTools::GetProgramPath(const char* in_name) kwsys_stl::string SystemTools::GetProgramPath(const char* in_name)
@ -2303,11 +2309,14 @@ int PortableGetLongPathName(const char* pathIn,
int len = (*func)(shortPath.c_str(), buffer, MAX_PATH+1); int len = (*func)(shortPath.c_str(), buffer, MAX_PATH+1);
if(len == 0 || len > MAX_PATH+1) if(len == 0 || len > MAX_PATH+1)
{ {
FreeLibrary(lh);
return 0; return 0;
} }
longPath = buffer; longPath = buffer;
FreeLibrary(lh);
return len; return len;
} }
FreeLibrary(lh);
} }
return OldWindowsGetLongPath(shortPath.c_str(), longPath); return OldWindowsGetLongPath(shortPath.c_str(), longPath);
} }

View File

@ -580,7 +580,7 @@ public:
/** /**
* Get current working directory CWD * Get current working directory CWD
*/ */
static kwsys_stl::string GetCurrentWorkingDirectory(); static kwsys_stl::string GetCurrentWorkingDirectory(bool collapse =true);
/** /**
* Change directory the the directory specified * Change directory the the directory specified
@ -668,7 +668,6 @@ private:
* Each time 'dir' will be found it will be replace by 'refdir' * Each time 'dir' will be found it will be replace by 'refdir'
*/ */
static SystemToolsTranslationMap *TranslationMap; static SystemToolsTranslationMap *TranslationMap;
friend class SystemToolsManager; friend class SystemToolsManager;
}; };