This commit is contained in:
twinaphex 2017-12-16 02:59:52 +01:00
parent 77b098d35e
commit d211e40727
7 changed files with 130 additions and 76 deletions

View File

@ -190,5 +190,6 @@ SOURCES_C += $(LIBRETRO_COMM_DIR)/streams/file_stream.c \
$(LIBRETRO_COMM_DIR)/compat/compat_snprintf.c \
$(LIBRETRO_COMM_DIR)/compat/compat_posix_string.c \
$(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \
$(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \
$(LIBRETRO_COMM_DIR)/string/stdstring.c
endif

View File

@ -73,16 +73,6 @@ bool path_is_compressed_file(const char *path);
**/
#define path_contains_compressed_file(path) (path_get_archive_delim((path)) != NULL)
/**
* path_file_exists:
* @path : path
*
* Checks if a file already exists at the specified path (@path).
*
* Returns: true (1) if file already exists, otherwise false (0).
*/
bool path_file_exists(const char *path);
/**
* path_get_archive_delim:
* @path : path
@ -99,7 +89,7 @@ const char *path_get_archive_delim(const char *path);
* path_get_extension:
* @path : path
*
* Gets extension of file. Only '.'s
* Gets extension of file. Only '.'s
* after the last slash are considered.
*
* Returns: extension part from the path.
@ -130,7 +120,7 @@ const char *path_basename(const char *path);
/**
* path_basedir:
* @path : path
* @path : path
*
* Extracts base directory by mutating path.
* Keeps trailing '/'.
@ -170,7 +160,7 @@ bool path_is_absolute(const char *path);
* fill_pathname:
* @out_path : output path
* @in_path : input path
* @replace : what to replace
* @replace : what to replace
* @size : buffer size of output path
*
* FIXME: Verify
@ -182,10 +172,10 @@ bool path_is_absolute(const char *path);
* Only '.'s after the last slash are considered as extensions.
* If no '.' is present, in_path and replace will simply be concatenated.
* 'size' is buffer size of 'out_path'.
* E.g.: in_path = "/foo/bar/baz/boo.c", replace = ".asm" =>
* out_path = "/foo/bar/baz/boo.asm"
* E.g.: in_path = "/foo/bar/baz/boo.c", replace = ".asm" =>
* out_path = "/foo/bar/baz/boo.asm"
* E.g.: in_path = "/foo/bar/baz/boo.c", replace = "" =>
* out_path = "/foo/bar/baz/boo"
* out_path = "/foo/bar/baz/boo"
*/
void fill_pathname(char *out_path, const char *in_path,
const char *replace, size_t size);
@ -196,10 +186,10 @@ void fill_pathname(char *out_path, const char *in_path,
* @ext : extension of output filename
* @size : buffer size of output filename
*
* Creates a 'dated' filename prefixed by 'RetroArch', and
* Creates a 'dated' filename prefixed by 'RetroArch', and
* concatenates extension (@ext) to it.
*
* E.g.:
* E.g.:
* out_filename = "RetroArch-{month}{day}-{Hours}{Minutes}.{@ext}"
**/
void fill_dated_filename(char *out_filename,
@ -225,7 +215,7 @@ void fill_str_dated_filename(char *out_filename,
* fill_pathname_noext:
* @out_path : output path
* @in_path : input path
* @replace : what to replace
* @replace : what to replace
* @size : buffer size of output path
*
* Appends a filename extension 'replace' to 'in_path', and outputs
@ -270,7 +260,7 @@ void fill_pathname_dir(char *in_dir, const char *in_basename,
/**
* fill_pathname_base:
* @out : output path
* @out : output path
* @in_path : input path
* @size : size of output path
*
@ -287,7 +277,7 @@ void fill_pathname_base_ext(char *out,
/**
* fill_pathname_basedir:
* @out_dir : output directory
* @out_dir : output directory
* @in_path : input path
* @size : size of output directory
*
@ -302,7 +292,7 @@ void fill_pathname_basedir_noext(char *out_dir,
/**
* fill_pathname_parent_dir:
* @out_dir : output directory
* @out_dir : output directory
* @in_dir : input directory
* @size : size of output directory
*
@ -330,12 +320,12 @@ void fill_pathname_resolve_relative(char *out_path, const char *in_refpath,
/**
* fill_pathname_join:
* @out_path : output path
* @dir : directory
* @dir : directory
* @path : path
* @size : size of output path
*
* Joins a directory (@dir) and path (@path) together.
* Makes sure not to get two consecutive slashes
* Makes sure not to get two consecutive slashes
* between directory and path.
**/
void fill_pathname_join(char *out_path, const char *dir,
@ -347,7 +337,7 @@ void fill_pathname_join_special_ext(char *out_path,
size_t size);
void fill_pathname_join_concat(char *out_path,
const char *dir, const char *path,
const char *dir, const char *path,
const char *concat,
size_t size);
@ -357,12 +347,12 @@ void fill_pathname_join_noext(char *out_path,
/**
* fill_pathname_join_delim:
* @out_path : output path
* @dir : directory
* @dir : directory
* @path : path
* @delim : delimiter
* @delim : delimiter
* @size : size of output path
*
* Joins a directory (@dir) and path (@path) together
* Joins a directory (@dir) and path (@path) together
* using the given delimiter (@delim).
**/
void fill_pathname_join_delim(char *out_path, const char *dir,
@ -426,7 +416,7 @@ void fill_pathname_abbreviate_special(char *out_path,
#define path_default_slash() "/"
#endif
/**
/**
* fill_pathname_slash:
* @path : path
* @size : size of path

View File

@ -26,7 +26,7 @@
/*
This file is designed to normalize the libretro-common compiling environment.
It is not to be used in public API headers, as they should be designed as leanly as possible.
Nonetheless.. in the meantime, if you do something like use ssize_t, which is not fully portable,
Nonetheless.. in the meantime, if you do something like use ssize_t, which is not fully portable,
in a public API, you may need this.
*/

View File

@ -25,14 +25,14 @@
/*
This file is designed to normalize the libretro-common compiling environment
for public API headers. This should be leaner than a normal compiling environment,
for public API headers. This should be leaner than a normal compiling environment,
since it gets #included into other project's sources.
*/
/* ------------------------------------ */
/*
Ordinarily we want to put #ifdef __cplusplus extern "C" in C library
Ordinarily we want to put #ifdef __cplusplus extern "C" in C library
headers to enable them to get used by c++ sources.
However, we want to support building this library as C++ as well, so a
special technique is called for.
@ -75,19 +75,18 @@ typedef int ssize_t;
#include <sys/types.h>
#endif
#ifdef _WIN32
#define STRING_REP_INT64 "%I64u"
#define STRING_REP_UINT64 "%I64u"
#define STRING_REP_ULONG "%Iu"
#elif defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L && !defined(VITA) && !defined(WIIU)
#define STRING_REP_INT64 "%llu"
#define STRING_REP_UINT64 "%llu"
#define STRING_REP_ULONG "%zu"
#else
#define STRING_REP_INT64 "%llu"
#define STRING_REP_UINT64 "%llu"
#define STRING_REP_ULONG "%lu"
#ifdef _MSC_VER
#ifndef PRId64
#define PRId64 "I64d"
#define PRIu64 "I64u"
#define PRIuPTR "Iu"
#endif
#else
#include <inttypes.h>
#endif
#define STRING_REP_INT64 "%" PRId64
#define STRING_REP_UINT64 "%" PRIu64
#define STRING_REP_USIZE "%" PRIuPTR
/*
I would like to see retro_inline.h moved in here; possibly boolean too.

View File

@ -24,14 +24,16 @@
#define __RARCH_MISCELLANEOUS_H
#include <stdint.h>
#include <boolean.h>
#include <retro_inline.h>
#if defined(_WIN32) && !defined(_XBOX)
#if defined(_WIN32) && !defined(_XBOX)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#elif defined(_WIN32) && defined(_XBOX)
#include <Xtl.h>
#include <windows.h>
#elif defined(_WIN32) && defined(_XBOX)
#include <Xtl.h>
#endif
#include <limits.h>
@ -40,6 +42,24 @@
#include <compat/msvc.h>
#endif
static INLINE void bits_clear_bits(uint32_t *a, uint32_t *b, uint32_t count)
{
uint32_t i;
for (i = 0; i < count;i++)
a[i] &= ~b[i];
}
static INLINE bool bits_any_set(uint32_t* ptr, uint32_t count)
{
uint32_t i;
for (i = 0; i < count; i++)
{
if (ptr[i] != 0)
return true;
}
return false;
}
#ifndef PATH_MAX_LENGTH
#if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(GEKKO)|| defined(WIIU)
#define PATH_MAX_LENGTH 512
@ -56,35 +76,64 @@
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define BITS_GET_ELEM(a, i) ((a).data[i])
#define BITS_GET_ELEM_PTR(a, i) ((a)->data[i])
#define BIT_SET(a, bit) ((a)[(bit) >> 3] |= (1 << ((bit) & 7)))
#define BIT_CLEAR(a, bit) ((a)[(bit) >> 3] &= ~(1 << ((bit) & 7)))
#define BIT_GET(a, bit) ((a)[(bit) >> 3] & (1 << ((bit) & 7)))
#define BIT_GET(a, bit) (((a)[(bit) >> 3] >> ((bit) & 7)) & 1)
#define BIT16_SET(a, bit) ((a) |= (1 << ((bit) & 15)))
#define BIT16_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 15)))
#define BIT16_GET(a, bit) (!!((a) & (1 << ((bit) & 15))))
#define BIT16_GET(a, bit) (((a) >> ((bit) & 15)) & 1)
#define BIT16_CLEAR_ALL(a) ((a) = 0)
#define BIT32_SET(a, bit) ((a) |= (1 << ((bit) & 31)))
#define BIT32_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 31)))
#define BIT32_GET(a, bit) (!!((a) & (1 << ((bit) & 31))))
#define BIT32_GET(a, bit) (((a) >> ((bit) & 31)) & 1)
#define BIT32_CLEAR_ALL(a) ((a) = 0)
#define BIT64_SET(a, bit) ((a) |= (UINT64_C(1) << ((bit) & 63)))
#define BIT64_CLEAR(a, bit) ((a) &= ~(UINT64_C(1) << ((bit) & 63)))
#define BIT64_GET(a, bit) (!!((a) & (UINT64_C(1) << ((bit) & 63))))
#define BIT64_GET(a, bit) (((a) >> ((bit) & 63)) & 1)
#define BIT64_CLEAR_ALL(a) ((a) = 0)
#define BIT128_SET(a, bit) ((a).data[(bit) >> 5] |= (1 << ((bit) & 31)))
#define BIT128_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31)))
#define BIT128_GET(a, bit) ((a).data[(bit) >> 5] & (1 << ((bit) & 31)))
#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a));
#define BIT128_GET(a, bit) (((a).data[(bit) >> 5] >> ((bit) & 31)) & 1)
#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a))
/* Helper macros and struct to keep track of many booleans.
* To check for multiple bits, use &&, not &.
* For OR, | can be used. */
#define BIT128_SET_PTR(a, bit) BIT128_SET(*a, bit)
#define BIT128_CLEAR_PTR(a, bit) BIT128_CLEAR(*a, bit)
#define BIT128_GET_PTR(a, bit) BIT128_GET(*a, bit)
#define BIT128_CLEAR_ALL_PTR(a) BIT128_CLEAR_ALL(*a)
#define BIT256_SET(a, bit) BIT128_SET(a, bit)
#define BIT256_CLEAR(a, bit) BIT128_CLEAR(a, bit)
#define BIT256_GET(a, bit) BIT128_GET(a, bit)
#define BIT256_CLEAR_ALL(a) BIT128_CLEAR_ALL(a)
#define BIT256_SET_PTR(a, bit) BIT256_SET(*a, bit)
#define BIT256_CLEAR_PTR(a, bit) BIT256_CLEAR(*a, bit)
#define BIT256_GET_PTR(a, bit) BIT256_GET(*a, bit)
#define BIT256_CLEAR_ALL_PTR(a) BIT256_CLEAR_ALL(*a)
#define BITS_COPY16_PTR(a,bits) \
{ \
BIT128_CLEAR_ALL_PTR(a); \
BITS_GET_ELEM_PTR(a, 0) = (bits) & 0xffff; \
}
#define BITS_COPY32_PTR(a,bits) \
{ \
BIT128_CLEAR_ALL_PTR(a); \
BITS_GET_ELEM_PTR(a, 0) = (bits); \
}
/* Helper macros and struct to keep track of many booleans. */
/* This struct has 256 bits. */
typedef struct
{
uint32_t data[8];

View File

@ -87,7 +87,7 @@ char *string_trim_whitespace_right(char *const s);
/* Remove leading and trailing whitespaces */
char *string_trim_whitespace(char *const s);
char *word_wrap(char* buffer, const char *string, int line_width);
char *word_wrap(char* buffer, const char *string, int line_width, bool unicode);
RETRO_END_DECLS

View File

@ -24,12 +24,13 @@
#include <ctype.h>
#include <string/stdstring.h>
#include <encodings/utf.h>
char *string_to_upper(char *s)
{
char *cs = (char *)s;
for ( ; *cs != '\0'; cs++)
*cs = toupper(*cs);
*cs = toupper((unsigned char)*cs);
return s;
}
@ -37,7 +38,7 @@ char *string_to_lower(char *s)
{
char *cs = (char *)s;
for ( ; *cs != '\0'; cs++)
*cs = tolower(*cs);
*cs = tolower((unsigned char)*cs);
return s;
}
@ -47,10 +48,10 @@ char *string_ucwords(char *s)
for ( ; *cs != '\0'; cs++)
{
if (*cs == ' ')
*(cs+1) = toupper(*(cs+1));
*(cs+1) = toupper((unsigned char)*(cs+1));
}
s[0] = toupper(s[0]);
s[0] = toupper((unsigned char)s[0]);
return s;
}
@ -62,12 +63,12 @@ char *string_replace_substring(const char *in,
const char *inprev = NULL;
char *out = NULL;
char *outat = NULL;
/* if either pattern or replacement is NULL,
* duplicate in and let caller handle it. */
if (!pattern || !replacement)
return strdup(in);
pattern_len = strlen(pattern);
replacement_len = strlen(replacement);
numhits = 0;
@ -78,7 +79,7 @@ char *string_replace_substring(const char *in,
inat += pattern_len;
numhits++;
}
outlen = strlen(in) - pattern_len*numhits + replacement_len*numhits;
out = (char *)malloc(outlen+1);
outat = out;
@ -95,7 +96,7 @@ char *string_replace_substring(const char *in,
inprev = inat;
}
strcpy(outat, inprev);
return out;
}
@ -107,7 +108,7 @@ char *string_trim_whitespace_left(char *const s)
size_t len = strlen(s);
char *cur = s;
while(*cur && isspace(*cur))
while(*cur && isspace((unsigned char)*cur))
++cur, --len;
if(s != cur)
@ -126,10 +127,10 @@ char *string_trim_whitespace_right(char *const s)
size_t len = strlen(s);
char *cur = s + len - 1;
while(cur != s && isspace(*cur))
while(cur != s && isspace((unsigned char)*cur))
--cur, --len;
cur[isspace(*cur) ? 0 : 1] = '\0';
cur[isspace((unsigned char)*cur) ? 0 : 1] = '\0';
}
return s;
@ -144,7 +145,7 @@ char *string_trim_whitespace(char *const s)
return s;
}
char *word_wrap(char* buffer, const char *string, int line_width)
char *word_wrap(char* buffer, const char *string, int line_width, bool unicode)
{
unsigned i = 0;
unsigned len = (unsigned)strlen(string);
@ -156,20 +157,34 @@ char *word_wrap(char* buffer, const char *string, int line_width)
/* copy string until the end of the line is reached */
for (counter = 1; counter <= (unsigned)line_width; counter++)
{
const char *character;
unsigned char_len;
unsigned j = i;
/* check if end of string reached */
if (i == strlen(string))
if (i == len)
{
buffer[i] = 0;
return buffer;
}
buffer[i] = string[i];
character = utf8skip(&string[i], 1);
char_len = character - &string[i];
if (!unicode)
counter += char_len - 1;
do
{
buffer[i] = string[i];
char_len--;
i++;
} while(char_len);
/* check for newlines embedded in the original input
* and reset the index */
if (buffer[i] == '\n')
if (buffer[j] == '\n')
counter = 1;
i++;
}
/* check for whitespace */