mirror of
				https://github.com/eledio-devices/thirdparty-miniz.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			201 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #pragma once
 | |
| #include "miniz.h"
 | |
| 
 | |
| // ------------------- ZIP archive reading/writing
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| enum
 | |
| {
 | |
|     MZ_ZIP_MAX_IO_BUF_SIZE = 64 * 1024,
 | |
|     MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260,
 | |
|     MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256
 | |
| };
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|     mz_uint32 m_file_index;
 | |
|     mz_uint32 m_central_dir_ofs;
 | |
|     mz_uint16 m_version_made_by;
 | |
|     mz_uint16 m_version_needed;
 | |
|     mz_uint16 m_bit_flag;
 | |
|     mz_uint16 m_method;
 | |
| #ifndef MINIZ_NO_TIME
 | |
|     time_t m_time;
 | |
| #endif
 | |
|     mz_uint32 m_crc32;
 | |
|     mz_uint64 m_comp_size;
 | |
|     mz_uint64 m_uncomp_size;
 | |
|     mz_uint16 m_internal_attr;
 | |
|     mz_uint32 m_external_attr;
 | |
|     mz_uint64 m_local_header_ofs;
 | |
|     mz_uint32 m_comment_size;
 | |
|     char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE];
 | |
|     char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE];
 | |
| } mz_zip_archive_file_stat;
 | |
| 
 | |
| typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n);
 | |
| typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n);
 | |
| 
 | |
| struct mz_zip_internal_state_tag;
 | |
| typedef struct mz_zip_internal_state_tag mz_zip_internal_state;
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|     MZ_ZIP_MODE_INVALID = 0,
 | |
|     MZ_ZIP_MODE_READING = 1,
 | |
|     MZ_ZIP_MODE_WRITING = 2,
 | |
|     MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3
 | |
| } mz_zip_mode;
 | |
| 
 | |
| typedef struct mz_zip_archive_tag
 | |
| {
 | |
|     mz_uint64 m_archive_size;
 | |
|     mz_uint64 m_central_directory_file_ofs;
 | |
|     mz_uint m_total_files;
 | |
|     mz_zip_mode m_zip_mode;
 | |
| 
 | |
|     mz_uint m_file_offset_alignment;
 | |
| 
 | |
|     mz_alloc_func m_pAlloc;
 | |
|     mz_free_func m_pFree;
 | |
|     mz_realloc_func m_pRealloc;
 | |
|     void *m_pAlloc_opaque;
 | |
| 
 | |
|     mz_file_read_func m_pRead;
 | |
|     mz_file_write_func m_pWrite;
 | |
|     void *m_pIO_opaque;
 | |
| 
 | |
|     mz_zip_internal_state *m_pState;
 | |
| 
 | |
| } mz_zip_archive;
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|     MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100,
 | |
|     MZ_ZIP_FLAG_IGNORE_PATH = 0x0200,
 | |
|     MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400,
 | |
|     MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800
 | |
| } mz_zip_flags;
 | |
| 
 | |
| // ZIP archive reading
 | |
| 
 | |
| // Inits a ZIP archive reader.
 | |
| // These functions read and validate the archive's central directory.
 | |
| mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags);
 | |
| mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags);
 | |
| 
 | |
| #ifndef MINIZ_NO_STDIO
 | |
| mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags);
 | |
| #endif
 | |
| 
 | |
| // Returns the total number of files in the archive.
 | |
| mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip);
 | |
| 
 | |
| // Returns detailed information about an archive file entry.
 | |
| mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat);
 | |
| 
 | |
| // Determines if an archive file entry is a directory entry.
 | |
| mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index);
 | |
| mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index);
 | |
| 
 | |
| // Retrieves the filename of an archive file entry.
 | |
| // Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename.
 | |
| mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size);
 | |
| 
 | |
| // 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_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags);
 | |
| 
 | |
| // Extracts a archive file to a memory buffer using no memory allocation.
 | |
| mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);
 | |
| mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size);
 | |
| 
 | |
| // Extracts a archive file to a memory buffer.
 | |
| mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags);
 | |
| mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags);
 | |
| 
 | |
| // Extracts a archive file to a dynamically allocated heap buffer.
 | |
| void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags);
 | |
| void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags);
 | |
| 
 | |
| // Extracts a archive file using a callback function to output the file's data.
 | |
| mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);
 | |
| mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags);
 | |
| 
 | |
| #ifndef MINIZ_NO_STDIO
 | |
| // Extracts a archive file to a disk file and sets its last accessed and modified times.
 | |
| // This function only extracts files, not archive directory records.
 | |
| mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags);
 | |
| mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags);
 | |
| #endif
 | |
| 
 | |
| // Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used.
 | |
| mz_bool mz_zip_reader_end(mz_zip_archive *pZip);
 | |
| 
 | |
| // ZIP archive writing
 | |
| 
 | |
| #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
 | |
| 
 | |
| // Inits a ZIP archive writer.
 | |
| mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size);
 | |
| mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size);
 | |
| 
 | |
| #ifndef MINIZ_NO_STDIO
 | |
| mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning);
 | |
| #endif
 | |
| 
 | |
| // Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive.
 | |
| // For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called.
 | |
| // For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it).
 | |
| // Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL.
 | |
| // Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before
 | |
| // the archive is finalized the file's central directory will be hosed.
 | |
| mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename);
 | |
| 
 | |
| // Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive.
 | |
| // To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer.
 | |
| // 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.
 | |
| mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags);
 | |
| mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32);
 | |
| 
 | |
| #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.
 | |
| 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);
 | |
| #endif
 | |
| 
 | |
| // Adds a file to an archive by fully cloning the data from another archive.
 | |
| // This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields.
 | |
| mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index);
 | |
| 
 | |
| // Finalizes the archive by writing the central directory records followed by the end of central directory record.
 | |
| // After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end().
 | |
| // An archive must be manually finalized by calling this function for it to be valid.
 | |
| mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip);
 | |
| mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize);
 | |
| 
 | |
| // Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used.
 | |
| // Note for the archive to be valid, it must have been finalized before ending.
 | |
| mz_bool mz_zip_writer_end(mz_zip_archive *pZip);
 | |
| 
 | |
| // Misc. high-level helper functions:
 | |
| 
 | |
| // mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP 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.
 | |
| mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags);
 | |
| 
 | |
| // Reads a single file from an archive into a heap block.
 | |
| // Returns NULL on failure.
 | |
| void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags);
 | |
| 
 | |
| #endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 |