summaryrefslogtreecommitdiff
path: root/Build/source/libs/zziplib/zziplib-src/SDL/SDL_rwops_zzip.c
diff options
context:
space:
mode:
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.c62
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;
+}