| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,351 @@ | ||
| /* ioapi.c -- IO base function header for compress/uncompress .zip | ||
| part of the MiniZip project | ||
| Copyright (C) 1998-2010 Gilles Vollant | ||
| http://www.winimage.com/zLibDll/minizip.html | ||
| Modifications for Zip64 support | ||
| Copyright (C) 2009-2010 Mathias Svensson | ||
| http://result42.com | ||
| This program is distributed under the terms of the same license as zlib. | ||
| See the accompanying LICENSE file for the full text of the license. | ||
| */ | ||
|
|
||
| #include <stdlib.h> | ||
| #include <string.h> | ||
|
|
||
| #if defined unix || defined __APPLE__ | ||
| #include <sys/types.h> | ||
| #include <unistd.h> | ||
| #endif | ||
|
|
||
| #include "ioapi.h" | ||
|
|
||
| #if defined(_WIN32) | ||
| # define snprintf _snprintf | ||
| #endif | ||
|
|
||
| voidpf call_zopen64(const zlib_filefunc64_32_def *pfilefunc, const void *filename, int mode) | ||
| { | ||
| if (pfilefunc->zfile_func64.zopen64_file != NULL) | ||
| return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque, filename, mode); | ||
| return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque, (const char*)filename, mode); | ||
| } | ||
|
|
||
| voidpf call_zopendisk64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint32_t number_disk, int mode) | ||
| { | ||
| if (pfilefunc->zfile_func64.zopendisk64_file != NULL) | ||
| return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque, filestream, number_disk, mode); | ||
| return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque, filestream, number_disk, mode); | ||
| } | ||
|
|
||
| long call_zseek64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint64_t offset, int origin) | ||
| { | ||
| uint32_t offset_truncated = 0; | ||
| if (pfilefunc->zfile_func64.zseek64_file != NULL) | ||
| return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); | ||
| offset_truncated = (uint32_t)offset; | ||
| if (offset_truncated != offset) | ||
| return -1; | ||
| return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream, offset_truncated, origin); | ||
| } | ||
|
|
||
| uint64_t call_ztell64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream) | ||
| { | ||
| uint64_t position; | ||
| if (pfilefunc->zfile_func64.zseek64_file != NULL) | ||
| return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque, filestream); | ||
| position = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque, filestream); | ||
| if ((position) == UINT32_MAX) | ||
| return (uint64_t)-1; | ||
| return position; | ||
| } | ||
|
|
||
| void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def *p_filefunc64_32, const zlib_filefunc_def *p_filefunc32) | ||
| { | ||
| p_filefunc64_32->zfile_func64.zopen64_file = NULL; | ||
| p_filefunc64_32->zfile_func64.zopendisk64_file = NULL; | ||
| p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; | ||
| p_filefunc64_32->zopendisk32_file = p_filefunc32->zopendisk_file; | ||
| p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; | ||
| p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; | ||
| p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; | ||
| p_filefunc64_32->zfile_func64.ztell64_file = NULL; | ||
| p_filefunc64_32->zfile_func64.zseek64_file = NULL; | ||
| p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; | ||
| p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; | ||
| p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; | ||
| p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; | ||
| p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; | ||
| } | ||
|
|
||
| static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char *filename, int mode); | ||
| static uint32_t ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uint32_t size); | ||
| static uint32_t ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void *buf, uint32_t size); | ||
| static uint64_t ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream); | ||
| static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, uint64_t offset, int origin); | ||
| static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream); | ||
| static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream); | ||
|
|
||
| typedef struct | ||
| { | ||
| FILE *file; | ||
| int filenameLength; | ||
| void *filename; | ||
| } FILE_IOPOSIX; | ||
|
|
||
| static voidpf file_build_ioposix(FILE *file, const char *filename) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| if (file == NULL) | ||
| return NULL; | ||
| ioposix = (FILE_IOPOSIX*)malloc(sizeof(FILE_IOPOSIX)); | ||
| ioposix->file = file; | ||
| ioposix->filenameLength = (int)strlen(filename) + 1; | ||
| ioposix->filename = (char*)malloc(ioposix->filenameLength * sizeof(char)); | ||
| strncpy((char*)ioposix->filename, filename, ioposix->filenameLength); | ||
| return (voidpf)ioposix; | ||
| } | ||
|
|
||
| static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char *filename, int mode) | ||
| { | ||
| FILE* file = NULL; | ||
| const char *mode_fopen = NULL; | ||
| if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) | ||
| mode_fopen = "rb"; | ||
| else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | ||
| mode_fopen = "r+b"; | ||
| else if (mode & ZLIB_FILEFUNC_MODE_CREATE) | ||
| mode_fopen = "wb"; | ||
|
|
||
| if ((filename != NULL) && (mode_fopen != NULL)) | ||
| { | ||
| file = fopen(filename, mode_fopen); | ||
| return file_build_ioposix(file, filename); | ||
| } | ||
| return file; | ||
| } | ||
|
|
||
| static voidpf ZCALLBACK fopen64_file_func(voidpf opaque, const void *filename, int mode) | ||
| { | ||
| FILE* file = NULL; | ||
| const char *mode_fopen = NULL; | ||
| if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) | ||
| mode_fopen = "rb"; | ||
| else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | ||
| mode_fopen = "r+b"; | ||
| else if (mode & ZLIB_FILEFUNC_MODE_CREATE) | ||
| mode_fopen = "wb"; | ||
|
|
||
| if ((filename != NULL) && (mode_fopen != NULL)) | ||
| { | ||
| file = fopen64((const char*)filename, mode_fopen); | ||
| return file_build_ioposix(file, (const char*)filename); | ||
| } | ||
| return file; | ||
| } | ||
|
|
||
| static voidpf ZCALLBACK fopendisk64_file_func(voidpf opaque, voidpf stream, uint32_t number_disk, int mode) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| char *diskFilename = NULL; | ||
| voidpf ret = NULL; | ||
| int i = 0; | ||
|
|
||
| if (stream == NULL) | ||
| return NULL; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char)); | ||
| strncpy(diskFilename, (const char*)ioposix->filename, ioposix->filenameLength); | ||
| for (i = ioposix->filenameLength - 1; i >= 0; i -= 1) | ||
| { | ||
| if (diskFilename[i] != '.') | ||
| continue; | ||
| snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02u", number_disk + 1); | ||
| break; | ||
| } | ||
| if (i >= 0) | ||
| ret = fopen64_file_func(opaque, diskFilename, mode); | ||
| free(diskFilename); | ||
| return ret; | ||
| } | ||
|
|
||
| static voidpf ZCALLBACK fopendisk_file_func(voidpf opaque, voidpf stream, uint32_t number_disk, int mode) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| char *diskFilename = NULL; | ||
| voidpf ret = NULL; | ||
| int i = 0; | ||
|
|
||
| if (stream == NULL) | ||
| return NULL; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char)); | ||
| strncpy(diskFilename, (const char*)ioposix->filename, ioposix->filenameLength); | ||
| for (i = ioposix->filenameLength - 1; i >= 0; i -= 1) | ||
| { | ||
| if (diskFilename[i] != '.') | ||
| continue; | ||
| snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02u", number_disk + 1); | ||
| break; | ||
| } | ||
| if (i >= 0) | ||
| ret = fopen_file_func(opaque, diskFilename, mode); | ||
| free(diskFilename); | ||
| return ret; | ||
| } | ||
|
|
||
| static uint32_t ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uint32_t size) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| uint32_t read = (uint32_t)-1; | ||
| if (stream == NULL) | ||
| return read; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| read = (uint32_t)fread(buf, 1, (size_t)size, ioposix->file); | ||
| return read; | ||
| } | ||
|
|
||
| static uint32_t ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void *buf, uint32_t size) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| uint32_t written = (uint32_t)-1; | ||
| if (stream == NULL) | ||
| return written; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| written = (uint32_t)fwrite(buf, 1, (size_t)size, ioposix->file); | ||
| return written; | ||
| } | ||
|
|
||
| static long ZCALLBACK ftell_file_func(voidpf opaque, voidpf stream) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| long ret = -1; | ||
| if (stream == NULL) | ||
| return ret; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| ret = ftell(ioposix->file); | ||
| return ret; | ||
| } | ||
|
|
||
| static uint64_t ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| uint64_t ret = (uint64_t)-1; | ||
| if (stream == NULL) | ||
| return ret; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| ret = ftello64(ioposix->file); | ||
| return ret; | ||
| } | ||
|
|
||
| static long ZCALLBACK fseek_file_func(voidpf opaque, voidpf stream, uint32_t offset, int origin) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| int fseek_origin = 0; | ||
| long ret = 0; | ||
|
|
||
| if (stream == NULL) | ||
| return -1; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
|
|
||
| switch (origin) | ||
| { | ||
| case ZLIB_FILEFUNC_SEEK_CUR: | ||
| fseek_origin = SEEK_CUR; | ||
| break; | ||
| case ZLIB_FILEFUNC_SEEK_END: | ||
| fseek_origin = SEEK_END; | ||
| break; | ||
| case ZLIB_FILEFUNC_SEEK_SET: | ||
| fseek_origin = SEEK_SET; | ||
| break; | ||
| default: | ||
| return -1; | ||
| } | ||
| if (fseek(ioposix->file, offset, fseek_origin) != 0) | ||
| ret = -1; | ||
| return ret; | ||
| } | ||
|
|
||
| static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, uint64_t offset, int origin) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| int fseek_origin = 0; | ||
| long ret = 0; | ||
|
|
||
| if (stream == NULL) | ||
| return -1; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
|
|
||
| switch (origin) | ||
| { | ||
| case ZLIB_FILEFUNC_SEEK_CUR: | ||
| fseek_origin = SEEK_CUR; | ||
| break; | ||
| case ZLIB_FILEFUNC_SEEK_END: | ||
| fseek_origin = SEEK_END; | ||
| break; | ||
| case ZLIB_FILEFUNC_SEEK_SET: | ||
| fseek_origin = SEEK_SET; | ||
| break; | ||
| default: | ||
| return -1; | ||
| } | ||
|
|
||
| if (fseeko64(ioposix->file, offset, fseek_origin) != 0) | ||
| ret = -1; | ||
|
|
||
| return ret; | ||
| } | ||
|
|
||
| static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| int ret = -1; | ||
| if (stream == NULL) | ||
| return ret; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| if (ioposix->filename != NULL) | ||
| free(ioposix->filename); | ||
| ret = fclose(ioposix->file); | ||
| free(ioposix); | ||
| return ret; | ||
| } | ||
|
|
||
| static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream) | ||
| { | ||
| FILE_IOPOSIX *ioposix = NULL; | ||
| int ret = -1; | ||
| if (stream == NULL) | ||
| return ret; | ||
| ioposix = (FILE_IOPOSIX*)stream; | ||
| ret = ferror(ioposix->file); | ||
| return ret; | ||
| } | ||
|
|
||
| void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def) | ||
| { | ||
| pzlib_filefunc_def->zopen_file = fopen_file_func; | ||
| pzlib_filefunc_def->zopendisk_file = fopendisk_file_func; | ||
| pzlib_filefunc_def->zread_file = fread_file_func; | ||
| pzlib_filefunc_def->zwrite_file = fwrite_file_func; | ||
| pzlib_filefunc_def->ztell_file = ftell_file_func; | ||
| pzlib_filefunc_def->zseek_file = fseek_file_func; | ||
| pzlib_filefunc_def->zclose_file = fclose_file_func; | ||
| pzlib_filefunc_def->zerror_file = ferror_file_func; | ||
| pzlib_filefunc_def->opaque = NULL; | ||
| } | ||
|
|
||
| void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def) | ||
| { | ||
| pzlib_filefunc_def->zopen64_file = fopen64_file_func; | ||
| pzlib_filefunc_def->zopendisk64_file = fopendisk64_file_func; | ||
| pzlib_filefunc_def->zread_file = fread_file_func; | ||
| pzlib_filefunc_def->zwrite_file = fwrite_file_func; | ||
| pzlib_filefunc_def->ztell64_file = ftell64_file_func; | ||
| pzlib_filefunc_def->zseek64_file = fseek64_file_func; | ||
| pzlib_filefunc_def->zclose_file = fclose_file_func; | ||
| pzlib_filefunc_def->zerror_file = ferror_file_func; | ||
| pzlib_filefunc_def->opaque = NULL; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,146 @@ | ||
| /* ioapi.h -- IO base function header for compress/uncompress .zip | ||
| part of the MiniZip project | ||
| Copyright (C) 1998-2010 Gilles Vollant | ||
| http://www.winimage.com/zLibDll/minizip.html | ||
| Modifications for Zip64 support | ||
| Copyright (C) 2009-2010 Mathias Svensson | ||
| http://result42.com | ||
| This program is distributed under the terms of the same license as zlib. | ||
| See the accompanying LICENSE file for the full text of the license. | ||
| */ | ||
|
|
||
| #ifndef _ZLIBIOAPI64_H | ||
| #define _ZLIBIOAPI64_H | ||
|
|
||
| #include <stdio.h> | ||
| #include <stdlib.h> | ||
| #include <stdint.h> | ||
|
|
||
| #include "zlib.h" | ||
|
|
||
| #if defined(USE_FILE32API) | ||
| # define fopen64 fopen | ||
| # define ftello64 ftell | ||
| # define fseeko64 fseek | ||
| #else | ||
| # if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__APPLE__) | ||
| # define fopen64 fopen | ||
| # define ftello64 ftello | ||
| # define fseeko64 fseeko | ||
| # endif | ||
| # ifdef _MSC_VER | ||
| # define fopen64 fopen | ||
| # if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) | ||
| # define ftello64 _ftelli64 | ||
| # define fseeko64 _fseeki64 | ||
| # else /* old MSC */ | ||
| # define ftello64 ftell | ||
| # define fseeko64 fseek | ||
| # endif | ||
| # endif | ||
| #endif | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #define ZLIB_FILEFUNC_SEEK_CUR (1) | ||
| #define ZLIB_FILEFUNC_SEEK_END (2) | ||
| #define ZLIB_FILEFUNC_SEEK_SET (0) | ||
|
|
||
| #define ZLIB_FILEFUNC_MODE_READ (1) | ||
| #define ZLIB_FILEFUNC_MODE_WRITE (2) | ||
| #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) | ||
| #define ZLIB_FILEFUNC_MODE_EXISTING (4) | ||
| #define ZLIB_FILEFUNC_MODE_CREATE (8) | ||
|
|
||
| #ifndef ZCALLBACK | ||
| # if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \ | ||
| defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) | ||
| # define ZCALLBACK CALLBACK | ||
| # else | ||
| # define ZCALLBACK | ||
| # endif | ||
| #endif | ||
|
|
||
| typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char *filename, int mode); | ||
| typedef voidpf (ZCALLBACK *opendisk_file_func) (voidpf opaque, voidpf stream, uint32_t number_disk, int mode); | ||
| typedef uint32_t (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uint32_t size); | ||
| typedef uint32_t (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void *buf, uint32_t size); | ||
| typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream); | ||
| typedef int (ZCALLBACK *error_file_func) (voidpf opaque, voidpf stream); | ||
|
|
||
| typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream); | ||
| typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uint32_t offset, int origin); | ||
|
|
||
| /* here is the "old" 32 bits structure structure */ | ||
| typedef struct zlib_filefunc_def_s | ||
| { | ||
| open_file_func zopen_file; | ||
| opendisk_file_func zopendisk_file; | ||
| read_file_func zread_file; | ||
| write_file_func zwrite_file; | ||
| tell_file_func ztell_file; | ||
| seek_file_func zseek_file; | ||
| close_file_func zclose_file; | ||
| error_file_func zerror_file; | ||
| voidpf opaque; | ||
| } zlib_filefunc_def; | ||
|
|
||
| typedef uint64_t (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream); | ||
| typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, uint64_t offset, int origin); | ||
| typedef voidpf (ZCALLBACK *open64_file_func) (voidpf opaque, const void *filename, int mode); | ||
| typedef voidpf (ZCALLBACK *opendisk64_file_func)(voidpf opaque, voidpf stream, uint32_t number_disk, int mode); | ||
|
|
||
| typedef struct zlib_filefunc64_def_s | ||
| { | ||
| open64_file_func zopen64_file; | ||
| opendisk64_file_func zopendisk64_file; | ||
| read_file_func zread_file; | ||
| write_file_func zwrite_file; | ||
| tell64_file_func ztell64_file; | ||
| seek64_file_func zseek64_file; | ||
| close_file_func zclose_file; | ||
| error_file_func zerror_file; | ||
| voidpf opaque; | ||
| } zlib_filefunc64_def; | ||
|
|
||
| void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def); | ||
| void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def); | ||
|
|
||
| /* now internal definition, only for zip.c and unzip.h */ | ||
| typedef struct zlib_filefunc64_32_def_s | ||
| { | ||
| zlib_filefunc64_def zfile_func64; | ||
| open_file_func zopen32_file; | ||
| opendisk_file_func zopendisk32_file; | ||
| tell_file_func ztell32_file; | ||
| seek_file_func zseek32_file; | ||
| } zlib_filefunc64_32_def; | ||
|
|
||
| #define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) | ||
| #define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) | ||
| /*#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))*/ | ||
| /*#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))*/ | ||
| #define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) | ||
| #define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) | ||
|
|
||
| voidpf call_zopen64(const zlib_filefunc64_32_def *pfilefunc,const void*filename, int mode); | ||
| voidpf call_zopendisk64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint32_t number_disk, int mode); | ||
| long call_zseek64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint64_t offset, int origin); | ||
| uint64_t call_ztell64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream); | ||
|
|
||
| void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def *p_filefunc64_32, const zlib_filefunc_def *p_filefunc32); | ||
|
|
||
| #define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) | ||
| #define ZOPENDISK64(filefunc,filestream,diskn,mode) (call_zopendisk64((&(filefunc)),(filestream),(diskn),(mode))) | ||
| #define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) | ||
| #define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,62 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup Label="ProjectConfigurations"> | ||
| <ProjectConfiguration Include="Debug|x64"> | ||
| <Configuration>Debug</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Release|x64"> | ||
| <Configuration>Release</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| </ItemGroup> | ||
| <PropertyGroup Label="Globals"> | ||
| <ProjectGuid>{23114507-079A-4418-9707-CFA81A03CA99}</ProjectGuid> | ||
| <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||
| <PropertyGroup Label="Configuration"> | ||
| <ConfigurationType>StaticLibrary</ConfigurationType> | ||
| <PlatformToolset>v141</PlatformToolset> | ||
| <CharacterSet>Unicode</CharacterSet> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration"> | ||
| <UseDebugLibraries>true</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration"> | ||
| <UseDebugLibraries>false</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||
| <ImportGroup Label="ExtensionSettings"> | ||
| </ImportGroup> | ||
| <ImportGroup Label="PropertySheets"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\Source\VSProps\Base.props" /> | ||
| <Import Project="..\..\Source\VSProps\ClDisableAllWarnings.props" /> | ||
| </ImportGroup> | ||
| <PropertyGroup Label="UserMacros" /> | ||
| <PropertyGroup /> | ||
| <ItemDefinitionGroup> | ||
| <ClCompile> | ||
| <PreprocessorDefinitions>NOUNCRYPT;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||
| </ClCompile> | ||
| </ItemDefinitionGroup> | ||
| <ItemGroup> | ||
| <Text Include="CMakeLists.txt" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClCompile Include="ioapi.c" /> | ||
| <ClCompile Include="unzip.c" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClInclude Include="ioapi.h" /> | ||
| <ClInclude Include="unzip.h" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <None Include="LICENSE" /> | ||
| <None Include="README" /> | ||
| </ItemGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||
| <ImportGroup Label="ExtensionTargets"> | ||
| </ImportGroup> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,306 @@ | ||
| /* unzip.h -- IO for uncompress .zip files using zlib | ||
| Version 1.1, February 14h, 2010 | ||
| part of the MiniZip project | ||
| Copyright (C) 1998-2010 Gilles Vollant | ||
| http://www.winimage.com/zLibDll/minizip.html | ||
| Modifications of Unzip for Zip64 | ||
| Copyright (C) 2007-2008 Even Rouault | ||
| Modifications for Zip64 support on both zip and unzip | ||
| Copyright (C) 2009-2010 Mathias Svensson | ||
| http://result42.com | ||
| This program is distributed under the terms of the same license as zlib. | ||
| See the accompanying LICENSE file for the full text of the license. | ||
| */ | ||
|
|
||
| #ifndef _UNZ_H | ||
| #define _UNZ_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #ifndef _ZLIB_H | ||
| #include "zlib.h" | ||
| #endif | ||
|
|
||
| #ifndef _ZLIBIOAPI_H | ||
| #include "ioapi.h" | ||
| #endif | ||
|
|
||
| #ifdef HAVE_BZIP2 | ||
| #include "bzlib.h" | ||
| #endif | ||
|
|
||
| #define Z_BZIP2ED 12 | ||
|
|
||
| #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) | ||
| /* like the STRICT of WIN32, we define a pointer that cannot be converted | ||
| from (void*) without cast */ | ||
| typedef struct TagunzFile__ { int unused; } unz_file__; | ||
| typedef unz_file__ *unzFile; | ||
| #else | ||
| typedef voidp unzFile; | ||
| #endif | ||
|
|
||
| #define UNZ_OK (0) | ||
| #define UNZ_END_OF_LIST_OF_FILE (-100) | ||
| #define UNZ_ERRNO (Z_ERRNO) | ||
| #define UNZ_EOF (0) | ||
| #define UNZ_PARAMERROR (-102) | ||
| #define UNZ_BADZIPFILE (-103) | ||
| #define UNZ_INTERNALERROR (-104) | ||
| #define UNZ_CRCERROR (-105) | ||
| #define UNZ_BADPASSWORD (-106) | ||
|
|
||
| /* unz_global_info structure contain global data about the ZIPfile | ||
| These data comes from the end of central dir */ | ||
| typedef struct unz_global_info64_s | ||
| { | ||
| uint64_t number_entry; /* total number of entries in the central dir on this disk */ | ||
| uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/ | ||
| uint16_t size_comment; /* size of the global comment of the zipfile */ | ||
| } unz_global_info64; | ||
|
|
||
| typedef struct unz_global_info_s | ||
| { | ||
| uint32_t number_entry; /* total number of entries in the central dir on this disk */ | ||
| uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/ | ||
| uint16_t size_comment; /* size of the global comment of the zipfile */ | ||
| } unz_global_info; | ||
|
|
||
| /* unz_file_info contain information about a file in the zipfile */ | ||
| typedef struct unz_file_info64_s | ||
| { | ||
| uint16_t version; /* version made by 2 bytes */ | ||
| uint16_t version_needed; /* version needed to extract 2 bytes */ | ||
| uint16_t flag; /* general purpose bit flag 2 bytes */ | ||
| uint16_t compression_method; /* compression method 2 bytes */ | ||
| uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */ | ||
| uint32_t crc; /* crc-32 4 bytes */ | ||
| uint64_t compressed_size; /* compressed size 8 bytes */ | ||
| uint64_t uncompressed_size; /* uncompressed size 8 bytes */ | ||
| uint16_t size_filename; /* filename length 2 bytes */ | ||
| uint16_t size_file_extra; /* extra field length 2 bytes */ | ||
| uint16_t size_file_comment; /* file comment length 2 bytes */ | ||
|
|
||
| uint32_t disk_num_start; /* disk number start 4 bytes */ | ||
| uint16_t internal_fa; /* internal file attributes 2 bytes */ | ||
| uint32_t external_fa; /* external file attributes 4 bytes */ | ||
|
|
||
| uint64_t disk_offset; | ||
|
|
||
| uint16_t size_file_extra_internal; | ||
| } unz_file_info64; | ||
|
|
||
| typedef struct unz_file_info_s | ||
| { | ||
| uint16_t version; /* version made by 2 bytes */ | ||
| uint16_t version_needed; /* version needed to extract 2 bytes */ | ||
| uint16_t flag; /* general purpose bit flag 2 bytes */ | ||
| uint16_t compression_method; /* compression method 2 bytes */ | ||
| uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */ | ||
| uint32_t crc; /* crc-32 4 bytes */ | ||
| uint32_t compressed_size; /* compressed size 4 bytes */ | ||
| uint32_t uncompressed_size; /* uncompressed size 4 bytes */ | ||
| uint16_t size_filename; /* filename length 2 bytes */ | ||
| uint16_t size_file_extra; /* extra field length 2 bytes */ | ||
| uint16_t size_file_comment; /* file comment length 2 bytes */ | ||
|
|
||
| uint16_t disk_num_start; /* disk number start 2 bytes */ | ||
| uint16_t internal_fa; /* internal file attributes 2 bytes */ | ||
| uint32_t external_fa; /* external file attributes 4 bytes */ | ||
|
|
||
| uint64_t disk_offset; | ||
| } unz_file_info; | ||
|
|
||
| /***************************************************************************/ | ||
| /* Opening and close a zip file */ | ||
|
|
||
| extern unzFile ZEXPORT unzOpen(const char *path); | ||
| extern unzFile ZEXPORT unzOpen64(const void *path); | ||
| /* Open a Zip file. | ||
| path should contain the full path (by example, on a Windows XP computer | ||
| "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". | ||
| return NULL if zipfile cannot be opened or doesn't exist | ||
| return unzFile handle if no error | ||
| NOTE: The "64" function take a const void *pointer, because the path is just the value passed to the | ||
| open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path | ||
| is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char *does not describe the reality */ | ||
|
|
||
| extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc_def); | ||
| /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */ | ||
| extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def); | ||
| /* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */ | ||
|
|
||
| extern int ZEXPORT unzClose(unzFile file); | ||
| /* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile, | ||
| these files MUST be closed with unzipCloseCurrentFile before call unzipClose. | ||
| return UNZ_OK if there is no error */ | ||
|
|
||
| extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info *pglobal_info); | ||
| extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info); | ||
| /* Write info about the ZipFile in the *pglobal_info structure. | ||
| return UNZ_OK if no error */ | ||
|
|
||
| extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uint16_t comment_size); | ||
| /* Get the global comment string of the ZipFile, in the comment buffer. | ||
| uSizeBuf is the size of the szComment buffer. | ||
| return the number of byte copied or an error code <0 */ | ||
|
|
||
| /***************************************************************************/ | ||
| /* Reading the content of the current zipfile, you can open it, read data from it, and close it | ||
| (you can close it before reading all the file) */ | ||
|
|
||
| extern int ZEXPORT unzOpenCurrentFile(unzFile file); | ||
| /* Open for reading data the current file in the zipfile. | ||
| return UNZ_OK if no error */ | ||
|
|
||
| extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password); | ||
| /* Open for reading data the current file in the zipfile. | ||
| password is a crypting password | ||
| return UNZ_OK if no error */ | ||
|
|
||
| extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw); | ||
| /* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress) | ||
| if raw==1 *method will receive method of compression, *level will receive level of compression | ||
| NOTE: you can set level parameter as NULL (if you did not want known level, | ||
| but you CANNOT set method parameter as NULL */ | ||
|
|
||
| extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password); | ||
| /* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */ | ||
|
|
||
| extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, uint32_t len); | ||
| /* Read bytes from the current file (opened by unzOpenCurrentFile) | ||
| buf contain buffer where data must be copied | ||
| len the size of buf. | ||
| return the number of byte copied if somes bytes are copied | ||
| return 0 if the end of file was reached | ||
| return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ | ||
|
|
||
| extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename, | ||
| uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); | ||
| extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *filename, | ||
| uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); | ||
| /* Get Info about the current file | ||
| pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file | ||
| filename if != NULL, the file name string will be copied in filename | ||
| filename_size is the size of the filename buffer | ||
| extrafield if != NULL, the extra field information from the central header will be copied in to | ||
| extrafield_size is the size of the extraField buffer | ||
| comment if != NULL, the comment string of the file will be copied in to | ||
| comment_size is the size of the comment buffer */ | ||
|
|
||
| extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, uint32_t len); | ||
| /* Read extra field from the current file (opened by unzOpenCurrentFile) | ||
| This is the local-header version of the extra field (sometimes, there is | ||
| more info in the local-header version than in the central-header) | ||
| if buf == NULL, it return the size of the local extra field | ||
| if buf != NULL, len is the size of the buffer, the extra header is copied in buf. | ||
| return number of bytes copied in buf, or (if <0) the error code */ | ||
|
|
||
| extern int ZEXPORT unzCloseCurrentFile(unzFile file); | ||
| /* Close the file in zip opened with unzOpenCurrentFile | ||
| return UNZ_CRCERROR if all the file was read but the CRC is not good */ | ||
|
|
||
| /***************************************************************************/ | ||
| /* Browse the directory of the zipfile */ | ||
|
|
||
| typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2); | ||
| typedef int (*unzIteratorFunction)(unzFile file); | ||
| typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename, | ||
| uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); | ||
|
|
||
| extern int ZEXPORT unzGoToFirstFile(unzFile file); | ||
| /* Set the current file of the zipfile to the first file. | ||
| return UNZ_OK if no error */ | ||
|
|
||
| extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename, | ||
| uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); | ||
| /* Set the current file of the zipfile to the first file and retrieves the current info on success. | ||
| Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo. | ||
| return UNZ_OK if no error */ | ||
|
|
||
| extern int ZEXPORT unzGoToNextFile(unzFile file); | ||
| /* Set the current file of the zipfile to the next file. | ||
| return UNZ_OK if no error | ||
| return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */ | ||
|
|
||
| extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename, | ||
| uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); | ||
| /* Set the current file of the zipfile to the next file and retrieves the current | ||
| info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo. | ||
| return UNZ_OK if no error | ||
| return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */ | ||
|
|
||
| extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func); | ||
| /* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function. | ||
| return UNZ_OK if the file is found (it becomes the current file) | ||
| return UNZ_END_OF_LIST_OF_FILE if the file is not found */ | ||
|
|
||
| /***************************************************************************/ | ||
| /* Raw access to zip file */ | ||
|
|
||
| typedef struct unz_file_pos_s | ||
| { | ||
| uint32_t pos_in_zip_directory; /* offset in zip file directory */ | ||
| uint32_t num_of_file; /* # of file */ | ||
| } unz_file_pos; | ||
|
|
||
| extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos *file_pos); | ||
| extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos *file_pos); | ||
|
|
||
| typedef struct unz64_file_pos_s | ||
| { | ||
| uint64_t pos_in_zip_directory; /* offset in zip file directory */ | ||
| uint64_t num_of_file; /* # of file */ | ||
| } unz64_file_pos; | ||
|
|
||
| extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos *file_pos); | ||
| extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos); | ||
|
|
||
| extern int32_t ZEXPORT unzGetOffset(unzFile file); | ||
| extern int64_t ZEXPORT unzGetOffset64(unzFile file); | ||
| /* Get the current file offset */ | ||
|
|
||
| extern int ZEXPORT unzSetOffset(unzFile file, uint32_t pos); | ||
| extern int ZEXPORT unzSetOffset64(unzFile file, uint64_t pos); | ||
| /* Set the current file offset */ | ||
|
|
||
| extern int32_t ZEXPORT unzTell(unzFile file); | ||
| extern int64_t ZEXPORT unzTell64(unzFile file); | ||
| /* return current position in uncompressed data */ | ||
|
|
||
| extern int ZEXPORT unzSeek(unzFile file, uint32_t offset, int origin); | ||
| extern int ZEXPORT unzSeek64(unzFile file, uint64_t offset, int origin); | ||
| /* Seek within the uncompressed data if compression method is storage */ | ||
|
|
||
| extern int ZEXPORT unzEndOfFile(unzFile file); | ||
| /* return 1 if the end of file was reached, 0 elsewhere */ | ||
|
|
||
| /***************************************************************************/ | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* _UNZ_H */ |