Use SDL_GetBasePath for better portability
+#include <SDL2/SDL.h>
#include <stdio.h>
#include <string.h>
-#ifdef __APPLE__
-#include <mach-o/dyld.h>
-#endif
-#ifdef _WIN32
-#include <direct.h>
-#include <windows.h>
-#endif
-#ifdef __linux__
-#include <assert.h>
-#include <unistd.h>
-#endif
#include "utils.h"
const char *executable_folder(void)
{
- static char path[1024] = {0,};
- if (path[0]) {
- return path;
+ static const char *ret = NULL;
+ if (!ret) {
+ ret = SDL_GetBasePath();
+ if (!ret) {
+ ret = "./";
}
- /* Ugly unportable code! :( */
-#ifdef __APPLE__
- unsigned int length = sizeof(path) - 1;
- _NSGetExecutablePath(&path[0], &length);
-#else
-#ifdef __linux__
- ssize_t __attribute__((unused)) length = readlink("/proc/self/exe", &path[0], sizeof(path) - 1);
- assert (length != -1);
-#else
-#ifdef _WIN32
- HMODULE hModule = GetModuleHandle(NULL);
- GetModuleFileName(hModule, path, sizeof(path) - 1);
-#else
- /* No OS-specific way, assume running from CWD */
- getcwd(&path[0], sizeof(path) - 1);
- return path;
-#endif
-#endif
-#endif
- size_t pos = strlen(path);
- while (pos) {
- pos--;
-#ifdef _WIN32
- if (path[pos] == '\\') {
-#else
- if (path[pos] == '/') {
-#endif
- path[pos] = 0;
- break;
}
- }
- return path;
+ return ret;
}
char *executable_relative_path(const char *filename)
{
static char path[1024];
- snprintf(path, sizeof(path), "%s/%s", executable_folder(), filename);
+ snprintf(path, sizeof(path), "%s%s", executable_folder(), filename);
return path;
}
