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:
Marek Kraus 2022-12-06 16:09:22 +01:00 committed by GitHub
commit b9a2baae13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -26,6 +26,29 @@ static struct arg_lit* reset;
static struct arg_end* end;
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
get_binary_folder(char* buffer, uint32_t buffer_size) {
#ifdef __linux__
@ -33,6 +56,9 @@ get_binary_folder(char* buffer, uint32_t buffer_size) {
return -1;
}
char* pos = strrchr(buffer, '/');
#elif defined(__APPLE__)
get_executable_path(buffer, buffer_size);
char* pos = strrchr(buffer, '/');
#else
if (GetModuleFileName(NULL, buffer, buffer_size) <= 0) {
return -1;