mirror of
https://github.com/CTCaer/RetroArch.git
synced 2025-02-01 09:12:35 +00:00
Take RARCH_INTERNAL code from file_path.c out of libretro-common
This commit is contained in:
parent
f8926c494f
commit
18ce5f73be
@ -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 \
|
||||
|
213
file_path_special.c
Normal file
213
file_path_special.c
Normal file
@ -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 <file/file_path.h>
|
||||
#include <stdlib.h>
|
||||
#include <boolean.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <compat/strl.h>
|
||||
#include <compat/posix_string.h>
|
||||
#include <retro_miscellaneous.h>
|
||||
|
||||
#ifdef __HAIKU__
|
||||
#include <kernel/image.h>
|
||||
#endif
|
||||
|
||||
#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP)
|
||||
#include <unistd.h> /* 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 <xtl.h>
|
||||
#define INVALID_FILE_ATTRIBUTES -1
|
||||
#else
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
#include <direct.h>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
#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
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -29,6 +29,8 @@
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <retro_inline.h>
|
||||
|
||||
#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
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user