mirror of
https://github.com/libretro/RetroArch
synced 2025-04-11 00:44:20 +00:00
Add relative-to-application querying to config.
This commit is contained in:
parent
c100b1371c
commit
2588e60180
@ -563,7 +563,7 @@ bool config_get_array(config_file_t *conf, const char *key, char *buf, size_t si
|
|||||||
|
|
||||||
bool config_get_path(config_file_t *conf, const char *key, char *buf, size_t size)
|
bool config_get_path(config_file_t *conf, const char *key, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32) || defined(RARCH_CONSOLE)
|
#if defined(RARCH_CONSOLE)
|
||||||
return config_get_array(conf, key, buf, size);
|
return config_get_array(conf, key, buf, size);
|
||||||
#else
|
#else
|
||||||
struct config_entry_list *list = conf->entries;
|
struct config_entry_list *list = conf->entries;
|
||||||
@ -573,6 +573,7 @@ bool config_get_path(config_file_t *conf, const char *key, char *buf, size_t siz
|
|||||||
if (strcmp(key, list->key) == 0)
|
if (strcmp(key, list->key) == 0)
|
||||||
{
|
{
|
||||||
const char *value = list->value;
|
const char *value = list->value;
|
||||||
|
|
||||||
if (*value == '~')
|
if (*value == '~')
|
||||||
{
|
{
|
||||||
const char *home = getenv("HOME");
|
const char *home = getenv("HOME");
|
||||||
@ -587,6 +588,27 @@ bool config_get_path(config_file_t *conf, const char *key, char *buf, size_t siz
|
|||||||
value++;
|
value++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ((*value == ':') &&
|
||||||
|
#ifdef _WIN32
|
||||||
|
((value[1] == '/') || (value[1] == '\\'))
|
||||||
|
#else
|
||||||
|
(value[1] == '/'))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
char application_dir[PATH_MAX];
|
||||||
|
fill_pathname_application_path(application_dir, sizeof(application_dir));
|
||||||
|
|
||||||
|
RARCH_LOG("[Config]: Querying application path: %s.\n", application_dir);
|
||||||
|
path_basedir(application_dir);
|
||||||
|
|
||||||
|
size_t src_size = strlcpy(buf, application_dir, size);
|
||||||
|
if (src_size >= size)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
buf += src_size;
|
||||||
|
size -= src_size;
|
||||||
|
value += 2;
|
||||||
|
}
|
||||||
|
|
||||||
return strlcpy(buf, value, size) < size;
|
return strlcpy(buf, value, size) < size;
|
||||||
}
|
}
|
||||||
|
4
file.h
4
file.h
@ -131,6 +131,10 @@ void fill_pathname_resolve_relative(char *out_path, const char *in_refpath, cons
|
|||||||
// Joins a directory and path together. Makes sure not to get two consecutive slashes between dir and path.
|
// Joins a directory and path together. Makes sure not to get two consecutive slashes between dir and path.
|
||||||
void fill_pathname_join(char *out_path, const char *dir, const char *path, size_t size);
|
void fill_pathname_join(char *out_path, const char *dir, const char *path, size_t size);
|
||||||
|
|
||||||
|
#ifndef RARCH_CONSOLE
|
||||||
|
void fill_pathname_application_path(char *buf, size_t size);
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t convert_char_to_wchar(wchar_t *out_wchar, const char *in_char, size_t size);
|
size_t convert_char_to_wchar(wchar_t *out_wchar, const char *in_char, size_t size);
|
||||||
size_t convert_wchar_to_char(char *out_char, const wchar_t *in_wchar, size_t size);
|
size_t convert_wchar_to_char(char *out_char, const wchar_t *in_wchar, size_t size);
|
||||||
|
|
||||||
|
32
file_path.c
32
file_path.c
@ -45,6 +45,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void string_list_free(struct string_list *list)
|
void string_list_free(struct string_list *list)
|
||||||
@ -536,6 +537,37 @@ void fill_pathname_join(char *out_path, const char *dir, const char *path, size_
|
|||||||
rarch_assert(strlcat(out_path, path, size) < size);
|
rarch_assert(strlcat(out_path, path, size) < size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef RARCH_CONSOLE
|
||||||
|
void fill_pathname_application_path(char *buf, size_t size)
|
||||||
|
{
|
||||||
|
if (!size)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
DWORD ret = GetModuleFileName(GetModuleHandle(NULL), buf, size - 1);
|
||||||
|
buf[ret] = '\0';
|
||||||
|
#else
|
||||||
|
|
||||||
|
*buf = '\0';
|
||||||
|
pid_t pid = getpid();
|
||||||
|
char link_path[PATH_MAX];
|
||||||
|
static const char *exts[] = { "exe", "file", "path/a.out" }; // Linux, BSD and Solaris paths. Not standardized.
|
||||||
|
for (unsigned i = 0; i < ARRAY_SIZE(exts); i++)
|
||||||
|
{
|
||||||
|
snprintf(link_path, sizeof(link_path), "/proc/%u/%s", (unsigned)pid, exts[i]);
|
||||||
|
ssize_t ret = readlink(link_path, buf, size - 1);
|
||||||
|
if (ret >= 0)
|
||||||
|
{
|
||||||
|
buf[ret] = '\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RARCH_ERR("Cannot resolve application path! This should not happen.\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t convert_char_to_wchar(wchar_t *out_wchar, const char *in_char, size_t size)
|
size_t convert_char_to_wchar(wchar_t *out_wchar, const char *in_char, size_t size)
|
||||||
{
|
{
|
||||||
return mbstowcs(out_wchar, in_char, size / sizeof(wchar_t));
|
return mbstowcs(out_wchar, in_char, size / sizeof(wchar_t));
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../general.h"
|
#include "../general.h"
|
||||||
|
#include "conf/config_file.h"
|
||||||
|
#include "../file.h"
|
||||||
|
|
||||||
#ifdef HAVE_RGUI
|
#ifdef HAVE_RGUI
|
||||||
#include "../frontend/menu/rgui.h"
|
#include "../frontend/menu/rgui.h"
|
||||||
@ -33,6 +35,7 @@ int main(int argc, char *argv[])
|
|||||||
// Consoles use the higher level API.
|
// Consoles use the higher level API.
|
||||||
return rarch_main(argc, argv);
|
return rarch_main(argc, argv);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
rarch_init_msg_queue();
|
rarch_init_msg_queue();
|
||||||
|
|
||||||
int init_ret;
|
int init_ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user