From: Joel Rosdahl Date: Tue, 6 Jul 2021 06:57:50 +0000 (+0200) Subject: Add util::split_path_list function and remove PATH_DELIM macro X-Git-Tag: v4.4~149 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=49548d72986f3087cc6a72cfac0747400dc2a309;p=thirdparty%2Fccache.git Add util::split_path_list function and remove PATH_DELIM macro --- diff --git a/src/Context.cpp b/src/Context.cpp index 27b404813..d61a68b41 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -24,6 +24,8 @@ #include "Util.hpp" #include "hashutil.hpp" +#include + #include #include #include @@ -43,7 +45,7 @@ Context::Context() Logging::init(config); ignore_header_paths = - Util::split_into_strings(config.ignore_headers_in_manifest(), PATH_DELIM); + util::split_path_list(config.ignore_headers_in_manifest()); set_ignore_options(Util::split_into_strings(config.ignore_options(), " ")); // Set default umask for all files created by ccache from now on (if diff --git a/src/ccache.cpp b/src/ccache.cpp index cdaf8ffcb..65daa54a2 100644 --- a/src/ccache.cpp +++ b/src/ccache.cpp @@ -1370,8 +1370,8 @@ hash_common_info(const Context& ctx, } if (!ctx.config.extra_files_to_hash().empty()) { - for (const std::string& path : Util::split_into_strings( - ctx.config.extra_files_to_hash(), PATH_DELIM)) { + for (const std::string& path : + util::split_path_list(ctx.config.extra_files_to_hash())) { LOG("Hashing extra file {}", path); hash.hash_delimiter("extrafile"); if (!hash_binary_file(ctx, hash, path)) { diff --git a/src/execute.cpp b/src/execute.cpp index 86d0a8084..4f7a9a6bd 100644 --- a/src/execute.cpp +++ b/src/execute.cpp @@ -270,7 +270,7 @@ find_executable_in_path(const std::string& name, // Search the path looking for the first compiler of the right name that isn't // us. - for (const std::string& dir : Util::split_into_strings(path, PATH_DELIM)) { + for (const std::string& dir : util::split_path_list(path)) { #ifdef _WIN32 char namebuf[MAX_PATH]; int ret = SearchPath( diff --git a/src/system.hpp b/src/system.hpp index 424891f7e..99fe9287c 100644 --- a/src/system.hpp +++ b/src/system.hpp @@ -174,10 +174,8 @@ const mode_t S_IWUSR = mode_t(_S_IWRITE); # define STDIN_FILENO 0 # define STDOUT_FILENO 1 # define STDERR_FILENO 2 -# define PATH_DELIM ";" #else # define DLLIMPORT -# define PATH_DELIM ":" #endif DLLIMPORT extern char** environ; diff --git a/src/util/path_utils.cpp b/src/util/path_utils.cpp index de5f81f46..2d6b80f08 100644 --- a/src/util/path_utils.cpp +++ b/src/util/path_utils.cpp @@ -18,10 +18,15 @@ #include "path_utils.hpp" -#include #include #include +#ifdef _WIN32 +const char k_path_delimiter[] = ";"; +#else +const char k_path_delimiter[] = ":"; +#endif + namespace util { bool @@ -36,6 +41,12 @@ is_absolute_path(nonstd::string_view path) return !path.empty() && path[0] == '/'; } +std::vector +split_path_list(nonstd::string_view path_list) +{ + return Util::split_into_strings(path_list, k_path_delimiter); +} + std::string to_absolute_path(nonstd::string_view path) { diff --git a/src/util/path_utils.hpp b/src/util/path_utils.hpp index 3ef23cbaf..6e81a683d 100644 --- a/src/util/path_utils.hpp +++ b/src/util/path_utils.hpp @@ -21,12 +21,17 @@ #include #include +#include namespace util { // Return whether `path` is absolute. bool is_absolute_path(nonstd::string_view path); +// Split a list of paths (such as the content of $PATH on Unix platforms or +// %PATH% on Windows platforms) into paths. +std::vector split_path_list(nonstd::string_view path_list); + // Make `path` an absolute path. std::string to_absolute_path(nonstd::string_view path); diff --git a/unittest/test_util_path_utils.cpp b/unittest/test_util_path_utils.cpp index 0d6a773e1..038e37ff8 100644 --- a/unittest/test_util_path_utils.cpp +++ b/unittest/test_util_path_utils.cpp @@ -38,6 +38,31 @@ TEST_CASE("util::is_absolute_path") CHECK(!util::is_absolute_path("foo/fie")); } +TEST_CASE("util::split_path_list") +{ + CHECK(util::split_path_list("").empty()); + { + const auto v = util::split_path_list("a"); + REQUIRE(v.size() == 1); + CHECK(v[0] == "a"); + } + { + const auto v = util::split_path_list("a/b"); + REQUIRE(v.size() == 1); + CHECK(v[0] == "a/b"); + } + { +#ifdef _WIN32 + const auto v = util::split_path_list("a/b;c"); +#else + const auto v = util::split_path_list("a/b:c"); +#endif + REQUIRE(v.size() == 2); + CHECK(v[0] == "a/b"); + CHECK(v[1] == "c"); + } +} + TEST_CASE("util::to_absolute_path") { CHECK(util::to_absolute_path("/foo/bar") == "/foo/bar");