ENH: Speedup improvements

This commit is contained in:
Andy Cedilnik 2005-04-13 13:59:48 -04:00
parent 4a390c174c
commit bddcf4ec97
1 changed files with 45 additions and 29 deletions

View File

@ -1171,47 +1171,62 @@ int SystemTools::EstimateFormatLength(const char *format, va_list ap)
void SystemTools::ConvertToUnixSlashes(kwsys_stl::string& path) void SystemTools::ConvertToUnixSlashes(kwsys_stl::string& path)
{ {
kwsys_stl::string::size_type pos = 0; kwsys_stl::string::size_type pos = 0;
while((pos = path.find('\\', pos)) != kwsys_stl::string::npos) const char* pathCString = path.c_str();
bool hasDoubleSlash = false;
const char* pos0 = pathCString;
const char* pos1 = pathCString+1;
for ( pos = 0; *pos0; ++ pos )
{ {
// make sure we don't convert an escaped space to a unix slash // make sure we don't convert an escaped space to a unix slash
if(pos < path.size()-1) if ( *pos0 == '\\' && *pos1 != ' ' )
{
if(path[pos+1] != ' ')
{ {
path[pos] = '/'; path[pos] = '/';
} }
}
pos++;
}
// Remove all // from the path just like most unix shells
int start_find;
// Also, reuse the loop to check for slash followed by another slash
if ( !hasDoubleSlash && *pos1 &&
*pos1 == '/' && *(pos1+1) == '/' )
{
#ifdef _WIN32 #ifdef _WIN32
// However, on windows if the first characters are both slashes, // However, on windows if the first characters are both slashes,
// then keep them that way, so that network paths can be handled. // then keep them that way, so that network paths can be handled.
start_find = 1; if ( pos > 0)
{
hasDoubleSlash = true;
}
#else #else
start_find = 0; hasDoubleSlash = true;
#endif #endif
}
while((pos = path.find("//", start_find)) != kwsys_stl::string::npos) pos0 ++;
pos1 ++;
}
if ( hasDoubleSlash )
{ {
SystemTools::ReplaceString(path, "//", "/"); SystemTools::ReplaceString(path, "//", "/");
} }
// remove any trailing slash // remove any trailing slash
if(path.size() > 1 && path[path.size()-1] == '/') if(!path.empty())
{
// if there is a tilda ~ then replace it with HOME
if(*pathCString == '~')
{
const char* homeEnv = SystemTools::GetEnv("HOME");
if (homeEnv)
{
path.replace(0,1,homeEnv);
}
}
if (*(pathCString+(path.size()-1)) == '/')
{ {
path = path.substr(0, path.size()-1); path = path.substr(0, path.size()-1);
} }
// if there is a tilda ~ then replace it with HOME
if(path.find("~") == 0)
{
if (getenv("HOME"))
{
path = kwsys_stl::string(getenv("HOME")) + path.substr(1);
}
} }
} }
@ -2491,13 +2506,14 @@ kwsys_stl::string SystemTools::GetFilenamePath(const kwsys_stl::string& filename
*/ */
kwsys_stl::string SystemTools::GetFilenameName(const kwsys_stl::string& filename) kwsys_stl::string SystemTools::GetFilenameName(const kwsys_stl::string& filename)
{ {
kwsys_stl::string fn = filename; #if defined(_WIN32)
SystemTools::ConvertToUnixSlashes(fn); kwsys_stl::string::size_type slash_pos = filename.find_last_of("/\\", 0, slash_pos);
#else
kwsys_stl::string::size_type slash_pos = fn.rfind("/"); kwsys_stl::string::size_type slash_pos = filename.find_last_of("/");
#endif
if(slash_pos != kwsys_stl::string::npos) if(slash_pos != kwsys_stl::string::npos)
{ {
return fn.substr(slash_pos + 1); return filename.substr(slash_pos + 1);
} }
else else
{ {