OLD | NEW |
1 /* | 1 /* |
2 Additional tools for Minizip | 2 Additional tools for Minizip |
3 Code: Xavier Roche '2004 | 3 Code: Xavier Roche '2004 |
4 License: Same as ZLIB (www.gzip.org) | 4 License: Same as ZLIB (www.gzip.org) |
5 */ | 5 */ |
6 | 6 |
7 /* Code */ | 7 /* Code */ |
8 #include <stdio.h> | 8 #include <stdio.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
11 | |
12 #if defined(USE_SYSTEM_ZLIB) | 11 #if defined(USE_SYSTEM_ZLIB) |
13 #include <zlib.h> | 12 #include <zlib.h> |
14 #else | 13 #else |
15 #include "third_party/zlib/zlib.h" | 14 #include "third_party/zlib/zlib.h" |
16 #endif | 15 #endif |
17 #include "unzip.h" | 16 #include "unzip.h" |
18 | 17 |
19 #define READ_8(adr) ((unsigned char)*(adr)) | 18 #define READ_8(adr) ((unsigned char)*(adr)) |
20 #define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) | 19 #define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) |
21 #define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) | 20 #define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 unsigned int gpflag = READ_16(header + 6); | 59 unsigned int gpflag = READ_16(header + 6); |
61 unsigned int method = READ_16(header + 8); | 60 unsigned int method = READ_16(header + 8); |
62 unsigned int filetime = READ_16(header + 10); | 61 unsigned int filetime = READ_16(header + 10); |
63 unsigned int filedate = READ_16(header + 12); | 62 unsigned int filedate = READ_16(header + 12); |
64 unsigned int crc = READ_32(header + 14); /* crc */ | 63 unsigned int crc = READ_32(header + 14); /* crc */ |
65 unsigned int cpsize = READ_32(header + 18); /* compressed size */ | 64 unsigned int cpsize = READ_32(header + 18); /* compressed size */ |
66 unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ | 65 unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ |
67 unsigned int fnsize = READ_16(header + 26); /* file name length */ | 66 unsigned int fnsize = READ_16(header + 26); /* file name length */ |
68 unsigned int extsize = READ_16(header + 28); /* extra field length */ | 67 unsigned int extsize = READ_16(header + 28); /* extra field length */ |
69 filename[0] = extra[0] = '\0'; | 68 filename[0] = extra[0] = '\0'; |
70 | 69 |
71 /* Header */ | 70 /* Header */ |
72 if (fwrite(header, 1, 30, fpOut) == 30) { | 71 if (fwrite(header, 1, 30, fpOut) == 30) { |
73 offset += 30; | 72 offset += 30; |
74 } else { | 73 } else { |
75 err = Z_ERRNO; | 74 err = Z_ERRNO; |
76 break; | 75 break; |
77 } | 76 } |
78 | 77 |
79 /* Filename */ | 78 /* Filename */ |
80 if (fnsize > 0) { | 79 if (fnsize > 0) { |
81 if (fread(filename, 1, fnsize, fpZip) == fnsize) { | 80 if (fread(filename, 1, fnsize, fpZip) == fnsize) { |
82 if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { | 81 if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { |
83 offset += fnsize; | 82 offset += fnsize; |
84 } else { | 83 } else { |
85 err = Z_ERRNO; | 84 err = Z_ERRNO; |
86 break; | 85 break; |
87 } | 86 } |
88 } else { | 87 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
101 offset += extsize; | 100 offset += extsize; |
102 } else { | 101 } else { |
103 err = Z_ERRNO; | 102 err = Z_ERRNO; |
104 break; | 103 break; |
105 } | 104 } |
106 } else { | 105 } else { |
107 err = Z_ERRNO; | 106 err = Z_ERRNO; |
108 break; | 107 break; |
109 } | 108 } |
110 } | 109 } |
111 | 110 |
112 /* Data */ | 111 /* Data */ |
113 { | 112 { |
114 int dataSize = cpsize; | 113 int dataSize = cpsize; |
115 if (dataSize == 0) { | 114 if (dataSize == 0) { |
116 dataSize = uncpsize; | 115 dataSize = uncpsize; |
117 } | 116 } |
118 if (dataSize > 0) { | 117 if (dataSize > 0) { |
119 char* data = malloc(dataSize); | 118 char* data = malloc(dataSize); |
120 if (data != NULL) { | 119 if (data != NULL) { |
121 if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { | 120 if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { |
122 if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { | 121 if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { |
123 offset += dataSize; | 122 offset += dataSize; |
124 totalBytes += dataSize; | 123 totalBytes += dataSize; |
125 } else { | 124 } else { |
126 err = Z_ERRNO; | 125 err = Z_ERRNO; |
127 } | 126 } |
128 } else { | 127 } else { |
129 err = Z_ERRNO; | 128 err = Z_ERRNO; |
130 } | 129 } |
131 free(data); | 130 free(data); |
132 if (err != Z_OK) { | 131 if (err != Z_OK) { |
133 break; | 132 break; |
134 } | 133 } |
135 } else { | 134 } else { |
136 err = Z_MEM_ERROR; | 135 err = Z_MEM_ERROR; |
137 break; | 136 break; |
138 } | 137 } |
139 } | 138 } |
140 } | 139 } |
141 | 140 |
142 /* Central directory entry */ | 141 /* Central directory entry */ |
143 { | 142 { |
144 char header[46]; | 143 char header[46]; |
145 char* comment = ""; | 144 char* comment = ""; |
146 int comsize = (int) strlen(comment); | 145 int comsize = (int) strlen(comment); |
147 WRITE_32(header, 0x02014b50); | 146 WRITE_32(header, 0x02014b50); |
148 WRITE_16(header + 4, version); | 147 WRITE_16(header + 4, version); |
149 WRITE_16(header + 6, version); | 148 WRITE_16(header + 6, version); |
150 WRITE_16(header + 8, gpflag); | 149 WRITE_16(header + 8, gpflag); |
151 WRITE_16(header + 10, method); | 150 WRITE_16(header + 10, method); |
152 WRITE_16(header + 12, filetime); | 151 WRITE_16(header + 12, filetime); |
153 WRITE_16(header + 14, filedate); | 152 WRITE_16(header + 14, filedate); |
154 WRITE_32(header + 16, crc); | 153 WRITE_32(header + 16, crc); |
155 WRITE_32(header + 20, cpsize); | 154 WRITE_32(header + 20, cpsize); |
156 WRITE_32(header + 24, uncpsize); | 155 WRITE_32(header + 24, uncpsize); |
157 WRITE_16(header + 28, fnsize); | 156 WRITE_16(header + 28, fnsize); |
158 WRITE_16(header + 30, extsize); | 157 WRITE_16(header + 30, extsize); |
159 WRITE_16(header + 32, comsize); | 158 WRITE_16(header + 32, comsize); |
160 WRITE_16(header + 34, 0); /* disk # */ | 159 WRITE_16(header + 34, 0); /* disk # */ |
161 WRITE_16(header + 36, 0); /* int attrb */ | 160 WRITE_16(header + 36, 0); /* int attrb */ |
162 WRITE_32(header + 38, 0); /* ext attrb */ | 161 WRITE_32(header + 38, 0); /* ext attrb */ |
163 WRITE_32(header + 42, currentOffset); | 162 WRITE_32(header + 42, currentOffset); |
164 /* Header */ | 163 /* Header */ |
165 if (fwrite(header, 1, 46, fpOutCD) == 46) { | 164 if (fwrite(header, 1, 46, fpOutCD) == 46) { |
166 offsetCD += 46; | 165 offsetCD += 46; |
167 | 166 |
168 /* Filename */ | 167 /* Filename */ |
169 if (fnsize > 0) { | 168 if (fnsize > 0) { |
170 if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { | 169 if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { |
171 offsetCD += fnsize; | 170 offsetCD += fnsize; |
172 } else { | 171 } else { |
173 err = Z_ERRNO; | 172 err = Z_ERRNO; |
174 break; | 173 break; |
175 } | 174 } |
176 } else { | 175 } else { |
177 err = Z_STREAM_ERROR; | 176 err = Z_STREAM_ERROR; |
178 break; | 177 break; |
179 } | 178 } |
180 | 179 |
181 /* Extra field */ | 180 /* Extra field */ |
182 if (extsize > 0) { | 181 if (extsize > 0) { |
183 if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { | 182 if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { |
184 offsetCD += extsize; | 183 offsetCD += extsize; |
185 } else { | 184 } else { |
186 err = Z_ERRNO; | 185 err = Z_ERRNO; |
187 break; | 186 break; |
188 } | 187 } |
189 } | 188 } |
190 | 189 |
191 /* Comment field */ | 190 /* Comment field */ |
192 if (comsize > 0) { | 191 if (comsize > 0) { |
193 if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { | 192 if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { |
194 offsetCD += comsize; | 193 offsetCD += comsize; |
195 } else { | 194 } else { |
196 err = Z_ERRNO; | 195 err = Z_ERRNO; |
197 break; | 196 break; |
198 } | 197 } |
199 } | 198 } |
200 | 199 |
201 | 200 |
202 } else { | 201 } else { |
203 err = Z_ERRNO; | 202 err = Z_ERRNO; |
204 break; | 203 break; |
205 } | 204 } |
206 } | 205 } |
207 | 206 |
208 /* Success */ | 207 /* Success */ |
209 entries++; | 208 entries++; |
210 | 209 |
211 } else { | 210 } else { |
(...skipping 11 matching lines...) Expand all Loading... |
223 entriesZip = 0xffff; | 222 entriesZip = 0xffff; |
224 } | 223 } |
225 WRITE_32(header, 0x06054b50); | 224 WRITE_32(header, 0x06054b50); |
226 WRITE_16(header + 4, 0); /* disk # */ | 225 WRITE_16(header + 4, 0); /* disk # */ |
227 WRITE_16(header + 6, 0); /* disk # */ | 226 WRITE_16(header + 6, 0); /* disk # */ |
228 WRITE_16(header + 8, entriesZip); /* hack */ | 227 WRITE_16(header + 8, entriesZip); /* hack */ |
229 WRITE_16(header + 10, entriesZip); /* hack */ | 228 WRITE_16(header + 10, entriesZip); /* hack */ |
230 WRITE_32(header + 12, offsetCD); /* size of CD */ | 229 WRITE_32(header + 12, offsetCD); /* size of CD */ |
231 WRITE_32(header + 16, offset); /* offset to CD */ | 230 WRITE_32(header + 16, offset); /* offset to CD */ |
232 WRITE_16(header + 20, comsize); /* comment */ | 231 WRITE_16(header + 20, comsize); /* comment */ |
233 | 232 |
234 /* Header */ | 233 /* Header */ |
235 if (fwrite(header, 1, 22, fpOutCD) == 22) { | 234 if (fwrite(header, 1, 22, fpOutCD) == 22) { |
236 | 235 |
237 /* Comment field */ | 236 /* Comment field */ |
238 if (comsize > 0) { | 237 if (comsize > 0) { |
239 if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { | 238 if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { |
240 err = Z_ERRNO; | 239 err = Z_ERRNO; |
241 } | 240 } |
242 } | 241 } |
243 | 242 |
244 } else { | 243 } else { |
245 err = Z_ERRNO; | 244 err = Z_ERRNO; |
246 } | 245 } |
247 } | 246 } |
248 | 247 |
249 /* Final merge (file + central directory) */ | 248 /* Final merge (file + central directory) */ |
250 fclose(fpOutCD); | 249 fclose(fpOutCD); |
251 if (err == Z_OK) { | 250 if (err == Z_OK) { |
252 fpOutCD = fopen(fileOutTmp, "rb"); | 251 fpOutCD = fopen(fileOutTmp, "rb"); |
253 if (fpOutCD != NULL) { | 252 if (fpOutCD != NULL) { |
254 int nRead; | 253 int nRead; |
255 char buffer[8192]; | 254 char buffer[8192]; |
256 while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { | 255 while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { |
257 if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { | 256 if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { |
258 err = Z_ERRNO; | 257 err = Z_ERRNO; |
259 break; | 258 break; |
260 } | 259 } |
261 } | 260 } |
262 fclose(fpOutCD); | 261 fclose(fpOutCD); |
263 } | 262 } |
264 } | 263 } |
265 | 264 |
266 /* Close */ | 265 /* Close */ |
267 fclose(fpZip); | 266 fclose(fpZip); |
268 fclose(fpOut); | 267 fclose(fpOut); |
269 | 268 |
270 /* Wipe temporary file */ | 269 /* Wipe temporary file */ |
271 (void)remove(fileOutTmp); | 270 (void)remove(fileOutTmp); |
272 | 271 |
273 /* Number of recovered entries */ | 272 /* Number of recovered entries */ |
274 if (err == Z_OK) { | 273 if (err == Z_OK) { |
275 if (nRecovered != NULL) { | 274 if (nRecovered != NULL) { |
276 *nRecovered = entries; | 275 *nRecovered = entries; |
277 } | 276 } |
278 if (bytesRecovered != NULL) { | 277 if (bytesRecovered != NULL) { |
279 *bytesRecovered = totalBytes; | 278 *bytesRecovered = totalBytes; |
280 } | 279 } |
281 } | 280 } |
282 } else { | 281 } else { |
283 err = Z_STREAM_ERROR; | 282 err = Z_STREAM_ERROR; |
284 } | 283 } |
285 return err; | 284 return err; |
286 } | 285 } |
OLD | NEW |