From 18ce5f73bee0290ec7dd8eac7d4c931fa3893465 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 13 Mar 2015 05:03:50 +0100 Subject: [PATCH] Take RARCH_INTERNAL code from file_path.c out of libretro-common --- Makefile.common | 1 + file_path_special.c | 213 +++++++++++++++++++++++ griffin/griffin.c | 1 + libretro-common/file/file_path.c | 183 ------------------- libretro-common/include/file/file_path.h | 35 ++++ tools/retroarch-joyconfig-griffin.c | 1 + 6 files changed, 251 insertions(+), 183 deletions(-) create mode 100644 file_path_special.c diff --git a/Makefile.common b/Makefile.common index 6502224bff..fce3020d39 100644 --- a/Makefile.common +++ b/Makefile.common @@ -103,6 +103,7 @@ OBJ += frontend/frontend.o \ file_ops.o \ libretro-common/file//nbio/nbio_stdio.o \ libretro-common/file/file_path.o \ + file_path_special.o \ hash.o \ audio/audio_driver.o \ audio/audio_monitor.o \ diff --git a/file_path_special.c b/file_path_special.c new file mode 100644 index 0000000000..65ab4b90b5 --- /dev/null +++ b/file_path_special.c @@ -0,0 +1,213 @@ +/* Copyright (C) 2010-2015 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (file_path.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __HAIKU__ +#include +#endif + +#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP) +#include /* stat() is defined here */ +#endif + +#if defined(__CELLOS_LV2__) + +#ifndef S_ISDIR +#define S_ISDIR(x) (x & 0040000) +#endif + +#endif + +#if defined(_WIN32) +#ifdef _MSC_VER +#define setmode _setmode +#endif +#ifdef _XBOX +#include +#define INVALID_FILE_ATTRIBUTES -1 +#else +#include +#include +#include +#include +#endif +#else +#include +#include +#include +#include +#endif + +void fill_pathname_expand_special(char *out_path, + const char *in_path, size_t size) +{ +#if !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++; + } + } + else if ((in_path[0] == ':') && +#ifdef _WIN32 + ((in_path[1] == '/') || (in_path[1] == '\\')) +#else + (in_path[1] == '/') +#endif + ) + { + char application_dir[PATH_MAX_LENGTH]; + fill_pathname_application_path(application_dir, sizeof(application_dir)); + path_basedir(application_dir); + + size_t src_size = strlcpy(out_path, application_dir, size); + rarch_assert(src_size < size); + + out_path += src_size; + size -= src_size; + in_path += 2; + } +#endif + + rarch_assert(strlcpy(out_path, in_path, size) < size); +} + + +void fill_pathname_abbreviate_special(char *out_path, + const char *in_path, size_t size) +{ +#if !defined(RARCH_CONSOLE) + unsigned i; + + const char *home = getenv("HOME"); + char application_dir[PATH_MAX_LENGTH]; + fill_pathname_application_path(application_dir, sizeof(application_dir)); + path_basedir(application_dir); + + /* application_dir could be zero-string. Safeguard against this. + * + * Keep application dir in front of home, moving app dir to a + * new location inside home would break otherwise. */ + + const char *candidates[3] = { application_dir, home, NULL }; + const char *notations[3] = { ":", "~", NULL }; + + for (i = 0; candidates[i]; i++) + { + if (*candidates[i] && strstr(in_path, candidates[i]) == in_path) + { + size_t src_size = strlcpy(out_path, notations[i], size); + rarch_assert(src_size < size); + + out_path += src_size; + size -= src_size; + in_path += strlen(candidates[i]); + + if (!path_char_is_slash(*in_path)) + { + rarch_assert(strlcpy(out_path, path_default_slash(), size) < size); + out_path++; + size--; + } + + break; /* Don't allow more abbrevs to take place. */ + } + } +#endif + + rarch_assert(strlcpy(out_path, in_path, size) < size); +} + +#if !defined(RARCH_CONSOLE) +void fill_pathname_application_path(char *buf, size_t size) +{ + size_t i; + (void)i; + if (!size) + return; + +#ifdef _WIN32 + DWORD ret = GetModuleFileName(GetModuleHandle(NULL), buf, size - 1); + buf[ret] = '\0'; +#elif defined(__APPLE__) + CFBundleRef bundle = CFBundleGetMainBundle(); + if (bundle) + { + CFURLRef bundle_url = CFBundleCopyBundleURL(bundle); + CFStringRef bundle_path = CFURLCopyPath(bundle_url); + CFStringGetCString(bundle_path, buf, size, kCFStringEncodingUTF8); + CFRelease(bundle_path); + CFRelease(bundle_url); + + rarch_assert(strlcat(buf, "nobin", size) < size); + return; + } +#elif defined(__HAIKU__) + image_info info; + int32 cookie = 0; + + while (get_next_image_info(0, &cookie, &info) == B_OK) + { + if (info.type == B_APP_IMAGE) + { + strlcpy(buf, info.name, size); + return; + } + } +#else + *buf = '\0'; + pid_t pid = getpid(); + char link_path[PATH_MAX_LENGTH]; + /* Linux, BSD and Solaris paths. Not standardized. */ + static const char *exts[] = { "exe", "file", "path/a.out" }; + for (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; + } + } + + /* Cannot resolve application path! This should not happen. */ +#endif +} +#endif diff --git a/griffin/griffin.c b/griffin/griffin.c index 6f48307f26..4d3a975837 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -556,6 +556,7 @@ FILE ============================================================ */ #include "../content.c" #include "../libretro-common/file/file_path.c" +#include "../file_path_special.c" #include "../libretro-common/file/dir_list.c" #include "../libretro-common/string/string_list.c" #include "../file_ops.c" diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index c638e3cf0b..c14d2bf470 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -101,39 +101,6 @@ char *path_remove_extension(char *path) return last; } -/** - * path_char_is_slash: - * @c : character - * - * Checks if character (@c) is a slash. - * - * Returns: true (1) if character is a slash, otherwise false (0). - */ -static bool path_char_is_slash(char c) -{ -#ifdef _WIN32 - return (c == '/') || (c == '\\'); -#else - return (c == '/'); -#endif -} - -/** - * path_default_slash: - * - * Gets the default slash separator. - * - * Returns: default slash separator. - */ -static const char *path_default_slash(void) -{ -#ifdef _WIN32 - return "\\"; -#else - return "/"; -#endif -} - /** * path_contains_compressed_file: * @path : path @@ -695,49 +662,6 @@ void fill_pathname_join_delim(char *out_path, const char *dir, rarch_assert(strlcat(out_path, path, size) < size); } -#if defined(RARCH_INTERNAL) -void fill_pathname_expand_special(char *out_path, - const char *in_path, size_t size) -{ -#if !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++; - } - } - else if ((in_path[0] == ':') && -#ifdef _WIN32 - ((in_path[1] == '/') || (in_path[1] == '\\')) -#else - (in_path[1] == '/') -#endif - ) - { - char application_dir[PATH_MAX_LENGTH]; - fill_pathname_application_path(application_dir, sizeof(application_dir)); - path_basedir(application_dir); - - size_t src_size = strlcpy(out_path, application_dir, size); - rarch_assert(src_size < size); - - out_path += src_size; - size -= src_size; - in_path += 2; - } -#endif - - rarch_assert(strlcpy(out_path, in_path, size) < size); -} -#endif - /** * fill_short_pathname_representation: * @out_rep : output representation @@ -776,110 +700,3 @@ void fill_short_pathname_representation(char* out_rep, else strlcpy(out_rep,path_short, size); } - -#if defined(RARCH_INTERNAL) -void fill_pathname_abbreviate_special(char *out_path, - const char *in_path, size_t size) -{ -#if !defined(RARCH_CONSOLE) - unsigned i; - - const char *home = getenv("HOME"); - char application_dir[PATH_MAX_LENGTH]; - fill_pathname_application_path(application_dir, sizeof(application_dir)); - path_basedir(application_dir); - - /* application_dir could be zero-string. Safeguard against this. - * - * Keep application dir in front of home, moving app dir to a - * new location inside home would break otherwise. */ - - const char *candidates[3] = { application_dir, home, NULL }; - const char *notations[3] = { ":", "~", NULL }; - - for (i = 0; candidates[i]; i++) - { - if (*candidates[i] && strstr(in_path, candidates[i]) == in_path) - { - size_t src_size = strlcpy(out_path, notations[i], size); - rarch_assert(src_size < size); - - out_path += src_size; - size -= src_size; - in_path += strlen(candidates[i]); - - if (!path_char_is_slash(*in_path)) - { - rarch_assert(strlcpy(out_path, path_default_slash(), size) < size); - out_path++; - size--; - } - - break; /* Don't allow more abbrevs to take place. */ - } - } -#endif - - rarch_assert(strlcpy(out_path, in_path, size) < size); -} - -#if !defined(RARCH_CONSOLE) -void fill_pathname_application_path(char *buf, size_t size) -{ - size_t i; - (void)i; - if (!size) - return; - -#ifdef _WIN32 - DWORD ret = GetModuleFileName(GetModuleHandle(NULL), buf, size - 1); - buf[ret] = '\0'; -#elif defined(__APPLE__) - CFBundleRef bundle = CFBundleGetMainBundle(); - if (bundle) - { - CFURLRef bundle_url = CFBundleCopyBundleURL(bundle); - CFStringRef bundle_path = CFURLCopyPath(bundle_url); - CFStringGetCString(bundle_path, buf, size, kCFStringEncodingUTF8); - CFRelease(bundle_path); - CFRelease(bundle_url); - - rarch_assert(strlcat(buf, "nobin", size) < size); - return; - } -#elif defined(__HAIKU__) - image_info info; - int32 cookie = 0; - - while (get_next_image_info(0, &cookie, &info) == B_OK) - { - if (info.type == B_APP_IMAGE) - { - strlcpy(buf, info.name, size); - return; - } - } -#else - *buf = '\0'; - pid_t pid = getpid(); - char link_path[PATH_MAX_LENGTH]; - /* Linux, BSD and Solaris paths. Not standardized. */ - static const char *exts[] = { "exe", "file", "path/a.out" }; - for (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; - } - } - - /* Cannot resolve application path! This should not happen. */ -#endif -} -#endif - -#endif diff --git a/libretro-common/include/file/file_path.h b/libretro-common/include/file/file_path.h index d204627ae0..1a9db7f89b 100644 --- a/libretro-common/include/file/file_path.h +++ b/libretro-common/include/file/file_path.h @@ -29,6 +29,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -350,6 +352,39 @@ void fill_pathname_expand_special(char *out_path, void fill_pathname_abbreviate_special(char *out_path, const char *in_path, size_t size); +/** + * path_char_is_slash: + * @c : character + * + * Checks if character (@c) is a slash. + * + * Returns: true (1) if character is a slash, otherwise false (0). + */ +static INLINE bool path_char_is_slash(char c) +{ +#ifdef _WIN32 + return (c == '/') || (c == '\\'); +#else + return (c == '/'); +#endif +} + +/** + * path_default_slash: + * + * Gets the default slash separator. + * + * Returns: default slash separator. + */ +static INLINE const char *path_default_slash(void) +{ +#ifdef _WIN32 + return "\\"; +#else + return "/"; +#endif +} + /** * fill_pathname_slash: * @path : path diff --git a/tools/retroarch-joyconfig-griffin.c b/tools/retroarch-joyconfig-griffin.c index 9cf1fabd9f..916e6925ff 100644 --- a/tools/retroarch-joyconfig-griffin.c +++ b/tools/retroarch-joyconfig-griffin.c @@ -43,6 +43,7 @@ #include "../libretro-common/file/config_file.c" #include "../libretro-common/file/file_path.c" +#include "../file_path_special.c" #include "../libretro-common/string/string_list.c" #include "../libretro-common/compat/compat.c"