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