diff --git a/gifdec.c b/gifdec.c index 83c2d0f..bd5e913 100644 --- a/gifdec.c +++ b/gifdec.c @@ -13,6 +13,79 @@ #include #endif +#ifdef USE_ALLOCATED_SPACE +uint8_t *emu_memory; +size_t emu_offset; +size_t emu_size; + +int emu_open(const char *path, int) { + emu_memory = NULL; + emu_offset = 0; + emu_size = 0; + + FILE *f = fopen(path, "rb"); + fseek(f, 0, SEEK_END); + emu_size = ftell(f); + fseek(f, 0, SEEK_SET); /* same as rewind(f); */ + + emu_memory = (uint8_t *)malloc(emu_size + 1); + if(!emu_memory) { + return -1; + } + + fread(emu_memory, emu_size, 1, f); + fclose(f); + + return 1; +} + +int emu_close(int) { + if(emu_memory) { + free(emu_memory); + } + return 0; +} + +int emu_read(int, void *buffer, size_t len) { + if(!emu_memory) { + return -1; + } + + size_t read_length = ((emu_size - 1) < emu_offset + len) ? emu_size - emu_offset : len; + memcpy(buffer, emu_memory + emu_offset, read_length); + emu_offset += read_length; + return read_length; +} + +int emu_lseek(int, size_t value, int type) { + size_t last_offset = emu_offset; + + switch(type) { + case SEEK_SET: + emu_offset = value; + break; + case SEEK_CUR: + emu_offset += value; + break; + case SEEK_END: + emu_offset = emu_size - 1; + break; + } + + if(emu_offset >= emu_size) { + emu_offset = last_offset; + return -1; + } + + return emu_offset; +} + +#define read emu_read +#define lseek emu_lseek +#define open emu_open +#define close emu_close +#endif + #define MIN(A, B) ((A) < (B) ? (A) : (B)) #define MAX(A, B) ((A) > (B) ? (A) : (B))