Merge branch 'upstream-KWSys' into update-kwsys

# By KWSys Upstream
* upstream-KWSys:
  KWSys 2022-07-22 (ac792bf7)
This commit is contained in:
Brad King 2022-07-22 12:00:58 -04:00
commit 6d84355274
2 changed files with 60 additions and 42 deletions

View File

@ -43,12 +43,12 @@ public:
{
std::string Name;
#if defined(_WIN32) && !defined(__CYGWIN__)
_wfinddata_t FindData;
WIN32_FIND_DATAW FindData;
#endif
FileData(std::string name
#if defined(_WIN32) && !defined(__CYGWIN__)
,
_wfinddata_t data
WIN32_FIND_DATAW data
#endif
)
: Name(std::move(name))
@ -115,8 +115,8 @@ std::string Directory::GetFilePath(std::size_t i) const
bool Directory::FileIsDirectory(std::size_t i) const
{
#if defined(_WIN32) && !defined(__CYGWIN__)
_wfinddata_t const& data = this->Internal->Files[i].FindData;
return (data.attrib & FILE_ATTRIBUTE_DIRECTORY) != 0;
auto const& data = this->Internal->Files[i].FindData;
return (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
#else
std::string const& path = this->GetFilePath(i);
return kwsys::SystemTools::FileIsDirectory(path);
@ -127,9 +127,9 @@ bool Directory::FileIsSymlink(std::size_t i) const
{
std::string const& path = this->GetFilePath(i);
#if defined(_WIN32) && !defined(__CYGWIN__)
_wfinddata_t const& data = this->Internal->Files[i].FindData;
auto const& data = this->Internal->Files[i].FindData;
return kwsys::SystemTools::FileIsSymlinkWithAttr(
Encoding::ToWindowsExtendedPath(path), data.attrib);
Encoding::ToWindowsExtendedPath(path), data.dwFileAttributes);
#else
return kwsys::SystemTools::FileIsSymlink(path);
#endif
@ -157,7 +157,7 @@ namespace KWSYS_NAMESPACE {
Status Directory::Load(std::string const& name, std::string* errorMessage)
{
this->Clear();
intptr_t srchHandle;
HANDLE srchHandle;
char* buf;
size_t bufLength;
size_t n = name.size();
@ -176,14 +176,14 @@ Status Directory::Load(std::string const& name, std::string* errorMessage)
snprintf(buf, bufLength, "%s/*", name.c_str());
}
}
struct _wfinddata_t data; // data of current file
WIN32_FIND_DATAW data; // data of current file
// Now put them into the file array
srchHandle =
_wfindfirst((wchar_t*)Encoding::ToWindowsExtendedPath(buf).c_str(), &data);
FindFirstFileW(Encoding::ToWindowsExtendedPath(buf).c_str(), &data);
delete[] buf;
if (srchHandle == -1) {
if (srchHandle == INVALID_HANDLE_VALUE) {
Status status = Status::POSIX_errno();
if (errorMessage) {
*errorMessage = status.GetString();
@ -193,10 +193,11 @@ Status Directory::Load(std::string const& name, std::string* errorMessage)
// Loop through names
do {
this->Internal->Files.emplace_back(Encoding::ToNarrow(data.name), data);
} while (_wfindnext(srchHandle, &data) != -1);
this->Internal->Files.emplace_back(Encoding::ToNarrow(data.cFileName),
data);
} while (FindNextFileW(srchHandle, &data));
this->Internal->Path = name;
if (_findclose(srchHandle) == -1) {
if (!FindClose(srchHandle)) {
Status status = Status::POSIX_errno();
if (errorMessage) {
*errorMessage = status.GetString();
@ -209,7 +210,7 @@ Status Directory::Load(std::string const& name, std::string* errorMessage)
unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name,
std::string* errorMessage)
{
intptr_t srchHandle;
HANDLE srchHandle;
char* buf;
size_t bufLength;
size_t n = name.size();
@ -222,13 +223,13 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name,
buf = new char[n + 2 + 1];
snprintf(buf, bufLength, "%s/*", name.c_str());
}
struct _wfinddata_t data; // data of current file
WIN32_FIND_DATAW data; // data of current file
// Now put them into the file array
srchHandle = _wfindfirst((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
srchHandle = FindFirstFileW(Encoding::ToWide(buf).c_str(), &data);
delete[] buf;
if (srchHandle == -1) {
if (srchHandle == INVALID_HANDLE_VALUE) {
if (errorMessage) {
if (unsigned int errorId = GetLastError()) {
LPSTR message = nullptr;
@ -250,8 +251,8 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name,
unsigned long count = 0;
do {
count++;
} while (_wfindnext(srchHandle, &data) != -1);
_findclose(srchHandle);
} while (FindNextFileW(srchHandle, &data));
FindClose(srchHandle);
return count;
}

View File

@ -536,9 +536,11 @@ public:
StringMap TranslationMap;
#endif
#ifdef _WIN32
static std::string GetCasePathName(std::string const& pathIn);
static std::string GetCasePathName(std::string const& pathIn,
bool const cache);
static std::string GetActualCaseForPathCached(std::string const& path);
static const char* GetEnvBuffered(const char* key);
std::map<std::string, std::string, SystemToolsPathCaseCmp> FindFileMap;
std::map<std::string, std::string, SystemToolsPathCaseCmp> PathCaseMap;
std::map<std::string, std::string> EnvMap;
#endif
@ -571,7 +573,8 @@ public:
static SystemToolsStatic* SystemToolsStatics;
#ifdef _WIN32
std::string SystemToolsStatic::GetCasePathName(std::string const& pathIn)
std::string SystemToolsStatic::GetCasePathName(std::string const& pathIn,
bool const cache)
{
std::string casePath;
@ -623,14 +626,31 @@ std::string SystemToolsStatic::GetCasePathName(std::string const& pathIn)
} else {
std::string test_str = casePath;
test_str += path_components[idx];
WIN32_FIND_DATAW findData;
HANDLE hFind =
::FindFirstFileW(Encoding::ToWide(test_str).c_str(), &findData);
if (INVALID_HANDLE_VALUE != hFind) {
path_components[idx] = Encoding::ToNarrow(findData.cFileName);
::FindClose(hFind);
} else {
converting = false;
bool found_in_cache = false;
if (cache) {
auto const it = SystemToolsStatics->FindFileMap.find(test_str);
if (it != SystemToolsStatics->FindFileMap.end()) {
path_components[idx] = it->second;
found_in_cache = true;
}
}
if (!found_in_cache) {
WIN32_FIND_DATAW findData;
HANDLE hFind =
::FindFirstFileW(Encoding::ToWide(test_str).c_str(), &findData);
if (INVALID_HANDLE_VALUE != hFind) {
auto case_file_name = Encoding::ToNarrow(findData.cFileName);
if (cache) {
SystemToolsStatics->FindFileMap.emplace(test_str,
case_file_name);
}
path_components[idx] = std::move(case_file_name);
::FindClose(hFind);
} else {
converting = false;
}
}
}
}
@ -642,19 +662,16 @@ std::string SystemToolsStatic::GetCasePathName(std::string const& pathIn)
std::string SystemToolsStatic::GetActualCaseForPathCached(std::string const& p)
{
// Check to see if actual case has already been called
// for this path, and the result is stored in the PathCaseMap
auto& pcm = SystemToolsStatics->PathCaseMap;
{
auto itr = pcm.find(p);
if (itr != pcm.end()) {
return itr->second;
}
}
std::string casePath = SystemToolsStatic::GetCasePathName(p);
if (casePath.size() <= MAX_PATH) {
pcm[p] = casePath;
std::string casePath;
auto it = SystemToolsStatics->PathCaseMap.find(p);
if (it != SystemToolsStatics->PathCaseMap.end()) {
casePath = it->second;
} else {
casePath = SystemToolsStatic::GetCasePathName(p, true);
SystemToolsStatics->PathCaseMap.emplace(p, casePath);
}
return casePath;
}
#endif
@ -3677,7 +3694,7 @@ std::string SystemTools::RelativePath(const std::string& local,
std::string SystemTools::GetActualCaseForPath(const std::string& p)
{
#ifdef _WIN32
return SystemToolsStatic::GetCasePathName(p);
return SystemToolsStatic::GetCasePathName(p, false);
#else
return p;
#endif