77 lines
1.6 KiB
C
77 lines
1.6 KiB
C
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#ifdef __APPLE__
|
||
|
#include <mach-o/dyld.h>
|
||
|
#endif
|
||
|
#ifdef _WIN32
|
||
|
#include <direct.h>
|
||
|
#include <windows.h>
|
||
|
#endif
|
||
|
#include "utils.h"
|
||
|
|
||
|
const char *executable_folder(void)
|
||
|
{
|
||
|
static char path[1024] = {0,};
|
||
|
if (path[0]) {
|
||
|
return path;
|
||
|
}
|
||
|
/* Ugly unportable code! :( */
|
||
|
#ifdef __APPLE__
|
||
|
unsigned int length = sizeof(path) - 1;
|
||
|
_NSGetExecutablePath(&path[0], &length);
|
||
|
#else
|
||
|
#ifdef __linux__
|
||
|
ssize_t 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;
|
||
|
}
|
||
|
|
||
|
char *executable_relative_path(const char *filename)
|
||
|
{
|
||
|
static char path[1024];
|
||
|
snprintf(path, sizeof(path), "%s/%s", executable_folder(), filename);
|
||
|
return path;
|
||
|
}
|
||
|
|
||
|
|
||
|
void replace_extension(const char *src, size_t length, char *dest, const char *ext)
|
||
|
{
|
||
|
memcpy(dest, src, length);
|
||
|
dest[length] = 0;
|
||
|
|
||
|
/* Remove extension */
|
||
|
for (size_t i = length; i--;) {
|
||
|
if (dest[i] == '/') break;
|
||
|
if (dest[i] == '.') {
|
||
|
dest[i] = 0;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Add new extension */
|
||
|
strcat(dest, ext);
|
||
|
}
|