diff options
Diffstat (limited to 'libretro/memstream.c')
-rw-r--r-- | libretro/memstream.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/libretro/memstream.c b/libretro/memstream.c new file mode 100644 index 0000000..4e1ac21 --- /dev/null +++ b/libretro/memstream.c @@ -0,0 +1,115 @@ +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include "memstream.h" + +static uint8_t* g_buffer = NULL; +static size_t g_size = 0; + +static size_t last_file_size = 0; + +struct memstream +{ + uint8_t *m_buf; + size_t m_size; + size_t m_ptr; +}; + +void memstream_set_buffer(uint8_t *buffer, size_t size) +{ + g_buffer = buffer; + g_size = size; +} + +size_t memstream_get_last_size() +{ + return last_file_size; +} + +static void memstream_init(memstream_t *stream, uint8_t *buffer, size_t max_size) +{ + stream->m_buf = buffer; + stream->m_size = max_size; + stream->m_ptr = 0; +} + +memstream_t *memstream_open() +{ + memstream_t *stream; + if (!g_buffer || !g_size) + return NULL; + + stream = (memstream_t*)calloc(1, sizeof(*stream)); + memstream_init(stream, g_buffer, g_size); + + g_buffer = NULL; + g_size = 0; + return stream; +} + +void memstream_close(memstream_t *stream) +{ + last_file_size = stream->m_ptr; + free(stream); +} + +size_t memstream_read(memstream_t *stream, void *data, size_t bytes) +{ + size_t avail = stream->m_size - stream->m_ptr; + if (bytes > avail) + bytes = avail; + + memcpy(data, stream->m_buf + stream->m_ptr, bytes); + stream->m_ptr += bytes; + return bytes; +} + +size_t memstream_write(memstream_t *stream, const void *data, size_t bytes) +{ + size_t avail = stream->m_size - stream->m_ptr; + if (bytes > avail) + bytes = avail; + + memcpy(stream->m_buf + stream->m_ptr, data, bytes); + stream->m_ptr += bytes; + return bytes; +} + +int memstream_seek(memstream_t *stream, int offset, int whence) +{ + size_t ptr; + if (whence == SEEK_SET) + ptr = offset; + else if (whence == SEEK_CUR) + ptr = stream->m_ptr + offset; + else if (whence == SEEK_END) + ptr = stream->m_size + offset; + else + return -1; + + if (ptr <= stream->m_size) + { + stream->m_ptr = ptr; + return 0; + } + else + return -1; +} + +size_t memstream_pos(memstream_t *stream) +{ + return stream->m_ptr; +} + +char *memstream_gets(memstream_t *stream, char *buffer, size_t len) +{ + return NULL; +} + +int memstream_getc(memstream_t *stream) +{ + if (stream->m_ptr >= stream->m_size) + return EOF; + else + return stream->m_buf[stream->m_ptr++]; +} |