mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	remove bundled minizip
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -56,8 +56,6 @@ fuzzylite.pc | ||||
| /client/RD | ||||
| /launcher/RD | ||||
| /lib/RD | ||||
| /lib/minizip/RD | ||||
| /lib/minizip/*/RD | ||||
| /scripting/erm/RD | ||||
| /scripting/erm/*/RD | ||||
| /server/RD | ||||
|   | ||||
| @@ -183,7 +183,7 @@ include(VersionDefinition) | ||||
| vcmi_print_important_variables() | ||||
|  | ||||
| # Options to enable folders in CMake generated projects for Visual Studio, Xcode, etc | ||||
| # Very useful to put 3rd-party libraries such as Minizip, GoogleTest and FuzzyLite in their own folders | ||||
| # Very useful to put 3rd-party libraries such as GoogleTest and FuzzyLite in their own folders | ||||
| set_property(GLOBAL PROPERTY USE_FOLDERS TRUE) | ||||
| # Make FOLDER property inheritable | ||||
| # So when we set FOLDER property on AI directory all and targets inside will inherit it | ||||
| @@ -500,14 +500,7 @@ if(TARGET zlib::zlib) | ||||
| 	add_library(ZLIB::ZLIB ALIAS zlib::zlib) | ||||
| endif() | ||||
|  | ||||
| option(FORCE_BUNDLED_MINIZIP "Force bundled Minizip library" OFF) | ||||
| if(NOT FORCE_BUNDLED_MINIZIP) | ||||
| 	find_package(minizip) | ||||
| 	if(TARGET minizip::minizip) | ||||
| 		add_definitions(-DUSE_SYSTEM_MINIZIP) | ||||
| 	endif() | ||||
| endif() | ||||
|  | ||||
| find_package(minizip REQUIRED) | ||||
|  | ||||
| if (ENABLE_CLIENT) | ||||
| 	if (ENABLE_VIDEO) | ||||
| @@ -705,11 +698,6 @@ if(ENABLE_LUA) | ||||
| 	add_subdirectory(scripting/lua) | ||||
| endif() | ||||
|  | ||||
| if(NOT TARGET minizip::minizip) | ||||
| 	add_subdirectory_with_folder("3rdparty" lib/minizip) | ||||
| 	add_library(minizip::minizip ALIAS minizip) | ||||
| endif() | ||||
|  | ||||
| if(ENABLE_LAUNCHER OR ENABLE_EDITOR) | ||||
| 	add_subdirectory(vcmiqt) | ||||
| endif() | ||||
|   | ||||
| @@ -10,8 +10,7 @@ | ||||
|             "name": "build-with-conan", | ||||
|             "hidden": true, | ||||
|             "cacheVariables": { | ||||
|                 "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/conan-generated/conan_toolchain.cmake", | ||||
|                 "FORCE_BUNDLED_MINIZIP": "OFF" | ||||
|                 "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/conan-generated/conan_toolchain.cmake" | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
| @@ -163,8 +162,7 @@ | ||||
|             }, | ||||
|             "cacheVariables": { | ||||
|                 "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake", | ||||
|                 "CMAKE_POLICY_DEFAULT_CMP0091": "NEW", | ||||
|                 "FORCE_BUNDLED_MINIZIP": "ON" | ||||
|                 "CMAKE_POLICY_DEFAULT_CMP0091": "NEW" | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
| @@ -176,7 +174,6 @@ | ||||
|             "cacheVariables": { | ||||
|                 "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake", | ||||
|                 "CMAKE_POLICY_DEFAULT_CMP0091": "NEW", | ||||
|                 "FORCE_BUNDLED_MINIZIP": "ON", | ||||
|                 "CMAKE_GENERATOR_PLATFORM": "WIN32" | ||||
|             } | ||||
|         }, | ||||
| @@ -192,8 +189,7 @@ | ||||
|             }, | ||||
|             "cacheVariables": { | ||||
|                 "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake", | ||||
|                 "CMAKE_POLICY_DEFAULT_CMP0091": "NEW", | ||||
|                 "FORCE_BUNDLED_MINIZIP": "ON" | ||||
|                 "CMAKE_POLICY_DEFAULT_CMP0091": "NEW" | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
| @@ -298,7 +294,6 @@ | ||||
|             "cacheVariables": { | ||||
|                 "CMAKE_SYSTEM_NAME": "iOS", | ||||
|                 "FORCE_BUNDLED_FL": "ON", | ||||
|                 "FORCE_BUNDLED_MINIZIP": "ON", | ||||
|                 "ENABLE_EDITOR" : "OFF" | ||||
|             } | ||||
|         }, | ||||
|   | ||||
| @@ -9,15 +9,9 @@ | ||||
|  */ | ||||
| #pragma once | ||||
|  | ||||
| #ifdef USE_SYSTEM_MINIZIP | ||||
| #include <minizip/unzip.h> | ||||
| #include <minizip/zip.h> | ||||
| #include <minizip/ioapi.h> | ||||
| #else | ||||
| #include "../minizip/unzip.h" | ||||
| #include "../minizip/zip.h" | ||||
| #include "../minizip/ioapi.h" | ||||
| #endif | ||||
|  | ||||
| // system zlib on old Androids isn't capable of using _64 functions: https://github.com/madler/zlib/pull/436 | ||||
| #if defined(__ANDROID_API__) && (__ANDROID_API__ < 24) | ||||
|   | ||||
| @@ -1,22 +0,0 @@ | ||||
| project(minizip) | ||||
|  | ||||
| include_directories(${ZLIB_INCLUDE_DIR}) | ||||
|  | ||||
| #NOTE: full library consists from several more files | ||||
| # but right now VCMI does not need any extra functionality | ||||
| set(lib_SRCS | ||||
| 		unzip.c | ||||
| 		zip.c | ||||
| 		ioapi.c | ||||
| ) | ||||
|  | ||||
| add_library(minizip SHARED ${lib_SRCS}) | ||||
| if(MSVC) | ||||
|     set_target_properties(minizip PROPERTIES COMPILE_DEFINITIONS "MINIZIP_DLL;ZLIB_DLL;ZLIB_INTERNAL") | ||||
| endif() | ||||
|  | ||||
| vcmi_set_output_dir(minizip "") | ||||
|  | ||||
| target_link_libraries(minizip ${ZLIB_LIBRARIES}) | ||||
|  | ||||
| install(TARGETS minizip RUNTIME DESTINATION ${LIB_DIR} LIBRARY DESTINATION ${LIB_DIR}) | ||||
| @@ -1,6 +0,0 @@ | ||||
|  | ||||
| MiniZip 1.1 was derived from MiniZip at version 1.01f | ||||
|  | ||||
| Change in 1.0 (Okt 2009) | ||||
|  - **TODO - Add history** | ||||
|  | ||||
| @@ -1,74 +0,0 @@ | ||||
| MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson | ||||
|  | ||||
| Introduction | ||||
| --------------------- | ||||
| MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
| When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. | ||||
| All possible work was done for compatibility. | ||||
|  | ||||
|  | ||||
| Background | ||||
| --------------------- | ||||
| When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64  | ||||
| support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) | ||||
|  | ||||
| That was used as a starting point. And after that ZIP64 support was added to zip.c | ||||
| some refactoring and code cleanup was also done. | ||||
|  | ||||
|  | ||||
| Changed from MiniZip 1.0 to MiniZip 1.1 | ||||
| --------------------------------------- | ||||
| * Added ZIP64 support for unzip ( by Even Rouault ) | ||||
| * Added ZIP64 support for zip ( by Mathias Svensson ) | ||||
| * Reverted some changed that Even Rouault did. | ||||
| * Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. | ||||
| * Added unzip patch for BZIP Compression method (patch create by Daniel Borca) | ||||
| * Added BZIP Compress method for zip | ||||
| * Did some refactoring and code cleanup | ||||
|  | ||||
|  | ||||
| Credits | ||||
|  | ||||
|  Gilles Vollant    - Original MiniZip author | ||||
|  Even Rouault      - ZIP64 unzip Support | ||||
|  Daniel Borca      - BZip Compression method support in unzip | ||||
|  Mathias Svensson  - ZIP64 zip support | ||||
|  Mathias Svensson  - BZip Compression method support in zip | ||||
|  | ||||
|  Resources | ||||
|  | ||||
|  ZipLayout   http://result42.com/projects/ZipFileLayout | ||||
|              Command line tool for Windows that shows the layout and information of the headers in a zip archive. | ||||
|              Used when debugging and validating the creation of zip files using MiniZip64 | ||||
|  | ||||
|  | ||||
|  ZIP App Note  http://www.pkware.com/documents/casestudies/APPNOTE.TXT | ||||
|                Zip File specification | ||||
|  | ||||
|  | ||||
| Notes. | ||||
|  * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. | ||||
|  | ||||
| License | ||||
| ---------------------------------------------------------- | ||||
|    Condition of use and distribution are the same than zlib : | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the authors be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
| ---------------------------------------------------------- | ||||
|  | ||||
| @@ -1,131 +0,0 @@ | ||||
| /* crypt.h -- base code for crypt/uncrypt ZIPfile | ||||
|  | ||||
|  | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
|  | ||||
|    This code is a modified version of crypting code in Infozip distribution | ||||
|  | ||||
|    The encryption/decryption parts of this source code (as opposed to the | ||||
|    non-echoing password parts) were originally written in Europe.  The | ||||
|    whole source package can be freely distributed, including from the USA. | ||||
|    (Prior to January 2000, re-export from the US was a violation of US law.) | ||||
|  | ||||
|    This encryption code is a direct transcription of the algorithm from | ||||
|    Roger Schlafly, described by Phil Katz in the file appnote.txt.  This | ||||
|    file (appnote.txt) is distributed with the PKZIP program (even in the | ||||
|    version without encryption capabilities). | ||||
|  | ||||
|    If you don't need crypting in your application, just define symbols | ||||
|    NOCRYPT and NOUNCRYPT. | ||||
|  | ||||
|    This code support the "Traditional PKWARE Encryption". | ||||
|  | ||||
|    The new AES encryption added on Zip format by Winzip (see the page | ||||
|    http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong | ||||
|    Encryption is not supported. | ||||
| */ | ||||
|  | ||||
| #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) | ||||
|  | ||||
| /*********************************************************************** | ||||
|  * Return the next byte in the pseudo-random sequence | ||||
|  */ | ||||
| static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) | ||||
| { | ||||
|     unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an | ||||
|                      * unpredictable manner on 16-bit systems; not a problem | ||||
|                      * with any known compiler so far, though */ | ||||
|  | ||||
|     temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; | ||||
|     return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); | ||||
| } | ||||
|  | ||||
| /*********************************************************************** | ||||
|  * Update the encryption keys with the next byte of plain text | ||||
|  */ | ||||
| static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) | ||||
| { | ||||
|     (*(pkeys+0)) = CRC32((*(pkeys+0)), c); | ||||
|     (*(pkeys+1)) += (*(pkeys+0)) & 0xff; | ||||
|     (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; | ||||
|     { | ||||
|       register int keyshift = (int)((*(pkeys+1)) >> 24); | ||||
|       (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); | ||||
|     } | ||||
|     return c; | ||||
| } | ||||
|  | ||||
|  | ||||
| /*********************************************************************** | ||||
|  * Initialize the encryption keys and the random header according to | ||||
|  * the given password. | ||||
|  */ | ||||
| static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) | ||||
| { | ||||
|     *(pkeys+0) = 305419896L; | ||||
|     *(pkeys+1) = 591751049L; | ||||
|     *(pkeys+2) = 878082192L; | ||||
|     while (*passwd != '\0') { | ||||
|         update_keys(pkeys,pcrc_32_tab,(int)*passwd); | ||||
|         passwd++; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #define zdecode(pkeys,pcrc_32_tab,c) \ | ||||
|     (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) | ||||
|  | ||||
| #define zencode(pkeys,pcrc_32_tab,c,t) \ | ||||
|     (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) | ||||
|  | ||||
| #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED | ||||
|  | ||||
| #define RAND_HEAD_LEN  12 | ||||
|    /* "last resort" source for second part of crypt seed pattern */ | ||||
| #  ifndef ZCR_SEED2 | ||||
| #    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */ | ||||
| #  endif | ||||
|  | ||||
| static int crypthead(const char* passwd,      /* password string */ | ||||
|                      unsigned char* buf,      /* where to write header */ | ||||
|                      int bufSize, | ||||
|                      unsigned long* pkeys, | ||||
|                      const z_crc_t* pcrc_32_tab, | ||||
|                      unsigned long crcForCrypting) | ||||
| { | ||||
|     int n;                       /* index in random header */ | ||||
|     int t;                       /* temporary */ | ||||
|     int c;                       /* random byte */ | ||||
|     unsigned char header[RAND_HEAD_LEN-2]; /* random header */ | ||||
|     static unsigned calls = 0;   /* ensure different random header each time */ | ||||
|  | ||||
|     if (bufSize<RAND_HEAD_LEN) | ||||
|       return 0; | ||||
|  | ||||
|     /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the | ||||
|      * output of rand() to get less predictability, since rand() is | ||||
|      * often poorly implemented. | ||||
|      */ | ||||
|     if (++calls == 1) | ||||
|     { | ||||
|         srand((unsigned)(time(NULL) ^ ZCR_SEED2)); | ||||
|     } | ||||
|     init_keys(passwd, pkeys, pcrc_32_tab); | ||||
|     for (n = 0; n < RAND_HEAD_LEN-2; n++) | ||||
|     { | ||||
|         c = (rand() >> 7) & 0xff; | ||||
|         header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); | ||||
|     } | ||||
|     /* Encrypt random header (last two bytes is high word of crc) */ | ||||
|     init_keys(passwd, pkeys, pcrc_32_tab); | ||||
|     for (n = 0; n < RAND_HEAD_LEN-2; n++) | ||||
|     { | ||||
|         buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); | ||||
|     } | ||||
|     buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); | ||||
|     buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); | ||||
|     return n; | ||||
| } | ||||
|  | ||||
| #endif | ||||
| @@ -1,247 +0,0 @@ | ||||
| /* ioapi.h -- IO base function header for compress/uncompress .zip | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
| */ | ||||
|  | ||||
| #if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) | ||||
|         #define _CRT_SECURE_NO_WARNINGS | ||||
| #endif | ||||
|  | ||||
| #if defined(__APPLE__) || defined(IOAPI_NO_64) | ||||
| // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions | ||||
| #define FOPEN_FUNC(filename, mode) fopen(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) | ||||
| #else | ||||
| #define FOPEN_FUNC(filename, mode) fopen64(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello64(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #include "ioapi.h" | ||||
|  | ||||
| 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); | ||||
|     else | ||||
|     { | ||||
|         return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); | ||||
|     } | ||||
| } | ||||
|  | ||||
| long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) | ||||
| { | ||||
|     if (pfilefunc->zfile_func64.zseek64_file != NULL) | ||||
|         return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); | ||||
|     else | ||||
|     { | ||||
|         uLong offsetTruncated = (uLong)offset; | ||||
|         if (offsetTruncated != offset) | ||||
|             return -1; | ||||
|         else | ||||
|             return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); | ||||
|     } | ||||
| } | ||||
|  | ||||
| ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) | ||||
| { | ||||
|     if (pfilefunc->zfile_func64.zseek64_file != NULL) | ||||
|         return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); | ||||
|     else | ||||
|     { | ||||
|         uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); | ||||
|         if ((tell_uLong) == MAXU32) | ||||
|             return (ZPOS64_T)-1; | ||||
|         else | ||||
|             return tell_uLong; | ||||
|     } | ||||
| } | ||||
|  | ||||
| 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->zopen32_file = p_filefunc32->zopen_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 OF((voidpf opaque, const char* filename, int mode)); | ||||
| static uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); | ||||
| static uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); | ||||
| static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); | ||||
| static long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); | ||||
| static int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); | ||||
| static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); | ||||
|  | ||||
| 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; | ||||
| } | ||||
|  | ||||
| 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 = FOPEN_FUNC((const char*)filename, mode_fopen); | ||||
|     return file; | ||||
| } | ||||
|  | ||||
|  | ||||
| static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) | ||||
| { | ||||
|     uLong ret; | ||||
|     ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) | ||||
| { | ||||
|     uLong ret; | ||||
|     ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     long ret; | ||||
|     ret = ftell((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     ZPOS64_T ret; | ||||
|     ret = FTELLO_FUNC((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offset, int origin) | ||||
| { | ||||
|     int fseek_origin=0; | ||||
|     long ret; | ||||
|     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; | ||||
|     } | ||||
|     ret = 0; | ||||
|     if (fseek((FILE *)stream, offset, fseek_origin) != 0) | ||||
|         ret = -1; | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin) | ||||
| { | ||||
|     int fseek_origin=0; | ||||
|     long ret; | ||||
|     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; | ||||
|     } | ||||
|     ret = 0; | ||||
|  | ||||
|     if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) | ||||
|                         ret = -1; | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     int ret; | ||||
|     ret = fclose((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     int ret; | ||||
|     ret = ferror((FILE *)stream); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| void fill_fopen_filefunc(pzlib_filefunc_def) | ||||
|   zlib_filefunc_def* pzlib_filefunc_def; | ||||
| { | ||||
|     pzlib_filefunc_def->zopen_file = fopen_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->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; | ||||
| } | ||||
| @@ -1,237 +0,0 @@ | ||||
| /* ioapi.h -- IO base function header for compress/uncompress .zip | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
|          Changes | ||||
|  | ||||
|     Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) | ||||
|     Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. | ||||
|                More if/def section may be needed to support other platforms | ||||
|     Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. | ||||
|                           (but you should use iowin32.c for windows instead) | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef _ZLIBIOAPI64_H | ||||
| #define _ZLIBIOAPI64_H | ||||
|  | ||||
| #ifndef OF /* function prototypes */ | ||||
| #  ifdef STDC | ||||
| #    define OF(args)  args | ||||
| #  else | ||||
| #    define OF(args)  () | ||||
| #  endif | ||||
| #endif | ||||
|  | ||||
| #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) | ||||
|  | ||||
|   // Linux needs this to support file operation on files larger then 4+GB | ||||
|   // But might need better if/def to select just the platforms that needs them. | ||||
|  | ||||
|         #ifndef __USE_FILE_OFFSET64 | ||||
|                 #define __USE_FILE_OFFSET64 | ||||
|         #endif | ||||
|         #ifndef __USE_LARGEFILE64 | ||||
|                 #define __USE_LARGEFILE64 | ||||
|         #endif | ||||
|         #ifndef _LARGEFILE64_SOURCE | ||||
|                 #define _LARGEFILE64_SOURCE | ||||
|         #endif | ||||
|         #ifndef _FILE_OFFSET_BIT | ||||
|                 #define _FILE_OFFSET_BIT 64 | ||||
|         #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include "zlib.h" | ||||
|  | ||||
| #if defined(USE_FILE32API) | ||||
| #define fopen64 fopen | ||||
| #define ftello64 ftell | ||||
| #define fseeko64 fseek | ||||
| #else | ||||
| #ifdef __FreeBSD__ | ||||
| #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 | ||||
|  | ||||
|  | ||||
| #ifndef ZPOS64_T | ||||
|   #ifdef _WIN32 | ||||
|                 #define ZPOS64_T fpos_t | ||||
|   #else | ||||
|     #include <stdint.h> | ||||
|     #define ZPOS64_T uint64_t | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef HAVE_MINIZIP64_CONF_H | ||||
| #include "mz64conf.h" | ||||
| #endif | ||||
|  | ||||
| /* a type chosen by DEFINE */ | ||||
| #ifdef HAVE_64BIT_INT_CUSTOM | ||||
| typedef  64BIT_INT_CUSTOM_TYPE ZPOS64_T; | ||||
| #else | ||||
| #ifdef HAS_STDINT_H | ||||
| #include "stdint.h" | ||||
| typedef uint64_t ZPOS64_T; | ||||
| #else | ||||
|  | ||||
| /* Maximum unsigned 32-bit value used as placeholder for zip64 */ | ||||
| #define MAXU32 0xffffffff | ||||
|  | ||||
| //#if defined(_MSC_VER) || defined(__BORLANDC__) | ||||
| //	typedef unsigned __int64 ZPOS64_T; | ||||
| //#else | ||||
| //	typedef unsigned long long int ZPOS64_T; | ||||
| //#endif | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #if defined(_MSC_VER)  | ||||
| #pragma warning (push) | ||||
| #pragma warning (disable : 4005) | ||||
|    /* If building or using zlib as a DLL, define ZLIB_DLL. | ||||
|     * This is not mandatory, but it offers a little performance increase. | ||||
|     */ | ||||
| #  ifdef ZLIB_DLL | ||||
| #      ifdef ZLIB_INTERNAL | ||||
| #        define ZEXPORT __declspec(dllexport) | ||||
| #      else | ||||
| #        define ZEXPORT __declspec(dllimport) | ||||
| #      endif | ||||
| #  endif  /* ZLIB_DLL */ | ||||
| #pragma warning (pop) | ||||
|  | ||||
| #ifdef MINIZIP_DLL | ||||
| #define MINIZIP_EXPORT __declspec(dllexport) | ||||
| #else | ||||
| #define MINIZIP_EXPORT __declspec(dllimport) | ||||
| #endif | ||||
| #else //not MSVC | ||||
| #define MINIZIP_EXPORT | ||||
| #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)      OF((voidpf opaque, const char* filename, int mode)); | ||||
| typedef uLong    (ZCALLBACK *read_file_func)      OF((voidpf opaque, voidpf stream, void* buf, uLong size)); | ||||
| typedef uLong    (ZCALLBACK *write_file_func)     OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); | ||||
| typedef int      (ZCALLBACK *close_file_func)     OF((voidpf opaque, voidpf stream)); | ||||
| typedef int      (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); | ||||
|  | ||||
| typedef long     (ZCALLBACK *tell_file_func)      OF((voidpf opaque, voidpf stream)); | ||||
| typedef long     (ZCALLBACK *seek_file_func)      OF((voidpf opaque, voidpf stream, uLong offset, int origin)); | ||||
|  | ||||
|  | ||||
| /* here is the "old" 32 bits structure structure */ | ||||
| typedef struct zlib_filefunc_def_s | ||||
| { | ||||
|     open_file_func      zopen_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; | ||||
|     testerror_file_func zerror_file; | ||||
|     voidpf              opaque; | ||||
| } zlib_filefunc_def; | ||||
|  | ||||
| typedef ZPOS64_T (ZCALLBACK *tell64_file_func)    OF((voidpf opaque, voidpf stream)); | ||||
| typedef long     (ZCALLBACK *seek64_file_func)    OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); | ||||
| typedef voidpf   (ZCALLBACK *open64_file_func)    OF((voidpf opaque, const void* filename, int mode)); | ||||
|  | ||||
| typedef struct zlib_filefunc64_def_s | ||||
| { | ||||
|     open64_file_func    zopen64_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; | ||||
|     testerror_file_func zerror_file; | ||||
|     voidpf              opaque; | ||||
| } zlib_filefunc64_def; | ||||
|  | ||||
| void MINIZIP_EXPORT fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
| void fill_fopen_filefunc OF((zlib_filefunc_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; | ||||
|     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 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); | ||||
| long    call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); | ||||
| ZPOS64_T call_ztell64 OF((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 ZTELL64(filefunc,filestream)            (call_ztell64((&(filefunc)),(filestream))) | ||||
| #define ZSEEK64(filefunc,filestream,pos,mode)   (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
| @@ -1,461 +0,0 @@ | ||||
| /* iowin32.c -- IO base function header for compress/uncompress .zip | ||||
|      Version 1.1, February 14h, 2010 | ||||
|      part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|      For more info read MiniZip_info.txt | ||||
|  | ||||
| */ | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "zlib.h" | ||||
| #include "ioapi.h" | ||||
| #include "iowin32.h" | ||||
|  | ||||
| #ifndef INVALID_HANDLE_VALUE | ||||
| #define INVALID_HANDLE_VALUE (0xFFFFFFFF) | ||||
| #endif | ||||
|  | ||||
| #ifndef INVALID_SET_FILE_POINTER | ||||
| #define INVALID_SET_FILE_POINTER ((DWORD)-1) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) | ||||
| #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) | ||||
| #define IOWIN32_USING_WINRT_API 1 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode)); | ||||
| uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size)); | ||||
| uLong   ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); | ||||
| ZPOS64_T ZCALLBACK win32_tell64_file_func  OF((voidpf opaque, voidpf stream)); | ||||
| long    ZCALLBACK win32_seek64_file_func  OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); | ||||
| int     ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); | ||||
| int     ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     HANDLE hf; | ||||
|     int error; | ||||
| } WIN32FILE_IOWIN; | ||||
|  | ||||
|  | ||||
| static void win32_translate_open_mode(int mode, | ||||
|                                       DWORD* lpdwDesiredAccess, | ||||
|                                       DWORD* lpdwCreationDisposition, | ||||
|                                       DWORD* lpdwShareMode, | ||||
|                                       DWORD* lpdwFlagsAndAttributes) | ||||
| { | ||||
|     *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; | ||||
|  | ||||
|     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) | ||||
|     { | ||||
|         *lpdwDesiredAccess = GENERIC_READ; | ||||
|         *lpdwCreationDisposition = OPEN_EXISTING; | ||||
|         *lpdwShareMode = FILE_SHARE_READ; | ||||
|     } | ||||
|     else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | ||||
|     { | ||||
|         *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; | ||||
|         *lpdwCreationDisposition = OPEN_EXISTING; | ||||
|     } | ||||
|     else if (mode & ZLIB_FILEFUNC_MODE_CREATE) | ||||
|     { | ||||
|         *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; | ||||
|         *lpdwCreationDisposition = CREATE_ALWAYS; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static voidpf win32_build_iowin(HANDLE hFile) | ||||
| { | ||||
|     voidpf ret=NULL; | ||||
|  | ||||
|     if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) | ||||
|     { | ||||
|         WIN32FILE_IOWIN w32fiow; | ||||
|         w32fiow.hf = hFile; | ||||
|         w32fiow.error = 0; | ||||
|         ret = malloc(sizeof(WIN32FILE_IOWIN)); | ||||
|  | ||||
|         if (ret==NULL) | ||||
|             CloseHandle(hFile); | ||||
|         else | ||||
|             *((WIN32FILE_IOWIN*)ret) = w32fiow; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
| #ifdef UNICODE | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|     { | ||||
|         WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; | ||||
|         MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); | ||||
|         hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
|     } | ||||
| #endif | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|     { | ||||
|         WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; | ||||
|         MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); | ||||
|         hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
|     } | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL); | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) | ||||
| { | ||||
|     const char* mode_fopen = NULL; | ||||
|     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); | ||||
|  | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
| #ifdef UNICODE | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|     { | ||||
|         WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; | ||||
|         MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); | ||||
|         hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); | ||||
|     } | ||||
| #endif | ||||
| #else | ||||
|     if ((filename!=NULL) && (dwDesiredAccess != 0)) | ||||
|         hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); | ||||
| #endif | ||||
|  | ||||
|     return win32_build_iowin(hFile); | ||||
| } | ||||
|  | ||||
|  | ||||
| uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) | ||||
| { | ||||
|     uLong ret=0; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|  | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         if (!ReadFile(hFile, buf, size, &ret, NULL)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             if (dwErr == ERROR_HANDLE_EOF) | ||||
|                 dwErr = 0; | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) | ||||
| { | ||||
|     uLong ret=0; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|  | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         if (!WriteFile(hFile, buf, size, &ret, NULL)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             if (dwErr == ERROR_HANDLE_EOF) | ||||
|                 dwErr = 0; | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos,  DWORD dwMoveMethod) | ||||
| { | ||||
| #ifdef IOWIN32_USING_WINRT_API | ||||
|     return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); | ||||
| #else | ||||
|     LONG lHigh = pos.HighPart; | ||||
|     DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, FILE_CURRENT); | ||||
|     BOOL fOk = TRUE; | ||||
|     if (dwNewPos == 0xFFFFFFFF) | ||||
|         if (GetLastError() != NO_ERROR) | ||||
|             fOk = FALSE; | ||||
|     if ((newPos != NULL) && (fOk)) | ||||
|     { | ||||
|         newPos->LowPart = dwNewPos; | ||||
|         newPos->HighPart = lHigh; | ||||
|     } | ||||
|     return fOk; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) | ||||
| { | ||||
|     long ret=-1; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = 0; | ||||
|  | ||||
|         if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = -1; | ||||
|         } | ||||
|         else | ||||
|             ret=(long)pos.LowPart; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     ZPOS64_T ret= (ZPOS64_T)-1; | ||||
|     HANDLE hFile = NULL; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream)->hf; | ||||
|  | ||||
|     if (hFile) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = 0; | ||||
|  | ||||
|         if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = (ZPOS64_T)-1; | ||||
|         } | ||||
|         else | ||||
|             ret=pos.QuadPart; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) | ||||
| { | ||||
|     DWORD dwMoveMethod=0xFFFFFFFF; | ||||
|     HANDLE hFile = NULL; | ||||
|  | ||||
|     long ret=-1; | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|     switch (origin) | ||||
|     { | ||||
|     case ZLIB_FILEFUNC_SEEK_CUR : | ||||
|         dwMoveMethod = FILE_CURRENT; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_END : | ||||
|         dwMoveMethod = FILE_END; | ||||
|         break; | ||||
|     case ZLIB_FILEFUNC_SEEK_SET : | ||||
|         dwMoveMethod = FILE_BEGIN; | ||||
|         break; | ||||
|     default: return -1; | ||||
|     } | ||||
|  | ||||
|     if (hFile != NULL) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = offset; | ||||
|         if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = -1; | ||||
|         } | ||||
|         else | ||||
|             ret=0; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) | ||||
| { | ||||
|     DWORD dwMoveMethod=0xFFFFFFFF; | ||||
|     HANDLE hFile = NULL; | ||||
|     long ret=-1; | ||||
|  | ||||
|     if (stream!=NULL) | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream)->hf; | ||||
|  | ||||
|     switch (origin) | ||||
|     { | ||||
|         case ZLIB_FILEFUNC_SEEK_CUR : | ||||
|             dwMoveMethod = FILE_CURRENT; | ||||
|             break; | ||||
|         case ZLIB_FILEFUNC_SEEK_END : | ||||
|             dwMoveMethod = FILE_END; | ||||
|             break; | ||||
|         case ZLIB_FILEFUNC_SEEK_SET : | ||||
|             dwMoveMethod = FILE_BEGIN; | ||||
|             break; | ||||
|         default: return -1; | ||||
|     } | ||||
|  | ||||
|     if (hFile) | ||||
|     { | ||||
|         LARGE_INTEGER pos; | ||||
|         pos.QuadPart = offset; | ||||
|         if (!MySetFilePointerEx(hFile, pos, NULL, FILE_CURRENT)) | ||||
|         { | ||||
|             DWORD dwErr = GetLastError(); | ||||
|             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; | ||||
|             ret = -1; | ||||
|         } | ||||
|         else | ||||
|             ret=0; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) | ||||
| { | ||||
|     int ret=-1; | ||||
|  | ||||
|     if (stream!=NULL) | ||||
|     { | ||||
|         HANDLE hFile; | ||||
|         hFile = ((WIN32FILE_IOWIN*)stream) -> hf; | ||||
|         if (hFile != NULL) | ||||
|         { | ||||
|             CloseHandle(hFile); | ||||
|             ret=0; | ||||
|         } | ||||
|         free(stream); | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) | ||||
| { | ||||
|     int ret=-1; | ||||
|     if (stream!=NULL) | ||||
|     { | ||||
|         ret = ((WIN32FILE_IOWIN*)stream) -> error; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen_file = win32_open_file_func; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell_file = win32_tell_file_func; | ||||
|     pzlib_filefunc_def->zseek_file = win32_seek_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
|  | ||||
| void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen64_file = win32_open64_file_func; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; | ||||
|     pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; | ||||
|     pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) | ||||
| { | ||||
|     pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; | ||||
|     pzlib_filefunc_def->zread_file = win32_read_file_func; | ||||
|     pzlib_filefunc_def->zwrite_file = win32_write_file_func; | ||||
|     pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; | ||||
|     pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; | ||||
|     pzlib_filefunc_def->zclose_file = win32_close_file_func; | ||||
|     pzlib_filefunc_def->zerror_file = win32_error_file_func; | ||||
|     pzlib_filefunc_def->opaque = NULL; | ||||
| } | ||||
| @@ -1,28 +0,0 @@ | ||||
| /* iowin32.h -- IO base function header for compress/uncompress .zip | ||||
|      Version 1.1, February 14h, 2010 | ||||
|      part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
| */ | ||||
|  | ||||
| #include <windows.h> | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); | ||||
| void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
| void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
| void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @@ -1,660 +0,0 @@ | ||||
| /* | ||||
|    miniunz.c | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( 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 ) | ||||
| */ | ||||
|  | ||||
| #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) | ||||
|         #ifndef __USE_FILE_OFFSET64 | ||||
|                 #define __USE_FILE_OFFSET64 | ||||
|         #endif | ||||
|         #ifndef __USE_LARGEFILE64 | ||||
|                 #define __USE_LARGEFILE64 | ||||
|         #endif | ||||
|         #ifndef _LARGEFILE64_SOURCE | ||||
|                 #define _LARGEFILE64_SOURCE | ||||
|         #endif | ||||
|         #ifndef _FILE_OFFSET_BIT | ||||
|                 #define _FILE_OFFSET_BIT 64 | ||||
|         #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __APPLE__ | ||||
| // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions | ||||
| #define FOPEN_FUNC(filename, mode) fopen(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) | ||||
| #else | ||||
| #define FOPEN_FUNC(filename, mode) fopen64(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello64(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| # include <direct.h> | ||||
| # include <io.h> | ||||
| #else | ||||
| # include <unistd.h> | ||||
| # include <utime.h> | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #include "unzip.h" | ||||
|  | ||||
| #define CASESENSITIVITY (0) | ||||
| #define WRITEBUFFERSIZE (8192) | ||||
| #define MAXFILENAME (256) | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| #define USEWIN32IOAPI | ||||
| #include "iowin32.h" | ||||
| #endif | ||||
| /* | ||||
|   mini unzip, demo of unzip package | ||||
|  | ||||
|   usage : | ||||
|   Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] | ||||
|  | ||||
|   list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT | ||||
|     if it exists | ||||
| */ | ||||
|  | ||||
|  | ||||
| /* change_file_date : change the date/time of a file | ||||
|     filename : the filename of the file where date/time must be modified | ||||
|     dosdate : the new date at the MSDos format (4 bytes) | ||||
|     tmu_date : the SAME new date at the tm_unz format */ | ||||
| void change_file_date(filename,dosdate,tmu_date) | ||||
|     const char *filename; | ||||
|     uLong dosdate; | ||||
|     tm_unz tmu_date; | ||||
| { | ||||
| #ifdef _WIN32 | ||||
|   HANDLE hFile; | ||||
|   FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; | ||||
|  | ||||
|   hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, | ||||
|                       0,NULL,OPEN_EXISTING,0,NULL); | ||||
|   GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); | ||||
|   DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); | ||||
|   LocalFileTimeToFileTime(&ftLocal,&ftm); | ||||
|   SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); | ||||
|   CloseHandle(hFile); | ||||
| #else | ||||
| #ifdef unix || __APPLE__ | ||||
|   struct utimbuf ut; | ||||
|   struct tm newdate; | ||||
|   newdate.tm_sec = tmu_date.tm_sec; | ||||
|   newdate.tm_min=tmu_date.tm_min; | ||||
|   newdate.tm_hour=tmu_date.tm_hour; | ||||
|   newdate.tm_mday=tmu_date.tm_mday; | ||||
|   newdate.tm_mon=tmu_date.tm_mon; | ||||
|   if (tmu_date.tm_year > 1900) | ||||
|       newdate.tm_year=tmu_date.tm_year - 1900; | ||||
|   else | ||||
|       newdate.tm_year=tmu_date.tm_year ; | ||||
|   newdate.tm_isdst=-1; | ||||
|  | ||||
|   ut.actime=ut.modtime=mktime(&newdate); | ||||
|   utime(filename,&ut); | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| /* mymkdir and change_file_date are not 100 % portable | ||||
|    As I don't know well Unix, I wait feedback for the unix portion */ | ||||
|  | ||||
| int mymkdir(dirname) | ||||
|     const char* dirname; | ||||
| { | ||||
|     int ret=0; | ||||
| #ifdef _WIN32 | ||||
|     ret = _mkdir(dirname); | ||||
| #elif unix | ||||
|     ret = mkdir (dirname,0775); | ||||
| #elif __APPLE__ | ||||
|     ret = mkdir (dirname,0775); | ||||
| #endif | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int makedir (newdir) | ||||
|     char *newdir; | ||||
| { | ||||
|   char *buffer ; | ||||
|   char *p; | ||||
|   int  len = (int)strlen(newdir); | ||||
|  | ||||
|   if (len <= 0) | ||||
|     return 0; | ||||
|  | ||||
|   buffer = (char*)malloc(len+1); | ||||
|         if (buffer==NULL) | ||||
|         { | ||||
|                 printf("Error allocating memory\n"); | ||||
|                 return UNZ_INTERNALERROR; | ||||
|         } | ||||
|   strcpy(buffer,newdir); | ||||
|  | ||||
|   if (buffer[len-1] == '/') { | ||||
|     buffer[len-1] = '\0'; | ||||
|   } | ||||
|   if (mymkdir(buffer) == 0) | ||||
|     { | ||||
|       free(buffer); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   p = buffer+1; | ||||
|   while (1) | ||||
|     { | ||||
|       char hold; | ||||
|  | ||||
|       while(*p && *p != '\\' && *p != '/') | ||||
|         p++; | ||||
|       hold = *p; | ||||
|       *p = 0; | ||||
|       if ((mymkdir(buffer) == -1) && (errno == ENOENT)) | ||||
|         { | ||||
|           printf("couldn't create directory %s\n",buffer); | ||||
|           free(buffer); | ||||
|           return 0; | ||||
|         } | ||||
|       if (hold == 0) | ||||
|         break; | ||||
|       *p++ = hold; | ||||
|     } | ||||
|   free(buffer); | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| void do_banner() | ||||
| { | ||||
|     printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); | ||||
|     printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); | ||||
| } | ||||
|  | ||||
| void do_help() | ||||
| { | ||||
|     printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ | ||||
|            "  -e  Extract without pathname (junk paths)\n" \ | ||||
|            "  -x  Extract with pathname\n" \ | ||||
|            "  -v  list files\n" \ | ||||
|            "  -l  list files\n" \ | ||||
|            "  -d  directory to extract into\n" \ | ||||
|            "  -o  overwrite files without prompting\n" \ | ||||
|            "  -p  extract encrypted file using password\n\n"); | ||||
| } | ||||
|  | ||||
| void Display64BitsSize(ZPOS64_T n, int size_char) | ||||
| { | ||||
|   /* to avoid compatibility problem , we do here the conversion */ | ||||
|   char number[21]; | ||||
|   int offset=19; | ||||
|   int pos_string = 19; | ||||
|   number[20]=0; | ||||
|   for (;;) { | ||||
|       number[offset]=(char)((n%10)+'0'); | ||||
|       if (number[offset] != '0') | ||||
|           pos_string=offset; | ||||
|       n/=10; | ||||
|       if (offset==0) | ||||
|           break; | ||||
|       offset--; | ||||
|   } | ||||
|   { | ||||
|       int size_display_string = 19-pos_string; | ||||
|       while (size_char > size_display_string) | ||||
|       { | ||||
|           size_char--; | ||||
|           printf(" "); | ||||
|       } | ||||
|   } | ||||
|  | ||||
|   printf("%s",&number[pos_string]); | ||||
| } | ||||
|  | ||||
| int do_list(uf) | ||||
|     unzFile uf; | ||||
| { | ||||
|     uLong i; | ||||
|     unz_global_info64 gi; | ||||
|     int err; | ||||
|  | ||||
|     err = unzGetGlobalInfo64(uf,&gi); | ||||
|     if (err!=UNZ_OK) | ||||
|         printf("error %d with zipfile in unzGetGlobalInfo \n",err); | ||||
|     printf("  Length  Method     Size Ratio   Date    Time   CRC-32     Name\n"); | ||||
|     printf("  ------  ------     ---- -----   ----    ----   ------     ----\n"); | ||||
|     for (i=0;i<gi.number_entry;i++) | ||||
|     { | ||||
|         char filename_inzip[256]; | ||||
|         unz_file_info64 file_info; | ||||
|         uLong ratio=0; | ||||
|         const char *string_method; | ||||
|         char charCrypt=' '; | ||||
|         err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); | ||||
|         if (err!=UNZ_OK) | ||||
|         { | ||||
|             printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); | ||||
|             break; | ||||
|         } | ||||
|         if (file_info.uncompressed_size>0) | ||||
|             ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); | ||||
|  | ||||
|         /* display a '*' if the file is encrypted */ | ||||
|         if ((file_info.flag & 1) != 0) | ||||
|             charCrypt='*'; | ||||
|  | ||||
|         if (file_info.compression_method==0) | ||||
|             string_method="Stored"; | ||||
|         else | ||||
|         if (file_info.compression_method==Z_DEFLATED) | ||||
|         { | ||||
|             uInt iLevel=(uInt)((file_info.flag & 0x6)/2); | ||||
|             if (iLevel==0) | ||||
|               string_method="Defl:N"; | ||||
|             else if (iLevel==1) | ||||
|               string_method="Defl:X"; | ||||
|             else if ((iLevel==2) || (iLevel==3)) | ||||
|               string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ | ||||
|         } | ||||
|         else | ||||
|         if (file_info.compression_method==Z_BZIP2ED) | ||||
|         { | ||||
|               string_method="BZip2 "; | ||||
|         } | ||||
|         else | ||||
|             string_method="Unkn. "; | ||||
|  | ||||
|         Display64BitsSize(file_info.uncompressed_size,7); | ||||
|         printf("  %6s%c",string_method,charCrypt); | ||||
|         Display64BitsSize(file_info.compressed_size,7); | ||||
|         printf(" %3lu%%  %2.2lu-%2.2lu-%2.2lu  %2.2lu:%2.2lu  %8.8lx   %s\n", | ||||
|                 ratio, | ||||
|                 (uLong)file_info.tmu_date.tm_mon + 1, | ||||
|                 (uLong)file_info.tmu_date.tm_mday, | ||||
|                 (uLong)file_info.tmu_date.tm_year % 100, | ||||
|                 (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, | ||||
|                 (uLong)file_info.crc,filename_inzip); | ||||
|         if ((i+1)<gi.number_entry) | ||||
|         { | ||||
|             err = unzGoToNextFile(uf); | ||||
|             if (err!=UNZ_OK) | ||||
|             { | ||||
|                 printf("error %d with zipfile in unzGoToNextFile\n",err); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) | ||||
|     unzFile uf; | ||||
|     const int* popt_extract_without_path; | ||||
|     int* popt_overwrite; | ||||
|     const char* password; | ||||
| { | ||||
|     char filename_inzip[256]; | ||||
|     char* filename_withoutpath; | ||||
|     char* p; | ||||
|     int err=UNZ_OK; | ||||
|     FILE *fout=NULL; | ||||
|     void* buf; | ||||
|     uInt size_buf; | ||||
|  | ||||
|     unz_file_info64 file_info; | ||||
|     uLong ratio=0; | ||||
|     err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); | ||||
|  | ||||
|     if (err!=UNZ_OK) | ||||
|     { | ||||
|         printf("error %d with zipfile in unzGetCurrentFileInfo\n",err); | ||||
|         return err; | ||||
|     } | ||||
|  | ||||
|     size_buf = WRITEBUFFERSIZE; | ||||
|     buf = (void*)malloc(size_buf); | ||||
|     if (buf==NULL) | ||||
|     { | ||||
|         printf("Error allocating memory\n"); | ||||
|         return UNZ_INTERNALERROR; | ||||
|     } | ||||
|  | ||||
|     p = filename_withoutpath = filename_inzip; | ||||
|     while ((*p) != '\0') | ||||
|     { | ||||
|         if (((*p)=='/') || ((*p)=='\\')) | ||||
|             filename_withoutpath = p+1; | ||||
|         p++; | ||||
|     } | ||||
|  | ||||
|     if ((*filename_withoutpath)=='\0') | ||||
|     { | ||||
|         if ((*popt_extract_without_path)==0) | ||||
|         { | ||||
|             printf("creating directory: %s\n",filename_inzip); | ||||
|             mymkdir(filename_inzip); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         const char* write_filename; | ||||
|         int skip=0; | ||||
|  | ||||
|         if ((*popt_extract_without_path)==0) | ||||
|             write_filename = filename_inzip; | ||||
|         else | ||||
|             write_filename = filename_withoutpath; | ||||
|  | ||||
|         err = unzOpenCurrentFilePassword(uf,password); | ||||
|         if (err!=UNZ_OK) | ||||
|         { | ||||
|             printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err); | ||||
|         } | ||||
|  | ||||
|         if (((*popt_overwrite)==0) && (err==UNZ_OK)) | ||||
|         { | ||||
|             char rep=0; | ||||
|             FILE* ftestexist; | ||||
|             ftestexist = FOPEN_FUNC(write_filename,"rb"); | ||||
|             if (ftestexist!=NULL) | ||||
|             { | ||||
|                 fclose(ftestexist); | ||||
|                 do | ||||
|                 { | ||||
|                     char answer[128]; | ||||
|                     int ret; | ||||
|  | ||||
|                     printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); | ||||
|                     ret = scanf("%1s",answer); | ||||
|                     if (ret != 1) | ||||
|                     { | ||||
|                        exit(EXIT_FAILURE); | ||||
|                     } | ||||
|                     rep = answer[0] ; | ||||
|                     if ((rep>='a') && (rep<='z')) | ||||
|                         rep -= 0x20; | ||||
|                 } | ||||
|                 while ((rep!='Y') && (rep!='N') && (rep!='A')); | ||||
|             } | ||||
|  | ||||
|             if (rep == 'N') | ||||
|                 skip = 1; | ||||
|  | ||||
|             if (rep == 'A') | ||||
|                 *popt_overwrite=1; | ||||
|         } | ||||
|  | ||||
|         if ((skip==0) && (err==UNZ_OK)) | ||||
|         { | ||||
|             fout=FOPEN_FUNC(write_filename,"wb"); | ||||
|             /* some zipfile don't contain directory alone before file */ | ||||
|             if ((fout==NULL) && ((*popt_extract_without_path)==0) && | ||||
|                                 (filename_withoutpath!=(char*)filename_inzip)) | ||||
|             { | ||||
|                 char c=*(filename_withoutpath-1); | ||||
|                 *(filename_withoutpath-1)='\0'; | ||||
|                 makedir(write_filename); | ||||
|                 *(filename_withoutpath-1)=c; | ||||
|                 fout=FOPEN_FUNC(write_filename,"wb"); | ||||
|             } | ||||
|  | ||||
|             if (fout==NULL) | ||||
|             { | ||||
|                 printf("error opening %s\n",write_filename); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (fout!=NULL) | ||||
|         { | ||||
|             printf(" extracting: %s\n",write_filename); | ||||
|  | ||||
|             do | ||||
|             { | ||||
|                 err = unzReadCurrentFile(uf,buf,size_buf); | ||||
|                 if (err<0) | ||||
|                 { | ||||
|                     printf("error %d with zipfile in unzReadCurrentFile\n",err); | ||||
|                     break; | ||||
|                 } | ||||
|                 if (err>0) | ||||
|                     if (fwrite(buf,err,1,fout)!=1) | ||||
|                     { | ||||
|                         printf("error in writing extracted file\n"); | ||||
|                         err=UNZ_ERRNO; | ||||
|                         break; | ||||
|                     } | ||||
|             } | ||||
|             while (err>0); | ||||
|             if (fout) | ||||
|                     fclose(fout); | ||||
|  | ||||
|             if (err==0) | ||||
|                 change_file_date(write_filename,file_info.dosDate, | ||||
|                                  file_info.tmu_date); | ||||
|         } | ||||
|  | ||||
|         if (err==UNZ_OK) | ||||
|         { | ||||
|             err = unzCloseCurrentFile (uf); | ||||
|             if (err!=UNZ_OK) | ||||
|             { | ||||
|                 printf("error %d with zipfile in unzCloseCurrentFile\n",err); | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|             unzCloseCurrentFile(uf); /* don't lose the error */ | ||||
|     } | ||||
|  | ||||
|     free(buf); | ||||
|     return err; | ||||
| } | ||||
|  | ||||
|  | ||||
| int do_extract(uf,opt_extract_without_path,opt_overwrite,password) | ||||
|     unzFile uf; | ||||
|     int opt_extract_without_path; | ||||
|     int opt_overwrite; | ||||
|     const char* password; | ||||
| { | ||||
|     uLong i; | ||||
|     unz_global_info64 gi; | ||||
|     int err; | ||||
|     FILE* fout=NULL; | ||||
|  | ||||
|     err = unzGetGlobalInfo64(uf,&gi); | ||||
|     if (err!=UNZ_OK) | ||||
|         printf("error %d with zipfile in unzGetGlobalInfo \n",err); | ||||
|  | ||||
|     for (i=0;i<gi.number_entry;i++) | ||||
|     { | ||||
|         if (do_extract_currentfile(uf,&opt_extract_without_path, | ||||
|                                       &opt_overwrite, | ||||
|                                       password) != UNZ_OK) | ||||
|             break; | ||||
|  | ||||
|         if ((i+1)<gi.number_entry) | ||||
|         { | ||||
|             err = unzGoToNextFile(uf); | ||||
|             if (err!=UNZ_OK) | ||||
|             { | ||||
|                 printf("error %d with zipfile in unzGoToNextFile\n",err); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) | ||||
|     unzFile uf; | ||||
|     const char* filename; | ||||
|     int opt_extract_without_path; | ||||
|     int opt_overwrite; | ||||
|     const char* password; | ||||
| { | ||||
|     int err = UNZ_OK; | ||||
|     if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) | ||||
|     { | ||||
|         printf("file %s not found in the zipfile\n",filename); | ||||
|         return 2; | ||||
|     } | ||||
|  | ||||
|     if (do_extract_currentfile(uf,&opt_extract_without_path, | ||||
|                                       &opt_overwrite, | ||||
|                                       password) == UNZ_OK) | ||||
|         return 0; | ||||
|     else | ||||
|         return 1; | ||||
| } | ||||
|  | ||||
|  | ||||
| int main(argc,argv) | ||||
|     int argc; | ||||
|     char *argv[]; | ||||
| { | ||||
|     const char *zipfilename=NULL; | ||||
|     const char *filename_to_extract=NULL; | ||||
|     const char *password=NULL; | ||||
|     char filename_try[MAXFILENAME+16] = ""; | ||||
|     int i; | ||||
|     int ret_value=0; | ||||
|     int opt_do_list=0; | ||||
|     int opt_do_extract=1; | ||||
|     int opt_do_extract_withoutpath=0; | ||||
|     int opt_overwrite=0; | ||||
|     int opt_extractdir=0; | ||||
|     const char *dirname=NULL; | ||||
|     unzFile uf=NULL; | ||||
|  | ||||
|     do_banner(); | ||||
|     if (argc==1) | ||||
|     { | ||||
|         do_help(); | ||||
|         return 0; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         for (i=1;i<argc;i++) | ||||
|         { | ||||
|             if ((*argv[i])=='-') | ||||
|             { | ||||
|                 const char *p=argv[i]+1; | ||||
|  | ||||
|                 while ((*p)!='\0') | ||||
|                 { | ||||
|                     char c=*(p++);; | ||||
|                     if ((c=='l') || (c=='L')) | ||||
|                         opt_do_list = 1; | ||||
|                     if ((c=='v') || (c=='V')) | ||||
|                         opt_do_list = 1; | ||||
|                     if ((c=='x') || (c=='X')) | ||||
|                         opt_do_extract = 1; | ||||
|                     if ((c=='e') || (c=='E')) | ||||
|                         opt_do_extract = opt_do_extract_withoutpath = 1; | ||||
|                     if ((c=='o') || (c=='O')) | ||||
|                         opt_overwrite=1; | ||||
|                     if ((c=='d') || (c=='D')) | ||||
|                     { | ||||
|                         opt_extractdir=1; | ||||
|                         dirname=argv[i+1]; | ||||
|                     } | ||||
|  | ||||
|                     if (((c=='p') || (c=='P')) && (i+1<argc)) | ||||
|                     { | ||||
|                         password=argv[i+1]; | ||||
|                         i++; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (zipfilename == NULL) | ||||
|                     zipfilename = argv[i]; | ||||
|                 else if ((filename_to_extract==NULL) && (!opt_extractdir)) | ||||
|                         filename_to_extract = argv[i] ; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (zipfilename!=NULL) | ||||
|     { | ||||
|  | ||||
| #        ifdef USEWIN32IOAPI | ||||
|         zlib_filefunc64_def ffunc; | ||||
| #        endif | ||||
|  | ||||
|         strncpy(filename_try, zipfilename,MAXFILENAME-1); | ||||
|         /* strncpy doesnt append the trailing NULL, of the string is too long. */ | ||||
|         filename_try[ MAXFILENAME ] = '\0'; | ||||
|  | ||||
| #        ifdef USEWIN32IOAPI | ||||
|         fill_win32_filefunc64A(&ffunc); | ||||
|         uf = unzOpen2_64(zipfilename,&ffunc); | ||||
| #        else | ||||
|         uf = unzOpen64(zipfilename); | ||||
| #        endif | ||||
|         if (uf==NULL) | ||||
|         { | ||||
|             strcat(filename_try,".zip"); | ||||
| #            ifdef USEWIN32IOAPI | ||||
|             uf = unzOpen2_64(filename_try,&ffunc); | ||||
| #            else | ||||
|             uf = unzOpen64(filename_try); | ||||
| #            endif | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (uf==NULL) | ||||
|     { | ||||
|         printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename); | ||||
|         return 1; | ||||
|     } | ||||
|     printf("%s opened\n",filename_try); | ||||
|  | ||||
|     if (opt_do_list==1) | ||||
|         ret_value = do_list(uf); | ||||
|     else if (opt_do_extract==1) | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         if (opt_extractdir && _chdir(dirname)) | ||||
| #else | ||||
|         if (opt_extractdir && chdir(dirname)) | ||||
| #endif | ||||
|         { | ||||
|           printf("Error changing into %s, aborting\n", dirname); | ||||
|           exit(-1); | ||||
|         } | ||||
|  | ||||
|         if (filename_to_extract == NULL) | ||||
|             ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password); | ||||
|         else | ||||
|             ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password); | ||||
|     } | ||||
|  | ||||
|     unzClose(uf); | ||||
|  | ||||
|     return ret_value; | ||||
| } | ||||
| @@ -1,520 +0,0 @@ | ||||
| /* | ||||
|    minizip.c | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( 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 ) | ||||
| */ | ||||
|  | ||||
|  | ||||
| #if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) | ||||
|         #ifndef __USE_FILE_OFFSET64 | ||||
|                 #define __USE_FILE_OFFSET64 | ||||
|         #endif | ||||
|         #ifndef __USE_LARGEFILE64 | ||||
|                 #define __USE_LARGEFILE64 | ||||
|         #endif | ||||
|         #ifndef _LARGEFILE64_SOURCE | ||||
|                 #define _LARGEFILE64_SOURCE | ||||
|         #endif | ||||
|         #ifndef _FILE_OFFSET_BIT | ||||
|                 #define _FILE_OFFSET_BIT 64 | ||||
|         #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __APPLE__ | ||||
| // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions | ||||
| #define FOPEN_FUNC(filename, mode) fopen(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) | ||||
| #else | ||||
| #define FOPEN_FUNC(filename, mode) fopen64(filename, mode) | ||||
| #define FTELLO_FUNC(stream) ftello64(stream) | ||||
| #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| # include <direct.h> | ||||
| # include <io.h> | ||||
| #else | ||||
| # include <unistd.h> | ||||
| # include <utime.h> | ||||
| # include <sys/types.h> | ||||
| # include <sys/stat.h> | ||||
| #endif | ||||
|  | ||||
| #include "zip.h" | ||||
|  | ||||
| #ifdef _WIN32 | ||||
|         #define USEWIN32IOAPI | ||||
|         #include "iowin32.h" | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| #define WRITEBUFFERSIZE (16384) | ||||
| #define MAXFILENAME (256) | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| uLong filetime(f, tmzip, dt) | ||||
|     char *f;                /* name of file to get info on */ | ||||
|     tm_zip *tmzip;             /* return value: access, modific. and creation times */ | ||||
|     uLong *dt;             /* dostime */ | ||||
| { | ||||
|   int ret = 0; | ||||
|   { | ||||
|       FILETIME ftLocal; | ||||
|       HANDLE hFind; | ||||
|       WIN32_FIND_DATAA ff32; | ||||
|  | ||||
|       hFind = FindFirstFileA(f,&ff32); | ||||
|       if (hFind != INVALID_HANDLE_VALUE) | ||||
|       { | ||||
|         FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); | ||||
|         FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); | ||||
|         FindClose(hFind); | ||||
|         ret = 1; | ||||
|       } | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
| #else | ||||
| #ifdef unix || __APPLE__ | ||||
| uLong filetime(f, tmzip, dt) | ||||
|     char *f;               /* name of file to get info on */ | ||||
|     tm_zip *tmzip;         /* return value: access, modific. and creation times */ | ||||
|     uLong *dt;             /* dostime */ | ||||
| { | ||||
|   int ret=0; | ||||
|   struct stat s;        /* results of stat() */ | ||||
|   struct tm* filedate; | ||||
|   time_t tm_t=0; | ||||
|  | ||||
|   if (strcmp(f,"-")!=0) | ||||
|   { | ||||
|     char name[MAXFILENAME+1]; | ||||
|     int len = strlen(f); | ||||
|     if (len > MAXFILENAME) | ||||
|       len = MAXFILENAME; | ||||
|  | ||||
|     strncpy(name, f,MAXFILENAME-1); | ||||
|     /* strncpy doesnt append the trailing NULL, of the string is too long. */ | ||||
|     name[ MAXFILENAME ] = '\0'; | ||||
|  | ||||
|     if (name[len - 1] == '/') | ||||
|       name[len - 1] = '\0'; | ||||
|     /* not all systems allow stat'ing a file with / appended */ | ||||
|     if (stat(name,&s)==0) | ||||
|     { | ||||
|       tm_t = s.st_mtime; | ||||
|       ret = 1; | ||||
|     } | ||||
|   } | ||||
|   filedate = localtime(&tm_t); | ||||
|  | ||||
|   tmzip->tm_sec  = filedate->tm_sec; | ||||
|   tmzip->tm_min  = filedate->tm_min; | ||||
|   tmzip->tm_hour = filedate->tm_hour; | ||||
|   tmzip->tm_mday = filedate->tm_mday; | ||||
|   tmzip->tm_mon  = filedate->tm_mon ; | ||||
|   tmzip->tm_year = filedate->tm_year; | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
| #else | ||||
| uLong filetime(f, tmzip, dt) | ||||
|     char *f;                /* name of file to get info on */ | ||||
|     tm_zip *tmzip;             /* return value: access, modific. and creation times */ | ||||
|     uLong *dt;             /* dostime */ | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int check_exist_file(filename) | ||||
|     const char* filename; | ||||
| { | ||||
|     FILE* ftestexist; | ||||
|     int ret = 1; | ||||
|     ftestexist = FOPEN_FUNC(filename,"rb"); | ||||
|     if (ftestexist==NULL) | ||||
|         ret = 0; | ||||
|     else | ||||
|         fclose(ftestexist); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| void do_banner() | ||||
| { | ||||
|     printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); | ||||
|     printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); | ||||
| } | ||||
|  | ||||
| void do_help() | ||||
| { | ||||
|     printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ | ||||
|            "  -o  Overwrite existing file.zip\n" \ | ||||
|            "  -a  Append to existing file.zip\n" \ | ||||
|            "  -0  Store only\n" \ | ||||
|            "  -1  Compress faster\n" \ | ||||
|            "  -9  Compress better\n\n" \ | ||||
|            "  -j  exclude path. store only the file name.\n\n"); | ||||
| } | ||||
|  | ||||
| /* calculate the CRC32 of a file, | ||||
|    because to encrypt a file, we need known the CRC32 of the file before */ | ||||
| int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) | ||||
| { | ||||
|    unsigned long calculate_crc=0; | ||||
|    int err=ZIP_OK; | ||||
|    FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); | ||||
|  | ||||
|    unsigned long size_read = 0; | ||||
|    unsigned long total_read = 0; | ||||
|    if (fin==NULL) | ||||
|    { | ||||
|        err = ZIP_ERRNO; | ||||
|    } | ||||
|  | ||||
|     if (err == ZIP_OK) | ||||
|         do | ||||
|         { | ||||
|             err = ZIP_OK; | ||||
|             size_read = (int)fread(buf,1,size_buf,fin); | ||||
|             if (size_read < size_buf) | ||||
|                 if (feof(fin)==0) | ||||
|             { | ||||
|                 printf("error in reading %s\n",filenameinzip); | ||||
|                 err = ZIP_ERRNO; | ||||
|             } | ||||
|  | ||||
|             if (size_read>0) | ||||
|                 calculate_crc = crc32(calculate_crc,buf,size_read); | ||||
|             total_read += size_read; | ||||
|  | ||||
|         } while ((err == ZIP_OK) && (size_read>0)); | ||||
|  | ||||
|     if (fin) | ||||
|         fclose(fin); | ||||
|  | ||||
|     *result_crc=calculate_crc; | ||||
|     printf("file %s crc %lx\n", filenameinzip, calculate_crc); | ||||
|     return err; | ||||
| } | ||||
|  | ||||
| int isLargeFile(const char* filename) | ||||
| { | ||||
|   int largeFile = 0; | ||||
|   ZPOS64_T pos = 0; | ||||
|   FILE* pFile = FOPEN_FUNC(filename, "rb"); | ||||
|  | ||||
|   if(pFile != NULL) | ||||
|   { | ||||
|     int n = FSEEKO_FUNC(pFile, 0, SEEK_END); | ||||
|     pos = FTELLO_FUNC(pFile); | ||||
|  | ||||
|                 printf("File : %s is %lld bytes\n", filename, pos); | ||||
|  | ||||
|     if(pos >= 0xffffffff) | ||||
|      largeFile = 1; | ||||
|  | ||||
|                 fclose(pFile); | ||||
|   } | ||||
|  | ||||
|  return largeFile; | ||||
| } | ||||
|  | ||||
| int main(argc,argv) | ||||
|     int argc; | ||||
|     char *argv[]; | ||||
| { | ||||
|     int i; | ||||
|     int opt_overwrite=0; | ||||
|     int opt_compress_level=Z_DEFAULT_COMPRESSION; | ||||
|     int opt_exclude_path=0; | ||||
|     int zipfilenamearg = 0; | ||||
|     char filename_try[MAXFILENAME+16]; | ||||
|     int zipok; | ||||
|     int err=0; | ||||
|     int size_buf=0; | ||||
|     void* buf=NULL; | ||||
|     const char* password=NULL; | ||||
|  | ||||
|  | ||||
|     do_banner(); | ||||
|     if (argc==1) | ||||
|     { | ||||
|         do_help(); | ||||
|         return 0; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         for (i=1;i<argc;i++) | ||||
|         { | ||||
|             if ((*argv[i])=='-') | ||||
|             { | ||||
|                 const char *p=argv[i]+1; | ||||
|  | ||||
|                 while ((*p)!='\0') | ||||
|                 { | ||||
|                     char c=*(p++);; | ||||
|                     if ((c=='o') || (c=='O')) | ||||
|                         opt_overwrite = 1; | ||||
|                     if ((c=='a') || (c=='A')) | ||||
|                         opt_overwrite = 2; | ||||
|                     if ((c>='0') && (c<='9')) | ||||
|                         opt_compress_level = c-'0'; | ||||
|                     if ((c=='j') || (c=='J')) | ||||
|                         opt_exclude_path = 1; | ||||
|  | ||||
|                     if (((c=='p') || (c=='P')) && (i+1<argc)) | ||||
|                     { | ||||
|                         password=argv[i+1]; | ||||
|                         i++; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (zipfilenamearg == 0) | ||||
|                 { | ||||
|                     zipfilenamearg = i ; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     size_buf = WRITEBUFFERSIZE; | ||||
|     buf = (void*)malloc(size_buf); | ||||
|     if (buf==NULL) | ||||
|     { | ||||
|         printf("Error allocating memory\n"); | ||||
|         return ZIP_INTERNALERROR; | ||||
|     } | ||||
|  | ||||
|     if (zipfilenamearg==0) | ||||
|     { | ||||
|         zipok=0; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         int i,len; | ||||
|         int dot_found=0; | ||||
|  | ||||
|         zipok = 1 ; | ||||
|         strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1); | ||||
|         /* strncpy doesnt append the trailing NULL, of the string is too long. */ | ||||
|         filename_try[ MAXFILENAME ] = '\0'; | ||||
|  | ||||
|         len=(int)strlen(filename_try); | ||||
|         for (i=0;i<len;i++) | ||||
|             if (filename_try[i]=='.') | ||||
|                 dot_found=1; | ||||
|  | ||||
|         if (dot_found==0) | ||||
|             strcat(filename_try,".zip"); | ||||
|  | ||||
|         if (opt_overwrite==2) | ||||
|         { | ||||
|             /* if the file don't exist, we not append file */ | ||||
|             if (check_exist_file(filename_try)==0) | ||||
|                 opt_overwrite=1; | ||||
|         } | ||||
|         else | ||||
|         if (opt_overwrite==0) | ||||
|             if (check_exist_file(filename_try)!=0) | ||||
|             { | ||||
|                 char rep=0; | ||||
|                 do | ||||
|                 { | ||||
|                     char answer[128]; | ||||
|                     int ret; | ||||
|                     printf("The file %s exists. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try); | ||||
|                     ret = scanf("%1s",answer); | ||||
|                     if (ret != 1) | ||||
|                     { | ||||
|                        exit(EXIT_FAILURE); | ||||
|                     } | ||||
|                     rep = answer[0] ; | ||||
|                     if ((rep>='a') && (rep<='z')) | ||||
|                         rep -= 0x20; | ||||
|                 } | ||||
|                 while ((rep!='Y') && (rep!='N') && (rep!='A')); | ||||
|                 if (rep=='N') | ||||
|                     zipok = 0; | ||||
|                 if (rep=='A') | ||||
|                     opt_overwrite = 2; | ||||
|             } | ||||
|     } | ||||
|  | ||||
|     if (zipok==1) | ||||
|     { | ||||
|         zipFile zf; | ||||
|         int errclose; | ||||
| #        ifdef USEWIN32IOAPI | ||||
|         zlib_filefunc64_def ffunc; | ||||
|         fill_win32_filefunc64A(&ffunc); | ||||
|         zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); | ||||
| #        else | ||||
|         zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); | ||||
| #        endif | ||||
|  | ||||
|         if (zf == NULL) | ||||
|         { | ||||
|             printf("error opening %s\n",filename_try); | ||||
|             err= ZIP_ERRNO; | ||||
|         } | ||||
|         else | ||||
|             printf("creating %s\n",filename_try); | ||||
|  | ||||
|         for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++) | ||||
|         { | ||||
|             if (!((((*(argv[i]))=='-') || ((*(argv[i]))=='/')) && | ||||
|                   ((argv[i][1]=='o') || (argv[i][1]=='O') || | ||||
|                    (argv[i][1]=='a') || (argv[i][1]=='A') || | ||||
|                    (argv[i][1]=='p') || (argv[i][1]=='P') || | ||||
|                    ((argv[i][1]>='0') || (argv[i][1]<='9'))) && | ||||
|                   (strlen(argv[i]) == 2))) | ||||
|             { | ||||
|                 FILE * fin = NULL; | ||||
|                 int size_read; | ||||
|                 const char* filenameinzip = argv[i]; | ||||
|                 const char *savefilenameinzip; | ||||
|                 zip_fileinfo zi; | ||||
|                 unsigned long crcFile=0; | ||||
|                 int zip64 = 0; | ||||
|  | ||||
|                 zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = | ||||
|                 zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; | ||||
|                 zi.dosDate = 0; | ||||
|                 zi.internal_fa = 0; | ||||
|                 zi.external_fa = 0; | ||||
|                 filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); | ||||
|  | ||||
| /* | ||||
|                 err = zipOpenNewFileInZip(zf,filenameinzip,&zi, | ||||
|                                  NULL,0,NULL,0,NULL / * comment * /, | ||||
|                                  (opt_compress_level != 0) ? Z_DEFLATED : 0, | ||||
|                                  opt_compress_level); | ||||
| */ | ||||
|                 if ((password != NULL) && (err==ZIP_OK)) | ||||
|                     err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); | ||||
|  | ||||
|                 zip64 = isLargeFile(filenameinzip); | ||||
|  | ||||
|                                                          /* The path name saved, should not include a leading slash. */ | ||||
|                /*if it did, windows/xp and dynazip couldn't read the zip file. */ | ||||
|                  savefilenameinzip = filenameinzip; | ||||
|                  while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) | ||||
|                  { | ||||
|                      savefilenameinzip++; | ||||
|                  } | ||||
|  | ||||
|                  /*should the zip file contain any path at all?*/ | ||||
|                  if( opt_exclude_path ) | ||||
|                  { | ||||
|                      const char *tmpptr; | ||||
|                      const char *lastslash = 0; | ||||
|                      for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) | ||||
|                      { | ||||
|                          if( *tmpptr == '\\' || *tmpptr == '/') | ||||
|                          { | ||||
|                              lastslash = tmpptr; | ||||
|                          } | ||||
|                      } | ||||
|                      if( lastslash != NULL ) | ||||
|                      { | ||||
|                          savefilenameinzip = lastslash+1; // base filename follows last slash. | ||||
|                      } | ||||
|                  } | ||||
|  | ||||
|                  /**/ | ||||
|                 err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, | ||||
|                                  NULL,0,NULL,0,NULL /* comment*/, | ||||
|                                  (opt_compress_level != 0) ? Z_DEFLATED : 0, | ||||
|                                  opt_compress_level,0, | ||||
|                                  /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ | ||||
|                                  -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, | ||||
|                                  password,crcFile, zip64); | ||||
|  | ||||
|                 if (err != ZIP_OK) | ||||
|                     printf("error in opening %s in zipfile\n",filenameinzip); | ||||
|                 else | ||||
|                 { | ||||
|                     fin = FOPEN_FUNC(filenameinzip,"rb"); | ||||
|                     if (fin==NULL) | ||||
|                     { | ||||
|                         err=ZIP_ERRNO; | ||||
|                         printf("error in opening %s for reading\n",filenameinzip); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (err == ZIP_OK) | ||||
|                     do | ||||
|                     { | ||||
|                         err = ZIP_OK; | ||||
|                         size_read = (int)fread(buf,1,size_buf,fin); | ||||
|                         if (size_read < size_buf) | ||||
|                             if (feof(fin)==0) | ||||
|                         { | ||||
|                             printf("error in reading %s\n",filenameinzip); | ||||
|                             err = ZIP_ERRNO; | ||||
|                         } | ||||
|  | ||||
|                         if (size_read>0) | ||||
|                         { | ||||
|                             err = zipWriteInFileInZip (zf,buf,size_read); | ||||
|                             if (err<0) | ||||
|                             { | ||||
|                                 printf("error in writing %s in the zipfile\n", | ||||
|                                                  filenameinzip); | ||||
|                             } | ||||
|  | ||||
|                         } | ||||
|                     } while ((err == ZIP_OK) && (size_read>0)); | ||||
|  | ||||
|                 if (fin) | ||||
|                     fclose(fin); | ||||
|  | ||||
|                 if (err<0) | ||||
|                     err=ZIP_ERRNO; | ||||
|                 else | ||||
|                 { | ||||
|                     err = zipCloseFileInZip(zf); | ||||
|                     if (err!=ZIP_OK) | ||||
|                         printf("error in closing %s in the zipfile\n", | ||||
|                                     filenameinzip); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         errclose = zipClose(zf,NULL); | ||||
|         if (errclose != ZIP_OK) | ||||
|             printf("error in closing %s\n",filename_try); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|        do_help(); | ||||
|     } | ||||
|  | ||||
|     free(buf); | ||||
|     return 0; | ||||
| } | ||||
| @@ -1,298 +0,0 @@ | ||||
| /* | ||||
|   Additional tools for Minizip | ||||
|   Code: Xavier Roche '2004 | ||||
|   License: Same as ZLIB (www.gzip.org) | ||||
| */ | ||||
|  | ||||
| /* Code */ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "zlib.h" | ||||
| #include "unzip.h" | ||||
|  | ||||
| #define READ_8(adr)  ((unsigned char)*(adr)) | ||||
| #define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) | ||||
| #define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) | ||||
|  | ||||
| #define WRITE_8(buff, n) do { \ | ||||
|   *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ | ||||
| } while(0) | ||||
| #define WRITE_16(buff, n) do { \ | ||||
|   WRITE_8((unsigned char*)(buff), n); \ | ||||
|   WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ | ||||
| } while(0) | ||||
| #define WRITE_32(buff, n) do { \ | ||||
|   WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ | ||||
|   WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ | ||||
| } while(0) | ||||
|  | ||||
| extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) | ||||
| const char* file; | ||||
| const char* fileOut; | ||||
| const char* fileOutTmp; | ||||
| uLong* nRecovered; | ||||
| uLong* bytesRecovered; | ||||
| { | ||||
|   int err = Z_OK; | ||||
|   FILE* fpZip = fopen(file, "rb"); | ||||
|   FILE* fpOut = fopen(fileOut, "wb"); | ||||
|   FILE* fpOutCD = fopen(fileOutTmp, "wb"); | ||||
|   if (fpZip != NULL &&  fpOut != NULL) { | ||||
|     int entries = 0; | ||||
|     uLong totalBytes = 0; | ||||
|     char header[30]; | ||||
|     char filename[1024]; | ||||
|     char extra[1024]; | ||||
|     int offset = 0; | ||||
|     int offsetCD = 0; | ||||
|     while ( fread(header, 1, 30, fpZip) == 30 ) { | ||||
|       int currentOffset = offset; | ||||
|  | ||||
|       /* File entry */ | ||||
|       if (READ_32(header) == 0x04034b50) { | ||||
|         unsigned int version = READ_16(header + 4); | ||||
|         unsigned int gpflag = READ_16(header + 6); | ||||
|         unsigned int method = READ_16(header + 8); | ||||
|         unsigned int filetime = READ_16(header + 10); | ||||
|         unsigned int filedate = READ_16(header + 12); | ||||
|         unsigned int crc = READ_32(header + 14); /* crc */ | ||||
|         unsigned int cpsize = READ_32(header + 18); /* compressed size */ | ||||
|         unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ | ||||
|         unsigned int fnsize = READ_16(header + 26); /* file name length */ | ||||
|         unsigned int extsize = READ_16(header + 28); /* extra field length */ | ||||
|         filename[0] = extra[0] = '\0'; | ||||
|  | ||||
|         /* Header */ | ||||
|         if (fwrite(header, 1, 30, fpOut) == 30) { | ||||
|           offset += 30; | ||||
|         } else { | ||||
|           err = Z_ERRNO; | ||||
|           break; | ||||
|         } | ||||
|  | ||||
|         /* Filename */ | ||||
|         if (fnsize > 0) { | ||||
|           if (fnsize < sizeof(filename)) { | ||||
|             if (fread(filename, 1, fnsize, fpZip) == fnsize) { | ||||
|                 if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { | ||||
|                 offset += fnsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_ERRNO; | ||||
|               break; | ||||
|             } | ||||
|           } else { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } else { | ||||
|           err = Z_STREAM_ERROR; | ||||
|           break; | ||||
|         } | ||||
|  | ||||
|         /* Extra field */ | ||||
|         if (extsize > 0) { | ||||
|           if (extsize < sizeof(extra)) { | ||||
|             if (fread(extra, 1, extsize, fpZip) == extsize) { | ||||
|               if (fwrite(extra, 1, extsize, fpOut) == extsize) { | ||||
|                 offset += extsize; | ||||
|                 } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_ERRNO; | ||||
|               break; | ||||
|             } | ||||
|           } else { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         /* Data */ | ||||
|         { | ||||
|           int dataSize = cpsize; | ||||
|           if (dataSize == 0) { | ||||
|             dataSize = uncpsize; | ||||
|           } | ||||
|           if (dataSize > 0) { | ||||
|             char* data = malloc(dataSize); | ||||
|             if (data != NULL) { | ||||
|               if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { | ||||
|                 if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { | ||||
|                   offset += dataSize; | ||||
|                   totalBytes += dataSize; | ||||
|                 } else { | ||||
|                   err = Z_ERRNO; | ||||
|                 } | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|               } | ||||
|               free(data); | ||||
|               if (err != Z_OK) { | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_MEM_ERROR; | ||||
|               break; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         /* Central directory entry */ | ||||
|         { | ||||
|           char header[46]; | ||||
|           char* comment = ""; | ||||
|           int comsize = (int) strlen(comment); | ||||
|           WRITE_32(header, 0x02014b50); | ||||
|           WRITE_16(header + 4, version); | ||||
|           WRITE_16(header + 6, version); | ||||
|           WRITE_16(header + 8, gpflag); | ||||
|           WRITE_16(header + 10, method); | ||||
|           WRITE_16(header + 12, filetime); | ||||
|           WRITE_16(header + 14, filedate); | ||||
|           WRITE_32(header + 16, crc); | ||||
|           WRITE_32(header + 20, cpsize); | ||||
|           WRITE_32(header + 24, uncpsize); | ||||
|           WRITE_16(header + 28, fnsize); | ||||
|           WRITE_16(header + 30, extsize); | ||||
|           WRITE_16(header + 32, comsize); | ||||
|           WRITE_16(header + 34, 0);     /* disk # */ | ||||
|           WRITE_16(header + 36, 0);     /* int attrb */ | ||||
|           WRITE_32(header + 38, 0);     /* ext attrb */ | ||||
|           WRITE_32(header + 42, currentOffset); | ||||
|           /* Header */ | ||||
|           if (fwrite(header, 1, 46, fpOutCD) == 46) { | ||||
|             offsetCD += 46; | ||||
|  | ||||
|             /* Filename */ | ||||
|             if (fnsize > 0) { | ||||
|               if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { | ||||
|                 offsetCD += fnsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } else { | ||||
|               err = Z_STREAM_ERROR; | ||||
|               break; | ||||
|             } | ||||
|  | ||||
|             /* Extra field */ | ||||
|             if (extsize > 0) { | ||||
|               if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { | ||||
|                 offsetCD += extsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } | ||||
|  | ||||
|             /* Comment field */ | ||||
|             if (comsize > 0) { | ||||
|               if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { | ||||
|                 offsetCD += comsize; | ||||
|               } else { | ||||
|                 err = Z_ERRNO; | ||||
|                 break; | ||||
|               } | ||||
|             } | ||||
|  | ||||
|  | ||||
|           } else { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         /* Success */ | ||||
|         entries++; | ||||
|  | ||||
|       } else { | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Final central directory  */ | ||||
|     { | ||||
|       int entriesZip = entries; | ||||
|       char header[22]; | ||||
|       char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; | ||||
|       int comsize = (int) strlen(comment); | ||||
|       if (entriesZip > 0xffff) { | ||||
|         entriesZip = 0xffff; | ||||
|       } | ||||
|       WRITE_32(header, 0x06054b50); | ||||
|       WRITE_16(header + 4, 0);    /* disk # */ | ||||
|       WRITE_16(header + 6, 0);    /* disk # */ | ||||
|       WRITE_16(header + 8, entriesZip);   /* hack */ | ||||
|       WRITE_16(header + 10, entriesZip);  /* hack */ | ||||
|       WRITE_32(header + 12, offsetCD);    /* size of CD */ | ||||
|       WRITE_32(header + 16, offset);      /* offset to CD */ | ||||
|       WRITE_16(header + 20, comsize);     /* comment */ | ||||
|  | ||||
|       /* Header */ | ||||
|       if (fwrite(header, 1, 22, fpOutCD) == 22) { | ||||
|  | ||||
|         /* Comment field */ | ||||
|         if (comsize > 0) { | ||||
|           if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { | ||||
|             err = Z_ERRNO; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|       } else { | ||||
|         err = Z_ERRNO; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Final merge (file + central directory) */ | ||||
|     fclose(fpOutCD); | ||||
|     if (err == Z_OK) { | ||||
|       fpOutCD = fopen(fileOutTmp, "rb"); | ||||
|       if (fpOutCD != NULL) { | ||||
|         int nRead; | ||||
|         char buffer[8192]; | ||||
|         while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { | ||||
|           if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|         fclose(fpOutCD); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Close */ | ||||
|     fclose(fpZip); | ||||
|     fclose(fpOut); | ||||
|  | ||||
|     /* Wipe temporary file */ | ||||
|     (void)remove(fileOutTmp); | ||||
|  | ||||
|     /* Number of recovered entries */ | ||||
|     if (err == Z_OK) { | ||||
|       if (nRecovered != NULL) { | ||||
|         *nRecovered = entries; | ||||
|       } | ||||
|       if (bytesRecovered != NULL) { | ||||
|         *bytesRecovered = totalBytes; | ||||
|       } | ||||
|     } | ||||
|   } else { | ||||
|     if (fpZip) | ||||
|       fclose(fpZip); | ||||
|     if (fpOut) | ||||
|       fclose(fpOut); | ||||
|     if (fpOutCD) | ||||
|       fclose(fpOutCD); | ||||
|  | ||||
|     err = Z_STREAM_ERROR; | ||||
|   } | ||||
|   return err; | ||||
| } | ||||
| @@ -1,37 +0,0 @@ | ||||
| /* | ||||
|   Additional tools for Minizip | ||||
|   Code: Xavier Roche '2004 | ||||
|   License: Same as ZLIB (www.gzip.org) | ||||
| */ | ||||
|  | ||||
| #ifndef _zip_tools_H | ||||
| #define _zip_tools_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #ifndef _ZLIB_H | ||||
| #include "zlib.h" | ||||
| #endif | ||||
|  | ||||
| #include "unzip.h" | ||||
|  | ||||
| /* Repair a ZIP file (missing central directory) | ||||
|    file: file to recover | ||||
|    fileOut: output file after recovery | ||||
|    fileOutTmp: temporary file name used for recovery | ||||
| */ | ||||
| extern int ZEXPORT unzRepair(const char* file, | ||||
|                              const char* fileOut, | ||||
|                              const char* fileOutTmp, | ||||
|                              uLong* nRecovered, | ||||
|                              uLong* bytesRecovered); | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										2125
									
								
								lib/minizip/unzip.c
									
									
									
									
									
								
							
							
						
						
									
										2125
									
								
								lib/minizip/unzip.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,437 +0,0 @@ | ||||
| /* unzip.h -- IO for uncompress .zip files using zlib | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( 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 ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
|          --------------------------------------------------------------------------------- | ||||
|  | ||||
|         Condition of use and distribution are the same than zlib : | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the authors be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
|   --------------------------------------------------------------------------------- | ||||
|  | ||||
|         Changes | ||||
|  | ||||
|         See header of unzip64.c | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef _unz64_H | ||||
| #define _unz64_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; } unzFile__; | ||||
| typedef unzFile__ *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) | ||||
|  | ||||
| /* tm_unz contain date/time info */ | ||||
| typedef struct tm_unz_s | ||||
| { | ||||
|     uInt tm_sec;            /* seconds after the minute - [0,59] */ | ||||
|     uInt tm_min;            /* minutes after the hour - [0,59] */ | ||||
|     uInt tm_hour;           /* hours since midnight - [0,23] */ | ||||
|     uInt tm_mday;           /* day of the month - [1,31] */ | ||||
|     uInt tm_mon;            /* months since January - [0,11] */ | ||||
|     uInt tm_year;           /* years - [1980..2044] */ | ||||
| } tm_unz; | ||||
|  | ||||
| /* 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 | ||||
| { | ||||
|     ZPOS64_T number_entry;         /* total number of entries in | ||||
|                                      the central dir on this disk */ | ||||
|     uLong size_comment;         /* size of the global comment of the zipfile */ | ||||
| } unz_global_info64; | ||||
|  | ||||
| typedef struct unz_global_info_s | ||||
| { | ||||
|     uLong number_entry;         /* total number of entries in | ||||
|                                      the central dir on this disk */ | ||||
|     uLong 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 | ||||
| { | ||||
|     uLong version;              /* version made by                 2 bytes */ | ||||
|     uLong version_needed;       /* version needed to extract       2 bytes */ | ||||
|     uLong flag;                 /* general purpose bit flag        2 bytes */ | ||||
|     uLong compression_method;   /* compression method              2 bytes */ | ||||
|     uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */ | ||||
|     uLong crc;                  /* crc-32                          4 bytes */ | ||||
|     ZPOS64_T compressed_size;   /* compressed size                 8 bytes */ | ||||
|     ZPOS64_T uncompressed_size; /* uncompressed size               8 bytes */ | ||||
|     uLong size_filename;        /* filename length                 2 bytes */ | ||||
|     uLong size_file_extra;      /* extra field length              2 bytes */ | ||||
|     uLong size_file_comment;    /* file comment length             2 bytes */ | ||||
|  | ||||
|     uLong disk_num_start;       /* disk number start               2 bytes */ | ||||
|     uLong internal_fa;          /* internal file attributes        2 bytes */ | ||||
|     uLong external_fa;          /* external file attributes        4 bytes */ | ||||
|  | ||||
|     tm_unz tmu_date; | ||||
| } unz_file_info64; | ||||
|  | ||||
| typedef struct unz_file_info_s | ||||
| { | ||||
|     uLong version;              /* version made by                 2 bytes */ | ||||
|     uLong version_needed;       /* version needed to extract       2 bytes */ | ||||
|     uLong flag;                 /* general purpose bit flag        2 bytes */ | ||||
|     uLong compression_method;   /* compression method              2 bytes */ | ||||
|     uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */ | ||||
|     uLong crc;                  /* crc-32                          4 bytes */ | ||||
|     uLong compressed_size;      /* compressed size                 4 bytes */ | ||||
|     uLong uncompressed_size;    /* uncompressed size               4 bytes */ | ||||
|     uLong size_filename;        /* filename length                 2 bytes */ | ||||
|     uLong size_file_extra;      /* extra field length              2 bytes */ | ||||
|     uLong size_file_comment;    /* file comment length             2 bytes */ | ||||
|  | ||||
|     uLong disk_num_start;       /* disk number start               2 bytes */ | ||||
|     uLong internal_fa;          /* internal file attributes        2 bytes */ | ||||
|     uLong external_fa;          /* external file attributes        4 bytes */ | ||||
|  | ||||
|     tm_unz tmu_date; | ||||
| } unz_file_info; | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzStringFileNameCompare OF ((const char* fileName1, | ||||
|                                                  const char* fileName2, | ||||
|                                                  int iCaseSensitivity)); | ||||
| /* | ||||
|    Compare two filename (fileName1,fileName2). | ||||
|    If iCaseSenisivity = 1, comparison is case sensitivity (like strcmp) | ||||
|    If iCaseSenisivity = 2, comparison is not case sensitivity (like strcmpi | ||||
|                                 or strcasecmp) | ||||
|    If iCaseSenisivity = 0, case sensitivity is default of your operating system | ||||
|     (like 1 on Unix, 2 on Windows) | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern unzFile MINIZIP_EXPORT unzOpen OF((const char *path)); | ||||
| extern unzFile MINIZIP_EXPORT unzOpen64 OF((const void *path)); | ||||
| /* | ||||
|   Open a Zip file. path contain the full pathname (by example, | ||||
|      on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer | ||||
|      "zlib/zlib113.zip". | ||||
|      If the zipfile cannot be opened (file don't exist or in not valid), the | ||||
|        return value is NULL. | ||||
|      Else, the return value is a unzFile Handle, usable with other function | ||||
|        of this unzip package. | ||||
|      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 MINIZIP_EXPORT unzOpen2 OF((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 the zip file (see ioapi.h) | ||||
| */ | ||||
|  | ||||
| extern unzFile MINIZIP_EXPORT unzOpen2_64 OF((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 the zip file (see ioapi.h) | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzClose OF((unzFile file)); | ||||
| /* | ||||
|   Close a ZipFile opened with unzOpen. | ||||
|   If there is files inside the .Zip opened with unzOpenCurrentFile (see later), | ||||
|     these files MUST be closed with unzCloseCurrentFile before call unzClose. | ||||
|   return UNZ_OK if there is no problem. */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetGlobalInfo OF((unzFile file, | ||||
|                                         unz_global_info *pglobal_info)); | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetGlobalInfo64 OF((unzFile file, | ||||
|                                         unz_global_info64 *pglobal_info)); | ||||
| /* | ||||
|   Write info about the ZipFile in the *pglobal_info structure. | ||||
|   No preparation of the structure is needed | ||||
|   return UNZ_OK if there is no problem. */ | ||||
|  | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetGlobalComment OF((unzFile file, | ||||
|                                            char *szComment, | ||||
|                                            uLong uSizeBuf)); | ||||
| /* | ||||
|   Get the global comment string of the ZipFile, in the szComment buffer. | ||||
|   uSizeBuf is the size of the szComment buffer. | ||||
|   return the number of byte copied or an error code <0 | ||||
| */ | ||||
|  | ||||
|  | ||||
| /***************************************************************************/ | ||||
| /* Unzip package allow you browse the directory of the zipfile */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGoToFirstFile OF((unzFile file)); | ||||
| /* | ||||
|   Set the current file of the zipfile to the first file. | ||||
|   return UNZ_OK if there is no problem | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGoToNextFile OF((unzFile file)); | ||||
| /* | ||||
|   Set the current file of the zipfile to the next file. | ||||
|   return UNZ_OK if there is no problem | ||||
|   return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzLocateFile OF((unzFile file, | ||||
|                      const char *szFileName, | ||||
|                      int iCaseSensitivity)); | ||||
| /* | ||||
|   Try locate the file szFileName in the zipfile. | ||||
|   For the iCaseSensitivity signification, see unzStringFileNameCompare | ||||
|  | ||||
|   return value : | ||||
|   UNZ_OK if the file is found. It becomes the current file. | ||||
|   UNZ_END_OF_LIST_OF_FILE if the file is not found | ||||
| */ | ||||
|  | ||||
|  | ||||
| /* ****************************************** */ | ||||
| /* Ryan supplied functions */ | ||||
| /* unz_file_info contain information about a file in the zipfile */ | ||||
| typedef struct unz_file_pos_s | ||||
| { | ||||
|     uLong pos_in_zip_directory;   /* offset in zip file directory */ | ||||
|     uLong num_of_file;            /* # of file */ | ||||
| } unz_file_pos; | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetFilePos( | ||||
|     unzFile file, | ||||
|     unz_file_pos* file_pos); | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGoToFilePos( | ||||
|     unzFile file, | ||||
|     unz_file_pos* file_pos); | ||||
|  | ||||
| typedef struct unz64_file_pos_s | ||||
| { | ||||
|     ZPOS64_T pos_in_zip_directory;   /* offset in zip file directory */ | ||||
|     ZPOS64_T num_of_file;            /* # of file */ | ||||
| } unz64_file_pos; | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetFilePos64( | ||||
|     unzFile file, | ||||
|     unz64_file_pos* file_pos); | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGoToFilePos64( | ||||
|     unzFile file, | ||||
|     const unz64_file_pos* file_pos); | ||||
|  | ||||
| /* ****************************************** */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetCurrentFileInfo64 OF((unzFile file, | ||||
|                          unz_file_info64 *pfile_info, | ||||
|                          char *szFileName, | ||||
|                          uLong fileNameBufferSize, | ||||
|                          void *extraField, | ||||
|                          uLong extraFieldBufferSize, | ||||
|                          char *szComment, | ||||
|                          uLong commentBufferSize)); | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetCurrentFileInfo OF((unzFile file, | ||||
|                          unz_file_info *pfile_info, | ||||
|                          char *szFileName, | ||||
|                          uLong fileNameBufferSize, | ||||
|                          void *extraField, | ||||
|                          uLong extraFieldBufferSize, | ||||
|                          char *szComment, | ||||
|                          uLong commentBufferSize)); | ||||
| /* | ||||
|   Get Info about the current file | ||||
|   if pfile_info!=NULL, the *pfile_info structure will contain somes info about | ||||
|         the current file | ||||
|   if szFileName!=NULL, the filemane string will be copied in szFileName | ||||
|             (fileNameBufferSize is the size of the buffer) | ||||
|   if extraField!=NULL, the extra field information will be copied in extraField | ||||
|             (extraFieldBufferSize is the size of the buffer). | ||||
|             This is the Central-header version of the extra field | ||||
|   if szComment!=NULL, the comment string of the file will be copied in szComment | ||||
|             (commentBufferSize is the size of the buffer) | ||||
| */ | ||||
|  | ||||
|  | ||||
| /** Addition for GDAL : START */ | ||||
|  | ||||
| extern ZPOS64_T MINIZIP_EXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); | ||||
|  | ||||
| /** Addition for GDAL : END */ | ||||
|  | ||||
|  | ||||
| /***************************************************************************/ | ||||
| /* for 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 MINIZIP_EXPORT unzOpenCurrentFile OF((unzFile file)); | ||||
| /* | ||||
|   Open for reading data the current file in the zipfile. | ||||
|   If there is no error, the return value is UNZ_OK. | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzOpenCurrentFilePassword OF((unzFile file, | ||||
|                                                   const char* password)); | ||||
| /* | ||||
|   Open for reading data the current file in the zipfile. | ||||
|   password is a crypting password | ||||
|   If there is no error, the return value is UNZ_OK. | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzOpenCurrentFile2 OF((unzFile file, | ||||
|                                            int* method, | ||||
|                                            int* level, | ||||
|                                            int raw)); | ||||
| /* | ||||
|   Same than 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 MINIZIP_EXPORT unzOpenCurrentFile3 OF((unzFile file, | ||||
|                                            int* method, | ||||
|                                            int* level, | ||||
|                                            int raw, | ||||
|                                            const char* password)); | ||||
| /* | ||||
|   Same than 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 MINIZIP_EXPORT unzCloseCurrentFile OF((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 | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzReadCurrentFile OF((unzFile file, | ||||
|                       voidp buf, | ||||
|                       unsigned 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 z_off_t MINIZIP_EXPORT unztell OF((unzFile file)); | ||||
|  | ||||
| extern ZPOS64_T MINIZIP_EXPORT unztell64 OF((unzFile file)); | ||||
| /* | ||||
|   Give the current position in uncompressed data | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzeof OF((unzFile file)); | ||||
| /* | ||||
|   return 1 if the end of file was reached, 0 elsewhere | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT unzGetLocalExtrafield OF((unzFile file, | ||||
|                                              voidp buf, | ||||
|                                              unsigned 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. | ||||
|   the return value is the number of bytes copied in buf, or (if <0) | ||||
|     the error code | ||||
| */ | ||||
|  | ||||
| /***************************************************************************/ | ||||
|  | ||||
| /* Get the current file offset */ | ||||
| extern ZPOS64_T MINIZIP_EXPORT unzGetOffset64 (unzFile file); | ||||
| extern uLong MINIZIP_EXPORT unzGetOffset (unzFile file); | ||||
|  | ||||
| /* Set the current file offset */ | ||||
| extern int MINIZIP_EXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); | ||||
| extern int MINIZIP_EXPORT unzSetOffset (unzFile file, uLong pos); | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* _unz64_H */ | ||||
							
								
								
									
										2012
									
								
								lib/minizip/zip.c
									
									
									
									
									
								
							
							
						
						
									
										2012
									
								
								lib/minizip/zip.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,362 +0,0 @@ | ||||
| /* zip.h -- IO on .zip files using zlib | ||||
|    Version 1.1, February 14h, 2010 | ||||
|    part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) | ||||
|  | ||||
|          Modifications for Zip64 support | ||||
|          Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) | ||||
|  | ||||
|          For more info read MiniZip_info.txt | ||||
|  | ||||
|          --------------------------------------------------------------------------- | ||||
|  | ||||
|    Condition of use and distribution are the same than zlib : | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the authors be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
|         --------------------------------------------------------------------------- | ||||
|  | ||||
|         Changes | ||||
|  | ||||
|         See header of zip.h | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef _zip12_H | ||||
| #define _zip12_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| //#define HAVE_BZIP2 | ||||
|  | ||||
| #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(STRICTZIP) || defined(STRICTZIPUNZIP) | ||||
| /* like the STRICT of WIN32, we define a pointer that cannot be converted | ||||
|     from (void*) without cast */ | ||||
| typedef struct TagzipFile__ { int unused; } zipFile__; | ||||
| typedef zipFile__ *zipFile; | ||||
| #else | ||||
| typedef voidp zipFile; | ||||
| #endif | ||||
|  | ||||
| #define ZIP_OK                          (0) | ||||
| #define ZIP_EOF                         (0) | ||||
| #define ZIP_ERRNO                       (Z_ERRNO) | ||||
| #define ZIP_PARAMERROR                  (-102) | ||||
| #define ZIP_BADZIPFILE                  (-103) | ||||
| #define ZIP_INTERNALERROR               (-104) | ||||
|  | ||||
| #ifndef DEF_MEM_LEVEL | ||||
| #  if MAX_MEM_LEVEL >= 8 | ||||
| #    define DEF_MEM_LEVEL 8 | ||||
| #  else | ||||
| #    define DEF_MEM_LEVEL  MAX_MEM_LEVEL | ||||
| #  endif | ||||
| #endif | ||||
| /* default memLevel */ | ||||
|  | ||||
| /* tm_zip contain date/time info */ | ||||
| typedef struct tm_zip_s | ||||
| { | ||||
|     uInt tm_sec;            /* seconds after the minute - [0,59] */ | ||||
|     uInt tm_min;            /* minutes after the hour - [0,59] */ | ||||
|     uInt tm_hour;           /* hours since midnight - [0,23] */ | ||||
|     uInt tm_mday;           /* day of the month - [1,31] */ | ||||
|     uInt tm_mon;            /* months since January - [0,11] */ | ||||
|     uInt tm_year;           /* years - [1980..2044] */ | ||||
| } tm_zip; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     tm_zip      tmz_date;       /* date in understandable format           */ | ||||
|     uLong       dosDate;       /* if dos_date == 0, tmu_date is used      */ | ||||
| /*    uLong       flag;        */   /* general purpose bit flag        2 bytes */ | ||||
|  | ||||
|     uLong       internal_fa;    /* internal file attributes        2 bytes */ | ||||
|     uLong       external_fa;    /* external file attributes        4 bytes */ | ||||
| } zip_fileinfo; | ||||
|  | ||||
| typedef const char* zipcharpc; | ||||
|  | ||||
|  | ||||
| #define APPEND_STATUS_CREATE        (0) | ||||
| #define APPEND_STATUS_CREATEAFTER   (1) | ||||
| #define APPEND_STATUS_ADDINZIP      (2) | ||||
|  | ||||
| extern zipFile MINIZIP_EXPORT zipOpen OF((const char *pathname, int append)); | ||||
| extern zipFile MINIZIP_EXPORT zipOpen64 OF((const void *pathname, int append)); | ||||
| /* | ||||
|   Create a zipfile. | ||||
|      pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on | ||||
|        an Unix computer "zlib/zlib113.zip". | ||||
|      if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip | ||||
|        will be created at the end of the file. | ||||
|          (useful if the file contain a self extractor code) | ||||
|      if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will | ||||
|        add files in existing zip (be sure you don't add file that doesn't exist) | ||||
|      If the zipfile cannot be opened, the return value is NULL. | ||||
|      Else, the return value is a zipFile Handle, usable with other function | ||||
|        of this zip package. | ||||
| */ | ||||
|  | ||||
| /* Note : there is no delete function into a zipfile. | ||||
|    If you want delete file into a zipfile, you must open a zipfile, and create another | ||||
|    Of couse, you can use RAW reading and writing to copy the file you did not want delete | ||||
| */ | ||||
|  | ||||
| extern zipFile MINIZIP_EXPORT zipOpen2 OF((const char *pathname, | ||||
|                                    int append, | ||||
|                                    zipcharpc* globalcomment, | ||||
|                                    zlib_filefunc_def* pzlib_filefunc_def)); | ||||
|  | ||||
| extern zipFile MINIZIP_EXPORT zipOpen2_64 OF((const void *pathname, | ||||
|                                    int append, | ||||
|                                    zipcharpc* globalcomment, | ||||
|                                    zlib_filefunc64_def* pzlib_filefunc_def)); | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip OF((zipFile file, | ||||
|                        const char* filename, | ||||
|                        const zip_fileinfo* zipfi, | ||||
|                        const void* extrafield_local, | ||||
|                        uInt size_extrafield_local, | ||||
|                        const void* extrafield_global, | ||||
|                        uInt size_extrafield_global, | ||||
|                        const char* comment, | ||||
|                        int method, | ||||
|                        int level)); | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip64 OF((zipFile file, | ||||
|                        const char* filename, | ||||
|                        const zip_fileinfo* zipfi, | ||||
|                        const void* extrafield_local, | ||||
|                        uInt size_extrafield_local, | ||||
|                        const void* extrafield_global, | ||||
|                        uInt size_extrafield_global, | ||||
|                        const char* comment, | ||||
|                        int method, | ||||
|                        int level, | ||||
|                        int zip64)); | ||||
|  | ||||
| /* | ||||
|   Open a file in the ZIP for writing. | ||||
|   filename : the filename in zip (if NULL, '-' without quote will be used | ||||
|   *zipfi contain supplemental information | ||||
|   if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local | ||||
|     contains the extrafield data the the local header | ||||
|   if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global | ||||
|     contains the extrafield data the the local header | ||||
|   if comment != NULL, comment contain the comment string | ||||
|   method contain the compression method (0 for store, Z_DEFLATED for deflate) | ||||
|   level contain the level of compression (can be Z_DEFAULT_COMPRESSION) | ||||
|   zip64 is set to 1 if a zip64 extended information block should be added to the local file header. | ||||
|                     this MUST be '1' if the uncompressed size is >= 0xffffffff. | ||||
|  | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip2 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw)); | ||||
|  | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip2_64 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int zip64)); | ||||
| /* | ||||
|   Same than zipOpenNewFileInZip, except if raw=1, we write raw file | ||||
|  */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip3 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting)); | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip3_64 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting, | ||||
|                                             int zip64 | ||||
|                                             )); | ||||
|  | ||||
| /* | ||||
|   Same than zipOpenNewFileInZip2, except | ||||
|     windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 | ||||
|     password : crypting password (NULL for no crypting) | ||||
|     crcForCrypting : crc of file to compress (needed for crypting) | ||||
|  */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip4 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting, | ||||
|                                             uLong versionMadeBy, | ||||
|                                             uLong flagBase | ||||
|                                             )); | ||||
|  | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipOpenNewFileInZip4_64 OF((zipFile file, | ||||
|                                             const char* filename, | ||||
|                                             const zip_fileinfo* zipfi, | ||||
|                                             const void* extrafield_local, | ||||
|                                             uInt size_extrafield_local, | ||||
|                                             const void* extrafield_global, | ||||
|                                             uInt size_extrafield_global, | ||||
|                                             const char* comment, | ||||
|                                             int method, | ||||
|                                             int level, | ||||
|                                             int raw, | ||||
|                                             int windowBits, | ||||
|                                             int memLevel, | ||||
|                                             int strategy, | ||||
|                                             const char* password, | ||||
|                                             uLong crcForCrypting, | ||||
|                                             uLong versionMadeBy, | ||||
|                                             uLong flagBase, | ||||
|                                             int zip64 | ||||
|                                             )); | ||||
| /* | ||||
|   Same than zipOpenNewFileInZip4, except | ||||
|     versionMadeBy : value for Version made by field | ||||
|     flag : value for flag field (compression level info will be added) | ||||
|  */ | ||||
|  | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipWriteInFileInZip OF((zipFile file, | ||||
|                        const void* buf, | ||||
|                        unsigned len)); | ||||
| /* | ||||
|   Write data in the zipfile | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipCloseFileInZip OF((zipFile file)); | ||||
| /* | ||||
|   Close the current file in the zipfile | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipCloseFileInZipRaw OF((zipFile file, | ||||
|                                             uLong uncompressed_size, | ||||
|                                             uLong crc32)); | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipCloseFileInZipRaw64 OF((zipFile file, | ||||
|                                             ZPOS64_T uncompressed_size, | ||||
|                                             uLong crc32)); | ||||
|  | ||||
| /* | ||||
|   Close the current file in the zipfile, for file opened with | ||||
|     parameter raw=1 in zipOpenNewFileInZip2 | ||||
|   uncompressed_size and crc32 are value for the uncompressed size | ||||
| */ | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipClose OF((zipFile file, | ||||
|                 const char* global_comment)); | ||||
| /* | ||||
|   Close the zipfile | ||||
| */ | ||||
|  | ||||
|  | ||||
| extern int MINIZIP_EXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); | ||||
| /* | ||||
|   zipRemoveExtraInfoBlock -  Added by Mathias Svensson | ||||
|  | ||||
|   Remove extra information block from a extra information data for the local file header or central directory header | ||||
|  | ||||
|   It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. | ||||
|  | ||||
|   0x0001 is the signature header for the ZIP64 extra information blocks | ||||
|  | ||||
|   usage. | ||||
|                         Remove ZIP64 Extra information from a central director extra field data | ||||
|               zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); | ||||
|  | ||||
|                         Remove ZIP64 Extra information from a Local File Header extra field data | ||||
|         zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); | ||||
| */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* _zip64_H */ | ||||
		Reference in New Issue
	
	Block a user