68 lines
1.8 KiB
C
68 lines
1.8 KiB
C
/**
|
|
* Unzip library by Per Bothner.
|
|
* Loosely based on Joonas Pihlajamaa's JUnzip.
|
|
* Released into public domain. https://github.com/jokkebk/JUnzip
|
|
*/
|
|
|
|
#ifndef __JUNZIP_H
|
|
#define __JUNZIP_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
#include <stdint.h>
|
|
|
|
// If you don't have stdint.h, the following two lines should work for most 32/64 bit systems
|
|
// typedef unsigned int uint32_t;
|
|
// typedef unsigned short uint16_t;
|
|
|
|
typedef struct JZFile JZFile;
|
|
|
|
struct JZFile {
|
|
unsigned char *start;
|
|
off_t length;
|
|
long position;
|
|
int numEntries;
|
|
uint32_t centralDirectoryOffset;
|
|
};
|
|
|
|
#define zf_tell(ZF) ((ZF)->position)
|
|
#define zf_available(ZF) ((ZF)->length - (ZF)->position)
|
|
#define zf_current(ZF) ((ZF)->start + (ZF)->position)
|
|
|
|
#define ZIP_LOCAL_FILE_HEADER_LENGTH 30
|
|
|
|
typedef struct {
|
|
uint16_t compressionMethod;
|
|
uint32_t crc32;
|
|
uint32_t compressedSize;
|
|
uint32_t uncompressedSize;
|
|
long fileNameStart;
|
|
uint16_t fileNameLength;
|
|
uint16_t extraFieldLength; // unsupported
|
|
uint32_t offset;
|
|
} JZFileHeader;
|
|
|
|
// Callback prototype for central and local file record reading functions
|
|
typedef int (*JZRecordCallback)(JZFile *zip, int index, JZFileHeader *header);
|
|
|
|
// Read ZIP file end record. Will move within file.
|
|
int jzReadEndRecord(JZFile *zip);
|
|
|
|
// Read ZIP file global directory. Will move within file.
|
|
// Callback is called for each record, until callback returns zero
|
|
int jzReadCentralDirectory(JZFile *zip, JZRecordCallback callback);
|
|
|
|
// See to the start of the actual data of the given entry.
|
|
int jzSeekData(JZFile *zip, JZFileHeader *header);
|
|
|
|
// Read data from file stream, described by header, to preallocated buffer
|
|
// Return value is zlib coded, e.g. Z_OK, or error code
|
|
int jzReadData(JZFile *zip, JZFileHeader *header, void *buffer);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif /* __cplusplus */
|
|
|
|
#endif
|