Merge branch 'upstream-KWSys' into update-kwsys
# By KWSys Upstream * upstream-KWSys: KWSys 2022-07-22 (ac792bf7)
This commit is contained in:
commit
6d84355274
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user