mirror of
https://github.com/pine64/blisp.git
synced 2024-12-22 22:40:15 +00:00
Merge pull request #3 from pine64/write
Modifications for MacOS to let it find data files in the same directory as the executable. This is totally wrong for a "normal" MacOS app bundle, but it follows the existing Linux convention.
This commit is contained in:
commit
b9a2baae13
@ -26,6 +26,29 @@ static struct arg_lit* reset;
|
|||||||
static struct arg_end* end;
|
static struct arg_end* end;
|
||||||
static void* cmd_write_argtable[6];
|
static void* cmd_write_argtable[6];
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
// Ugh. This stuff is just so messy without C++17 or Qt...
|
||||||
|
// These are not thread safe, but it doesn't place the responsibility
|
||||||
|
// to free an allocated buffer on the caller.nn
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static void get_executable_path(char* buffer_out, uint32_t max_size) {
|
||||||
|
assert (max_size >= PATH_MAX); // n.b. 1024 on MacOS. 4K on most Linux.
|
||||||
|
|
||||||
|
char raw_path_name[PATH_MAX]; // $HOME/../../var/tmp/x
|
||||||
|
char real_path_name[PATH_MAX]; // /var/tmp/x
|
||||||
|
uint32_t raw_path_size = sizeof(raw_path_name);
|
||||||
|
|
||||||
|
if(!_NSGetExecutablePath(raw_path_name, &raw_path_size)) {
|
||||||
|
realpath(raw_path_name, real_path_name);
|
||||||
|
}
|
||||||
|
// *real_path_name is appropriately sized and null terminated.
|
||||||
|
strcpy(buffer_out, real_path_name);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
get_binary_folder(char* buffer, uint32_t buffer_size) {
|
get_binary_folder(char* buffer, uint32_t buffer_size) {
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
@ -33,6 +56,9 @@ get_binary_folder(char* buffer, uint32_t buffer_size) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
char* pos = strrchr(buffer, '/');
|
char* pos = strrchr(buffer, '/');
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
get_executable_path(buffer, buffer_size);
|
||||||
|
char* pos = strrchr(buffer, '/');
|
||||||
#else
|
#else
|
||||||
if (GetModuleFileName(NULL, buffer, buffer_size) <= 0) {
|
if (GetModuleFileName(NULL, buffer, buffer_size) <= 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user