Merge branch 'upstream-KWSys' into update-kwsys
* upstream-KWSys: KWSys 2018-02-01 (04fcc449)
This commit is contained in:
commit
be46f9fb6e
@ -496,6 +496,16 @@ IF(KWSYS_USE_SystemTools)
|
|||||||
KWSYS_CXX_STAT_HAS_ST_MTIM=${KWSYS_CXX_STAT_HAS_ST_MTIM}
|
KWSYS_CXX_STAT_HAS_ST_MTIM=${KWSYS_CXX_STAT_HAS_ST_MTIM}
|
||||||
KWSYS_CXX_STAT_HAS_ST_MTIMESPEC=${KWSYS_CXX_STAT_HAS_ST_MTIMESPEC}
|
KWSYS_CXX_STAT_HAS_ST_MTIMESPEC=${KWSYS_CXX_STAT_HAS_ST_MTIMESPEC}
|
||||||
)
|
)
|
||||||
|
IF(NOT WIN32)
|
||||||
|
IF(KWSYS_STANDALONE)
|
||||||
|
OPTION(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES "If true, Windows paths will be supported on Unix as well" ON)
|
||||||
|
ENDIF()
|
||||||
|
IF(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES)
|
||||||
|
SET_PROPERTY(SOURCE SystemTools.cxx testSystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
|
||||||
|
KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES
|
||||||
|
)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
# Disable getpwnam for static linux builds since it depends on shared glibc
|
# Disable getpwnam for static linux builds since it depends on shared glibc
|
||||||
GET_PROPERTY(SHARED_LIBS_SUPPORTED GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
|
GET_PROPERTY(SHARED_LIBS_SUPPORTED GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
|
||||||
|
@ -1884,21 +1884,23 @@ static void ConvertVMSToUnix(std::string& path)
|
|||||||
// convert windows slashes to unix slashes
|
// convert windows slashes to unix slashes
|
||||||
void SystemTools::ConvertToUnixSlashes(std::string& path)
|
void SystemTools::ConvertToUnixSlashes(std::string& path)
|
||||||
{
|
{
|
||||||
|
if (path.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const char* pathCString = path.c_str();
|
const char* pathCString = path.c_str();
|
||||||
bool hasDoubleSlash = false;
|
bool hasDoubleSlash = false;
|
||||||
#ifdef __VMS
|
#ifdef __VMS
|
||||||
ConvertVMSToUnix(path);
|
ConvertVMSToUnix(path);
|
||||||
#else
|
#else
|
||||||
const char* pos0 = pathCString;
|
const char* pos0 = pathCString;
|
||||||
const char* pos1 = pathCString + 1;
|
|
||||||
for (std::string::size_type pos = 0; *pos0; ++pos) {
|
for (std::string::size_type pos = 0; *pos0; ++pos) {
|
||||||
// make sure we don't convert an escaped space to a unix slash
|
if (*pos0 == '\\') {
|
||||||
if (*pos0 == '\\' && *pos1 != ' ') {
|
|
||||||
path[pos] = '/';
|
path[pos] = '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also, reuse the loop to check for slash followed by another slash
|
// Also, reuse the loop to check for slash followed by another slash
|
||||||
if (*pos1 == '/' && *(pos1 + 1) == '/' && !hasDoubleSlash) {
|
if (!hasDoubleSlash && *(pos0 + 1) == '/' && *(pos0 + 2) == '/') {
|
||||||
#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.
|
||||||
@ -1911,15 +1913,14 @@ void SystemTools::ConvertToUnixSlashes(std::string& path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pos0++;
|
pos0++;
|
||||||
pos1++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasDoubleSlash) {
|
if (hasDoubleSlash) {
|
||||||
SystemTools::ReplaceString(path, "//", "/");
|
SystemTools::ReplaceString(path, "//", "/");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// remove any trailing slash
|
// remove any trailing slash
|
||||||
if (!path.empty()) {
|
|
||||||
// if there is a tilda ~ then replace it with HOME
|
// if there is a tilda ~ then replace it with HOME
|
||||||
pathCString = path.c_str();
|
pathCString = path.c_str();
|
||||||
if (pathCString[0] == '~' &&
|
if (pathCString[0] == '~' &&
|
||||||
@ -1949,7 +1950,6 @@ void SystemTools::ConvertToUnixSlashes(std::string& path)
|
|||||||
path.resize(size - 1);
|
path.resize(size - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -3171,8 +3171,8 @@ void SystemTools::CheckTranslationPath(std::string& path)
|
|||||||
|
|
||||||
static void SystemToolsAppendComponents(
|
static void SystemToolsAppendComponents(
|
||||||
std::vector<std::string>& out_components,
|
std::vector<std::string>& out_components,
|
||||||
std::vector<std::string>::const_iterator first,
|
std::vector<std::string>::iterator first,
|
||||||
std::vector<std::string>::const_iterator last)
|
std::vector<std::string>::iterator last)
|
||||||
{
|
{
|
||||||
static const std::string up = "..";
|
static const std::string up = "..";
|
||||||
static const std::string cur = ".";
|
static const std::string cur = ".";
|
||||||
@ -3182,7 +3182,11 @@ static void SystemToolsAppendComponents(
|
|||||||
out_components.resize(out_components.size() - 1);
|
out_components.resize(out_components.size() - 1);
|
||||||
}
|
}
|
||||||
} else if (!i->empty() && *i != cur) {
|
} else if (!i->empty() && *i != cur) {
|
||||||
|
#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
|
||||||
|
out_components.push_back(std::move(*i));
|
||||||
|
#else
|
||||||
out_components.push_back(*i);
|
out_components.push_back(*i);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3190,63 +3194,18 @@ static void SystemToolsAppendComponents(
|
|||||||
std::string SystemTools::CollapseFullPath(const std::string& in_path,
|
std::string SystemTools::CollapseFullPath(const std::string& in_path,
|
||||||
const char* in_base)
|
const char* in_base)
|
||||||
{
|
{
|
||||||
// Collect the output path components.
|
|
||||||
std::vector<std::string> out_components;
|
|
||||||
|
|
||||||
// Split the input path components.
|
|
||||||
std::vector<std::string> path_components;
|
|
||||||
SystemTools::SplitPath(in_path, path_components);
|
|
||||||
|
|
||||||
// If the input path is relative, start with a base path.
|
|
||||||
if (path_components[0].empty()) {
|
|
||||||
std::vector<std::string> base_components;
|
|
||||||
if (in_base) {
|
|
||||||
// Use the given base path.
|
|
||||||
SystemTools::SplitPath(in_base, base_components);
|
|
||||||
} else {
|
|
||||||
// Use the current working directory as a base path.
|
// Use the current working directory as a base path.
|
||||||
char buf[2048];
|
char buf[2048];
|
||||||
|
const char* res_in_base = in_base;
|
||||||
|
if (!res_in_base) {
|
||||||
if (const char* cwd = Getcwd(buf, 2048)) {
|
if (const char* cwd = Getcwd(buf, 2048)) {
|
||||||
SystemTools::SplitPath(cwd, base_components);
|
res_in_base = cwd;
|
||||||
} else {
|
} else {
|
||||||
base_components.push_back("");
|
res_in_base = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append base path components to the output path.
|
return SystemTools::CollapseFullPath(in_path, std::string(res_in_base));
|
||||||
out_components.push_back(base_components[0]);
|
|
||||||
SystemToolsAppendComponents(out_components, base_components.begin() + 1,
|
|
||||||
base_components.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append input path components to the output path.
|
|
||||||
SystemToolsAppendComponents(out_components, path_components.begin(),
|
|
||||||
path_components.end());
|
|
||||||
|
|
||||||
// Transform the path back to a string.
|
|
||||||
std::string newPath = SystemTools::JoinPath(out_components);
|
|
||||||
|
|
||||||
// Update the translation table with this potentially new path. I am not
|
|
||||||
// sure why this line is here, it seems really questionable, but yet I
|
|
||||||
// would put good money that if I remove it something will break, basically
|
|
||||||
// from what I can see it created a mapping from the collapsed path, to be
|
|
||||||
// replaced by the input path, which almost completely does the opposite of
|
|
||||||
// this function, the only thing preventing this from happening a lot is
|
|
||||||
// that if the in_path has a .. in it, then it is not added to the
|
|
||||||
// translation table. So for most calls this either does nothing due to the
|
|
||||||
// .. or it adds a translation between identical paths as nothing was
|
|
||||||
// collapsed, so I am going to try to comment it out, and see what hits the
|
|
||||||
// fan, hopefully quickly.
|
|
||||||
// Commented out line below:
|
|
||||||
// SystemTools::AddTranslationPath(newPath, in_path);
|
|
||||||
|
|
||||||
SystemTools::CheckTranslationPath(newPath);
|
|
||||||
#ifdef _WIN32
|
|
||||||
newPath = SystemTools::GetActualCaseForPath(newPath);
|
|
||||||
SystemTools::ConvertToUnixSlashes(newPath);
|
|
||||||
#endif
|
|
||||||
// Return the reconstructed path.
|
|
||||||
return newPath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string SystemTools::CollapseFullPath(const std::string& in_path,
|
std::string SystemTools::CollapseFullPath(const std::string& in_path,
|
||||||
@ -3258,9 +3217,10 @@ std::string SystemTools::CollapseFullPath(const std::string& in_path,
|
|||||||
// Split the input path components.
|
// Split the input path components.
|
||||||
std::vector<std::string> path_components;
|
std::vector<std::string> path_components;
|
||||||
SystemTools::SplitPath(in_path, path_components);
|
SystemTools::SplitPath(in_path, path_components);
|
||||||
|
out_components.reserve(path_components.size());
|
||||||
|
|
||||||
// If the input path is relative, start with a base path.
|
// If the input path is relative, start with a base path.
|
||||||
if (path_components[0].length() == 0) {
|
if (path_components[0].empty()) {
|
||||||
std::vector<std::string> base_components;
|
std::vector<std::string> base_components;
|
||||||
// Use the given base path.
|
// Use the given base path.
|
||||||
SystemTools::SplitPath(in_base, base_components);
|
SystemTools::SplitPath(in_base, base_components);
|
||||||
@ -3619,7 +3579,7 @@ std::string SystemTools::JoinPath(
|
|||||||
|
|
||||||
// All remaining components are always separated with a slash.
|
// All remaining components are always separated with a slash.
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
result.append("/");
|
result.push_back('/');
|
||||||
result.append((*first++));
|
result.append((*first++));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3715,7 +3675,12 @@ std::string SystemTools::GetFilenamePath(const std::string& filename)
|
|||||||
*/
|
*/
|
||||||
std::string SystemTools::GetFilenameName(const std::string& filename)
|
std::string SystemTools::GetFilenameName(const std::string& filename)
|
||||||
{
|
{
|
||||||
std::string::size_type slash_pos = filename.find_last_of("/\\");
|
#if defined(_WIN32) || defined(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES)
|
||||||
|
const char* separators = "/\\";
|
||||||
|
#else
|
||||||
|
char separators = '/';
|
||||||
|
#endif
|
||||||
|
std::string::size_type slash_pos = filename.find_last_of(separators);
|
||||||
if (slash_pos != std::string::npos) {
|
if (slash_pos != std::string::npos) {
|
||||||
return filename.substr(slash_pos + 1);
|
return filename.substr(slash_pos + 1);
|
||||||
} else {
|
} else {
|
||||||
|
@ -39,19 +39,19 @@ typedef unsigned short mode_t;
|
|||||||
static const char* toUnixPaths[][2] = {
|
static const char* toUnixPaths[][2] = {
|
||||||
{ "/usr/local/bin/passwd", "/usr/local/bin/passwd" },
|
{ "/usr/local/bin/passwd", "/usr/local/bin/passwd" },
|
||||||
{ "/usr/lo cal/bin/pa sswd", "/usr/lo cal/bin/pa sswd" },
|
{ "/usr/lo cal/bin/pa sswd", "/usr/lo cal/bin/pa sswd" },
|
||||||
{ "/usr/lo\\ cal/bin/pa\\ sswd", "/usr/lo\\ cal/bin/pa\\ sswd" },
|
{ "/usr/lo\\ cal/bin/pa\\ sswd", "/usr/lo/ cal/bin/pa/ sswd" },
|
||||||
{ "c:/usr/local/bin/passwd", "c:/usr/local/bin/passwd" },
|
{ "c:/usr/local/bin/passwd", "c:/usr/local/bin/passwd" },
|
||||||
{ "c:/usr/lo cal/bin/pa sswd", "c:/usr/lo cal/bin/pa sswd" },
|
{ "c:/usr/lo cal/bin/pa sswd", "c:/usr/lo cal/bin/pa sswd" },
|
||||||
{ "c:/usr/lo\\ cal/bin/pa\\ sswd", "c:/usr/lo\\ cal/bin/pa\\ sswd" },
|
{ "c:/usr/lo\\ cal/bin/pa\\ sswd", "c:/usr/lo/ cal/bin/pa/ sswd" },
|
||||||
{ "\\usr\\local\\bin\\passwd", "/usr/local/bin/passwd" },
|
{ "\\usr\\local\\bin\\passwd", "/usr/local/bin/passwd" },
|
||||||
{ "\\usr\\lo cal\\bin\\pa sswd", "/usr/lo cal/bin/pa sswd" },
|
{ "\\usr\\lo cal\\bin\\pa sswd", "/usr/lo cal/bin/pa sswd" },
|
||||||
{ "\\usr\\lo\\ cal\\bin\\pa\\ sswd", "/usr/lo\\ cal/bin/pa\\ sswd" },
|
{ "\\usr\\lo\\ cal\\bin\\pa\\ sswd", "/usr/lo/ cal/bin/pa/ sswd" },
|
||||||
{ "c:\\usr\\local\\bin\\passwd", "c:/usr/local/bin/passwd" },
|
{ "c:\\usr\\local\\bin\\passwd", "c:/usr/local/bin/passwd" },
|
||||||
{ "c:\\usr\\lo cal\\bin\\pa sswd", "c:/usr/lo cal/bin/pa sswd" },
|
{ "c:\\usr\\lo cal\\bin\\pa sswd", "c:/usr/lo cal/bin/pa sswd" },
|
||||||
{ "c:\\usr\\lo\\ cal\\bin\\pa\\ sswd", "c:/usr/lo\\ cal/bin/pa\\ sswd" },
|
{ "c:\\usr\\lo\\ cal\\bin\\pa\\ sswd", "c:/usr/lo/ cal/bin/pa/ sswd" },
|
||||||
{ "\\\\usr\\local\\bin\\passwd", "//usr/local/bin/passwd" },
|
{ "\\\\usr\\local\\bin\\passwd", "//usr/local/bin/passwd" },
|
||||||
{ "\\\\usr\\lo cal\\bin\\pa sswd", "//usr/lo cal/bin/pa sswd" },
|
{ "\\\\usr\\lo cal\\bin\\pa sswd", "//usr/lo cal/bin/pa sswd" },
|
||||||
{ "\\\\usr\\lo\\ cal\\bin\\pa\\ sswd", "//usr/lo\\ cal/bin/pa\\ sswd" },
|
{ "\\\\usr\\lo\\ cal\\bin\\pa\\ sswd", "//usr/lo/ cal/bin/pa/ sswd" },
|
||||||
{ KWSYS_NULLPTR, KWSYS_NULLPTR }
|
{ KWSYS_NULLPTR, KWSYS_NULLPTR }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -700,6 +700,16 @@ static bool CheckCollapsePath()
|
|||||||
bool res = true;
|
bool res = true;
|
||||||
res &= CheckCollapsePath("/usr/share/*", "/usr/share/*");
|
res &= CheckCollapsePath("/usr/share/*", "/usr/share/*");
|
||||||
res &= CheckCollapsePath("C:/Windows/*", "C:/Windows/*");
|
res &= CheckCollapsePath("C:/Windows/*", "C:/Windows/*");
|
||||||
|
res &= CheckCollapsePath("/usr/share/../lib", "/usr/lib");
|
||||||
|
res &= CheckCollapsePath("/usr/share/./lib", "/usr/share/lib");
|
||||||
|
res &= CheckCollapsePath("/usr/share/../../lib", "/lib");
|
||||||
|
res &= CheckCollapsePath("/usr/share/.././../lib", "/lib");
|
||||||
|
res &= CheckCollapsePath("/../lib", "/lib");
|
||||||
|
res &= CheckCollapsePath("/../lib/", "/lib");
|
||||||
|
res &= CheckCollapsePath("/", "/");
|
||||||
|
res &= CheckCollapsePath("C:/", "C:/");
|
||||||
|
res &= CheckCollapsePath("C:/../", "C:/");
|
||||||
|
res &= CheckCollapsePath("C:/../../", "C:/");
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -764,20 +774,26 @@ static bool CheckGetFilenameName()
|
|||||||
const char* windowsFilepath = "C:\\somewhere\\something";
|
const char* windowsFilepath = "C:\\somewhere\\something";
|
||||||
const char* unixFilepath = "/somewhere/something";
|
const char* unixFilepath = "/somewhere/something";
|
||||||
|
|
||||||
std::string expectedFilename = "something";
|
#if defined(_WIN32) || defined(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES)
|
||||||
|
std::string expectedWindowsFilename = "something";
|
||||||
|
#else
|
||||||
|
std::string expectedWindowsFilename = "C:\\somewhere\\something";
|
||||||
|
#endif
|
||||||
|
std::string expectedUnixFilename = "something";
|
||||||
|
|
||||||
bool res = true;
|
bool res = true;
|
||||||
std::string filename = kwsys::SystemTools::GetFilenameName(windowsFilepath);
|
std::string filename = kwsys::SystemTools::GetFilenameName(windowsFilepath);
|
||||||
if (filename != expectedFilename) {
|
if (filename != expectedWindowsFilename) {
|
||||||
std::cerr << "GetFilenameName(" << windowsFilepath << ") yielded "
|
std::cerr << "GetFilenameName(" << windowsFilepath << ") yielded "
|
||||||
<< filename << " instead of " << expectedFilename << std::endl;
|
<< filename << " instead of " << expectedWindowsFilename
|
||||||
|
<< std::endl;
|
||||||
res = false;
|
res = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = kwsys::SystemTools::GetFilenameName(unixFilepath);
|
filename = kwsys::SystemTools::GetFilenameName(unixFilepath);
|
||||||
if (filename != expectedFilename) {
|
if (filename != expectedUnixFilename) {
|
||||||
std::cerr << "GetFilenameName(" << unixFilepath << ") yielded " << filename
|
std::cerr << "GetFilenameName(" << unixFilepath << ") yielded " << filename
|
||||||
<< " instead of " << expectedFilename << std::endl;
|
<< " instead of " << expectedUnixFilename << std::endl;
|
||||||
res = false;
|
res = false;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
Loading…
Reference in New Issue
Block a user