mirror of
https://github.com/SimoneN64/Kaizen.git
synced 2025-04-02 10:41:53 -04:00
173 lines
4.2 KiB
C
173 lines
4.2 KiB
C
/* Copyright 2015 the unarr project authors (see AUTHORS file).
|
|
License: LGPLv3 */
|
|
|
|
#ifndef zip_zip_h
|
|
#define zip_zip_h
|
|
|
|
#include "../common/unarr-imp.h"
|
|
|
|
#ifdef HAVE_ZLIB
|
|
#include <zlib.h>
|
|
#endif
|
|
#include "inflate.h"
|
|
#ifdef HAVE_BZIP2
|
|
#include <bzlib.h>
|
|
#endif
|
|
#ifdef HAVE_LIBLZMA
|
|
#include <lzma.h>
|
|
#else
|
|
#include "../lzmasdk/LzmaDec.h"
|
|
#endif
|
|
#include "../lzmasdk/Ppmd8.h"
|
|
|
|
typedef struct ar_archive_zip_s ar_archive_zip;
|
|
|
|
/***** parse-zip *****/
|
|
|
|
enum zip_signatures {
|
|
SIG_LOCAL_FILE_HEADER = 0x04034B50,
|
|
SIG_CENTRAL_DIRECTORY = 0x02014B50,
|
|
SIG_END_OF_CENTRAL_DIRECTORY_64 = 0x06064B50,
|
|
SIG_END_OF_CENTRAL_DIRECTORY_64_LOCATOR = 0x07064B50,
|
|
SIG_END_OF_CENTRAL_DIRECTORY = 0x06054B50,
|
|
};
|
|
|
|
enum compression_method {
|
|
METHOD_STORE = 0, METHOD_DEFLATE = 8,
|
|
METHOD_DEFLATE64 = 9, METHOD_BZIP2 = 12, METHOD_LZMA = 14,
|
|
METHOD_XZ = 95, METHOD_PPMD = 98,
|
|
};
|
|
|
|
#define ZIP_LOCAL_ENTRY_FIXED_SIZE 30
|
|
#define ZIP_DIR_ENTRY_FIXED_SIZE 46
|
|
#define ZIP_END_OF_CENTRAL_DIR_SIZE 22
|
|
|
|
struct zip_entry {
|
|
uint32_t signature;
|
|
uint16_t version;
|
|
uint16_t min_version;
|
|
uint16_t flags;
|
|
uint16_t method;
|
|
uint32_t dosdate;
|
|
uint32_t crc;
|
|
uint64_t datasize;
|
|
uint64_t uncompressed;
|
|
uint16_t namelen;
|
|
uint16_t extralen;
|
|
uint16_t commentlen;
|
|
uint32_t disk;
|
|
uint16_t attr_internal;
|
|
uint32_t attr_external;
|
|
off64_t header_offset;
|
|
};
|
|
|
|
struct zip_eocd64 {
|
|
uint32_t signature;
|
|
uint16_t version;
|
|
uint16_t min_version;
|
|
uint32_t diskno;
|
|
uint32_t diskno_dir;
|
|
uint64_t numentries_disk;
|
|
uint64_t numentries;
|
|
uint64_t dir_size;
|
|
off64_t dir_offset;
|
|
uint16_t commentlen;
|
|
};
|
|
|
|
struct ar_archive_zip_entry {
|
|
off64_t offset;
|
|
uint16_t method;
|
|
uint16_t flags;
|
|
uint32_t crc;
|
|
char *name;
|
|
char *raw_name;
|
|
uint32_t dosdate;
|
|
};
|
|
|
|
bool zip_seek_to_compressed_data(ar_archive_zip *zip);
|
|
bool zip_parse_local_file_entry(ar_archive_zip *zip, struct zip_entry *entry);
|
|
off64_t zip_find_next_local_file_entry(ar_stream *stream, off64_t offset);
|
|
bool zip_parse_directory_entry(ar_archive_zip *zip, struct zip_entry *entry);
|
|
off64_t zip_find_end_of_last_directory_entry(ar_stream *stream, struct zip_eocd64 *eocd);
|
|
bool zip_parse_end_of_central_directory(ar_stream *stream, struct zip_eocd64 *eocd);
|
|
off64_t zip_find_end_of_central_directory(ar_stream *stream);
|
|
const char *zip_get_name(ar_archive *ar, bool raw);
|
|
|
|
/***** uncompress-zip *****/
|
|
|
|
struct ar_archive_zip_uncomp;
|
|
|
|
typedef uint32_t (* zip_uncomp_uncompress_data_fn)(struct ar_archive_zip_uncomp *uncomp, void *buffer, uint32_t buffer_size, bool is_last_chunk);
|
|
typedef void (* zip_uncomp_clear_state_fn)(struct ar_archive_zip_uncomp *uncomp);
|
|
|
|
struct InputBuffer {
|
|
uint8_t data[4096];
|
|
uint16_t offset;
|
|
uint16_t bytes_left;
|
|
bool at_eof;
|
|
};
|
|
|
|
struct ByteReader {
|
|
IByteIn super;
|
|
struct InputBuffer *input;
|
|
ar_archive_zip *zip;
|
|
};
|
|
|
|
struct ar_archive_zip_uncomp {
|
|
bool initialized;
|
|
zip_uncomp_uncompress_data_fn uncompress_data;
|
|
zip_uncomp_clear_state_fn clear_state;
|
|
union {
|
|
#ifdef HAVE_ZLIB
|
|
z_stream zstream;
|
|
#endif
|
|
inflate_state *inflate;
|
|
#ifdef HAVE_BZIP2
|
|
bz_stream bstream;
|
|
#endif
|
|
#ifdef HAVE_LIBLZMA
|
|
lzma_stream lzmastream;
|
|
#else
|
|
struct {
|
|
CLzmaDec dec;
|
|
ELzmaFinishMode finish;
|
|
ISzAlloc alloc;
|
|
} lzma;
|
|
#endif //HAVE_LIBLZMA
|
|
struct {
|
|
CPpmd8 ctx;
|
|
struct ByteReader bytein;
|
|
ISzAlloc alloc;
|
|
} ppmd8;
|
|
} state;
|
|
struct InputBuffer input;
|
|
};
|
|
|
|
bool zip_uncompress_part(ar_archive_zip *zip, void *buffer, size_t buffer_size);
|
|
void zip_clear_uncompress(struct ar_archive_zip_uncomp *uncomp);
|
|
|
|
/***** zip *****/
|
|
|
|
struct ar_archive_zip_dir {
|
|
/* off64_t offset; // use ar_archive::entry_offset_first */
|
|
off64_t end_offset;
|
|
};
|
|
|
|
struct ar_archive_zip_progress {
|
|
size_t data_left;
|
|
size_t bytes_done;
|
|
uint32_t crc;
|
|
};
|
|
|
|
struct ar_archive_zip_s {
|
|
ar_archive super;
|
|
struct ar_archive_zip_dir dir;
|
|
struct ar_archive_zip_entry entry;
|
|
struct ar_archive_zip_uncomp uncomp;
|
|
struct ar_archive_zip_progress progress;
|
|
bool deflatedonly;
|
|
off64_t comment_offset;
|
|
uint16_t comment_size;
|
|
};
|
|
|
|
#endif
|