diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index db9d23b565..d9406dba80 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -66,6 +66,7 @@ #include #include +#include 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;