From fe520ce58803f87a8f02866d54eb882114f6ab4e Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Sat, 11 Feb 2023 14:53:01 +0000 Subject: [PATCH] Makefile: Switch to using libretro-common subrepo Instead of integrating the content of the libretro-common repository inside this core, reference it as a git subrepo, just like it is currently done with GNU Lightning and Lightrec. The advantage is that the latest code from the main libretro-common repository can be fetched easily now. Signed-off-by: Paul Cercueil --- Makefile | 22 +- libretro-common/compat/compat_posix_string.c | 104 - libretro-common/compat/compat_strcasestr.c | 58 - libretro-common/compat/fopen_utf8.c | 63 - libretro-common/encodings/compat_strl.c | 69 - libretro-common/encodings/encoding_utf.c | 512 --- libretro-common/file/file_path.c | 1293 ------ libretro-common/include/boolean.h | 39 - libretro-common/include/compat/fopen_utf8.h | 34 - libretro-common/include/compat/posix_string.h | 60 - libretro-common/include/compat/strcasestr.h | 48 - libretro-common/include/compat/strl.h | 59 - libretro-common/include/encodings/utf.h | 67 - libretro-common/include/file/file_path.h | 531 --- libretro-common/include/libretro.h | 3900 ----------------- libretro-common/include/memmap.h | 52 - libretro-common/include/retro_assert.h | 37 - libretro-common/include/retro_common_api.h | 119 - libretro-common/include/retro_environment.h | 114 - libretro-common/include/retro_inline.h | 39 - libretro-common/include/retro_miscellaneous.h | 186 - libretro-common/include/streams/file_stream.h | 115 - .../include/streams/file_stream_transforms.h | 101 - libretro-common/include/string/stdstring.h | 198 - libretro-common/include/time/rtime.h | 48 - libretro-common/include/vfs/vfs.h | 111 - .../include/vfs/vfs_implementation.h | 76 - libretro-common/streams/file_stream.c | 662 --- .../streams/file_stream_transforms.c | 159 - libretro-common/string/stdstring.c | 416 -- libretro-common/time/rtime.c | 81 - libretro-common/vfs/vfs_implementation.c | 1329 ------ 32 files changed, 11 insertions(+), 10691 deletions(-) delete mode 100644 libretro-common/compat/compat_posix_string.c delete mode 100644 libretro-common/compat/compat_strcasestr.c delete mode 100644 libretro-common/compat/fopen_utf8.c delete mode 100644 libretro-common/encodings/compat_strl.c delete mode 100644 libretro-common/encodings/encoding_utf.c delete mode 100644 libretro-common/file/file_path.c delete mode 100644 libretro-common/include/boolean.h delete mode 100644 libretro-common/include/compat/fopen_utf8.h delete mode 100644 libretro-common/include/compat/posix_string.h delete mode 100644 libretro-common/include/compat/strcasestr.h delete mode 100644 libretro-common/include/compat/strl.h delete mode 100644 libretro-common/include/encodings/utf.h delete mode 100644 libretro-common/include/file/file_path.h delete mode 100644 libretro-common/include/libretro.h delete mode 100644 libretro-common/include/memmap.h delete mode 100644 libretro-common/include/retro_assert.h delete mode 100644 libretro-common/include/retro_common_api.h delete mode 100644 libretro-common/include/retro_environment.h delete mode 100644 libretro-common/include/retro_inline.h delete mode 100644 libretro-common/include/retro_miscellaneous.h delete mode 100644 libretro-common/include/streams/file_stream.h delete mode 100644 libretro-common/include/streams/file_stream_transforms.h delete mode 100644 libretro-common/include/string/stdstring.h delete mode 100644 libretro-common/include/time/rtime.h delete mode 100644 libretro-common/include/vfs/vfs.h delete mode 100644 libretro-common/include/vfs/vfs_implementation.h delete mode 100644 libretro-common/streams/file_stream.c delete mode 100644 libretro-common/streams/file_stream_transforms.c delete mode 100644 libretro-common/string/stdstring.c delete mode 100644 libretro-common/time/rtime.c delete mode 100644 libretro-common/vfs/vfs_implementation.c diff --git a/Makefile b/Makefile index ff8d1bb6..4edc0076 100644 --- a/Makefile +++ b/Makefile @@ -321,20 +321,20 @@ LDFLAGS += `pkg-config --libs glib-2.0 libosso dbus-1 hildon-fm-2` endif ifeq "$(PLATFORM)" "libretro" ifeq "$(USE_LIBRETRO_VFS)" "1" -OBJS += libretro-common/compat/compat_posix_string.o -OBJS += libretro-common/compat/fopen_utf8.o -OBJS += libretro-common/encodings/compat_strl.o -OBJS += libretro-common/encodings/encoding_utf.o -OBJS += libretro-common/file/file_path.o -OBJS += libretro-common/streams/file_stream.o -OBJS += libretro-common/streams/file_stream_transforms.o -OBJS += libretro-common/string/stdstring.o -OBJS += libretro-common/time/rtime.o -OBJS += libretro-common/vfs/vfs_implementation.o +OBJS += deps/libretro-common/compat/compat_posix_string.o +OBJS += deps/libretro-common/compat/fopen_utf8.o +OBJS += deps/libretro-common/encodings/compat_strl.o +OBJS += deps/libretro-common/encodings/encoding_utf.o +OBJS += deps/libretro-common/file/file_path.o +OBJS += deps/libretro-common/streams/file_stream.o +OBJS += deps/libretro-common/streams/file_stream_transforms.o +OBJS += deps/libretro-common/string/stdstring.o +OBJS += deps/libretro-common/time/rtime.o +OBJS += deps/libretro-common/vfs/vfs_implementation.o CFLAGS += -DUSE_LIBRETRO_VFS endif OBJS += frontend/libretro.o -CFLAGS += -Ilibretro-common/include +CFLAGS += -Ideps/libretro-common/include CFLAGS += -DFRONTEND_SUPPORTS_RGB565 CFLAGS += -DHAVE_LIBRETRO diff --git a/libretro-common/compat/compat_posix_string.c b/libretro-common/compat/compat_posix_string.c deleted file mode 100644 index 6a2f07ee..00000000 --- a/libretro-common/compat/compat_posix_string.c +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (C) 2010-2020 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (compat_posix_string.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 - -#ifdef _WIN32 - -#undef strcasecmp -#undef strdup -#undef isblank -#undef strtok_r -#include -#include -#include -#include - -#include - -int retro_strcasecmp__(const char *a, const char *b) -{ - while (*a && *b) - { - int a_ = tolower(*a); - int b_ = tolower(*b); - - if (a_ != b_) - return a_ - b_; - - a++; - b++; - } - - return tolower(*a) - tolower(*b); -} - -char *retro_strdup__(const char *orig) -{ - size_t len = strlen(orig) + 1; - char *ret = (char*)malloc(len); - if (!ret) - return NULL; - - strlcpy(ret, orig, len); - return ret; -} - -int retro_isblank__(int c) -{ - return (c == ' ') || (c == '\t'); -} - -char *retro_strtok_r__(char *str, const char *delim, char **saveptr) -{ - char *first = NULL; - if (!saveptr || !delim) - return NULL; - - if (str) - *saveptr = str; - - do - { - char *ptr = NULL; - first = *saveptr; - while (*first && strchr(delim, *first)) - *first++ = '\0'; - - if (*first == '\0') - return NULL; - - ptr = first + 1; - - while (*ptr && !strchr(delim, *ptr)) - ptr++; - - *saveptr = ptr + (*ptr ? 1 : 0); - *ptr = '\0'; - } while (strlen(first) == 0); - - return first; -} - -#endif diff --git a/libretro-common/compat/compat_strcasestr.c b/libretro-common/compat/compat_strcasestr.c deleted file mode 100644 index 4129dab2..00000000 --- a/libretro-common/compat/compat_strcasestr.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 2010-2020 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (compat_strcasestr.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 - -/* Pretty much strncasecmp. */ -static int casencmp(const char *a, const char *b, size_t n) -{ - size_t i; - - for (i = 0; i < n; i++) - { - int a_lower = tolower(a[i]); - int b_lower = tolower(b[i]); - if (a_lower != b_lower) - return a_lower - b_lower; - } - - return 0; -} - -char *strcasestr_retro__(const char *haystack, const char *needle) -{ - size_t i, search_off; - size_t hay_len = strlen(haystack); - size_t needle_len = strlen(needle); - - if (needle_len > hay_len) - return NULL; - - search_off = hay_len - needle_len; - for (i = 0; i <= search_off; i++) - if (!casencmp(haystack + i, needle, needle_len)) - return (char*)haystack + i; - - return NULL; -} diff --git a/libretro-common/compat/fopen_utf8.c b/libretro-common/compat/fopen_utf8.c deleted file mode 100644 index 85abb59e..00000000 --- a/libretro-common/compat/fopen_utf8.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2010-2020 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (fopen_utf8.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 - -#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) -#ifndef LEGACY_WIN32 -#define LEGACY_WIN32 -#endif -#endif - -#ifdef _WIN32 -#undef fopen - -void *fopen_utf8(const char * filename, const char * mode) -{ -#if defined(LEGACY_WIN32) - FILE *ret = NULL; - char * filename_local = utf8_to_local_string_alloc(filename); - - if (!filename_local) - return NULL; - ret = fopen(filename_local, mode); - if (filename_local) - free(filename_local); - return ret; -#else - wchar_t * filename_w = utf8_to_utf16_string_alloc(filename); - wchar_t * mode_w = utf8_to_utf16_string_alloc(mode); - FILE* ret = NULL; - - if (filename_w && mode_w) - ret = _wfopen(filename_w, mode_w); - if (filename_w) - free(filename_w); - if (mode_w) - free(mode_w); - return ret; -#endif -} -#endif diff --git a/libretro-common/encodings/compat_strl.c b/libretro-common/encodings/compat_strl.c deleted file mode 100644 index 31723107..00000000 --- a/libretro-common/encodings/compat_strl.c +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (C) 2010-2020 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (compat_strl.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 - -/* Implementation of strlcpy()/strlcat() based on OpenBSD. */ - -#ifndef __MACH__ - -size_t strlcpy(char *dest, const char *source, size_t size) -{ - size_t src_size = 0; - size_t n = size; - - if (n) - while (--n && (*dest++ = *source++)) src_size++; - - if (!n) - { - if (size) *dest = '\0'; - while (*source++) src_size++; - } - - return src_size; -} - -size_t strlcat(char *dest, const char *source, size_t size) -{ - size_t len = strlen(dest); - - dest += len; - - if (len > size) - size = 0; - else - size -= len; - - return len + strlcpy(dest, source, size); -} -#endif - -char *strldup(const char *s, size_t n) -{ - char *dst = (char*)malloc(sizeof(char) * (n + 1)); - strlcpy(dst, s, n); - return dst; -} diff --git a/libretro-common/encodings/encoding_utf.c b/libretro-common/encodings/encoding_utf.c deleted file mode 100644 index 2760824d..00000000 --- a/libretro-common/encodings/encoding_utf.c +++ /dev/null @@ -1,512 +0,0 @@ -/* Copyright (C) 2010-2020 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (encoding_utf.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 - -#if defined(_WIN32) && !defined(_XBOX) -#include -#elif defined(_XBOX) -#include -#endif - -#define UTF8_WALKBYTE(string) (*((*(string))++)) - -static unsigned leading_ones(uint8_t c) -{ - unsigned ones = 0; - while (c & 0x80) - { - ones++; - c <<= 1; - } - - return ones; -} - -/* Simple implementation. Assumes the sequence is - * properly synchronized and terminated. */ - -size_t utf8_conv_utf32(uint32_t *out, size_t out_chars, - const char *in, size_t in_size) -{ - unsigned i; - size_t ret = 0; - while (in_size && out_chars) - { - unsigned extra, shift; - uint32_t c; - uint8_t first = *in++; - unsigned ones = leading_ones(first); - - if (ones > 6 || ones == 1) /* Invalid or desync. */ - break; - - extra = ones ? ones - 1 : ones; - if (1 + extra > in_size) /* Overflow. */ - break; - - shift = (extra - 1) * 6; - c = (first & ((1 << (7 - ones)) - 1)) << (6 * extra); - - for (i = 0; i < extra; i++, in++, shift -= 6) - c |= (*in & 0x3f) << shift; - - *out++ = c; - in_size -= 1 + extra; - out_chars--; - ret++; - } - - return ret; -} - -bool utf16_conv_utf8(uint8_t *out, size_t *out_chars, - const uint16_t *in, size_t in_size) -{ - size_t out_pos = 0; - size_t in_pos = 0; - static const - uint8_t utf8_limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - - for (;;) - { - unsigned num_adds; - uint32_t value; - - if (in_pos == in_size) - { - *out_chars = out_pos; - return true; - } - value = in[in_pos++]; - if (value < 0x80) - { - if (out) - out[out_pos] = (char)value; - out_pos++; - continue; - } - - if (value >= 0xD800 && value < 0xE000) - { - uint32_t c2; - - if (value >= 0xDC00 || in_pos == in_size) - break; - c2 = in[in_pos++]; - if (c2 < 0xDC00 || c2 >= 0xE000) - break; - value = (((value - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000; - } - - for (num_adds = 1; num_adds < 5; num_adds++) - if (value < (((uint32_t)1) << (num_adds * 5 + 6))) - break; - if (out) - out[out_pos] = (char)(utf8_limits[num_adds - 1] - + (value >> (6 * num_adds))); - out_pos++; - do - { - num_adds--; - if (out) - out[out_pos] = (char)(0x80 - + ((value >> (6 * num_adds)) & 0x3F)); - out_pos++; - }while (num_adds != 0); - } - - *out_chars = out_pos; - return false; -} - -/* Acts mostly like strlcpy. - * - * Copies the given number of UTF-8 characters, - * but at most d_len bytes. - * - * Always NULL terminates. - * Does not copy half a character. - * - * Returns number of bytes. 's' is assumed valid UTF-8. - * Use only if 'chars' is considerably less than 'd_len'. */ -size_t utf8cpy(char *d, size_t d_len, const char *s, size_t chars) -{ - const uint8_t *sb = (const uint8_t*)s; - const uint8_t *sb_org = sb; - - if (!s) - return 0; - - while (*sb && chars-- > 0) - { - sb++; - while ((*sb & 0xC0) == 0x80) - sb++; - } - - if ((size_t)(sb - sb_org) > d_len-1 /* NUL */) - { - sb = sb_org + d_len-1; - while ((*sb & 0xC0) == 0x80) - sb--; - } - - memcpy(d, sb_org, sb-sb_org); - d[sb-sb_org] = '\0'; - - return sb-sb_org; -} - -const char *utf8skip(const char *str, size_t chars) -{ - const uint8_t *strb = (const uint8_t*)str; - - if (!chars) - return str; - - do - { - strb++; - while ((*strb & 0xC0)==0x80) - strb++; - chars--; - }while (chars); - - return (const char*)strb; -} - -size_t utf8len(const char *string) -{ - size_t ret = 0; - - if (!string) - return 0; - - while (*string) - { - if ((*string & 0xC0) != 0x80) - ret++; - string++; - } - return ret; -} - -/* Does not validate the input, returns garbage if it's not UTF-8. */ -uint32_t utf8_walk(const char **string) -{ - uint8_t first = UTF8_WALKBYTE(string); - uint32_t ret = 0; - - if (first < 128) - return first; - - ret = (ret << 6) | (UTF8_WALKBYTE(string) & 0x3F); - if (first >= 0xE0) - { - ret = (ret << 6) | (UTF8_WALKBYTE(string) & 0x3F); - if (first >= 0xF0) - { - ret = (ret << 6) | (UTF8_WALKBYTE(string) & 0x3F); - return ret | (first & 7) << 18; - } - return ret | (first & 15) << 12; - } - - return ret | (first & 31) << 6; -} - -static bool utf16_to_char(uint8_t **utf_data, - size_t *dest_len, const uint16_t *in) -{ - unsigned len = 0; - - while (in[len] != '\0') - len++; - - utf16_conv_utf8(NULL, dest_len, in, len); - *dest_len += 1; - *utf_data = (uint8_t*)malloc(*dest_len); - if (*utf_data == 0) - return false; - - return utf16_conv_utf8(*utf_data, dest_len, in, len); -} - -bool utf16_to_char_string(const uint16_t *in, char *s, size_t len) -{ - size_t dest_len = 0; - uint8_t *utf16_data = NULL; - bool ret = utf16_to_char(&utf16_data, &dest_len, in); - - if (ret) - { - utf16_data[dest_len] = 0; - strlcpy(s, (const char*)utf16_data, len); - } - - free(utf16_data); - utf16_data = NULL; - - return ret; -} - -#if defined(_WIN32) && !defined(_XBOX) && !defined(UNICODE) -/* Returned pointer MUST be freed by the caller if non-NULL. */ -static char *mb_to_mb_string_alloc(const char *str, - enum CodePage cp_in, enum CodePage cp_out) -{ - wchar_t *path_buf_wide = NULL; - int path_buf_wide_len = MultiByteToWideChar(cp_in, 0, str, -1, NULL, 0); - - /* Windows 95 will return 0 from these functions with - * a UTF8 codepage set without MSLU. - * - * From an unknown MSDN version (others omit this info): - * - CP_UTF8 Windows 98/Me, Windows NT 4.0 and later: - * Translate using UTF-8. When this is set, dwFlags must be zero. - * - Windows 95: Under the Microsoft Layer for Unicode, - * MultiByteToWideChar also supports CP_UTF7 and CP_UTF8. - */ - - if (!path_buf_wide_len) - return strdup(str); - - path_buf_wide = (wchar_t*) - calloc(path_buf_wide_len + sizeof(wchar_t), sizeof(wchar_t)); - - if (path_buf_wide) - { - MultiByteToWideChar(cp_in, 0, - str, -1, path_buf_wide, path_buf_wide_len); - - if (*path_buf_wide) - { - int path_buf_len = WideCharToMultiByte(cp_out, 0, - path_buf_wide, -1, NULL, 0, NULL, NULL); - - if (path_buf_len) - { - char *path_buf = (char*) - calloc(path_buf_len + sizeof(char), sizeof(char)); - - if (path_buf) - { - WideCharToMultiByte(cp_out, 0, - path_buf_wide, -1, path_buf, - path_buf_len, NULL, NULL); - - free(path_buf_wide); - - if (*path_buf) - return path_buf; - - free(path_buf); - return NULL; - } - } - else - { - free(path_buf_wide); - return strdup(str); - } - } - - free(path_buf_wide); - } - - return NULL; -} -#endif - -/* Returned pointer MUST be freed by the caller if non-NULL. */ -char* utf8_to_local_string_alloc(const char *str) -{ - if (str && *str) - { -#if defined(_WIN32) && !defined(_XBOX) && !defined(UNICODE) - return mb_to_mb_string_alloc(str, CODEPAGE_UTF8, CODEPAGE_LOCAL); -#else - /* assume string needs no modification if not on Windows */ - return strdup(str); -#endif - } - return NULL; -} - -/* Returned pointer MUST be freed by the caller if non-NULL. */ -char* local_to_utf8_string_alloc(const char *str) -{ - if (str && *str) - { -#if defined(_WIN32) && !defined(_XBOX) && !defined(UNICODE) - return mb_to_mb_string_alloc(str, CODEPAGE_LOCAL, CODEPAGE_UTF8); -#else - /* assume string needs no modification if not on Windows */ - return strdup(str); -#endif - } - return NULL; -} - -/* Returned pointer MUST be freed by the caller if non-NULL. */ -wchar_t* utf8_to_utf16_string_alloc(const char *str) -{ -#ifdef _WIN32 - int len = 0; - int out_len = 0; -#else - size_t len = 0; - size_t out_len = 0; -#endif - wchar_t *buf = NULL; - - if (!str || !*str) - return NULL; - -#ifdef _WIN32 - len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); - - if (len) - { - buf = (wchar_t*)calloc(len, sizeof(wchar_t)); - - if (!buf) - return NULL; - - out_len = MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, len); - } - else - { - /* fallback to ANSI codepage instead */ - len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); - - if (len) - { - buf = (wchar_t*)calloc(len, sizeof(wchar_t)); - - if (!buf) - return NULL; - - out_len = MultiByteToWideChar(CP_ACP, 0, str, -1, buf, len); - } - } - - if (out_len < 0) - { - free(buf); - return NULL; - } -#else - /* NOTE: For now, assume non-Windows platforms' locale is already UTF-8. */ - len = mbstowcs(NULL, str, 0) + 1; - - if (len) - { - buf = (wchar_t*)calloc(len, sizeof(wchar_t)); - - if (!buf) - return NULL; - - out_len = mbstowcs(buf, str, len); - } - - if (out_len == (size_t)-1) - { - free(buf); - return NULL; - } -#endif - - return buf; -} - -/* Returned pointer MUST be freed by the caller if non-NULL. */ -char* utf16_to_utf8_string_alloc(const wchar_t *str) -{ -#ifdef _WIN32 - int len = 0; -#else - size_t len = 0; -#endif - char *buf = NULL; - - if (!str || !*str) - return NULL; - -#ifdef _WIN32 - { - UINT code_page = CP_UTF8; - len = WideCharToMultiByte(code_page, - 0, str, -1, NULL, 0, NULL, NULL); - - /* fallback to ANSI codepage instead */ - if (!len) - { - code_page = CP_ACP; - len = WideCharToMultiByte(code_page, - 0, str, -1, NULL, 0, NULL, NULL); - } - - buf = (char*)calloc(len, sizeof(char)); - - if (!buf) - return NULL; - - if (WideCharToMultiByte(code_page, - 0, str, -1, buf, len, NULL, NULL) < 0) - { - free(buf); - return NULL; - } - } -#else - /* NOTE: For now, assume non-Windows platforms' - * locale is already UTF-8. */ - len = wcstombs(NULL, str, 0) + 1; - - if (len) - { - buf = (char*)calloc(len, sizeof(char)); - - if (!buf) - return NULL; - - if (wcstombs(buf, str, len) == (size_t)-1) - { - free(buf); - return NULL; - } - } -#endif - - return buf; -} diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c deleted file mode 100644 index 3dd53c98..00000000 --- a/libretro-common/file/file_path.c +++ /dev/null @@ -1,1293 +0,0 @@ -/* Copyright (C) 2010-2020 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 -#include -#include