mirror of
				https://github.com/eledio-devices/thirdparty-miniz.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Compare commits
	
		
			50 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | a4264837ae | ||
|  | b4936524bc | ||
|  | e9020723b3 | ||
|  | 5ba89c135d | ||
|  | 25de35faec | ||
|  | 4d1d5b6771 | ||
|  | 034f0228eb | ||
|  | 4b8c4f432c | ||
|  | 9d79ea2245 | ||
|  | 6db3c0d290 | ||
|  | 96f0da1db9 | ||
|  | 93c6567773 | ||
|  | 2b45f89867 | ||
|  | 5c62e23e04 | ||
|  | f3461d636a | ||
|  | 45a080c050 | ||
|  | 2e15a3ff77 | ||
|  | d31e119d4d | ||
|  | 3a884afaa7 | ||
|  | ae423e65b4 | ||
|  | 336fca3bd4 | ||
|  | a3ca94f833 | ||
|  | 9ce0d0ddff | ||
|  | f8600923fc | ||
|  | 306edd2022 | ||
|  | 407d298c14 | ||
|  | 53bfef515c | ||
|  | 91fa285a27 | ||
|  | df65d5a1de | ||
|  | 46cdde2ac5 | ||
|  | 3616bf804b | ||
|  | 76237898c0 | ||
|  | 3af5c82fd3 | ||
|  | 55f4dfe1d2 | ||
|  | b344eaf775 | ||
|  | 36b6c99f62 | ||
|  | 04f2169b8a | ||
|  | 14a5a1397b | ||
|  | fef12d34f1 | ||
|  | b01930542e | ||
|  | 9c88e826a2 | ||
|  | 22e4ef1b1d | ||
|  | 7a7d0b423b | ||
|  | c17cc20c80 | ||
|  | 0f6b199e5b | ||
|  | 0b7d3070b9 | ||
|  | aadc405b1c | ||
|  | 02c51d3662 | ||
|  | 9393a95f26 | ||
|  | 82e5b184e4 | 
| @@ -1,13 +1,19 @@ | ||||
| PROJECT(miniz) | ||||
| PROJECT(miniz C) | ||||
| cmake_minimum_required(VERSION 2.8) | ||||
| set(CMAKE_BUILD_TYPE Release) | ||||
| set(CMAKE_CONFIGURATION_TYPES Release Debug) | ||||
| if(CMAKE_BUILD_TYPE STREQUAL "") | ||||
|   # CMake defaults to leaving CMAKE_BUILD_TYPE empty. This screws up | ||||
|   # differentiation between debug and release builds. | ||||
|   set(CMAKE_BUILD_TYPE "Release" CACHE STRING | ||||
|     "Choose the type of build, options are: None (CMAKE_CXX_FLAGS or \ | ||||
| CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) | ||||
| endif () | ||||
|  | ||||
| set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) | ||||
|  | ||||
| set(miniz_SOURCE miniz.c miniz_zip.c miniz_tinfl.c miniz_tdef.c) | ||||
|  | ||||
| add_library(miniz ${miniz_SOURCE}) | ||||
| target_include_directories(miniz PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") | ||||
|  | ||||
| set(EXAMPLE1_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example1.c") | ||||
| set(EXAMPLE2_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/examples/example2.c") | ||||
| @@ -19,7 +25,6 @@ set(MINIZ_TESTER_SRC_LIST | ||||
|     "${CMAKE_CURRENT_SOURCE_DIR}/tests/miniz_tester.cpp" | ||||
|     "${CMAKE_CURRENT_SOURCE_DIR}/tests/timer.cpp") | ||||
|  | ||||
| include_directories(${CMAKE_CURRENT_SOURCE_DIR}) | ||||
| add_executable(example1 ${EXAMPLE1_SRC_LIST}) | ||||
| target_link_libraries(example1 miniz) | ||||
| add_executable(example2 ${EXAMPLE2_SRC_LIST}) | ||||
| @@ -38,3 +43,10 @@ endif() | ||||
|  | ||||
| # add_executable(miniz_tester ${MINIZ_TESTER_SRC_LIST}) | ||||
| # target_link_libraries(miniz_tester miniz) | ||||
|  | ||||
| install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets | ||||
|     ARCHIVE  DESTINATION lib | ||||
|     LIBRARY DESTINATION lib | ||||
|     ) | ||||
| file(GLOB INSTALL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h) | ||||
| install(FILES ${INSTALL_HEADERS} DESTINATION include/${PROJECT_NAME}) | ||||
							
								
								
									
										50
									
								
								ChangeLog.md
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								ChangeLog.md
									
									
									
									
									
								
							| @@ -1,5 +1,50 @@ | ||||
| ## Changelog | ||||
|  | ||||
| ### 2.1.0 | ||||
|  | ||||
|  - More instances of memcpy instead of cast and use memcpy per default | ||||
|  - Remove inline for c90 support | ||||
|  - New function to read files via callback functions when adding them | ||||
|  - Fix out of bounds read while reading Zip64 extended information | ||||
|  - guard memcpy when n == 0 because buffer may be NULL | ||||
|  - Implement inflateReset() function | ||||
|  - Move comp/decomp alloc/free  prototypes under guarding #ifndef MZ_NO_MALLOC | ||||
|  - Fix large file support under Windows | ||||
|  - Don't warn if _LARGEFILE64_SOURCE is not defined to 1 | ||||
|  - Fixes for MSVC warnings | ||||
|  - Remove check that path of file added to archive contains ':' or '\' | ||||
|  - Add !defined check on MINIZ_USE_ALIGNED_LOADS_AND_STORES | ||||
|  | ||||
| ### 2.0.8 | ||||
|  | ||||
|  - Remove unimplemented functions (mz_zip_locate_file and mz_zip_locate_file_v2) | ||||
|  - Add license, changelog, readme and example files to release zip | ||||
|  - Fix heap overflow to user buffer in tinfl_status tinfl_decompress | ||||
|  - Fix corrupt archive if uncompressed file smaller than 4 byte and the file is added by mz_zip_writer_add_mem* | ||||
|  | ||||
| ### 2.0.7 | ||||
|  | ||||
|  - Removed need in C++ compiler in cmake build | ||||
|  - Fixed a lot of uninitialized value errors found with Valgrind by memsetting m_dict to 0 in tdefl_init | ||||
|  - Fix resource leak in mz_zip_reader_init_file_v2 | ||||
|  - Fix assert with mz_zip_writer_add_mem* w/MZ_DEFAULT_COMPRESSION | ||||
|  - cmake build: install library and headers | ||||
|  - Remove _LARGEFILE64_SOURCE requirement from apple defines for large files | ||||
|  | ||||
| ### 2.0.6 | ||||
|  | ||||
|  - Improve MZ_ZIP_FLAG_WRITE_ZIP64 documentation | ||||
|  - Remove check for cur_archive_file_ofs > UINT_MAX because cur_archive_file_ofs is not used after this point | ||||
|  - Add cmake debug configuration | ||||
|  - Fix PNG height when creating png files | ||||
|  - Add "iterative" file extraction method based on mz_zip_reader_extract_to_callback. | ||||
|  - Option to use memcpy for unaligned data access | ||||
|  - Define processor/arch macros as zero if not set to one | ||||
|  | ||||
| ### 2.0.4/2.0.5 | ||||
|  | ||||
|  - Fix compilation with the various omission compile definitions | ||||
|  | ||||
| ### 2.0.3 | ||||
|  | ||||
| - Fix GCC/clang compile warnings | ||||
| @@ -19,11 +64,12 @@ | ||||
|  | ||||
| ### 2.0.0 beta | ||||
|  | ||||
| - Matthew Sitton merged to vogl ZIP64 changes. Miniz is now licensed as MIT since the vogl code base is MIT licensed | ||||
| - Matthew Sitton merged miniz 1.x to Rich Geldreich's vogl ZIP64 changes. Miniz is now licensed as MIT since the vogl code base is MIT licensed | ||||
| - Miniz is now split into several files | ||||
| - Miniz does now not seek backwards when creating ZIP files. That is the ZIP files can be streamed | ||||
| - Miniz automatically switches to the ZIP64 format the created ZIP files goes over ZIP file limits | ||||
| - Miniz automatically switches to the ZIP64 format when the created ZIP files goes over ZIP file limits | ||||
| - Similar to [SQLite](https://www.sqlite.org/amalgamation.html) the Miniz source code is amalgamated into one miniz.c/miniz.h pair in a build step (amalgamate.sh). Please use miniz.c/miniz.h in your projects | ||||
| - Miniz 2 is only source back-compatible with miniz 1.x. It breaks binary compatibility because structures changed | ||||
|  | ||||
| ### v1.16 BETA Oct 19, 2013 | ||||
|  | ||||
|   | ||||
| @@ -41,9 +41,27 @@ done | ||||
| rm test.out | ||||
| rm main.c | ||||
|  | ||||
| cp ChangeLog.md amalgamation/ | ||||
| cp LICENSE amalgamation/ | ||||
| cp readme.md amalgamation/ | ||||
| mkdir -p amalgamation/examples | ||||
| cp examples/* amalgamation/examples/ | ||||
|  | ||||
| cd amalgamation | ||||
| ! test -e miniz.zip || rm miniz.zip | ||||
| echo -e "miniz.c\nminiz.h" | zip -@ miniz | ||||
| cat << EOF | zip -@ miniz | ||||
| miniz.c | ||||
| miniz.h | ||||
| ChangeLog.md | ||||
| LICENSE | ||||
| readme.md | ||||
| examples/example1.c | ||||
| examples/example2.c | ||||
| examples/example3.c | ||||
| examples/example4.c | ||||
| examples/example5.c | ||||
| examples/example6.c | ||||
| EOF | ||||
| cd .. | ||||
|  | ||||
| echo "Amalgamation created." | ||||
|   | ||||
							
								
								
									
										26
									
								
								miniz.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								miniz.c
									
									
									
									
									
								
							| @@ -397,6 +397,32 @@ int mz_inflateInit(mz_streamp pStream) | ||||
|     return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); | ||||
| } | ||||
|  | ||||
| int mz_inflateReset(mz_streamp pStream) | ||||
| { | ||||
|     inflate_state *pDecomp; | ||||
|     if (!pStream) | ||||
|         return MZ_STREAM_ERROR; | ||||
|  | ||||
|     pStream->data_type = 0; | ||||
|     pStream->adler = 0; | ||||
|     pStream->msg = NULL; | ||||
|     pStream->total_in = 0; | ||||
|     pStream->total_out = 0; | ||||
|     pStream->reserved = 0; | ||||
|  | ||||
|     pDecomp = (inflate_state *)pStream->state; | ||||
|  | ||||
|     tinfl_init(&pDecomp->m_decomp); | ||||
|     pDecomp->m_dict_ofs = 0; | ||||
|     pDecomp->m_dict_avail = 0; | ||||
|     pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; | ||||
|     pDecomp->m_first_call = 1; | ||||
|     pDecomp->m_has_flushed = 0; | ||||
|     /* pDecomp->m_window_bits = window_bits */; | ||||
|  | ||||
|     return MZ_OK; | ||||
| } | ||||
|  | ||||
| int mz_inflate(mz_streamp pStream, int flush) | ||||
| { | ||||
|     inflate_state *pState; | ||||
|   | ||||
							
								
								
									
										20
									
								
								miniz.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								miniz.h
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| /* miniz.c 2.0.6 beta - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing | ||||
| /* miniz.c 2.1.0 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing | ||||
|    See "unlicense" statement at the end of this file. | ||||
|    Rich Geldreich <richgel99@gmail.com>, last updated Oct. 13, 2013 | ||||
|    Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt | ||||
| @@ -24,7 +24,7 @@ | ||||
|      zlib replacement in many apps: | ||||
|         The z_stream struct, optional memory allocation callbacks | ||||
|         deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound | ||||
|         inflateInit/inflateInit2/inflate/inflateEnd | ||||
|         inflateInit/inflateInit2/inflate/inflateReset/inflateEnd | ||||
|         compress, compress2, compressBound, uncompress | ||||
|         CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines. | ||||
|         Supports raw deflate streams or standard zlib streams with adler-32 checking. | ||||
| @@ -170,12 +170,16 @@ | ||||
| #define MINIZ_LITTLE_ENDIAN 0 | ||||
| #endif | ||||
|  | ||||
| /* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES only if not set */ | ||||
| #if !defined(MINIZ_USE_UNALIGNED_LOADS_AND_STORES) | ||||
| #if MINIZ_X86_OR_X64_CPU | ||||
| /* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. */ | ||||
| #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 | ||||
| #define MINIZ_UNALIGNED_USE_MEMCPY | ||||
| #else | ||||
| #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) | ||||
| /* Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions). */ | ||||
| @@ -234,11 +238,11 @@ enum | ||||
|     MZ_DEFAULT_COMPRESSION = -1 | ||||
| }; | ||||
|  | ||||
| #define MZ_VERSION "10.0.1" | ||||
| #define MZ_VERNUM 0xA010 | ||||
| #define MZ_VERSION "10.1.0" | ||||
| #define MZ_VERNUM 0xA100 | ||||
| #define MZ_VER_MAJOR 10 | ||||
| #define MZ_VER_MINOR 0 | ||||
| #define MZ_VER_REVISION 1 | ||||
| #define MZ_VER_MINOR 1 | ||||
| #define MZ_VER_REVISION 0 | ||||
| #define MZ_VER_SUBREVISION 0 | ||||
|  | ||||
| #ifndef MINIZ_NO_ZLIB_APIS | ||||
| @@ -361,6 +365,9 @@ int mz_inflateInit(mz_streamp pStream); | ||||
| /* window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate). */ | ||||
| int mz_inflateInit2(mz_streamp pStream, int window_bits); | ||||
|  | ||||
| /* Quickly resets a compressor without having to reallocate anything. Same as calling mz_inflateEnd() followed by mz_inflateInit()/mz_inflateInit2(). */ | ||||
| int mz_inflateReset(mz_streamp pStream); | ||||
|  | ||||
| /* Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible. */ | ||||
| /* Parameters: */ | ||||
| /*   pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. */ | ||||
| @@ -444,6 +451,7 @@ typedef void *const voidpc; | ||||
| #define compressBound mz_compressBound | ||||
| #define inflateInit mz_inflateInit | ||||
| #define inflateInit2 mz_inflateInit2 | ||||
| #define inflateReset mz_inflateReset | ||||
| #define inflate mz_inflate | ||||
| #define inflateEnd mz_inflateEnd | ||||
| #define uncompress mz_uncompress | ||||
|   | ||||
							
								
								
									
										26
									
								
								miniz_tdef.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								miniz_tdef.c
									
									
									
									
									
								
							| @@ -738,13 +738,13 @@ static int tdefl_flush_block(tdefl_compressor *d, int flush) | ||||
|  | ||||
| #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES | ||||
| #ifdef MINIZ_UNALIGNED_USE_MEMCPY | ||||
| static inline mz_uint16 TDEFL_READ_UNALIGNED_WORD(const mz_uint8* p) | ||||
| static mz_uint16 TDEFL_READ_UNALIGNED_WORD(const mz_uint8* p) | ||||
| { | ||||
| 	mz_uint16 ret; | ||||
| 	memcpy(&ret, p, sizeof(mz_uint16)); | ||||
| 	return ret; | ||||
| } | ||||
| static inline mz_uint16 TDEFL_READ_UNALIGNED_WORD2(const mz_uint16* p) | ||||
| static mz_uint16 TDEFL_READ_UNALIGNED_WORD2(const mz_uint16* p) | ||||
| { | ||||
| 	mz_uint16 ret; | ||||
| 	memcpy(&ret, p, sizeof(mz_uint16)); | ||||
| @@ -853,6 +853,16 @@ static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahe | ||||
| #endif /* #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES */ | ||||
|  | ||||
| #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN | ||||
| #ifdef MINIZ_UNALIGNED_USE_MEMCPY | ||||
| static mz_uint32 TDEFL_READ_UNALIGNED_WORD32(const mz_uint8* p) | ||||
| { | ||||
| 	mz_uint32 ret; | ||||
| 	memcpy(&ret, p, sizeof(mz_uint32)); | ||||
| 	return ret; | ||||
| } | ||||
| #else | ||||
| #define TDEFL_READ_UNALIGNED_WORD32(p) *(const mz_uint32 *)(p) | ||||
| #endif | ||||
| static mz_bool tdefl_compress_fast(tdefl_compressor *d) | ||||
| { | ||||
|     /* Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio. */ | ||||
| @@ -887,12 +897,12 @@ static mz_bool tdefl_compress_fast(tdefl_compressor *d) | ||||
|         { | ||||
|             mz_uint cur_match_dist, cur_match_len = 1; | ||||
|             mz_uint8 *pCur_dict = d->m_dict + cur_pos; | ||||
|             mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; | ||||
|             mz_uint first_trigram = TDEFL_READ_UNALIGNED_WORD32(pCur_dict) & 0xFFFFFF; | ||||
|             mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK; | ||||
|             mz_uint probe_pos = d->m_hash[hash]; | ||||
|             d->m_hash[hash] = (mz_uint16)lookahead_pos; | ||||
|  | ||||
|             if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) | ||||
|             if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((TDEFL_READ_UNALIGNED_WORD32(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) | ||||
|             { | ||||
|                 const mz_uint16 *p = (const mz_uint16 *)pCur_dict; | ||||
|                 const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); | ||||
| @@ -922,7 +932,11 @@ static mz_bool tdefl_compress_fast(tdefl_compressor *d) | ||||
|                     cur_match_dist--; | ||||
|  | ||||
|                     pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); | ||||
| #ifdef MINIZ_UNALIGNED_USE_MEMCPY | ||||
| 					memcpy(&pLZ_code_buf[1], &cur_match_dist, sizeof(cur_match_dist)); | ||||
| #else | ||||
|                     *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; | ||||
| #endif | ||||
|                     pLZ_code_buf += 3; | ||||
|                     *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); | ||||
|  | ||||
| @@ -1334,6 +1348,8 @@ tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_fun | ||||
|     d->m_pSrc = NULL; | ||||
|     d->m_src_buf_left = 0; | ||||
|     d->m_out_buf_ofs = 0; | ||||
|     if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) | ||||
|         MZ_CLEAR_OBJ(d->m_dict); | ||||
|     memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); | ||||
|     memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); | ||||
|     return TDEFL_STATUS_OKAY; | ||||
| @@ -1539,6 +1555,7 @@ void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, | ||||
|     return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE); | ||||
| } | ||||
|  | ||||
| #ifndef MINIZ_NO_MALLOC | ||||
| /* Allocate the tdefl_compressor and tinfl_decompressor structures in C so that */ | ||||
| /* non-C language bindings to tdefL_ and tinfl_ API don't need to worry about */ | ||||
| /* structure size and allocation mechanism. */ | ||||
| @@ -1551,6 +1568,7 @@ void tdefl_compressor_free(tdefl_compressor *pComp) | ||||
| { | ||||
|     MZ_FREE(pComp); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef _MSC_VER | ||||
| #pragma warning(pop) | ||||
|   | ||||
| @@ -177,11 +177,13 @@ mz_uint32 tdefl_get_adler32(tdefl_compressor *d); | ||||
| /* strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED */ | ||||
| mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); | ||||
|  | ||||
| #ifndef MINIZ_NO_MALLOC | ||||
| /* Allocate the tdefl_compressor structure in C so that */ | ||||
| /* non-C language bindings to tdefl_ API don't need to worry about */ | ||||
| /* structure size and allocation mechanism. */ | ||||
| tdefl_compressor *tdefl_compressor_alloc(); | ||||
| tdefl_compressor *tdefl_compressor_alloc(void); | ||||
| void tdefl_compressor_free(tdefl_compressor *pComp); | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
|   | ||||
| @@ -523,8 +523,12 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex | ||||
|                     const mz_uint8 *pSrc_end = pSrc + (counter & ~7); | ||||
|                     do | ||||
|                     { | ||||
| #ifdef MINIZ_UNALIGNED_USE_MEMCPY | ||||
| 						memcpy(pOut_buf_cur, pSrc, sizeof(mz_uint32)*2); | ||||
| #else | ||||
|                         ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; | ||||
|                         ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; | ||||
| #endif | ||||
|                         pOut_buf_cur += 8; | ||||
|                     } while ((pSrc += 8) < pSrc_end); | ||||
|                     if ((counter &= 7) < 3) | ||||
| @@ -540,18 +544,19 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex | ||||
|                     } | ||||
|                 } | ||||
| #endif | ||||
|                 do | ||||
|                 while(counter>2) | ||||
|                 { | ||||
|                     pOut_buf_cur[0] = pSrc[0]; | ||||
|                     pOut_buf_cur[1] = pSrc[1]; | ||||
|                     pOut_buf_cur[2] = pSrc[2]; | ||||
|                     pOut_buf_cur += 3; | ||||
|                     pSrc += 3; | ||||
|                 } while ((int)(counter -= 3) > 2); | ||||
|                 if ((int)counter > 0) | ||||
| 					counter -= 3; | ||||
|                 } | ||||
|                 if (counter > 0) | ||||
|                 { | ||||
|                     pOut_buf_cur[0] = pSrc[0]; | ||||
|                     if ((int)counter > 1) | ||||
|                     if (counter > 1) | ||||
|                         pOut_buf_cur[1] = pSrc[1]; | ||||
|                     pOut_buf_cur += counter; | ||||
|                 } | ||||
| @@ -715,6 +720,7 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| #ifndef MINIZ_NO_MALLOC | ||||
| tinfl_decompressor *tinfl_decompressor_alloc() | ||||
| { | ||||
|     tinfl_decompressor *pDecomp = (tinfl_decompressor *)MZ_MALLOC(sizeof(tinfl_decompressor)); | ||||
| @@ -727,6 +733,7 @@ void tinfl_decompressor_free(tinfl_decompressor *pDecomp) | ||||
| { | ||||
|     MZ_FREE(pDecomp); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
|   | ||||
| @@ -41,12 +41,13 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, | ||||
| struct tinfl_decompressor_tag; | ||||
| typedef struct tinfl_decompressor_tag tinfl_decompressor; | ||||
|  | ||||
| #ifndef MINIZ_NO_MALLOC | ||||
| /* Allocate the tinfl_decompressor structure in C so that */ | ||||
| /* non-C language bindings to tinfl_ API don't need to worry about */ | ||||
| /* structure size and allocation mechanism. */ | ||||
|  | ||||
| tinfl_decompressor *tinfl_decompressor_alloc(); | ||||
| tinfl_decompressor *tinfl_decompressor_alloc(void); | ||||
| void tinfl_decompressor_free(tinfl_decompressor *pDecomp); | ||||
| #endif | ||||
|  | ||||
| /* Max size of LZ dictionary. */ | ||||
| #define TINFL_LZ_DICT_SIZE 32768 | ||||
|   | ||||
							
								
								
									
										147
									
								
								miniz_zip.c
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								miniz_zip.c
									
									
									
									
									
								
							| @@ -62,8 +62,8 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) | ||||
| #define MZ_FWRITE fwrite | ||||
| #define MZ_FTELL64 _ftelli64 | ||||
| #define MZ_FSEEK64 _fseeki64 | ||||
| #define MZ_FILE_STAT_STRUCT _stat | ||||
| #define MZ_FILE_STAT _stat | ||||
| #define MZ_FILE_STAT_STRUCT _stat64 | ||||
| #define MZ_FILE_STAT _stat64 | ||||
| #define MZ_FFLUSH fflush | ||||
| #define MZ_FREOPEN mz_freopen | ||||
| #define MZ_DELETE_FILE remove | ||||
| @@ -97,7 +97,7 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) | ||||
| #define MZ_FFLUSH fflush | ||||
| #define MZ_FREOPEN(f, m, s) freopen(f, m, s) | ||||
| #define MZ_DELETE_FILE remove | ||||
| #elif defined(__GNUC__) && _LARGEFILE64_SOURCE | ||||
| #elif defined(__GNUC__) && defined(_LARGEFILE64_SOURCE) | ||||
| #ifndef MINIZ_NO_TIME | ||||
| #include <utime.h> | ||||
| #endif | ||||
| @@ -112,7 +112,7 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) | ||||
| #define MZ_FFLUSH fflush | ||||
| #define MZ_FREOPEN(p, m, s) freopen64(p, m, s) | ||||
| #define MZ_DELETE_FILE remove | ||||
| #elif defined(__APPLE__) && _LARGEFILE64_SOURCE | ||||
| #elif defined(__APPLE__) | ||||
| #ifndef MINIZ_NO_TIME | ||||
| #include <utime.h> | ||||
| #endif | ||||
| @@ -351,7 +351,8 @@ static MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zi | ||||
|     size_t orig_size = pArray->m_size; | ||||
|     if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) | ||||
|         return MZ_FALSE; | ||||
|     memcpy((mz_uint8 *)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size); | ||||
|     if (n > 0) | ||||
|         memcpy((mz_uint8 *)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size); | ||||
|     return MZ_TRUE; | ||||
| } | ||||
|  | ||||
| @@ -748,21 +749,47 @@ static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint flag | ||||
|  | ||||
|                 if (extra_size_remaining) | ||||
|                 { | ||||
|                     const mz_uint8 *pExtra_data = p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size; | ||||
| 					const mz_uint8 *pExtra_data; | ||||
| 					void* buf = NULL; | ||||
|  | ||||
| 					if (MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + ext_data_size > n) | ||||
| 					{ | ||||
| 						buf = MZ_MALLOC(ext_data_size); | ||||
| 						if(buf==NULL) | ||||
| 							return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); | ||||
|  | ||||
| 						if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size, buf, ext_data_size) != ext_data_size) | ||||
| 						{ | ||||
| 							MZ_FREE(buf); | ||||
| 							return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); | ||||
| 						} | ||||
|  | ||||
| 						pExtra_data = (mz_uint8*)buf; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						pExtra_data = p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size; | ||||
| 					} | ||||
|  | ||||
|                     do | ||||
|                     { | ||||
|                         mz_uint32 field_id; | ||||
|                         mz_uint32 field_data_size; | ||||
|  | ||||
|                         if (extra_size_remaining < (sizeof(mz_uint16) * 2)) | ||||
|                             return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); | ||||
| 						if (extra_size_remaining < (sizeof(mz_uint16) * 2)) | ||||
| 						{ | ||||
| 							MZ_FREE(buf); | ||||
| 							return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); | ||||
| 						} | ||||
|  | ||||
|                         field_id = MZ_READ_LE16(pExtra_data); | ||||
|                         field_data_size = MZ_READ_LE16(pExtra_data + sizeof(mz_uint16)); | ||||
|  | ||||
|                         if ((field_data_size + sizeof(mz_uint16) * 2) > extra_size_remaining) | ||||
|                             return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); | ||||
| 						if ((field_data_size + sizeof(mz_uint16) * 2) > extra_size_remaining) | ||||
| 						{ | ||||
| 							MZ_FREE(buf); | ||||
| 							return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); | ||||
| 						} | ||||
|  | ||||
|                         if (field_id == MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID) | ||||
|                         { | ||||
| @@ -775,6 +802,8 @@ static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint flag | ||||
|                         pExtra_data += sizeof(mz_uint16) * 2 + field_data_size; | ||||
|                         extra_size_remaining = extra_size_remaining - sizeof(mz_uint16) * 2 - field_data_size; | ||||
|                     } while (extra_size_remaining); | ||||
|  | ||||
| 					MZ_FREE(buf); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @@ -978,7 +1007,10 @@ mz_bool mz_zip_reader_init_file_v2(mz_zip_archive *pZip, const char *pFilename, | ||||
|     /* TODO: Better sanity check archive_size and the # of actual remaining bytes */ | ||||
|  | ||||
|     if (file_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) | ||||
|     { | ||||
| 	MZ_FCLOSE(pFile); | ||||
|         return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); | ||||
|     } | ||||
|  | ||||
|     if (!mz_zip_reader_init_internal(pZip, flags)) | ||||
|     { | ||||
| @@ -1968,7 +2000,7 @@ size_t mz_zip_reader_extract_iter_read(mz_zip_reader_extract_iter_state* pState, | ||||
|     if ((pState->flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!pState->file_stat.m_method)) | ||||
|     { | ||||
|         /* The file is stored or the caller has requested the compressed data, calc amount to return. */ | ||||
|         copied_to_caller = MZ_MIN( buf_size, pState->comp_remaining ); | ||||
|         copied_to_caller = (size_t)MZ_MIN( buf_size, pState->comp_remaining ); | ||||
|  | ||||
|         /* Zip is in memory....or requires reading from a file? */ | ||||
|         if (pState->pZip->m_pState->m_pMem) | ||||
| @@ -3045,7 +3077,7 @@ static mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char | ||||
|     if (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + user_extra_data_len + comment_size) >= MZ_UINT32_MAX) | ||||
|         return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); | ||||
|  | ||||
|     if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size + user_extra_data_len, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes)) | ||||
|     if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, (mz_uint16)(extra_size + user_extra_data_len), comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes)) | ||||
|         return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); | ||||
|  | ||||
|     if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) || | ||||
| @@ -3069,13 +3101,7 @@ static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) | ||||
|     if (*pArchive_name == '/') | ||||
|         return MZ_FALSE; | ||||
|  | ||||
|     while (*pArchive_name) | ||||
|     { | ||||
|         if ((*pArchive_name == '\\') || (*pArchive_name == ':')) | ||||
|             return MZ_FALSE; | ||||
|  | ||||
|         pArchive_name++; | ||||
|     } | ||||
|     /* Making sure the name does not contain drive letters or DOS style backward slashes is the responsibility of the program using miniz*/ | ||||
|  | ||||
|     return MZ_TRUE; | ||||
| } | ||||
| @@ -3128,14 +3154,15 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|     mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; | ||||
|     mz_uint16 bit_flags = 0; | ||||
|  | ||||
|     if ((int)level_and_flags < 0) | ||||
|         level_and_flags = MZ_DEFAULT_LEVEL; | ||||
|  | ||||
|     if (uncomp_size || (buf_size && !(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) | ||||
|         bit_flags |= MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; | ||||
|  | ||||
|     if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) | ||||
|         bit_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; | ||||
|  | ||||
|     if ((int)level_and_flags < 0) | ||||
|         level_and_flags = MZ_DEFAULT_LEVEL; | ||||
|     level = level_and_flags & 0xF; | ||||
|     store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)); | ||||
|  | ||||
| @@ -3182,6 +3209,17 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|     } | ||||
| #endif /* #ifndef MINIZ_NO_TIME */ | ||||
|  | ||||
| 	if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) | ||||
| 	{ | ||||
| 		uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, buf_size); | ||||
| 		uncomp_size = buf_size; | ||||
| 		if (uncomp_size <= 3) | ||||
| 		{ | ||||
| 			level = 0; | ||||
| 			store_data_uncompressed = MZ_TRUE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|     archive_name_size = strlen(pArchive_name); | ||||
|     if (archive_name_size > MZ_UINT16_MAX) | ||||
|         return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); | ||||
| @@ -3254,7 +3292,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|                                                                (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); | ||||
|         } | ||||
|  | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, extra_size + user_extra_data_len, 0, 0, 0, method, bit_flags, dos_time, dos_date)) | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)(extra_size + user_extra_data_len), 0, 0, 0, method, bit_flags, dos_time, dos_date)) | ||||
|             return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); | ||||
|  | ||||
|         if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) | ||||
| @@ -3281,7 +3319,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|     { | ||||
|         if ((comp_size > MZ_UINT32_MAX) || (cur_archive_file_ofs > MZ_UINT32_MAX)) | ||||
|             return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, user_extra_data_len, 0, 0, 0, method, bit_flags, dos_time, dos_date)) | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)user_extra_data_len, 0, 0, 0, method, bit_flags, dos_time, dos_date)) | ||||
|             return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); | ||||
|  | ||||
|         if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) | ||||
| @@ -3297,24 +3335,13 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|         cur_archive_file_ofs += archive_name_size; | ||||
|     } | ||||
|  | ||||
|     if (user_extra_data_len > 0) | ||||
|     { | ||||
|         if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, user_extra_data, user_extra_data_len) != user_extra_data_len) | ||||
|             return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); | ||||
| 	if (user_extra_data_len > 0) | ||||
| 	{ | ||||
| 		if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, user_extra_data, user_extra_data_len) != user_extra_data_len) | ||||
| 			return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); | ||||
|  | ||||
|         cur_archive_file_ofs += user_extra_data_len; | ||||
|     } | ||||
|  | ||||
|     if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) | ||||
|     { | ||||
|         uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, buf_size); | ||||
|         uncomp_size = buf_size; | ||||
|         if (uncomp_size <= 3) | ||||
|         { | ||||
|             level = 0; | ||||
|             store_data_uncompressed = MZ_TRUE; | ||||
|         } | ||||
|     } | ||||
| 		cur_archive_file_ofs += user_extra_data_len; | ||||
| 	} | ||||
|  | ||||
|     if (store_data_uncompressed) | ||||
|     { | ||||
| @@ -3385,7 +3412,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|                                                            (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); | ||||
|     } | ||||
|  | ||||
|     if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, pExtra_data, extra_size, pComment, | ||||
|     if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, pExtra_data, (mz_uint16)extra_size, pComment, | ||||
|                                           comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_dir_header_ofs, ext_attributes, | ||||
|                                           user_extra_data_central, user_extra_data_central_len)) | ||||
|         return MZ_FALSE; | ||||
| @@ -3396,8 +3423,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|     return MZ_TRUE; | ||||
| } | ||||
|  | ||||
| #ifndef MINIZ_NO_STDIO | ||||
| mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, MZ_FILE *pSrc_file, mz_uint64 size_to_add, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, | ||||
| mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 size_to_add, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, | ||||
|                                 const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) | ||||
| { | ||||
|     mz_uint16 gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; | ||||
| @@ -3410,6 +3436,7 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|     mz_uint32 extra_size = 0; | ||||
|     mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; | ||||
|     mz_zip_internal_state *pState; | ||||
| 	mz_uint64 file_ofs = 0; | ||||
|  | ||||
|     if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) | ||||
|         gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; | ||||
| @@ -3465,7 +3492,7 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|     if (!pState->m_zip64) | ||||
|     { | ||||
|         /* Bail early if the archive would obviously become too large */ | ||||
|         if ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + archive_name_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE  | ||||
|         if ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + archive_name_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE | ||||
| 			+ archive_name_size + comment_size + user_extra_data_len + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE + 1024 | ||||
| 			+ MZ_ZIP_DATA_DESCRIPTER_SIZE32 + user_extra_data_central_len) > 0xFFFFFFFF) | ||||
|         { | ||||
| @@ -3512,7 +3539,7 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|                                                                (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); | ||||
|         } | ||||
|  | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, extra_size + user_extra_data_len, 0, 0, 0, method, gen_flags, dos_time, dos_date)) | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)(extra_size + user_extra_data_len), 0, 0, 0, method, gen_flags, dos_time, dos_date)) | ||||
|             return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); | ||||
|  | ||||
|         if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) | ||||
| @@ -3536,7 +3563,7 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|     { | ||||
|         if ((comp_size > MZ_UINT32_MAX) || (cur_archive_file_ofs > MZ_UINT32_MAX)) | ||||
|             return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, user_extra_data_len, 0, 0, 0, method, gen_flags, dos_time, dos_date)) | ||||
|         if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)user_extra_data_len, 0, 0, 0, method, gen_flags, dos_time, dos_date)) | ||||
|             return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); | ||||
|  | ||||
|         if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) | ||||
| @@ -3574,11 +3601,12 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|             while (uncomp_remaining) | ||||
|             { | ||||
|                 mz_uint n = (mz_uint)MZ_MIN((mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); | ||||
|                 if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) | ||||
|                 if ((read_callback(callback_opaque, file_ofs, pRead_buf, n) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) | ||||
|                 { | ||||
|                     pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); | ||||
|                     return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); | ||||
|                 } | ||||
| 				file_ofs += n; | ||||
|                 uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); | ||||
|                 uncomp_remaining -= n; | ||||
|                 cur_archive_file_ofs += n; | ||||
| @@ -3613,12 +3641,13 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|                 tdefl_status status; | ||||
|                 tdefl_flush flush = TDEFL_NO_FLUSH; | ||||
|  | ||||
|                 if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size) | ||||
|                 if (read_callback(callback_opaque, file_ofs, pRead_buf, in_buf_size)!= in_buf_size) | ||||
|                 { | ||||
|                     mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
| 				file_ofs += in_buf_size; | ||||
|                 uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); | ||||
|                 uncomp_remaining -= in_buf_size; | ||||
|  | ||||
| @@ -3686,7 +3715,7 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|                                                            (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); | ||||
|     } | ||||
|  | ||||
|     if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, pExtra_data, extra_size, pComment, comment_size, | ||||
|     if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, pExtra_data, (mz_uint16)extra_size, pComment, comment_size, | ||||
|                                           uncomp_size, comp_size, uncomp_crc32, method, gen_flags, dos_time, dos_date, local_dir_header_ofs, ext_attributes, | ||||
|                                           user_extra_data_central, user_extra_data_central_len)) | ||||
|         return MZ_FALSE; | ||||
| @@ -3697,6 +3726,26 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, | ||||
|     return MZ_TRUE; | ||||
| } | ||||
|  | ||||
| #ifndef MINIZ_NO_STDIO | ||||
|  | ||||
| static size_t mz_file_read_func_stdio(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) | ||||
| { | ||||
| 	MZ_FILE *pSrc_file = (MZ_FILE *)pOpaque; | ||||
| 	mz_int64 cur_ofs = MZ_FTELL64(pSrc_file); | ||||
|  | ||||
| 	if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pSrc_file, (mz_int64)file_ofs, SEEK_SET)))) | ||||
| 		return 0; | ||||
|  | ||||
| 	return MZ_FREAD(pBuf, 1, n, pSrc_file); | ||||
| } | ||||
|  | ||||
| mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, MZ_FILE *pSrc_file, mz_uint64 size_to_add, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, | ||||
| 	const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) | ||||
| { | ||||
| 	return mz_zip_writer_add_read_buf_callback(pZip, pArchive_name, mz_file_read_func_stdio, pSrc_file, size_to_add, pFile_time, pComment, comment_size, level_and_flags, | ||||
| 		user_extra_data, user_extra_data_len, user_extra_data_central, user_extra_data_central_len); | ||||
| } | ||||
|  | ||||
| mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) | ||||
| { | ||||
|     MZ_FILE *pSrc_file = NULL; | ||||
|   | ||||
							
								
								
									
										13
									
								
								miniz_zip.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								miniz_zip.h
									
									
									
									
									
								
							| @@ -237,13 +237,6 @@ MZ_FILE *mz_zip_get_cfile(mz_zip_archive *pZip); | ||||
| /* Reads n bytes of raw archive data, starting at file offset file_ofs, to pBuf. */ | ||||
| size_t mz_zip_read_archive_data(mz_zip_archive *pZip, mz_uint64 file_ofs, void *pBuf, size_t n); | ||||
|  | ||||
| /* Attempts to locates a file in the archive's central directory. */ | ||||
| /* Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH */ | ||||
| /* Returns -1 if the file cannot be found. */ | ||||
| int mz_zip_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); | ||||
| /* Returns MZ_FALSE if the file cannot be found. */ | ||||
| mz_bool mz_zip_locate_file_v2(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags, mz_uint32 *pIndex); | ||||
|  | ||||
| /* All mz_zip funcs set the m_last_error field in the mz_zip_archive struct. These functions retrieve/manipulate this field. */ | ||||
| /* Note that the m_last_error functionality is not thread safe. */ | ||||
| mz_zip_error mz_zip_set_last_error(mz_zip_archive *pZip, mz_zip_error err_num); | ||||
| @@ -385,6 +378,12 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n | ||||
|                                     mz_uint64 uncomp_size, mz_uint32 uncomp_crc32, MZ_TIME_T *last_modified, const char *user_extra_data_local, mz_uint user_extra_data_local_len, | ||||
|                                     const char *user_extra_data_central, mz_uint user_extra_data_central_len); | ||||
|  | ||||
| /* Adds the contents of a file to an archive. This function also records the disk file's modified time into the archive. */ | ||||
| /* File data is supplied via a read callback function. User mz_zip_writer_add_(c)file to add a file directly.*/ | ||||
| mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 size_to_add, | ||||
| 	const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data_local, mz_uint user_extra_data_local_len, | ||||
| 	const char *user_extra_data_central, mz_uint user_extra_data_central_len); | ||||
|  | ||||
| #ifndef MINIZ_NO_STDIO | ||||
| /* Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. */ | ||||
| /* level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user