initial import
[picodrive.git] / platform / win32 / GenaDrive / Unzip.cpp
diff --git a/platform/win32/GenaDrive/Unzip.cpp b/platform/win32/GenaDrive/Unzip.cpp
new file mode 100644 (file)
index 0000000..d152de9
--- /dev/null
@@ -0,0 +1,109 @@
+\r
+\r
+#include "app.h"\r
+#include "Unzip.h"\r
+#include "zlib.h"\r
+\r
+// Decompress a 'deflate' compressed buffer\r
+static int Inflate(unsigned char *dest,int destLen, unsigned char *src,int srcLen)\r
+{\r
+  z_stream stream;\r
+\r
+  memset(&stream,0,sizeof(stream));\r
+\r
+  stream.next_in  =src;\r
+  stream.avail_in =srcLen;\r
+  stream.next_out =dest;\r
+  stream.avail_out=destLen;\r
+  inflateInit2(&stream,-15);\r
+  inflate(&stream,Z_FINISH);\r
+  inflateEnd(&stream);\r
+\r
+  return 0;\r
+}\r
+\r
+static int Get32(unsigned char *src)\r
+{\r
+  return src[0] | (src[1]<<8) | (src[2]<<16) | (src[3]<<24);\r
+}\r
+\r
+// --------------------------------------------------------------\r
+Unzip::Unzip()\r
+{\r
+  memset(this,0,sizeof(*this));\r
+}\r
+\r
+int Unzip::gotoFirstFile()\r
+{\r
+  headerPos=0;\r
+  return 0;\r
+}\r
+\r
+int Unzip::fileOpen()\r
+{\r
+  int ret=0,okay=0;\r
+\r
+  fseek(file,headerPos,SEEK_SET);\r
+\r
+  // Read in file entry header:\r
+  ret=fread(head,1,sizeof(head),file);\r
+  if (ret!=sizeof(head)) return 1;\r
+\r
+  // Check header:\r
+  if (head[0]=='P' && head[1]=='K' && head[2]==3 && head[3]==4) okay=1;\r
+  if (okay==0) return 1;\r
+\r
+  // Get compressed and uncompressed sizes:\r
+  srcLen =Get32(head+0x12);\r
+  dataLen=Get32(head+0x16);\r
+\r
+  // Get size of name and extra fields:\r
+  nameLen=Get32(head+0x1a);\r
+  extraLen=nameLen>>16; nameLen&=0xffff;\r
+\r
+  // Read in name:\r
+  name=(char *)malloc(nameLen+1); if (name==NULL) return 1;\r
+  memset(name,0,nameLen+1);\r
+  fread(name,1,nameLen,file);\r
+\r
+  // Find position of compressed data in the file\r
+  compPos=headerPos+sizeof(head);\r
+  compPos+=nameLen+extraLen;\r
+\r
+  return 0;\r
+}\r
+\r
+int Unzip::fileClose()\r
+{\r
+  free(name); name=NULL;\r
+\r
+  // Go to next header:\r
+  headerPos=compPos+srcLen;\r
+\r
+  srcLen=dataLen=0;\r
+  nameLen=extraLen=0;\r
+\r
+  return 0;\r
+}\r
+\r
+int Unzip::fileDecode(unsigned char *data)\r
+{\r
+  unsigned char *src=NULL;\r
+\r
+  // Go to compressed data:\r
+  fseek(file,compPos,SEEK_SET);\r
+\r
+  // Allocate memory:\r
+  src=(unsigned char *)malloc(srcLen);\r
+  if (src==NULL) { fclose(file); return 1; }\r
+  memset(src,0,srcLen);\r
+\r
+  // Read in compressed version and decompress\r
+  fread(src,1,srcLen,file);\r
+\r
+  Inflate(data,dataLen, src,srcLen);\r
+\r
+  free(src); src=NULL; srcLen=0;\r
+\r
+  return 0;\r
+}\r