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 
fopen_utf8(const char * filename,const char * mode)37 void *fopen_utf8(const char * filename, const char * mode)
38 {
39 #if defined(LEGACY_WIN32)
40    FILE             *ret = NULL;
41    char * filename_local = utf8_to_local_string_alloc(filename);
42 
43    if (!filename_local)
44       return NULL;
45    ret = fopen(filename_local, mode);
46    if (filename_local)
47       free(filename_local);
48    return ret;
49 #else
50    wchar_t * filename_w = utf8_to_utf16_string_alloc(filename);
51    wchar_t * mode_w = utf8_to_utf16_string_alloc(mode);
52    FILE* ret = _wfopen(filename_w, mode_w);
53    free(filename_w);
54    free(mode_w);
55    return ret;
56 #endif
57 }
58 #endif
59