]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
C++-ify same_executable_name
authorJoel Rosdahl <joel@rosdahl.net>
Tue, 28 Jul 2020 11:56:30 +0000 (13:56 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Tue, 28 Jul 2020 12:12:36 +0000 (14:12 +0200)
src/Util.cpp
src/Util.hpp
src/ccache.cpp
src/legacy_util.cpp
src/legacy_util.hpp
unittest/test_Util.cpp

index 6644962a727595a7a353e83d418b89bb903e3fc0..91a88e30ca4e0aa3d61279f8483e60e46440c2f2 100644 (file)
@@ -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)
 {
index 0f9b9b356b3b9c9221cf6715e94f2ee3a3e82769..480276f409fc17d26af83f6f5a6cd17f16989cfc 100644 (file)
@@ -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);
index c837ca00f188307a3fec02623519c18e7045f817..3f7ad4e58051a8bbf6df8e6109aa7c62643a0e34 100644 (file)
@@ -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);
index 9de72e69db494ece809958fd821e234722856ffd..dad04155fb1d656a51b7957e3b65a68d7b33afdd 100644 (file)
@@ -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)
index dfb67d817454bfb01edc4016b35a3fe759dc0f6c..74af3986b40b2082ccdd54bc554de51030873bf5 100644 (file)
@@ -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;
index eaa6965cdd34f614e78993a8cfe44d72a10c23f1..60a0304fcc20641db6f4f032d0b4fa896f0396ac 100644 (file)
@@ -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")
 {
   {