use wide fopen() on windows

This commit is contained in:
Brad Parker 2016-11-29 13:47:07 -05:00
parent 8adafa9249
commit 187e1fc71b

View File

@ -66,6 +66,7 @@
#include <streams/file_stream.h>
#include <memmap.h>
#include <retro_miscellaneous.h>
struct RFILE
{
@ -76,6 +77,18 @@ struct RFILE
#define HAVE_BUFFERED_IO 1
#ifdef _WIN32
#define MODE_STR_READ L"r"
#define MODE_STR_READ_UNBUF L"rb"
#define MODE_STR_WRITE_UNBUF L"wb"
#define MODE_STR_WRITE_PLUS L"w+"
#else
#define MODE_STR_READ "r"
#define MODE_STR_READ_UNBUF "rb"
#define MODE_STR_WRITE_UNBUF "wb"
#define MODE_STR_WRITE_PLUS "w+"
#endif
#if defined(HAVE_BUFFERED_IO)
FILE *fp;
#endif
@ -104,7 +117,12 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len)
int flags = 0;
int mode_int = 0;
#if defined(HAVE_BUFFERED_IO)
#ifdef _WIN32
const wchar_t *mode_str = NULL;
wchar_t path_wide[PATH_MAX_LENGTH] = {0};
#else
const char *mode_str = NULL;
#endif
#endif
RFILE *stream = (RFILE*)calloc(1, sizeof(*stream));
@ -132,7 +150,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len)
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = "r";
mode_str = MODE_STR_READ;
#endif
/* No "else" here */
flags = O_RDONLY;
@ -145,7 +163,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len)
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = "rb";
mode_str = MODE_STR_READ_UNBUF;
#endif
/* No "else" here */
flags = O_RDONLY;
@ -158,7 +176,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len)
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = "wb";
mode_str = MODE_STR_WRITE_UNBUF;
#endif
else
{
@ -176,7 +194,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len)
#else
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
mode_str = "w+";
mode_str = MODE_STR_WRITE_PLUS;
#endif
else
{
@ -195,13 +213,19 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len)
#if defined(HAVE_BUFFERED_IO)
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
{
#ifdef _WIN32
MultiByteToWideChar(CP_UTF8, 0, path, -1, path_wide, sizeof(path_wide) / sizeof(path_wide[0]));
stream->fp = _wfopen(path_wide, mode_str);
#else
stream->fp = fopen(path, mode_str);
#endif
if (!stream->fp)
goto error;
}
else
#endif
{
/* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, open() needs to be changed to _wopen() for WIndows. */
stream->fd = open(path, flags);
if (stream->fd == -1)
goto error;