diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index 9ded4c75a..8f5b97679 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -2987,17 +2987,43 @@ extern "C" { #include #if defined(_MSC_VER) || defined(__MINGW64__) + +#include + +struct WArgs { const wchar_t *fname, *mode; }; +static struct WArgs utf8towide(const char* fname_utf8, const char * modestr) +{ + static wchar_t buff[4096]; + static wchar_t mode[50]; + struct WArgs ret = { .fname = NULL, .mode = NULL }; + + if(MultiByteToWideChar(CP_UTF8, 0, fname_utf8, -1, buff, 4096) == 0) + return ret; + + if(MultiByteToWideChar(CP_UTF8, 0, modestr, -1, mode, 50) == 0) + return ret; + + ret.fname = buff, ret.mode = mode; + return ret; +} static FILE *mz_fopen(const char *pFilename, const char *pMode) { FILE *pFile = NULL; - fopen_s(&pFile, pFilename, pMode); + + struct WArgs args = utf8towide(pFilename, pMode); + if(args.fname != NULL && args.mode != NULL) + if(_wfopen_s(&pFile, args.fname, args.mode)) return NULL; + return pFile; } static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) { FILE *pFile = NULL; - if (freopen_s(&pFile, pPath, pMode, pStream)) - return NULL; + + struct WArgs args = utf8towide(pPath, pMode); + if(args.fname != NULL && args.mode != NULL) + if(_wfreopen_s(&pFile, args.fname, args.mode, pStream)) return NULL; + return pFile; } #ifndef MINIZ_NO_TIME