diff options
Diffstat (limited to 'Build/source/libs/zziplib/zziplib-src/SDL/SDL_rwops_zzip.c')
-rw-r--r-- | Build/source/libs/zziplib/zziplib-src/SDL/SDL_rwops_zzip.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/Build/source/libs/zziplib/zziplib-src/SDL/SDL_rwops_zzip.c b/Build/source/libs/zziplib/zziplib-src/SDL/SDL_rwops_zzip.c new file mode 100644 index 00000000000..b273a811470 --- /dev/null +++ b/Build/source/libs/zziplib/zziplib-src/SDL/SDL_rwops_zzip.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001 Guido Draheim <guidod@gmx.de> + * Use freely under the restrictions of the ZLIB License + * + * (this example uses errno which might not be multithreaded everywhere) + */ + +#include <SDL_rwops_zzip.h> +#include <zzip/zzip.h> +#include <string.h> /* strchr */ + +/* MSVC can not take a casted variable as an lvalue ! */ +#define SDL_RWOPS_ZZIP_DATA(_context) \ + ((_context)->hidden.unknown.data1) +#define SDL_RWOPS_ZZIP_FILE(_context) (ZZIP_FILE*) \ + ((_context)->hidden.unknown.data1) + +static int _zzip_seek(SDL_RWops *context, int offset, int whence) +{ + return zzip_seek(SDL_RWOPS_ZZIP_FILE(context), offset, whence); +} + +static int _zzip_read(SDL_RWops *context, void *ptr, int size, int maxnum) +{ + return zzip_read(SDL_RWOPS_ZZIP_FILE(context), ptr, size*maxnum) / size; +} + +static int _zzip_write(SDL_RWops *context, const void *ptr, int size, int num) +{ + return 0; /* ignored */ +} + +static int _zzip_close(SDL_RWops *context) +{ + if (! context) return 0; /* may be SDL_RWclose is called by atexit */ + + zzip_close (SDL_RWOPS_ZZIP_FILE(context)); + SDL_FreeRW (context); + return 0; +} + +SDL_RWops *SDL_RWFromZZIP(const char* file, const char* mode) +{ + register SDL_RWops* rwops; + register ZZIP_FILE* zzip_file; + + if (! strchr (mode, 'r')) + return SDL_RWFromFile(file, mode); + + zzip_file = zzip_fopen (file, mode); + if (! zzip_file) return 0; + + rwops = SDL_AllocRW (); + if (! rwops) { errno=ENOMEM; zzip_close (zzip_file); return 0; } + + SDL_RWOPS_ZZIP_DATA(rwops) = zzip_file; + rwops->read = _zzip_read; + rwops->write = _zzip_write; + rwops->seek = _zzip_seek; + rwops->close = _zzip_close; + return rwops; +} |