mirror of
https://github.com/libretro/RetroArch
synced 2025-03-25 16:44:01 +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 \
|
file_ops.o \
|
||||||
libretro-common/file//nbio/nbio_stdio.o \
|
libretro-common/file//nbio/nbio_stdio.o \
|
||||||
libretro-common/file/file_path.o \
|
libretro-common/file/file_path.o \
|
||||||
|
file_path_special.o \
|
||||||
hash.o \
|
hash.o \
|
||||||
audio/audio_driver.o \
|
audio/audio_driver.o \
|
||||||
audio/audio_monitor.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 "../content.c"
|
||||||
#include "../libretro-common/file/file_path.c"
|
#include "../libretro-common/file/file_path.c"
|
||||||
|
#include "../file_path_special.c"
|
||||||
#include "../libretro-common/file/dir_list.c"
|
#include "../libretro-common/file/dir_list.c"
|
||||||
#include "../libretro-common/string/string_list.c"
|
#include "../libretro-common/string/string_list.c"
|
||||||
#include "../file_ops.c"
|
#include "../file_ops.c"
|
||||||
|
@ -101,39 +101,6 @@ char *path_remove_extension(char *path)
|
|||||||
return last;
|
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_contains_compressed_file:
|
||||||
* @path : path
|
* @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);
|
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:
|
* fill_short_pathname_representation:
|
||||||
* @out_rep : output representation
|
* @out_rep : output representation
|
||||||
@ -776,110 +700,3 @@ void fill_short_pathname_representation(char* out_rep,
|
|||||||
else
|
else
|
||||||
strlcpy(out_rep,path_short, size);
|
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 <stddef.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <retro_inline.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -350,6 +352,39 @@ void fill_pathname_expand_special(char *out_path,
|
|||||||
void fill_pathname_abbreviate_special(char *out_path,
|
void fill_pathname_abbreviate_special(char *out_path,
|
||||||
const char *in_path, size_t size);
|
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:
|
* fill_pathname_slash:
|
||||||
* @path : path
|
* @path : path
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#include "../libretro-common/file/config_file.c"
|
#include "../libretro-common/file/config_file.c"
|
||||||
#include "../libretro-common/file/file_path.c"
|
#include "../libretro-common/file/file_path.c"
|
||||||
|
#include "../file_path_special.c"
|
||||||
#include "../libretro-common/string/string_list.c"
|
#include "../libretro-common/string/string_list.c"
|
||||||
#include "../libretro-common/compat/compat.c"
|
#include "../libretro-common/compat/compat.c"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user