KWSys 2015-07-10 (c9336bcf)

Extract upstream KWSys using the following shell commands.

$ git archive --prefix=upstream-kwsys/ c9336bcf | tar x
$ git shortlog --no-merges --abbrev=8 --format='%h %s' d3ba91e1..c9336bcf
Brad King (2):
      86a24794 SystemTools: Fix GetActualCaseForPath drive letter case handling
      c9336bcf SystemTools: Optimize GetActualCaseForPath memoization
This commit is contained in:
KWSys Robot 2015-07-10 09:36:55 -04:00 committed by Brad King
parent abeee54113
commit dc822da815
2 changed files with 45 additions and 16 deletions

View File

@ -385,6 +385,26 @@ class SystemToolsTranslationMap :
{
};
#ifdef _WIN32
struct SystemToolsPathCaseCmp
{
bool operator()(kwsys_stl::string const& l, kwsys_stl::string const& r) const
{
# ifdef _MSC_VER
return _stricmp(l.c_str(), r.c_str()) < 0;
# elif defined(__GNUC__)
return strcasecmp(l.c_str(), r.c_str()) < 0;
# else
return SystemTools::Strucmp(l.c_str(), r.c_str()) < 0;
# endif
}
};
class SystemToolsPathCaseMap:
public kwsys_stl::map<kwsys_stl::string, kwsys_stl::string,
SystemToolsPathCaseCmp> {};
#endif
// adds the elements of the env variable path to the arg passed in
void SystemTools::GetPath(kwsys_stl::vector<kwsys_stl::string>& path, const char* env)
{
@ -3690,6 +3710,11 @@ static int GetCasePathName(const kwsys_stl::string & pathIn,
// Start with root component.
kwsys_stl::vector<kwsys_stl::string>::size_type idx = 0;
casePath = path_components[idx++];
// make sure drive letter is always upper case
if(casePath.size() > 1 && casePath[1] == ':')
{
casePath[0] = toupper(casePath[0]);
}
const char* sep = "";
// If network path, fill casePath with server/share so FindFirstFile
@ -3745,27 +3770,21 @@ kwsys_stl::string SystemTools::GetActualCaseForPath(const kwsys_stl::string& p)
#ifndef _WIN32
return p;
#else
kwsys_stl::string casePath = p;
// make sure drive letter is always upper case
if(casePath.size() > 1 && casePath[1] == ':')
{
casePath[0] = toupper(casePath[0]);
}
// Check to see if actual case has already been called
// for this path, and the result is stored in the LongPathMap
SystemToolsTranslationMap::iterator i =
SystemTools::LongPathMap->find(casePath);
if(i != SystemTools::LongPathMap->end())
// for this path, and the result is stored in the PathCaseMap
SystemToolsPathCaseMap::iterator i =
SystemTools::PathCaseMap->find(p);
if(i != SystemTools::PathCaseMap->end())
{
return i->second;
}
kwsys_stl::string casePath;
int len = GetCasePathName(p, casePath);
if(len == 0 || len > MAX_PATH+1)
{
return p;
}
(*SystemTools::LongPathMap)[p] = casePath;
(*SystemTools::PathCaseMap)[p] = casePath;
return casePath;
#endif
}
@ -5139,7 +5158,9 @@ bool SystemTools::ParseURL( const kwsys_stl::string& URL,
// necessary.
static unsigned int SystemToolsManagerCount;
SystemToolsTranslationMap *SystemTools::TranslationMap;
SystemToolsTranslationMap *SystemTools::LongPathMap;
#ifdef _WIN32
SystemToolsPathCaseMap *SystemTools::PathCaseMap;
#endif
#ifdef __CYGWIN__
SystemToolsTranslationMap *SystemTools::Cyg2Win32Map;
#endif
@ -5187,7 +5208,9 @@ void SystemTools::ClassInitialize()
#endif
// Allocate the translation map first.
SystemTools::TranslationMap = new SystemToolsTranslationMap;
SystemTools::LongPathMap = new SystemToolsTranslationMap;
#ifdef _WIN32
SystemTools::PathCaseMap = new SystemToolsPathCaseMap;
#endif
#ifdef __CYGWIN__
SystemTools::Cyg2Win32Map = new SystemToolsTranslationMap;
#endif
@ -5244,7 +5267,9 @@ void SystemTools::ClassInitialize()
void SystemTools::ClassFinalize()
{
delete SystemTools::TranslationMap;
delete SystemTools::LongPathMap;
#ifdef _WIN32
delete SystemTools::PathCaseMap;
#endif
#ifdef __CYGWIN__
delete SystemTools::Cyg2Win32Map;
#endif

View File

@ -54,6 +54,8 @@ namespace @KWSYS_NAMESPACE@
{
class SystemToolsTranslationMap;
class SystemToolsPathCaseMap;
/** \class SystemToolsManager
* \brief Use to make sure SystemTools is initialized before it is used
* and is the last static object destroyed
@ -944,7 +946,9 @@ private:
* Each time 'dir' will be found it will be replace by 'refdir'
*/
static SystemToolsTranslationMap *TranslationMap;
static SystemToolsTranslationMap *LongPathMap;
#ifdef _WIN32
static SystemToolsPathCaseMap *PathCaseMap;
#endif
#ifdef __CYGWIN__
static SystemToolsTranslationMap *Cyg2Win32Map;
#endif