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)
{
// 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);
{
// 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.
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);
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)
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;
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")
{
{