diff options
author | tamasmeszaros <meszaros.q@gmail.com> | 2019-05-31 17:54:42 +0300 |
---|---|---|
committer | tamasmeszaros <meszaros.q@gmail.com> | 2019-05-31 17:54:42 +0300 |
commit | 8fc1eba652165869accaa4c9b7aad53203777137 (patch) | |
tree | ae3253341e09f3f5f467b862027e8c9e9a7347a1 /src | |
parent | d5d6af1361ba73a24ceacd4a8b4346ece11b9a2e (diff) |
Patch miniz bundled version to support unicode on Windows.
Diffstat (limited to 'src')
-rw-r--r-- | src/miniz/miniz.c | 32 |
1 files changed, 29 insertions, 3 deletions
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 <sys/stat.h> #if defined(_MSC_VER) || defined(__MINGW64__) + +#include <windows.h> + +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 |