Merge pull request #542 from gameblabla/mdec_fix
[pcsx_rearmed.git] / 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    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 = NULL;
53
54    if (filename_w && mode_w)
55       ret = _wfopen(filename_w, mode_w);
56    if (filename_w)
57       free(filename_w);
58    if (mode_w)
59       free(mode_w);
60    return ret;
61 #endif
62 }
63 #endif