@@ -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-
6539std::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+
78112std::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