| 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 |