diff --git a/configuration.c b/configuration.c index 0f6ee0a82c..4a09693356 100644 --- a/configuration.c +++ b/configuration.c @@ -2233,7 +2233,7 @@ bool config_load_override(void) if (system) core_name = system->info.library_name; - game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + game_name = path_basename_special(path_get(RARCH_PATH_BASENAME)); if (string_is_empty(core_name) || string_is_empty(game_name)) return false; @@ -2390,7 +2390,7 @@ bool config_load_remap(void) if (system) core_name = system->info.library_name; - game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + game_name = path_basename_special(path_get(RARCH_PATH_BASENAME)); if (string_is_empty(core_name) || string_is_empty(game_name)) return false; @@ -2492,7 +2492,7 @@ bool config_load_shader_preset(void) if (system) core_name = system->info.library_name; - game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + game_name = path_basename_special(path_get(RARCH_PATH_BASENAME)); if (string_is_empty(core_name) || string_is_empty(game_name)) return false; @@ -3092,7 +3092,7 @@ bool config_save_overrides(int override_type) if (system) core_name = system->info.library_name; - game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + game_name = path_basename_special(path_get(RARCH_PATH_BASENAME)); if (string_is_empty(core_name) || string_is_empty(game_name)) return false; diff --git a/file_path_special.c b/file_path_special.c index 349359790d..674dc4f4b8 100644 --- a/file_path_special.c +++ b/file_path_special.c @@ -534,3 +534,25 @@ void path_basedir_wrapper(char *path) else snprintf(path, 3, ".%s", path_default_slash()); } + +/** + * path_basename: + * @path : path + * + * Get basename from @path. + * + * Returns: basename from path. + **/ +const char *path_basename_special(const char *path) +{ +#ifdef HAVE_COMPRESSION + /* We cut either at the first compression-related + * hash or the last slash; whichever comes last. */ + const char *delim = path_get_archive_delim(path); + + if (delim) + return delim + 1; +#endif + + return path_basename(path); +} diff --git a/file_path_special.h b/file_path_special.h index 521866143a..ae79fc3031 100644 --- a/file_path_special.h +++ b/file_path_special.h @@ -21,6 +21,9 @@ #include #include +#include + +RETRO_BEGIN_DECLS enum file_path_enum { @@ -118,6 +121,16 @@ enum application_special_type void fill_short_pathname_representation_wrapper(char* out_rep, const char *in_path, size_t size); +/** + * path_basename_special: + * @path : path + * + * Get basename from @path. + * + * Returns: basename from path. + **/ +const char *path_basename_special(const char *path); + /** * path_basedir: * @path : path @@ -133,4 +146,6 @@ bool fill_pathname_application_data(char *s, size_t len); void fill_pathname_application_special(char *s, size_t len, enum application_special_type type); +RETRO_END_DECLS + #endif diff --git a/gfx/drivers_shader/glslang_util.cpp b/gfx/drivers_shader/glslang_util.cpp index 6f0793f103..9916a3c7bd 100644 --- a/gfx/drivers_shader/glslang_util.cpp +++ b/gfx/drivers_shader/glslang_util.cpp @@ -28,6 +28,8 @@ #include "glslang_util.hpp" #include "glslang.hpp" +#include "../../file_path_special.h" + #include "../../verbosity.h" using namespace std; @@ -40,7 +42,7 @@ static bool read_shader_file(const char *path, vector *output, bool root char *ptr = NULL; char *buf = nullptr; ssize_t len = 0; - const char *basename = path_basename(path); + const char *basename = path_basename_special(path); include_path[0] = tmp[0] = '\0'; diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index a58e7d3a78..03d7277348 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -510,16 +510,8 @@ void path_parent_dir(char *path) **/ const char *path_basename(const char *path) { - /* We cut either at the first compression-related hash or the last slash; whichever comes last */ const char *last = find_last_slash(path); -#ifdef HAVE_COMPRESSION - const char *delim = path_get_archive_delim(path); - - if (delim) - return delim + 1; -#endif - if (last) return last + 1; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 6a4fcecf39..5d39610bba 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -1412,7 +1412,7 @@ static void menu_action_setting_disp_set_label_core_option_create( strlcpy(s, "", len); if (!string_is_empty(path_get(RARCH_PATH_BASENAME))) - strlcpy(s, path_basename(path_get(RARCH_PATH_BASENAME)), len); + strlcpy(s, path_basename_special(path_get(RARCH_PATH_BASENAME)), len); strlcpy(s2, path, len2); } diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index ba16d33d66..58ce5ca41c 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1693,7 +1693,7 @@ static int generic_action_ok_shader_preset_save(const char *path, break; case ACTION_OK_SHADER_PRESET_SAVE_GAME: { - const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + const char *game_name = path_basename_special(path_get(RARCH_PATH_BASENAME)); fill_pathname_join(file, directory, game_name, sizeof(file)); } break; @@ -1803,7 +1803,8 @@ static int generic_action_ok_remap_file_save(const char *path, case ACTION_OK_REMAP_FILE_SAVE_GAME: if (!string_is_empty(core_name)) fill_pathname_join(file, core_name, - path_basename(path_get(RARCH_PATH_BASENAME)), sizeof(file)); + path_basename_special(path_get(RARCH_PATH_BASENAME)), + sizeof(file)); break; } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 3c9492f837..fc1beffe6d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3413,7 +3413,7 @@ static int menu_displaylist_parse_cores( path = str_list->elems[i].data; if (!string_is_empty(info->path)) - path = path_basename(path); + path = path_basename_special(path); #ifndef HAVE_DYNAMIC if (frontend_driver_has_fork()) diff --git a/retroarch.c b/retroarch.c index af54841baa..f7b9857d5f 100644 --- a/retroarch.c +++ b/retroarch.c @@ -908,7 +908,7 @@ bool retroarch_validate_game_options(char *s, size_t len, bool mkdir) if (system) core_name = system->info.library_name; - game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + game_name = path_basename_special(path_get(RARCH_PATH_BASENAME)); if (string_is_empty(core_name) || string_is_empty(game_name)) return false; diff --git a/tasks/task_content.c b/tasks/task_content.c index 57db1866cd..91a860c914 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -393,7 +393,7 @@ static bool load_content_from_compressed_archive( attributes.i = 0; fill_pathname_join(new_path, new_basedir, - path_basename(path), sizeof(new_path)); + path_basename_special(path), sizeof(new_path)); ret = file_archive_compressed_read(path, NULL, new_path, &new_path_len); diff --git a/tasks/task_decompress.c b/tasks/task_decompress.c index 709270d65a..8f527210df 100644 --- a/tasks/task_decompress.c +++ b/tasks/task_decompress.c @@ -328,7 +328,7 @@ bool task_push_decompress( t->user_data = user_data; snprintf(tmp, sizeof(tmp), "%s '%s'", - msg_hash_to_str(MSG_EXTRACTING), path_basename(source_file)); + msg_hash_to_str(MSG_EXTRACTING), path_basename_special(source_file)); t->title = strdup(tmp); diff --git a/tasks/task_http.c b/tasks/task_http.c index a34b4853e4..4002816186 100644 --- a/tasks/task_http.c +++ b/tasks/task_http.c @@ -23,6 +23,8 @@ #include #include +#include "../file_path_special.h" + #include "../msg_hash.h" #include "../verbosity.h" #include "tasks_internal.h" @@ -291,7 +293,7 @@ void *task_push_http_transfer(const char *url, bool mute, const char *type, t->progress = -1; snprintf(tmp, sizeof(tmp), "%s '%s'", - msg_hash_to_str(MSG_DOWNLOADING), path_basename(url)); + msg_hash_to_str(MSG_DOWNLOADING), path_basename_special(url)); t->title = strdup(tmp); diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index d80479cac2..d7d32d4efa 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -202,7 +202,8 @@ static bool screenshot_dump( else { if (settings->auto_screenshot_filename) - fill_str_dated_filename(state->shotname, path_basename(name_base), + fill_str_dated_filename(state->shotname, + path_basename(name_base), IMG_EXT, sizeof(state->shotname)); else snprintf(state->shotname, sizeof(state->shotname),