From f0a1b94a1131b6a3cbfc74b493bfb452b8fd7142 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 7 Apr 2016 03:07:23 +0200 Subject: [PATCH] Update memory_stream.c with FCEUmm update code --- .../include/streams/memory_stream.h | 4 +- libretro-common/streams/interface_stream.c | 2 +- libretro-common/streams/memory_stream.c | 43 +++++++++++++++---- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/libretro-common/include/streams/memory_stream.h b/libretro-common/include/streams/memory_stream.h index b4041e4b81..5f196ea62b 100644 --- a/libretro-common/include/streams/memory_stream.h +++ b/libretro-common/include/streams/memory_stream.h @@ -28,7 +28,7 @@ typedef struct memstream memstream_t; -memstream_t *memstream_open(void); +memstream_t *memstream_open(unsigned writing); void memstream_close(memstream_t *stream); @@ -38,6 +38,8 @@ size_t memstream_write(memstream_t *stream, const void *data, size_t bytes); int memstream_getc(memstream_t *stream); +void memstream_putc(memstream_t *stream, int c); + char *memstream_gets(memstream_t *stream, char *buffer, size_t len); size_t memstream_pos(memstream_t *stream); diff --git a/libretro-common/streams/interface_stream.c b/libretro-common/streams/interface_stream.c index e4235724ae..dcb09c3668 100644 --- a/libretro-common/streams/interface_stream.c +++ b/libretro-common/streams/interface_stream.c @@ -81,7 +81,7 @@ bool intfstream_open(intfstream_internal_t *intf, const char *path, return false; break; case INTFSTREAM_MEMORY: - intf->memory.fp = memstream_open(); + intf->memory.fp = memstream_open(0); if (!intf->memory.fp) return false; break; diff --git a/libretro-common/streams/memory_stream.c b/libretro-common/streams/memory_stream.c index ffeb4a3191..6bffa3b726 100644 --- a/libretro-common/streams/memory_stream.c +++ b/libretro-common/streams/memory_stream.c @@ -35,8 +35,16 @@ struct memstream uint8_t *buf; size_t size; size_t ptr; + size_t max_ptr; + unsigned writing; }; +static void memstream_update_pos(memstream_t *stream) +{ + if (stream->ptr > stream->max_ptr) + stream->max_ptr = stream->ptr; +} + void memstream_set_buffer(uint8_t *buffer, size_t size) { g_buffer = buffer; @@ -49,24 +57,26 @@ size_t memstream_get_last_size(void) } static void memstream_init(memstream_t *stream, - uint8_t *buffer, size_t max_size) + uint8_t *buffer, size_t max_size, unsigned writing) { if (!stream) return; - stream->buf = buffer; - stream->size = max_size; - stream->ptr = 0; + stream->buf = buffer; + stream->size = max_size; + stream->ptr = 0; + stream->max_ptr = 0; + stream->writing = writing; } -memstream_t *memstream_open(void) +memstream_t *memstream_open(unsigned writing) { memstream_t *stream; if (!g_buffer || !g_size) return NULL; stream = (memstream_t*)calloc(1, sizeof(*stream)); - memstream_init(stream, g_buffer, g_size); + memstream_init(stream, g_buffer, g_size, writing); g_buffer = NULL; g_size = 0; @@ -78,7 +88,7 @@ void memstream_close(memstream_t *stream) if (!stream) return; - last_file_size = stream->ptr; + last_file_size = stream->writing ? stream->max_ptr : stream->size; free(stream); } @@ -95,6 +105,7 @@ size_t memstream_read(memstream_t *stream, void *data, size_t bytes) memcpy(data, stream->buf + stream->ptr, bytes); stream->ptr += bytes; + memstream_update_pos(stream); return bytes; } @@ -111,6 +122,7 @@ size_t memstream_write(memstream_t *stream, const void *data, size_t bytes) memcpy(stream->buf + stream->ptr, data, bytes); stream->ptr += bytes; + memstream_update_pos(stream); return bytes; } @@ -127,7 +139,7 @@ int memstream_seek(memstream_t *stream, int offset, int whence) ptr = stream->ptr + offset; break; case SEEK_END: - ptr = stream->size + offset; + ptr = (stream->writing ? stream->max_ptr : stream->size) + offset; break; default: return -1; @@ -159,7 +171,20 @@ char *memstream_gets(memstream_t *stream, char *buffer, size_t len) int memstream_getc(memstream_t *stream) { + int ret = 0; if (stream->ptr >= stream->size) return EOF; - return stream->buf[stream->ptr++]; + ret = stream->buf[stream->ptr++]; + + memstream_update_pos(stream); + + return ret; +} + +void memstream_putc(memstream_t *stream, int c) +{ + if (stream->ptr < stream->size) + stream->buf[stream->ptr++] = c; + + memstream_update_pos(stream); }