diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index 40b867b007..5e6298d5df 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -31,6 +31,8 @@ #include #include +#include + RETRO_BEGIN_DECLS typedef struct RFILE RFILE; @@ -81,6 +83,12 @@ bool filestream_write_file(const char *path, const void *data, ssize_t size); int filestream_putc(RFILE *stream, int c); +int filestream_vprintf(RFILE *stream, const char* format, va_list args); + +int filestream_printf(RFILE *stream, const char* format, ...); + +int filestream_error(RFILE *stream); + int filestream_get_fd(RFILE *stream); int filestream_flush(RFILE *stream); diff --git a/libretro-common/include/streams/file_stream_transforms.h b/libretro-common/include/streams/file_stream_transforms.h index 8921051154..81ff689f60 100644 --- a/libretro-common/include/streams/file_stream_transforms.h +++ b/libretro-common/include/streams/file_stream_transforms.h @@ -24,12 +24,12 @@ #define __LIBRETRO_SDK_FILE_STREAM_TRANSFORMS_H #include - -#include #include RETRO_BEGIN_DECLS +typedef struct RFILE RFILE; + #define FILE RFILE #define fopen rfopen @@ -38,9 +38,14 @@ RETRO_BEGIN_DECLS #define fseek rfseek #define fread rfread #define fgets rfgets +#define fgetc rfgetc #define fwrite rfwrite +#define fputc rfputc +#define fprintf rfprintf +#define ferror rferror +#define feof rfeof -RFILE* rfopen(const char *path, char *mode); +RFILE* rfopen(const char *path, const char *mode); int rfclose(RFILE* stream); @@ -53,9 +58,19 @@ size_t rfread(void* buffer, char *rfgets(char *buffer, int maxCount, RFILE* stream); +int rfgetc(RFILE* stream); + size_t rfwrite(void const* buffer, size_t elementSize, size_t elementCount, RFILE* stream); +int rfputc(int character, RFILE * stream); + +int rfprintf(RFILE * stream, const char * format, ...); + +int rferror(RFILE* stream); + +int rfeof(RFILE* stream); + RETRO_END_DECLS #endif diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 46635532e3..5a9d4000a7 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -529,6 +529,34 @@ int filestream_putc(RFILE *stream, int c) #endif } +int filestream_vprintf(RFILE *stream, const char* format, va_list args) +{ + static char buffer[8 * 1024]; + int numChars = vsprintf(buffer, format, args); + + if (numChars < 0) + return -1; + else if (numChars == 0) + return 0; + + return filestream_write(stream, buffer, numChars); +} + +int filestream_printf(RFILE *stream, const char* format, ...) +{ + va_list vl; + int result; + va_start(vl, format); + result = filestream_vprintf(stream, format, vl); + va_end(vl); + return result; +} + +int filestream_error(RFILE *stream) +{ + return ferror(stream->fp); +} + int filestream_close(RFILE *stream) { if (!stream) diff --git a/libretro-common/streams/file_stream_transforms.c b/libretro-common/streams/file_stream_transforms.c index f43ee7b25a..d1e8f2f26e 100644 --- a/libretro-common/streams/file_stream_transforms.c +++ b/libretro-common/streams/file_stream_transforms.c @@ -22,8 +22,9 @@ #include #include +#include -RFILE* rfopen(const char *path, char *mode) +RFILE* rfopen(const char *path, const char *mode) { unsigned int retro_mode = RFILE_MODE_READ_TEXT; if (strstr(mode, "r")) @@ -64,8 +65,38 @@ char *rfgets(char *buffer, int maxCount, RFILE* stream) return filestream_gets(stream, buffer, maxCount); } +int rfgetc(RFILE* stream) +{ + return filestream_getc(stream); +} + size_t rfwrite(void const* buffer, size_t elementSize, size_t elementCount, RFILE* stream) { return filestream_write(stream, buffer, elementSize*elementCount); } + +int rfputc(int character, RFILE * stream) +{ + return filestream_putc(stream, character); +} + +int rfprintf(RFILE * stream, const char * format, ...) +{ + int result; + va_list vl; + va_start(vl, format); + result = filestream_vprintf(stream, format, vl); + va_end(vl); + return result; +} + +int rferror(RFILE* stream) +{ + return filestream_error(stream); +} + +int rfeof(RFILE* stream) +{ + return filestream_eof(stream); +}