diff --git a/libretro-common/file/retro_file.c b/libretro-common/file/retro_file.c index 4b11619992..ce32f05616 100644 --- a/libretro-common/file/retro_file.c +++ b/libretro-common/file/retro_file.c @@ -38,10 +38,16 @@ #include #endif +#if 0 +#define HAVE_BUFFERED_IO 1 +#endif + struct RFILE { #if defined(PSP) || defined(VITA) SceUID fd; +#elif defined(HAVE_BUFFERED_IO) + FILE *fd; #else int fd; #endif @@ -59,6 +65,8 @@ RFILE *retro_fopen(const char *path, unsigned mode, ssize_t len) case RFILE_MODE_READ: #if defined(VITA) || defined(PSP) stream->fd = sceIoOpen(path, O_RDONLY, 0777); +#elif defined(HAVE_BUFFERED_IO) + stream->fd = fopen(path, "rb"); #else stream->fd = open(path, O_RDONLY); #endif @@ -66,6 +74,8 @@ RFILE *retro_fopen(const char *path, unsigned mode, ssize_t len) case RFILE_MODE_WRITE: #if defined(VITA) || defined(PSP) stream->fd = sceIoOpen(path, O_WRONLY | O_CREAT, 0777); +#elif defined(HAVE_BUFFERED_IO) + stream->fd = fopen(path, "wb"); #else stream->fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); #endif @@ -73,6 +83,8 @@ RFILE *retro_fopen(const char *path, unsigned mode, ssize_t len) case RFILE_MODE_READ_WRITE: #if defined(VITA) || defined(PSP) stream->fd = sceIoOpen(path, O_RDWR, 0777); +#elif defined(HAVE_BUFFERED_IO) + stream->fd = fopen(path, "w+"); #else #ifdef _WIN32 stream->fd = open(path, O_RDWR | O_BINARY); @@ -83,7 +95,18 @@ RFILE *retro_fopen(const char *path, unsigned mode, ssize_t len) break; } +#if defined(HAVE_BUFFERED_IO) + if (!stream->fd) +#else + if (stream->fd == -1) +#endif + goto error; + return stream; + +error: + retro_fclose(stream); + return NULL; } ssize_t retro_fseek(RFILE *stream, ssize_t offset, int whence) @@ -93,6 +116,8 @@ ssize_t retro_fseek(RFILE *stream, ssize_t offset, int whence) #if defined(VITA) || defined(PSP) return sceIoLseek(stream->fd, (SceOff)offset, whence); +#elif defined(HAVE_BUFFERED_IO) + return fseek(stream->fd, (long)offset, whence); #else return lseek(stream->fd, offset, whence); #endif @@ -104,6 +129,8 @@ ssize_t retro_fread(RFILE *stream, void *s, size_t len) return -1; #if defined(VITA) || defined(PSP) return sceIoRead(stream->fd, s, len); +#elif defined(HAVE_BUFFERED_IO) + return fread(s, len, 1, stream->fd); #else return read(stream->fd, s, len); #endif @@ -115,6 +142,8 @@ ssize_t retro_fwrite(RFILE *stream, const void *s, size_t len) return -1; #if defined(VITA) || defined(PSP) return sceIoWrite(stream->fd, s, len); +#elif defined(HAVE_BUFFERED_IO) + return fwrite(s, len, 1, stream->fd); #else return write(stream->fd, s, len); #endif @@ -126,23 +155,35 @@ void retro_fclose(RFILE *stream) return; #if defined(VITA) || defined(PSP) - sceIoClose(stream->fd); + if (stream->fd > 0) + sceIoClose(stream->fd); +#elif defined(HAVE_BUFFERED_IO) + if (stream->fd) + fclose(stream->fd); #else - close(stream->fd); + if (stream->fd > 0) + close(stream->fd); #endif free(stream); } +static bool retro_fread_iterate(RFILE *stream, char *s, size_t len, ssize_t *bytes_written) +{ + *bytes_written = retro_fread(stream, s, len); +#if defined(HAVE_BUFFERED_IO) + return (*bytes_written < 0); +#else + return (*bytes_written < 0 && errno == EINTR); +#endif +} + bool retro_fmemcpy(const char *path, char *s, size_t len, ssize_t *bytes_written) { RFILE *stream = retro_fopen(path, RFILE_MODE_READ, -1); if (!stream) return false; - do - { - *bytes_written = retro_fread(stream, s, len); - }while(*bytes_written < 0 && errno == EINTR); + while(retro_fread_iterate(stream, s, len, bytes_written)); retro_fclose(stream); if (*bytes_written < 0)