From: Joel Rosdahl Date: Tue, 28 Jul 2020 11:56:30 +0000 (+0200) Subject: C++-ify same_executable_name X-Git-Tag: v4.0~275 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f10561ab47bb06094dd5e1a27ff2d7606da3c561;p=thirdparty%2Fccache.git C++-ify same_executable_name --- diff --git a/src/Util.cpp b/src/Util.cpp index 6644962a7..91a88e30c 100644 --- a/src/Util.cpp +++ b/src/Util.cpp @@ -1031,6 +1031,19 @@ remove_extension(string_view path) return path.substr(0, path.length() - get_extension(path).length()); } +bool +same_program_name(const std::string& program_name, + const std::string& canonical_program_name) +{ +#ifdef _WIN32 + std::string lowercase_program_name = Util::to_lowercase(program_name); + return lowercase_program_name == canonical_program_name + || lowercase_program_name == (canonical_program_name + ".exe"); +#else + return program_name == canonical_program_name; +#endif +} + void send_to_stderr(const std::string& text, bool strip_colors) { diff --git a/src/Util.hpp b/src/Util.hpp index 0f9b9b356..480276f40 100644 --- a/src/Util.hpp +++ b/src/Util.hpp @@ -318,6 +318,12 @@ std::string real_path(const std::string& path, // extension as determined by `get_extension()`. nonstd::string_view remove_extension(nonstd::string_view path); +// Detmine if `program_name` is equal to `canonical_program_name`. On Windows, +// this means performing a case insensitive equality check with and without a +// ".exe" suffix. On non-Windows, it is a simple equality check. +bool same_program_name(const std::string& program_name, + const std::string& canonical_program_name); + // Send `text` to STDERR_FILENO, optionally stripping ANSI color sequences if // `strip_colors` is true. Throws `Error` on error. void send_to_stderr(const std::string& text, bool strip_colors); diff --git a/src/ccache.cpp b/src/ccache.cpp index c837ca00f..3f7ad4e58 100644 --- a/src/ccache.cpp +++ b/src/ccache.cpp @@ -1728,7 +1728,7 @@ find_compiler(Context& ctx, const char* const* argv) { // We might be being invoked like "ccache gcc -c foo.c". std::string base(Util::base_name(argv[0])); - if (same_executable_name(base.c_str(), MYNAME)) { + if (Util::same_program_name(base, MYNAME)) { ctx.orig_args.pop_front(); if (is_full_path(ctx.orig_args[0].c_str())) { // A full path was given. @@ -2423,7 +2423,7 @@ ccache_main(int argc, const char* const* argv) try { // Check if we are being invoked as "ccache". std::string program_name(Util::base_name(argv[0])); - if (same_executable_name(program_name.c_str(), MYNAME)) { + if (Util::same_program_name(program_name, MYNAME)) { if (argc < 2) { fmt::print(stderr, USAGE_TEXT, MYNAME, MYNAME); x_exit(1); diff --git a/src/legacy_util.cpp b/src/legacy_util.cpp index 9de72e69d..dad04155f 100644 --- a/src/legacy_util.cpp +++ b/src/legacy_util.cpp @@ -185,23 +185,6 @@ get_home_directory() fatal("Could not determine home directory from $HOME or getpwuid(3)"); } -// Check whether s1 and s2 have the same executable name. -bool -same_executable_name(const char* s1, const char* s2) -{ -#ifdef _WIN32 - bool eq = strcasecmp(s1, s2) == 0; - if (!eq) { - char* tmp = format("%s.exe", s2); - eq = strcasecmp(s1, tmp) == 0; - free(tmp); - } - return eq; -#else - return str_eq(s1, s2); -#endif -} - // Return whether the argument is a full path. bool is_full_path(const char* path) diff --git a/src/legacy_util.hpp b/src/legacy_util.hpp index dfb67d817..74af3986b 100644 --- a/src/legacy_util.hpp +++ b/src/legacy_util.hpp @@ -34,7 +34,6 @@ void x_unsetenv(const char* name); struct tm* localtime_r(const time_t* timep, struct tm* result); #endif const char* get_home_directory(); -bool same_executable_name(const char* s1, const char* s2); bool is_full_path(const char* path); void update_mtime(const char* path); void x_exit(int status) ATTR_NORETURN; diff --git a/unittest/test_Util.cpp b/unittest/test_Util.cpp index eaa6965cd..60a0304fc 100644 --- a/unittest/test_Util.cpp +++ b/unittest/test_Util.cpp @@ -668,6 +668,18 @@ TEST_CASE("Util::remove_extension") CHECK(Util::remove_extension("/foo/bar/f.abc.txt") == "/foo/bar/f.abc"); } +TEST_CASE("Util::same_program_name") +{ + CHECK(Util::same_program_name("foo", "foo")); +#ifdef _WIN32 + CHECK(Util::same_program_name("FOO", "foo")); + CHECK(Util::same_program_name("FOO.exe", "foo")); +#else + CHECK(!Util::same_program_name("FOO", "foo")); + CHECK(!Util::same_program_name("FOO.exe", "foo")); +#endif +} + TEST_CASE("Util::split_into_views") { {