psxbios: don't limit pointers to ram
[pcsx_rearmed.git] / deps / libretro-common / compat / fopen_utf8.c
1 /* Copyright  (C) 2010-2020 The RetroArch team
2  *
3  * ---------------------------------------------------------------------------------------
4  * The following license statement only applies to this file (fopen_utf8.c).
5  * ---------------------------------------------------------------------------------------
6  *
7  * Permission is hereby granted, free of charge,
8  * to any person obtaining a copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation the rights to
10  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
11  * and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  */
22
23 #include <compat/fopen_utf8.h>
24 #include <encodings/utf.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27
28 #if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX)
29 #ifndef LEGACY_WIN32
30 #define LEGACY_WIN32
31 #endif
32 #endif
33
34 #ifdef _WIN32
35 #undef fopen
36
37 void *fopen_utf8(const char * filename, const char * mode)
38 {
39 #if defined(LEGACY_WIN32)
40    char * filename_local = utf8_to_local_string_alloc(filename);
41    if (filename_local)
42    {
43       FILE *ret          = fopen(filename_local, mode);
44       free(filename_local);
45       return ret;
46    }
47 #else
48    wchar_t * filename_w  = utf8_to_utf16_string_alloc(filename);
49    if (filename_w)
50    {
51       FILE    *ret       = NULL;
52       wchar_t *mode_w    = utf8_to_utf16_string_alloc(mode);
53       if (mode_w)
54       {
55          ret             = _wfopen(filename_w, mode_w);
56          free(mode_w);
57       }
58       free(filename_w);
59       return ret;
60    }
61 #endif
62    return NULL;
63 }
64 #endif