From cc144ebfd8b3a7b89e07c3b22b6a9e8540e5d0e2 Mon Sep 17 00:00:00 2001 From: KWSys Robot Date: Mon, 28 Sep 2015 09:29:33 -0400 Subject: [PATCH] KWSys 2015-09-28 (2089567a) Extract upstream KWSys using the following shell commands. $ git archive --prefix=upstream-kwsys/ 2089567a | tar x $ git shortlog --no-merges --abbrev=8 --format='%h %s' dc4e4a55..2089567a Vitaly Baranov (1): 2089567a SystemTools: Fix GetPath to not affect existing output vector entries --- SystemTools.cxx | 3 ++- testSystemTools.cxx | 63 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/SystemTools.cxx b/SystemTools.cxx index 80289b8f5..262af278e 100644 --- a/SystemTools.cxx +++ b/SystemTools.cxx @@ -408,6 +408,7 @@ class SystemToolsPathCaseMap: // adds the elements of the env variable path to the arg passed in void SystemTools::GetPath(std::vector& path, const char* env) { + size_t const old_size = path.size(); #if defined(_WIN32) && !defined(__CYGWIN__) const char pathSep = ';'; #else @@ -445,7 +446,7 @@ void SystemTools::GetPath(std::vector& path, const char* env) done = true; } } - for(std::vector::iterator i = path.begin(); + for(std::vector::iterator i = path.begin() + old_size; i != path.end(); ++i) { SystemTools::ConvertToUnixSlashes(*i); diff --git a/testSystemTools.cxx b/testSystemTools.cxx index e14d2fc4e..a0f904f72 100644 --- a/testSystemTools.cxx +++ b/testSystemTools.cxx @@ -28,6 +28,7 @@ #include #include +#include #include /* strcmp */ #if defined(_WIN32) && !defined(__CYGWIN__) # include /* _umask (MSVC) / umask (Borland) */ @@ -790,6 +791,66 @@ static bool CheckCollapsePath() return res; } +static std::string StringVectorToString(const std::vector& vec) +{ + std::stringstream ss; + ss << "vector("; + for (std::vector::const_iterator i = vec.begin(); + i != vec.end(); ++i) + { + if (i != vec.begin()) + { + ss << ", "; + } + ss << *i; + } + ss << ")"; + return ss.str(); +} + +static bool CheckGetPath() +{ + const char* envName = "S"; +#ifdef _WIN32 + const char* envValue = "C:\\Somewhere\\something;D:\\Temp"; +#else + const char* envValue = "/Somewhere/something:/tmp"; +#endif + const char* registryPath = "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MyApp; MyKey]"; + + std::vector originalPathes; + originalPathes.push_back(registryPath); + + std::vector expectedPathes; + expectedPathes.push_back(registryPath); +#ifdef _WIN32 + expectedPathes.push_back("C:/Somewhere/something"); + expectedPathes.push_back("D:/Temp"); +#else + expectedPathes.push_back("/Somewhere/something"); + expectedPathes.push_back("/tmp"); +#endif + + bool res = true; + res &= CheckPutEnv(std::string(envName) + "=" + envValue, envName, envValue); + + std::vector pathes = originalPathes; + kwsys::SystemTools::GetPath(pathes, envName); + + if (pathes != expectedPathes) + { + std::cerr << + "GetPath(" << StringVectorToString(originalPathes) << + ", " << envName << ") yielded " << StringVectorToString(pathes) << + " instead of " << StringVectorToString(expectedPathes) << + std::endl; + res = false; + } + + res &= CheckUnPutEnv(envName, envName); + return res; +} + //---------------------------------------------------------------------------- int testSystemTools(int, char*[]) { @@ -825,5 +886,7 @@ int testSystemTools(int, char*[]) res &= CheckCollapsePath(); + res &= CheckGetPath(); + return res ? 0 : 1; }