Skip to content

Commit e16e163

Browse files
committed
Fixed get folder of executable
1 parent 22b1e76 commit e16e163

File tree

1 file changed

+61
-27
lines changed

1 file changed

+61
-27
lines changed

src/utilities.cpp

Lines changed: 61 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,6 @@ std::string utilities::get_program_name(std::filesystem::path path) {
3636
return path.stem().string();
3737
}
3838

39-
#ifdef __linux__
40-
std::string utilities::get_executable_name(std::string program_name) {
41-
return program_name;
42-
}
43-
44-
std::string utilities::get_run_command(std::string program_name) {
45-
return "./" + utilities::get_executable_name(program_name);
46-
}
47-
#elif __APPLE__
48-
std::string utilities::get_executable_name(std::string program_name) {
49-
return program_name;
50-
}
51-
52-
std::string utilities::get_run_command(std::string program_name) {
53-
return "./" + utilities::get_executable_name(program_name);
54-
}
55-
#elif _WIN32
56-
std::string utilities::get_executable_name(std::string program_name) {
57-
return program_name + ".exe";
58-
}
59-
60-
std::string utilities::get_run_command(std::string program_name) {
61-
return ".\\" + utilities::get_executable_name(program_name);
62-
}
63-
#endif
64-
6539
std::string utilities::to_str(Set<ast::Type> set) {
6640
std::string output = "{";
6741
for (size_t i = 0; i < set.elements.size(); i++) {
@@ -75,6 +49,66 @@ std::string utilities::to_str(Set<ast::Type> set) {
7549
return output;
7650
}
7751

52+
#ifdef __linux__
53+
std::filesystem::path get_executable_path() {
54+
return std::filesystem::canonical("/proc/self/exe");
55+
}
56+
57+
std::string utilities::get_executable_name(std::string program_name) {
58+
return program_name;
59+
}
60+
61+
std::string utilities::get_run_command(std::string program_name) {
62+
return "./" + utilities::get_executable_name(program_name);
63+
}
64+
65+
#elif __APPLE__
66+
#include <mach-o/dyld.h>
67+
68+
std::filesystem::path get_executable_path() {
69+
// Get size of path
70+
uint32_t size = 0;
71+
_NSGetExecutablePath(NULL, &size);
72+
73+
// Get string
74+
std::string path;
75+
path.resize(size + 1);
76+
_NSGetExecutablePath(&path[0], &size);
77+
78+
// Return
79+
return std::filesystem::canonical(path);
80+
}
81+
82+
std::string utilities::get_executable_name(std::string program_name) {
83+
return program_name;
84+
}
85+
86+
std::string utilities::get_run_command(std::string program_name) {
87+
return "./" + utilities::get_executable_name(program_name);
88+
}
89+
90+
#elif _WIN32
91+
#include <Windows.h>
92+
93+
std::filesystem::path get_executable_path() {
94+
std::string path;
95+
while (true) {
96+
path.resize(path.size() + MAX_PATH);
97+
auto copied = GetModuleFileNameA(NULL, &path[0], path.size());
98+
if (copied + 1 < path.size()) break;
99+
}
100+
return std::filesystem::canonical(path);
101+
}
102+
103+
std::string utilities::get_executable_name(std::string program_name) {
104+
return program_name + ".exe";
105+
}
106+
107+
std::string utilities::get_run_command(std::string program_name) {
108+
return ".\\" + utilities::get_executable_name(program_name);
109+
}
110+
#endif
111+
78112
std::string utilities::get_folder_of_executable() {
79-
return std::filesystem::weakly_canonical(std::filesystem::path(get_run_command("diamond"))).parent_path().string();
113+
return get_executable_path().parent_path();
80114
}

0 commit comments

Comments
 (0)