From 81f957b9f8c5972ef539c900da5f4763bcb96b8c Mon Sep 17 00:00:00 2001 From: Rubidium Date: Fri, 9 Jun 2023 16:44:42 +0200 Subject: [PATCH] Codechange: use std::string to find the executable's working directory --- src/fileio.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/fileio.cpp b/src/fileio.cpp index 29927236d5..0461b27a13 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -738,26 +738,28 @@ extern void DetermineBasePaths(const char *exe); */ static bool ChangeWorkingDirectoryToExecutable(const char *exe) { - char tmp[MAX_PATH]; - strecpy(tmp, exe, lastof(tmp)); + std::string path = exe; - bool success = false; #ifdef WITH_COCOA - char *app_bundle = strchr(tmp, '.'); - while (app_bundle != nullptr && !StrStartsWithIgnoreCase(app_bundle, ".app")) app_bundle = strchr(&app_bundle[1], '.'); - - if (app_bundle != nullptr) *app_bundle = '\0'; -#endif /* WITH_COCOA */ - char *s = strrchr(tmp, PATHSEPCHAR); - if (s != nullptr) { - *s = '\0'; - if (chdir(tmp) != 0) { - Debug(misc, 0, "Directory with the binary does not exist?"); - } else { - success = true; + for (size_t pos = path.find_first_of('.'); pos != std::string::npos; pos = path.find_first_of('.', pos + 1)) { + if (StrEqualsIgnoreCase(path.substr(pos, 4), ".app")) { + path.erase(pos); + break; } } - return success; +#endif /* WITH_COCOA */ + + size_t pos = path.find_last_of(PATHSEPCHAR); + if (pos == std::string::npos) return false; + + path.erase(pos); + + if (chdir(path.c_str()) != 0) { + Debug(misc, 0, "Directory with the binary does not exist?"); + return false; + } + + return true; } /**