mirror of
https://github.com/libretro/RetroArch
synced 2025-04-17 20:43:10 +00:00
Make path shell-style reading part of config reader.
This commit is contained in:
parent
6a169513c9
commit
bca1694183
@ -568,13 +568,45 @@ bool config_get_array(config_file_t *conf, const char *key, char *buf, size_t si
|
|||||||
while (list)
|
while (list)
|
||||||
{
|
{
|
||||||
if (strcmp(key, list->key) == 0)
|
if (strcmp(key, list->key) == 0)
|
||||||
|
return strlcpy(buf, list->value, size) < size;
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool config_get_path(config_file_t *conf, const char *key, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
strlcpy(buf, list->value, size);
|
#if defined(_WIN32) || defined(RARCH_CONSOLE)
|
||||||
return true;
|
return config_get_array(conf, key, buf, size);
|
||||||
|
#else
|
||||||
|
struct entry_list *list = conf->entries;
|
||||||
|
|
||||||
|
while (list)
|
||||||
|
{
|
||||||
|
if (strcmp(key, list->key) == 0)
|
||||||
|
{
|
||||||
|
const char *value = list->value;
|
||||||
|
if (*value == '~')
|
||||||
|
{
|
||||||
|
const char *home = getenv("HOME");
|
||||||
|
if (home)
|
||||||
|
{
|
||||||
|
size_t src_size = strlcpy(buf, home, size);
|
||||||
|
if (src_size >= size)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
buf += src_size;
|
||||||
|
size -= src_size;
|
||||||
|
value++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strlcpy(buf, value, size) < size;
|
||||||
}
|
}
|
||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool config_get_bool(config_file_t *conf, const char *key, bool *in)
|
bool config_get_bool(config_file_t *conf, const char *key, bool *in)
|
||||||
|
@ -63,6 +63,8 @@ bool config_get_char(config_file_t *conf, const char *entry, char *in);
|
|||||||
bool config_get_string(config_file_t *conf, const char *entry, char **in);
|
bool config_get_string(config_file_t *conf, const char *entry, char **in);
|
||||||
// Extracts a string to a preallocated buffer. Avoid memory allocation.
|
// Extracts a string to a preallocated buffer. Avoid memory allocation.
|
||||||
bool config_get_array(config_file_t *conf, const char *entry, char *in, size_t size);
|
bool config_get_array(config_file_t *conf, const char *entry, char *in, size_t size);
|
||||||
|
// Extracts a string to a preallocated buffer. Avoid memory allocation. Recognized magic like ~/. Similar to config_get_array() otherwise.
|
||||||
|
bool config_get_path(config_file_t *conf, const char *entry, char *in, size_t size);
|
||||||
// Extracts a boolean from config. Valid boolean true are "true" and "1". Valid false are "false" and "0". Other values will be treated as an error.
|
// Extracts a boolean from config. Valid boolean true are "true" and "1". Valid false are "false" and "0". Other values will be treated as an error.
|
||||||
bool config_get_bool(config_file_t *conf, const char *entry, bool *in);
|
bool config_get_bool(config_file_t *conf, const char *entry, bool *in);
|
||||||
|
|
||||||
|
@ -47,16 +47,21 @@
|
|||||||
#define CONFIG_GET_STRING_BASE(conf, base, var, key) \
|
#define CONFIG_GET_STRING_BASE(conf, base, var, key) \
|
||||||
config_get_array(conf, key, base.var, sizeof(base.var))
|
config_get_array(conf, key, base.var, sizeof(base.var))
|
||||||
|
|
||||||
|
#define CONFIG_GET_PATH_BASE(conf, base, var, key) \
|
||||||
|
config_get_path(conf, key, base.var, sizeof(base.var))
|
||||||
|
|
||||||
#define CONFIG_GET_BOOL(var, key) CONFIG_GET_BOOL_BASE(conf, g_settings, var, key)
|
#define CONFIG_GET_BOOL(var, key) CONFIG_GET_BOOL_BASE(conf, g_settings, var, key)
|
||||||
#define CONFIG_GET_INT(var, key) CONFIG_GET_INT_BASE(conf, g_settings, var, key)
|
#define CONFIG_GET_INT(var, key) CONFIG_GET_INT_BASE(conf, g_settings, var, key)
|
||||||
#define CONFIG_GET_UINT64(var, key) CONFIG_GET_UINT64_BASE(conf, g_settings, var, key)
|
#define CONFIG_GET_UINT64(var, key) CONFIG_GET_UINT64_BASE(conf, g_settings, var, key)
|
||||||
#define CONFIG_GET_FLOAT(var, key) CONFIG_GET_FLOAT_BASE(conf, g_settings, var, key)
|
#define CONFIG_GET_FLOAT(var, key) CONFIG_GET_FLOAT_BASE(conf, g_settings, var, key)
|
||||||
#define CONFIG_GET_STRING(var, key) CONFIG_GET_STRING_BASE(conf, g_settings, var, key)
|
#define CONFIG_GET_STRING(var, key) CONFIG_GET_STRING_BASE(conf, g_settings, var, key)
|
||||||
|
#define CONFIG_GET_PATH(var, key) CONFIG_GET_PATH_BASE(conf, g_settings, var, key)
|
||||||
|
|
||||||
#define CONFIG_GET_BOOL_EXTERN(var, key) CONFIG_GET_BOOL_BASE(conf, g_extern, var, key)
|
#define CONFIG_GET_BOOL_EXTERN(var, key) CONFIG_GET_BOOL_BASE(conf, g_extern, var, key)
|
||||||
#define CONFIG_GET_INT_EXTERN(var, key) CONFIG_GET_INT_BASE(conf, g_extern, var, key)
|
#define CONFIG_GET_INT_EXTERN(var, key) CONFIG_GET_INT_BASE(conf, g_extern, var, key)
|
||||||
#define CONFIG_GET_FLOAT_EXTERN(var, key) CONFIG_GET_FLOAT_BASE(conf, g_extern, var, key)
|
#define CONFIG_GET_FLOAT_EXTERN(var, key) CONFIG_GET_FLOAT_BASE(conf, g_extern, var, key)
|
||||||
#define CONFIG_GET_STRING_EXTERN(var, key) CONFIG_GET_STRING_BASE(conf, g_extern, var, key)
|
#define CONFIG_GET_STRING_EXTERN(var, key) CONFIG_GET_STRING_BASE(conf, g_extern, var, key)
|
||||||
|
#define CONFIG_GET_PATH_EXTERN(var, key) CONFIG_GET_PATH_BASE(conf, g_extern, var, key)
|
||||||
|
|
||||||
#ifdef RARCH_CONSOLE
|
#ifdef RARCH_CONSOLE
|
||||||
#define CONFIG_GET_BOOL_CONSOLE(var, key) CONFIG_GET_BOOL_BASE(conf, g_console, var, key)
|
#define CONFIG_GET_BOOL_CONSOLE(var, key) CONFIG_GET_BOOL_BASE(conf, g_console, var, key)
|
||||||
|
3
file.h
3
file.h
@ -99,9 +99,6 @@ void fill_pathname_base(char *out_path, const char *in_path, size_t size);
|
|||||||
// If in_path is a path without any slashes (relative current directory), out_path will get path ".".
|
// If in_path is a path without any slashes (relative current directory), out_path will get path ".".
|
||||||
void fill_pathname_basedir(char *out_path, const char *in_path, size_t size);
|
void fill_pathname_basedir(char *out_path, const char *in_path, size_t size);
|
||||||
|
|
||||||
// Copies string, and attempts to replace magic like ~/, etc with proper paths, like a shell would.
|
|
||||||
void fill_pathname_shell(char *out_path, const char *in_path, size_t size);
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
21
file_path.c
21
file_path.c
@ -424,27 +424,6 @@ void fill_pathname_basedir(char *out_dir, const char *in_path, size_t size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_pathname_shell(char *out_path, const char *in_path, size_t size)
|
|
||||||
{
|
|
||||||
#if !defined(_WIN32) && !defined(RARCH_CONSOLE)
|
|
||||||
if (*in_path == '~')
|
|
||||||
{
|
|
||||||
const char *home = getenv("HOME");
|
|
||||||
if (home)
|
|
||||||
{
|
|
||||||
size_t src_size = strlcpy(out_path, home, size);
|
|
||||||
rarch_assert(src_size < size);
|
|
||||||
|
|
||||||
out_path += src_size;
|
|
||||||
size -= src_size;
|
|
||||||
in_path++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
rarch_assert(strlcpy(out_path, in_path, size) < size);
|
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
||||||
|
50
settings.c
50
settings.c
@ -363,9 +363,9 @@ bool config_load_file(const char *path)
|
|||||||
CONFIG_GET_BOOL(video.aspect_ratio_auto, "video_aspect_ratio_auto");
|
CONFIG_GET_BOOL(video.aspect_ratio_auto, "video_aspect_ratio_auto");
|
||||||
CONFIG_GET_FLOAT(video.refresh_rate, "video_refresh_rate");
|
CONFIG_GET_FLOAT(video.refresh_rate, "video_refresh_rate");
|
||||||
|
|
||||||
CONFIG_GET_STRING(video.cg_shader_path, "video_cg_shader");
|
CONFIG_GET_PATH(video.cg_shader_path, "video_cg_shader");
|
||||||
CONFIG_GET_STRING(video.bsnes_shader_path, "video_bsnes_shader");
|
CONFIG_GET_PATH(video.bsnes_shader_path, "video_bsnes_shader");
|
||||||
CONFIG_GET_STRING(video.second_pass_shader, "video_second_pass_shader");
|
CONFIG_GET_PATH(video.second_pass_shader, "video_second_pass_shader");
|
||||||
CONFIG_GET_BOOL(video.render_to_texture, "video_render_to_texture");
|
CONFIG_GET_BOOL(video.render_to_texture, "video_render_to_texture");
|
||||||
CONFIG_GET_FLOAT(video.fbo_scale_x, "video_fbo_scale_x");
|
CONFIG_GET_FLOAT(video.fbo_scale_x, "video_fbo_scale_x");
|
||||||
CONFIG_GET_FLOAT(video.fbo_scale_y, "video_fbo_scale_y");
|
CONFIG_GET_FLOAT(video.fbo_scale_y, "video_fbo_scale_y");
|
||||||
@ -373,7 +373,7 @@ bool config_load_file(const char *path)
|
|||||||
CONFIG_GET_BOOL(video.allow_rotate, "video_allow_rotate");
|
CONFIG_GET_BOOL(video.allow_rotate, "video_allow_rotate");
|
||||||
|
|
||||||
#ifdef HAVE_FREETYPE
|
#ifdef HAVE_FREETYPE
|
||||||
CONFIG_GET_STRING(video.font_path, "video_font_path");
|
CONFIG_GET_PATH(video.font_path, "video_font_path");
|
||||||
CONFIG_GET_INT(video.font_size, "video_font_size");
|
CONFIG_GET_INT(video.font_size, "video_font_size");
|
||||||
CONFIG_GET_BOOL(video.font_enable, "video_font_enable");
|
CONFIG_GET_BOOL(video.font_enable, "video_font_enable");
|
||||||
CONFIG_GET_BOOL(video.font_scale, "video_font_scale");
|
CONFIG_GET_BOOL(video.font_scale, "video_font_scale");
|
||||||
@ -396,9 +396,9 @@ bool config_load_file(const char *path)
|
|||||||
CONFIG_GET_BOOL(video.gpu_screenshot, "video_gpu_screenshot");
|
CONFIG_GET_BOOL(video.gpu_screenshot, "video_gpu_screenshot");
|
||||||
|
|
||||||
#ifdef HAVE_DYLIB
|
#ifdef HAVE_DYLIB
|
||||||
CONFIG_GET_STRING(video.filter_path, "video_filter");
|
CONFIG_GET_PATH(video.filter_path, "video_filter");
|
||||||
CONFIG_GET_STRING(video.external_driver, "video_external_driver");
|
CONFIG_GET_PATH(video.external_driver, "video_external_driver");
|
||||||
CONFIG_GET_STRING(audio.external_driver, "audio_external_driver");
|
CONFIG_GET_PATH(audio.external_driver, "audio_external_driver");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_CG) || defined(HAVE_XML)
|
#if defined(HAVE_CG) || defined(HAVE_XML)
|
||||||
@ -416,8 +416,7 @@ bool config_load_file(const char *path)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_XML)
|
#if defined(HAVE_XML)
|
||||||
if (config_get_array(conf, "video_shader_dir", tmp_str, sizeof(tmp_str)))
|
CONFIG_GET_PATH(video.shader_dir, "video_shader_dir");
|
||||||
fill_pathname_shell(g_settings.video.shader_dir, tmp_str, sizeof(g_settings.video.shader_dir));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CONFIG_GET_FLOAT(input.axis_threshold, "input_axis_threshold");
|
CONFIG_GET_FLOAT(input.axis_threshold, "input_axis_threshold");
|
||||||
@ -442,15 +441,13 @@ bool config_load_file(const char *path)
|
|||||||
|
|
||||||
CONFIG_GET_STRING(video.driver, "video_driver");
|
CONFIG_GET_STRING(video.driver, "video_driver");
|
||||||
CONFIG_GET_STRING(audio.driver, "audio_driver");
|
CONFIG_GET_STRING(audio.driver, "audio_driver");
|
||||||
CONFIG_GET_STRING(audio.dsp_plugin, "audio_dsp_plugin");
|
CONFIG_GET_PATH(audio.dsp_plugin, "audio_dsp_plugin");
|
||||||
CONFIG_GET_STRING(input.driver, "input_driver");
|
CONFIG_GET_STRING(input.driver, "input_driver");
|
||||||
|
|
||||||
if (!*g_settings.libretro)
|
if (!*g_settings.libretro)
|
||||||
CONFIG_GET_STRING(libretro, "libretro_path");
|
CONFIG_GET_PATH(libretro, "libretro_path");
|
||||||
|
|
||||||
if (config_get_array(conf, "screenshot_directory", tmp_str, sizeof(tmp_str)))
|
|
||||||
fill_pathname_shell(g_settings.screenshot_directory, tmp_str, sizeof(g_settings.screenshot_directory));
|
|
||||||
|
|
||||||
|
CONFIG_GET_PATH(screenshot_directory, "screenshot_directory");
|
||||||
if (*g_settings.screenshot_directory && !path_is_directory(g_settings.screenshot_directory))
|
if (*g_settings.screenshot_directory && !path_is_directory(g_settings.screenshot_directory))
|
||||||
{
|
{
|
||||||
RARCH_WARN("screenshot_directory is not an existing directory, ignoring ...\n");
|
RARCH_WARN("screenshot_directory is not an existing directory, ignoring ...\n");
|
||||||
@ -471,8 +468,8 @@ bool config_load_file(const char *path)
|
|||||||
CONFIG_GET_BOOL(pause_nonactive, "pause_nonactive");
|
CONFIG_GET_BOOL(pause_nonactive, "pause_nonactive");
|
||||||
CONFIG_GET_INT(autosave_interval, "autosave_interval");
|
CONFIG_GET_INT(autosave_interval, "autosave_interval");
|
||||||
|
|
||||||
CONFIG_GET_STRING(cheat_database, "cheat_database_path");
|
CONFIG_GET_PATH(cheat_database, "cheat_database_path");
|
||||||
CONFIG_GET_STRING(cheat_settings_path, "cheat_settings_path");
|
CONFIG_GET_PATH(cheat_settings_path, "cheat_settings_path");
|
||||||
|
|
||||||
CONFIG_GET_BOOL(block_sram_overwrite, "block_sram_overwrite");
|
CONFIG_GET_BOOL(block_sram_overwrite, "block_sram_overwrite");
|
||||||
CONFIG_GET_BOOL(savestate_auto_index, "savestate_auto_index");
|
CONFIG_GET_BOOL(savestate_auto_index, "savestate_auto_index");
|
||||||
@ -494,36 +491,29 @@ bool config_load_file(const char *path)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_extern.has_set_save_path && config_get_array(conf, "savefile_directory", tmp_str, sizeof(tmp_str)))
|
if (!g_extern.has_set_save_path && config_get_path(conf, "savefile_directory", tmp_str, sizeof(tmp_str)))
|
||||||
{
|
{
|
||||||
char tmp[PATH_MAX];
|
if (path_is_directory(tmp_str))
|
||||||
fill_pathname_shell(tmp, tmp_str, sizeof(tmp));
|
|
||||||
|
|
||||||
if (path_is_directory(tmp))
|
|
||||||
{
|
{
|
||||||
strlcpy(g_extern.savefile_name_srm, tmp, sizeof(g_extern.savefile_name_srm));
|
strlcpy(g_extern.savefile_name_srm, tmp_str, sizeof(g_extern.savefile_name_srm));
|
||||||
fill_pathname_dir(g_extern.savefile_name_srm, g_extern.basename, ".srm", sizeof(g_extern.savefile_name_srm));
|
fill_pathname_dir(g_extern.savefile_name_srm, g_extern.basename, ".srm", sizeof(g_extern.savefile_name_srm));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
RARCH_WARN("savefile_directory is not a directory, ignoring ....\n");
|
RARCH_WARN("savefile_directory is not a directory, ignoring ....\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_extern.has_set_state_path && config_get_array(conf, "savestate_directory", tmp_str, sizeof(tmp_str)))
|
if (!g_extern.has_set_state_path && config_get_path(conf, "savestate_directory", tmp_str, sizeof(tmp_str)))
|
||||||
{
|
{
|
||||||
char tmp[PATH_MAX];
|
if (path_is_directory(tmp_str))
|
||||||
fill_pathname_shell(tmp, tmp_str, sizeof(tmp));
|
|
||||||
|
|
||||||
if (path_is_directory(tmp))
|
|
||||||
{
|
{
|
||||||
strlcpy(g_extern.savestate_name, tmp, sizeof(g_extern.savestate_name));
|
strlcpy(g_extern.savestate_name, tmp_str, sizeof(g_extern.savestate_name));
|
||||||
fill_pathname_dir(g_extern.savestate_name, g_extern.basename, ".state", sizeof(g_extern.savestate_name));
|
fill_pathname_dir(g_extern.savestate_name, g_extern.basename, ".state", sizeof(g_extern.savestate_name));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
RARCH_WARN("savestate_directory is not a directory, ignoring ...\n");
|
RARCH_WARN("savestate_directory is not a directory, ignoring ...\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config_get_array(conf, "system_directory", tmp_str, sizeof(tmp_str)))
|
CONFIG_GET_PATH(system_directory, "system_directory");
|
||||||
fill_pathname_shell(g_settings.system_directory, tmp_str, sizeof(g_settings.system_directory));
|
|
||||||
|
|
||||||
config_read_keybinds_conf(conf);
|
config_read_keybinds_conf(conf);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user