From 273fbe24f4b9c866553d2f195f7a2d4306807182 Mon Sep 17 00:00:00 2001 From: StapleButter Date: Wed, 11 Oct 2017 00:32:43 +0200 Subject: [PATCH] add fopen wrapper to support UTF8 paths/filenames under Windows. --- melonDS.cbp | 1 + src/NDSCart.cpp | 8 +++++--- src/melon_fopen.h | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/melon_fopen.h diff --git a/melonDS.cbp b/melonDS.cbp index d0485d6b..7e83b989 100644 --- a/melonDS.cbp +++ b/melonDS.cbp @@ -229,6 +229,7 @@ + diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp index 3d480f39..03f536a6 100644 --- a/src/NDSCart.cpp +++ b/src/NDSCart.cpp @@ -22,6 +22,8 @@ #include "NDSCart.h" #include "ARM.h" +#include "melon_fopen.h" + namespace NDSCart_SRAM { @@ -92,7 +94,7 @@ void LoadSave(char* path) strncpy(SRAMPath, path, 255); SRAMPath[255] = '\0'; - FILE* f = fopen(path, "rb"); + FILE* f = melon_fopen(path, "rb"); if (f) { fseek(f, 0, SEEK_END); @@ -624,7 +626,7 @@ void Write(u8 val, u32 hold) if (islast && (CurCmd == 0x02 || CurCmd == 0x0A) && (SRAMLength > 0)) { - FILE* f = fopen(SRAMPath, "wb"); + FILE* f = melon_fopen(SRAMPath, "wb"); if (f) { fwrite(SRAM, SRAMLength, 1, f); @@ -817,7 +819,7 @@ bool LoadROM(const char* path, bool direct) // TODO: streaming mode? for really big ROMs or systems with limited RAM // for now we're lazy - FILE* f = fopen(path, "rb"); + FILE* f = melon_fopen(path, "rb"); if (!f) { return false; diff --git a/src/melon_fopen.h b/src/melon_fopen.h new file mode 100644 index 00000000..2541f84f --- /dev/null +++ b/src/melon_fopen.h @@ -0,0 +1,50 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef MELON_FOPEN_H +#define MELON_FOPEN_H + +#ifdef __WIN32__ + +#include + +static FILE* melon_fopen(const char* path, const char* mode) +{ + int len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); + if (len < 1) return NULL; + WCHAR* fatass = new WCHAR[len]; + int res = MultiByteToWideChar(CP_UTF8, 0, path, -1, fatass, len); + if (res != len) return NULL; // checkme? + + // this will be more than enough + WCHAR fatmode[4]; + fatmode[0] = mode[0]; + fatmode[1] = mode[1]; + fatmode[2] = mode[2]; + fatmode[3] = 0; + + return _wfopen(fatass, fatmode); +} + +#else + +#define melon_fopen fopen + +#endif + +#endif // MELON_FOPEN_H