bugfix for SIMPLE_WRITE_SOUND
[picodrive.git] / platform / win32 / GenaDrive / Unzip.cpp
1 \r
2 \r
3 #include "app.h"\r
4 #include "Unzip.h"\r
5 #include "zlib.h"\r
6 \r
7 // Decompress a 'deflate' compressed buffer\r
8 static int Inflate(unsigned char *dest,int destLen, unsigned char *src,int srcLen)\r
9 {\r
10   z_stream stream;\r
11 \r
12   memset(&stream,0,sizeof(stream));\r
13 \r
14   stream.next_in  =src;\r
15   stream.avail_in =srcLen;\r
16   stream.next_out =dest;\r
17   stream.avail_out=destLen;\r
18   inflateInit2(&stream,-15);\r
19   inflate(&stream,Z_FINISH);\r
20   inflateEnd(&stream);\r
21 \r
22   return 0;\r
23 }\r
24 \r
25 static int Get32(unsigned char *src)\r
26 {\r
27   return src[0] | (src[1]<<8) | (src[2]<<16) | (src[3]<<24);\r
28 }\r
29 \r
30 // --------------------------------------------------------------\r
31 Unzip::Unzip()\r
32 {\r
33   memset(this,0,sizeof(*this));\r
34 }\r
35 \r
36 int Unzip::gotoFirstFile()\r
37 {\r
38   headerPos=0;\r
39   return 0;\r
40 }\r
41 \r
42 int Unzip::fileOpen()\r
43 {\r
44   int ret=0,okay=0;\r
45 \r
46   fseek(file,headerPos,SEEK_SET);\r
47 \r
48   // Read in file entry header:\r
49   ret=fread(head,1,sizeof(head),file);\r
50   if (ret!=sizeof(head)) return 1;\r
51 \r
52   // Check header:\r
53   if (head[0]=='P' && head[1]=='K' && head[2]==3 && head[3]==4) okay=1;\r
54   if (okay==0) return 1;\r
55 \r
56   // Get compressed and uncompressed sizes:\r
57   srcLen =Get32(head+0x12);\r
58   dataLen=Get32(head+0x16);\r
59 \r
60   // Get size of name and extra fields:\r
61   nameLen=Get32(head+0x1a);\r
62   extraLen=nameLen>>16; nameLen&=0xffff;\r
63 \r
64   // Read in name:\r
65   name=(char *)malloc(nameLen+1); if (name==NULL) return 1;\r
66   memset(name,0,nameLen+1);\r
67   fread(name,1,nameLen,file);\r
68 \r
69   // Find position of compressed data in the file\r
70   compPos=headerPos+sizeof(head);\r
71   compPos+=nameLen+extraLen;\r
72 \r
73   return 0;\r
74 }\r
75 \r
76 int Unzip::fileClose()\r
77 {\r
78   free(name); name=NULL;\r
79 \r
80   // Go to next header:\r
81   headerPos=compPos+srcLen;\r
82 \r
83   srcLen=dataLen=0;\r
84   nameLen=extraLen=0;\r
85 \r
86   return 0;\r
87 }\r
88 \r
89 int Unzip::fileDecode(unsigned char *data)\r
90 {\r
91   unsigned char *src=NULL;\r
92 \r
93   // Go to compressed data:\r
94   fseek(file,compPos,SEEK_SET);\r
95 \r
96   // Allocate memory:\r
97   src=(unsigned char *)malloc(srcLen);\r
98   if (src==NULL) { fclose(file); return 1; }\r
99   memset(src,0,srcLen);\r
100 \r
101   // Read in compressed version and decompress\r
102   fread(src,1,srcLen,file);\r
103 \r
104   Inflate(data,dataLen, src,srcLen);\r
105 \r
106   free(src); src=NULL; srcLen=0;\r
107 \r
108   return 0;\r
109 }\r