mirror of https://github.com/snes9xgit/snes9x.git
Update minizip to version 1.1
This enables compilation under my Fedora aarch64 system.
This commit is contained in:
parent
1e1c45be07
commit
8c93a8c12b
|
@ -1,9 +1,9 @@
|
||||||
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
||||||
|
|
||||||
|
|
||||||
Version 1.01h, December 28th, 2009
|
Version 1.01e, February 12th, 2005
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
Copyright (C) 1998-2005 Gilles Vollant
|
||||||
|
|
||||||
This code is a modified version of crypting code in Infozip distribution
|
This code is a modified version of crypting code in Infozip distribution
|
||||||
|
|
||||||
|
@ -32,12 +32,12 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Return the next byte in the pseudo-random sequence
|
* Return the next byte in the pseudo-random sequence
|
||||||
*/
|
*/
|
||||||
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
|
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
|
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||||
* unpredictable manner on 16-bit systems; not a problem
|
* unpredictable manner on 16-bit systems; not a problem
|
||||||
* with any known compiler so far, though */
|
* with any known compiler so far, though */
|
||||||
|
|
||||||
|
(void)pcrc_32_tab;
|
||||||
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
||||||
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||||
}
|
}
|
||||||
|
@ -45,13 +45,12 @@ static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Update the encryption keys with the next byte of plain text
|
* Update the encryption keys with the next byte of plain text
|
||||||
*/
|
*/
|
||||||
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
|
static int update_keys(unsigned long* pkeys, const z_crc_t* pcrc_32_tab, int c) {
|
||||||
{
|
|
||||||
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
||||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||||
{
|
{
|
||||||
int keyshift = (int)((*(pkeys+1)) >> 24);
|
register int keyshift = (int)((*(pkeys+1)) >> 24);
|
||||||
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
|
@ -62,8 +61,7 @@ static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int
|
||||||
* Initialize the encryption keys and the random header according to
|
* Initialize the encryption keys and the random header according to
|
||||||
* the given password.
|
* the given password.
|
||||||
*/
|
*/
|
||||||
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
|
static void init_keys(const char* passwd, unsigned long* pkeys, const z_crc_t* pcrc_32_tab) {
|
||||||
{
|
|
||||||
*(pkeys+0) = 305419896L;
|
*(pkeys+0) = 305419896L;
|
||||||
*(pkeys+1) = 591751049L;
|
*(pkeys+1) = 591751049L;
|
||||||
*(pkeys+2) = 878082192L;
|
*(pkeys+2) = 878082192L;
|
||||||
|
@ -77,7 +75,7 @@ static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned lon
|
||||||
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
|
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
|
||||||
|
|
||||||
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
||||||
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
|
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), (Byte)t^(c))
|
||||||
|
|
||||||
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
||||||
|
|
||||||
|
@ -87,15 +85,13 @@ static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned lon
|
||||||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
|
static unsigned crypthead(const char* passwd, /* password string */
|
||||||
const char *passwd; /* password string */
|
unsigned char* buf, /* where to write header */
|
||||||
unsigned char *buf; /* where to write header */
|
int bufSize,
|
||||||
int bufSize;
|
unsigned long* pkeys,
|
||||||
unsigned long* pkeys;
|
const z_crc_t* pcrc_32_tab,
|
||||||
const unsigned long* pcrc_32_tab;
|
unsigned long crcForCrypting) {
|
||||||
unsigned long crcForCrypting;
|
unsigned n; /* index in random header */
|
||||||
{
|
|
||||||
int n; /* index in random header */
|
|
||||||
int t; /* temporary */
|
int t; /* temporary */
|
||||||
int c; /* random byte */
|
int c; /* random byte */
|
||||||
unsigned char header[RAND_HEAD_LEN-2]; /* random header */
|
unsigned char header[RAND_HEAD_LEN-2]; /* random header */
|
||||||
|
@ -124,8 +120,8 @@ static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
|
||||||
{
|
{
|
||||||
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
|
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
|
||||||
}
|
}
|
||||||
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
|
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
|
||||||
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
|
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
249
unzip/ioapi.c
249
unzip/ioapi.c
|
@ -1,77 +1,88 @@
|
||||||
/* ioapi.c -- IO base function header for compress/uncompress .zip
|
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||||
files using zlib + zip or unzip API
|
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Version 1.01h, December 28th, 2009
|
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
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS)))
|
||||||
#include <stdlib.h>
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
#include <string.h>
|
#endif
|
||||||
|
|
||||||
|
#if defined(__APPLE__) || defined(IOAPI_NO_64) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_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 "zlib.h"
|
|
||||||
#include "ioapi.h"
|
#include "ioapi.h"
|
||||||
|
|
||||||
|
voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc, const void*filename, int mode) {
|
||||||
|
if (pfilefunc->zfile_func64.zopen64_file != NULL)
|
||||||
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
|
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
|
||||||
|
else
|
||||||
#ifndef SEEK_CUR
|
|
||||||
#define SEEK_CUR 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SEEK_END
|
|
||||||
#define SEEK_END 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SEEK_SET
|
|
||||||
#define SEEK_SET 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
voidpf ZCALLBACK fopen_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
const char* filename,
|
|
||||||
int mode));
|
|
||||||
|
|
||||||
uLong ZCALLBACK fread_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
voidpf stream,
|
|
||||||
void* buf,
|
|
||||||
uLong size));
|
|
||||||
|
|
||||||
uLong ZCALLBACK fwrite_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
voidpf stream,
|
|
||||||
const void* buf,
|
|
||||||
uLong size));
|
|
||||||
|
|
||||||
long ZCALLBACK ftell_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
voidpf stream));
|
|
||||||
|
|
||||||
long ZCALLBACK fseek_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
voidpf stream,
|
|
||||||
uLong offset,
|
|
||||||
int origin));
|
|
||||||
|
|
||||||
int ZCALLBACK fclose_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
voidpf stream));
|
|
||||||
|
|
||||||
int ZCALLBACK ferror_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
voidpf stream));
|
|
||||||
|
|
||||||
|
|
||||||
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
|
|
||||||
voidpf opaque;
|
|
||||||
const char* filename;
|
|
||||||
int mode;
|
|
||||||
{
|
{
|
||||||
|
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 = (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.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(voidpf opaque, const char* filename, int mode) {
|
||||||
FILE* file = NULL;
|
FILE* file = NULL;
|
||||||
const char* mode_fopen = NULL;
|
const char* mode_fopen = NULL;
|
||||||
|
(void)opaque;
|
||||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||||
mode_fopen = "rb";
|
mode_fopen = "rb";
|
||||||
else
|
else
|
||||||
|
@ -86,47 +97,58 @@ voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static voidpf ZCALLBACK fopen64_file_func(voidpf opaque, const void* filename, int mode) {
|
||||||
|
FILE* file = NULL;
|
||||||
|
const char* mode_fopen = NULL;
|
||||||
|
(void)opaque;
|
||||||
|
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";
|
||||||
|
|
||||||
uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
|
if ((filename!=NULL) && (mode_fopen != NULL))
|
||||||
voidpf opaque;
|
file = FOPEN_FUNC((const char*)filename, mode_fopen);
|
||||||
voidpf stream;
|
return file;
|
||||||
void* buf;
|
}
|
||||||
uLong size;
|
|
||||||
{
|
|
||||||
|
static uLong ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uLong size) {
|
||||||
uLong ret;
|
uLong ret;
|
||||||
|
(void)opaque;
|
||||||
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uLong ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) {
|
||||||
uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
|
|
||||||
voidpf opaque;
|
|
||||||
voidpf stream;
|
|
||||||
const void* buf;
|
|
||||||
uLong size;
|
|
||||||
{
|
|
||||||
uLong ret;
|
uLong ret;
|
||||||
|
(void)opaque;
|
||||||
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
long ZCALLBACK ftell_file_func (opaque, stream)
|
static long ZCALLBACK ftell_file_func(voidpf opaque, voidpf stream) {
|
||||||
voidpf opaque;
|
|
||||||
voidpf stream;
|
|
||||||
{
|
|
||||||
long ret;
|
long ret;
|
||||||
|
(void)opaque;
|
||||||
ret = ftell((FILE *)stream);
|
ret = ftell((FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
|
|
||||||
voidpf opaque;
|
static ZPOS64_T ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream) {
|
||||||
voidpf stream;
|
ZPOS64_T ret;
|
||||||
uLong offset;
|
(void)opaque;
|
||||||
int origin;
|
ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
|
||||||
{
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long ZCALLBACK fseek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) {
|
||||||
int fseek_origin=0;
|
int fseek_origin=0;
|
||||||
long ret;
|
long ret;
|
||||||
|
(void)opaque;
|
||||||
switch (origin)
|
switch (origin)
|
||||||
{
|
{
|
||||||
case ZLIB_FILEFUNC_SEEK_CUR :
|
case ZLIB_FILEFUNC_SEEK_CUR :
|
||||||
|
@ -141,32 +163,52 @@ long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
|
||||||
default: return -1;
|
default: return -1;
|
||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (fseek((FILE *)stream, offset, fseek_origin) != 0)
|
if (fseek((FILE *)stream, (long)offset, fseek_origin) != 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZCALLBACK fclose_file_func (opaque, stream)
|
static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) {
|
||||||
voidpf opaque;
|
int fseek_origin=0;
|
||||||
voidpf stream;
|
long ret;
|
||||||
|
(void)opaque;
|
||||||
|
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, (z_off64_t)offset, fseek_origin) != 0)
|
||||||
|
ret = -1;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream) {
|
||||||
int ret;
|
int ret;
|
||||||
|
(void)opaque;
|
||||||
ret = fclose((FILE *)stream);
|
ret = fclose((FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZCALLBACK ferror_file_func (opaque, stream)
|
static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream) {
|
||||||
voidpf opaque;
|
|
||||||
voidpf stream;
|
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
(void)opaque;
|
||||||
ret = ferror((FILE *)stream);
|
ret = ferror((FILE *)stream);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_fopen_filefunc (pzlib_filefunc_def)
|
void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def) {
|
||||||
zlib_filefunc_def* pzlib_filefunc_def;
|
|
||||||
{
|
|
||||||
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
||||||
pzlib_filefunc_def->zread_file = fread_file_func;
|
pzlib_filefunc_def->zread_file = fread_file_func;
|
||||||
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
||||||
|
@ -176,3 +218,14 @@ void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||||
pzlib_filefunc_def->zerror_file = ferror_file_func;
|
pzlib_filefunc_def->zerror_file = ferror_file_func;
|
||||||
pzlib_filefunc_def->opaque = NULL;
|
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;
|
||||||
|
}
|
||||||
|
|
188
unzip/ioapi.h
188
unzip/ioapi.h
|
@ -1,13 +1,114 @@
|
||||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||||
files using zlib + zip or unzip API
|
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Version 1.01h, December 28th, 2009
|
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)
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ZLIBIOAPI_H
|
#ifndef _ZLIBIOAPI64_H
|
||||||
#define _ZLIBIOAPI_H
|
#define _ZLIBIOAPI64_H
|
||||||
|
|
||||||
|
#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
|
||||||
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64)
|
||||||
|
#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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
||||||
|
typedef unsigned __int64 ZPOS64_T;
|
||||||
|
#else
|
||||||
|
typedef unsigned long long int ZPOS64_T;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum unsigned 32-bit value used as placeholder for zip64 */
|
||||||
|
#ifndef MAXU32
|
||||||
|
#define MAXU32 (0xffffffff)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define ZLIB_FILEFUNC_SEEK_CUR (1)
|
#define ZLIB_FILEFUNC_SEEK_CUR (1)
|
||||||
|
@ -21,31 +122,29 @@
|
||||||
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
||||||
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
||||||
|
|
||||||
#ifndef OF
|
|
||||||
#define OF(x) x
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ZCALLBACK
|
#ifndef ZCALLBACK
|
||||||
|
#if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
||||||
#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
|
||||||
#define ZCALLBACK CALLBACK
|
#define ZCALLBACK CALLBACK
|
||||||
#else
|
#else
|
||||||
#define ZCALLBACK
|
#define ZCALLBACK
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#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 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));
|
|
||||||
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
|
|
||||||
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char* filename, int mode);
|
||||||
|
typedef uLong (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uLong size);
|
||||||
|
typedef uLong (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void* buf, uLong size);
|
||||||
|
typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream);
|
||||||
|
typedef int (ZCALLBACK *testerror_file_func) (voidpf opaque, voidpf stream);
|
||||||
|
|
||||||
|
typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream);
|
||||||
|
typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uLong offset, int origin);
|
||||||
|
|
||||||
|
|
||||||
|
/* here is the "old" 32 bits structure */
|
||||||
typedef struct zlib_filefunc_def_s
|
typedef struct zlib_filefunc_def_s
|
||||||
{
|
{
|
||||||
open_file_func zopen_file;
|
open_file_func zopen_file;
|
||||||
|
@ -58,21 +157,54 @@ typedef struct zlib_filefunc_def_s
|
||||||
voidpf opaque;
|
voidpf opaque;
|
||||||
} zlib_filefunc_def;
|
} zlib_filefunc_def;
|
||||||
|
|
||||||
|
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream);
|
||||||
|
typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin);
|
||||||
|
typedef voidpf (ZCALLBACK *open64_file_func) (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 fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
|
void fill_fopen_filefunc(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;
|
||||||
|
|
||||||
|
|
||||||
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_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))
|
||||||
|
|
||||||
#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
|
voidpf call_zopen64(const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode);
|
||||||
#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
|
long call_zseek64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin);
|
||||||
#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
|
ZPOS64_T call_ztell64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream);
|
||||||
#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
|
|
||||||
#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
|
|
||||||
#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
366
unzip/iowin32.c
366
unzip/iowin32.c
|
@ -1,10 +1,14 @@
|
||||||
/* iowin32.c -- IO base function header for compress/uncompress .zip
|
/* iowin32.c -- IO base function header for compress/uncompress .zip
|
||||||
files using zlib + zip or unzip API
|
Version 1.1, February 14h, 2010
|
||||||
This IO API version uses the Win32 API (for Microsoft Windows)
|
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Version 1.01h, December 28th, 2009
|
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
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -21,40 +25,18 @@
|
||||||
#define INVALID_SET_FILE_POINTER ((DWORD)-1)
|
#define INVALID_SET_FILE_POINTER ((DWORD)-1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
voidpf ZCALLBACK win32_open_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
const char* filename,
|
|
||||||
int mode));
|
|
||||||
|
|
||||||
uLong ZCALLBACK win32_read_file_func OF((
|
// see Include/shared/winapifamily.h in the Windows Kit
|
||||||
voidpf opaque,
|
#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
|
||||||
voidpf stream,
|
|
||||||
void* buf,
|
|
||||||
uLong size));
|
|
||||||
|
|
||||||
uLong ZCALLBACK win32_write_file_func OF((
|
#if !defined(WINAPI_FAMILY_ONE_PARTITION)
|
||||||
voidpf opaque,
|
#define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition)
|
||||||
voidpf stream,
|
#endif
|
||||||
const void* buf,
|
|
||||||
uLong size));
|
|
||||||
|
|
||||||
long ZCALLBACK win32_tell_file_func OF((
|
#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
|
||||||
voidpf opaque,
|
#define IOWIN32_USING_WINRT_API 1
|
||||||
voidpf stream));
|
#endif
|
||||||
|
#endif
|
||||||
long ZCALLBACK win32_seek_file_func OF((
|
|
||||||
voidpf opaque,
|
|
||||||
voidpf stream,
|
|
||||||
uLong 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
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -62,69 +44,156 @@ typedef struct
|
||||||
int error;
|
int error;
|
||||||
} WIN32FILE_IOWIN;
|
} WIN32FILE_IOWIN;
|
||||||
|
|
||||||
voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
|
|
||||||
voidpf opaque;
|
|
||||||
const char* filename;
|
|
||||||
int mode;
|
|
||||||
{
|
|
||||||
const char* mode_fopen = NULL;
|
|
||||||
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
|
|
||||||
HANDLE hFile = 0;
|
|
||||||
voidpf ret=NULL;
|
|
||||||
|
|
||||||
dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
|
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)
|
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||||
{
|
{
|
||||||
dwDesiredAccess = GENERIC_READ;
|
*lpdwDesiredAccess = GENERIC_READ;
|
||||||
dwCreationDisposition = OPEN_EXISTING;
|
*lpdwCreationDisposition = OPEN_EXISTING;
|
||||||
dwShareMode = FILE_SHARE_READ;
|
*lpdwShareMode = FILE_SHARE_READ;
|
||||||
}
|
}
|
||||||
else
|
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
|
||||||
{
|
{
|
||||||
dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
|
*lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
|
||||||
dwCreationDisposition = OPEN_EXISTING;
|
*lpdwCreationDisposition = OPEN_EXISTING;
|
||||||
}
|
}
|
||||||
else
|
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||||
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
|
||||||
{
|
{
|
||||||
dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
|
*lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
|
||||||
dwCreationDisposition = CREATE_ALWAYS;
|
*lpdwCreationDisposition = CREATE_ALWAYS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((filename!=NULL) && (dwDesiredAccess != 0))
|
static voidpf win32_build_iowin(HANDLE hFile) {
|
||||||
hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
|
voidpf ret=NULL;
|
||||||
dwCreationDisposition, dwFlagsAndAttributes, NULL);
|
|
||||||
|
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
|
||||||
hFile = NULL;
|
|
||||||
|
|
||||||
if (hFile != NULL)
|
|
||||||
{
|
{
|
||||||
WIN32FILE_IOWIN w32fiow;
|
WIN32FILE_IOWIN w32fiow;
|
||||||
w32fiow.hf = hFile;
|
w32fiow.hf = hFile;
|
||||||
w32fiow.error = 0;
|
w32fiow.error = 0;
|
||||||
ret = malloc(sizeof(WIN32FILE_IOWIN));
|
ret = malloc(sizeof(WIN32FILE_IOWIN));
|
||||||
|
|
||||||
if (ret==NULL)
|
if (ret==NULL)
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
else *((WIN32FILE_IOWIN*)ret) = w32fiow;
|
else
|
||||||
|
*((WIN32FILE_IOWIN*)ret) = w32fiow;
|
||||||
}
|
}
|
||||||
return ret;
|
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;
|
||||||
|
|
||||||
uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
|
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
|
||||||
voidpf opaque;
|
|
||||||
voidpf stream;
|
#ifdef IOWIN32_USING_WINRT_API
|
||||||
void* buf;
|
#ifdef UNICODE
|
||||||
uLong size;
|
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;
|
uLong ret=0;
|
||||||
HANDLE hFile = NULL;
|
HANDLE hFile = NULL;
|
||||||
if (stream!=NULL)
|
if (stream!=NULL)
|
||||||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
|
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
|
||||||
|
|
||||||
if (hFile != NULL)
|
if (hFile != NULL)
|
||||||
|
{
|
||||||
if (!ReadFile(hFile, buf, size, &ret, NULL))
|
if (!ReadFile(hFile, buf, size, &ret, NULL))
|
||||||
{
|
{
|
||||||
DWORD dwErr = GetLastError();
|
DWORD dwErr = GetLastError();
|
||||||
|
@ -132,23 +201,20 @@ uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
|
||||||
dwErr = 0;
|
dwErr = 0;
|
||||||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
|
uLong ZCALLBACK win32_write_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) {
|
||||||
voidpf opaque;
|
|
||||||
voidpf stream;
|
|
||||||
const void* buf;
|
|
||||||
uLong size;
|
|
||||||
{
|
|
||||||
uLong ret=0;
|
uLong ret=0;
|
||||||
HANDLE hFile = NULL;
|
HANDLE hFile = NULL;
|
||||||
if (stream!=NULL)
|
if (stream!=NULL)
|
||||||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
|
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
|
||||||
|
|
||||||
if (hFile != NULL)
|
if (hFile != NULL)
|
||||||
|
{
|
||||||
if (!WriteFile(hFile, buf, size, &ret, NULL))
|
if (!WriteFile(hFile, buf, size, &ret, NULL))
|
||||||
{
|
{
|
||||||
DWORD dwErr = GetLastError();
|
DWORD dwErr = GetLastError();
|
||||||
|
@ -156,39 +222,77 @@ uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
|
||||||
dwErr = 0;
|
dwErr = 0;
|
||||||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
long ZCALLBACK win32_tell_file_func (opaque, stream)
|
static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) {
|
||||||
voidpf opaque;
|
#ifdef IOWIN32_USING_WINRT_API
|
||||||
voidpf stream;
|
return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod);
|
||||||
|
#else
|
||||||
|
LONG lHigh = pos.HighPart;
|
||||||
|
DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod);
|
||||||
|
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;
|
long ret=-1;
|
||||||
HANDLE hFile = NULL;
|
HANDLE hFile = NULL;
|
||||||
if (stream!=NULL)
|
if (stream!=NULL)
|
||||||
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
|
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
|
||||||
if (hFile != NULL)
|
if (hFile != NULL)
|
||||||
{
|
{
|
||||||
DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
|
LARGE_INTEGER pos;
|
||||||
if (dwSet == INVALID_SET_FILE_POINTER)
|
pos.QuadPart = 0;
|
||||||
|
|
||||||
|
if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT))
|
||||||
{
|
{
|
||||||
DWORD dwErr = GetLastError();
|
DWORD dwErr = GetLastError();
|
||||||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ret=(long)dwSet;
|
ret=(long)pos.LowPart;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
|
ZPOS64_T ZCALLBACK win32_tell64_file_func(voidpf opaque, voidpf stream) {
|
||||||
voidpf opaque;
|
ZPOS64_T ret= (ZPOS64_T)-1;
|
||||||
voidpf stream;
|
HANDLE hFile = NULL;
|
||||||
uLong offset;
|
if (stream!=NULL)
|
||||||
int origin;
|
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;
|
DWORD dwMoveMethod=0xFFFFFFFF;
|
||||||
HANDLE hFile = NULL;
|
HANDLE hFile = NULL;
|
||||||
|
|
||||||
|
@ -211,8 +315,9 @@ long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
|
||||||
|
|
||||||
if (hFile != NULL)
|
if (hFile != NULL)
|
||||||
{
|
{
|
||||||
DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
|
LARGE_INTEGER pos;
|
||||||
if (dwSet == INVALID_SET_FILE_POINTER)
|
pos.QuadPart = offset;
|
||||||
|
if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod))
|
||||||
{
|
{
|
||||||
DWORD dwErr = GetLastError();
|
DWORD dwErr = GetLastError();
|
||||||
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
|
||||||
|
@ -224,10 +329,45 @@ long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZCALLBACK win32_close_file_func (opaque, stream)
|
long ZCALLBACK win32_seek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) {
|
||||||
voidpf opaque;
|
DWORD dwMoveMethod=0xFFFFFFFF;
|
||||||
voidpf stream;
|
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, dwMoveMethod))
|
||||||
|
{
|
||||||
|
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;
|
int ret=-1;
|
||||||
|
|
||||||
if (stream!=NULL)
|
if (stream!=NULL)
|
||||||
|
@ -244,10 +384,7 @@ int ZCALLBACK win32_close_file_func (opaque, stream)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ZCALLBACK win32_error_file_func (opaque, stream)
|
int ZCALLBACK win32_error_file_func(voidpf opaque, voidpf stream) {
|
||||||
voidpf opaque;
|
|
||||||
voidpf stream;
|
|
||||||
{
|
|
||||||
int ret=-1;
|
int ret=-1;
|
||||||
if (stream!=NULL)
|
if (stream!=NULL)
|
||||||
{
|
{
|
||||||
|
@ -256,9 +393,7 @@ int ZCALLBACK win32_error_file_func (opaque, stream)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_win32_filefunc (pzlib_filefunc_def)
|
void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def) {
|
||||||
zlib_filefunc_def* pzlib_filefunc_def;
|
|
||||||
{
|
|
||||||
pzlib_filefunc_def->zopen_file = win32_open_file_func;
|
pzlib_filefunc_def->zopen_file = win32_open_file_func;
|
||||||
pzlib_filefunc_def->zread_file = win32_read_file_func;
|
pzlib_filefunc_def->zread_file = win32_read_file_func;
|
||||||
pzlib_filefunc_def->zwrite_file = win32_write_file_func;
|
pzlib_filefunc_def->zwrite_file = win32_write_file_func;
|
||||||
|
@ -268,3 +403,38 @@ void fill_win32_filefunc (pzlib_filefunc_def)
|
||||||
pzlib_filefunc_def->zerror_file = win32_error_file_func;
|
pzlib_filefunc_def->zerror_file = win32_error_file_func;
|
||||||
pzlib_filefunc_def->opaque = NULL;
|
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,10 +1,14 @@
|
||||||
/* iowin32.h -- IO base function header for compress/uncompress .zip
|
/* iowin32.h -- IO base function header for compress/uncompress .zip
|
||||||
files using zlib + zip or unzip API
|
Version 1.1, February 14h, 2010
|
||||||
This IO API version uses the Win32 API (for Microsoft Windows)
|
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Version 1.01h, December 28th, 2009
|
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
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -14,7 +18,10 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
|
void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def);
|
||||||
|
void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
|
void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
|
void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
244
unzip/miniunz.c
244
unzip/miniunz.c
|
@ -1,10 +1,43 @@
|
||||||
/*
|
/*
|
||||||
miniunz.c
|
miniunz.c
|
||||||
Version 1.01h, December 28th, 2009
|
Version 1.1, February 14h, 2010
|
||||||
|
sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
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
|
||||||
|
|
||||||
|
#if defined(__APPLE__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_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 <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -12,22 +45,24 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#ifdef unix
|
#ifdef _WIN32
|
||||||
# include <unistd.h>
|
|
||||||
# include <utime.h>
|
|
||||||
#else
|
|
||||||
# include <direct.h>
|
# include <direct.h>
|
||||||
# include <io.h>
|
# include <io.h>
|
||||||
|
#else
|
||||||
|
# include <unistd.h>
|
||||||
|
# include <utime.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "unzip.h"
|
#include "unzip.h"
|
||||||
|
|
||||||
#define CASESENSITIVITY (0)
|
#define CASESENSITIVITY (0)
|
||||||
#define WRITEBUFFERSIZE (8192)
|
#define WRITEBUFFERSIZE (8192)
|
||||||
#define MAXFILENAME (256)
|
#define MAXFILENAME (256)
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
#define USEWIN32IOAPI
|
#define USEWIN32IOAPI
|
||||||
#include "iowin32.h"
|
#include "iowin32.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -44,18 +79,14 @@
|
||||||
|
|
||||||
/* change_file_date : change the date/time of a file
|
/* change_file_date : change the date/time of a file
|
||||||
filename : the filename of the file where date/time must be modified
|
filename : the filename of the file where date/time must be modified
|
||||||
dosdate : the new date at the MSDos format (4 bytes)
|
dosdate : the new date at the MSDOS format (4 bytes)
|
||||||
tmu_date : the SAME new date at the tm_unz format */
|
tmu_date : the SAME new date at the tm_unz format */
|
||||||
void change_file_date(filename,dosdate,tmu_date)
|
static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_date) {
|
||||||
const char *filename;
|
#ifdef _WIN32
|
||||||
uLong dosdate;
|
|
||||||
tm_unz tmu_date;
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
HANDLE hFile;
|
HANDLE hFile;
|
||||||
FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
|
FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
|
||||||
|
|
||||||
hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE,
|
hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE,
|
||||||
0,NULL,OPEN_EXISTING,0,NULL);
|
0,NULL,OPEN_EXISTING,0,NULL);
|
||||||
GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
|
GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
|
||||||
DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
|
DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
|
||||||
|
@ -63,7 +94,8 @@ void change_file_date(filename,dosdate,tmu_date)
|
||||||
SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
|
SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
#else
|
#else
|
||||||
#ifdef unix
|
#if defined(unix) || defined(__APPLE__)
|
||||||
|
(void)dosdate;
|
||||||
struct utimbuf ut;
|
struct utimbuf ut;
|
||||||
struct tm newdate;
|
struct tm newdate;
|
||||||
newdate.tm_sec = tmu_date.tm_sec;
|
newdate.tm_sec = tmu_date.tm_sec;
|
||||||
|
@ -79,6 +111,10 @@ void change_file_date(filename,dosdate,tmu_date)
|
||||||
|
|
||||||
ut.actime=ut.modtime=mktime(&newdate);
|
ut.actime=ut.modtime=mktime(&newdate);
|
||||||
utime(filename,&ut);
|
utime(filename,&ut);
|
||||||
|
#else
|
||||||
|
(void)filename;
|
||||||
|
(void)dosdate;
|
||||||
|
(void)tmu_date;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -87,28 +123,26 @@ void change_file_date(filename,dosdate,tmu_date)
|
||||||
/* mymkdir and change_file_date are not 100 % portable
|
/* mymkdir and change_file_date are not 100 % portable
|
||||||
As I don't know well Unix, I wait feedback for the unix portion */
|
As I don't know well Unix, I wait feedback for the unix portion */
|
||||||
|
|
||||||
int mymkdir(dirname)
|
static int mymkdir(const char* dirname) {
|
||||||
const char* dirname;
|
|
||||||
{
|
|
||||||
int ret=0;
|
int ret=0;
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
ret = mkdir(dirname);
|
ret = _mkdir(dirname);
|
||||||
#else
|
#elif unix
|
||||||
#ifdef unix
|
|
||||||
ret = mkdir (dirname,0775);
|
ret = mkdir (dirname,0775);
|
||||||
#endif
|
#elif __APPLE__
|
||||||
|
ret = mkdir (dirname,0775);
|
||||||
|
#else
|
||||||
|
(void)dirname;
|
||||||
#endif
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int makedir (newdir)
|
static int makedir(const char *newdir) {
|
||||||
char *newdir;
|
|
||||||
{
|
|
||||||
char *buffer ;
|
char *buffer ;
|
||||||
char *p;
|
char *p;
|
||||||
int len = (int)strlen(newdir);
|
size_t len = strlen(newdir);
|
||||||
|
|
||||||
if (len <= 0)
|
if (len == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
buffer = (char*)malloc(len+1);
|
buffer = (char*)malloc(len+1);
|
||||||
|
@ -151,14 +185,12 @@ int makedir (newdir)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_banner()
|
static void do_banner(void) {
|
||||||
{
|
printf("MiniUnz 1.1, demo of zLib + Unz package written by Gilles Vollant\n");
|
||||||
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");
|
printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_help()
|
static void do_help(void) {
|
||||||
{
|
|
||||||
printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
|
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" \
|
" -e Extract without pathname (junk paths)\n" \
|
||||||
" -x Extract with pathname\n" \
|
" -x Extract with pathname\n" \
|
||||||
|
@ -166,39 +198,63 @@ void do_help()
|
||||||
" -l list files\n" \
|
" -l list files\n" \
|
||||||
" -d directory to extract into\n" \
|
" -d directory to extract into\n" \
|
||||||
" -o overwrite files without prompting\n" \
|
" -o overwrite files without prompting\n" \
|
||||||
" -p extract crypted file using password\n\n");
|
" -p extract encrypted file using password\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Display64BitsSize(ZPOS64_T n, int size_char) {
|
||||||
int do_list(uf)
|
/* to avoid compatibility problem , we do here the conversion */
|
||||||
unzFile uf;
|
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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_list(unzFile uf) {
|
||||||
uLong i;
|
uLong i;
|
||||||
unz_global_info gi;
|
unz_global_info64 gi;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = unzGetGlobalInfo (uf,&gi);
|
err = unzGetGlobalInfo64(uf,&gi);
|
||||||
if (err!=UNZ_OK)
|
if (err!=UNZ_OK)
|
||||||
printf("error %d with zipfile in unzGetGlobalInfo \n",err);
|
printf("error %d with zipfile in unzGetGlobalInfo \n",err);
|
||||||
printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
|
printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
|
||||||
printf(" ------ ------ ---- ----- ---- ---- ------ ----\n");
|
printf(" ------ ------ ---- ----- ---- ---- ------ ----\n");
|
||||||
for (i=0;i<gi.number_entry;i++)
|
for (i=0;i<gi.number_entry;i++)
|
||||||
{
|
{
|
||||||
char filename_inzip[256];
|
char filename_inzip[65536+1];
|
||||||
unz_file_info file_info;
|
unz_file_info64 file_info;
|
||||||
uLong ratio=0;
|
uLong ratio=0;
|
||||||
const char *string_method;
|
const char *string_method = "";
|
||||||
char charCrypt=' ';
|
char charCrypt=' ';
|
||||||
err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
|
err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
|
||||||
if (err!=UNZ_OK)
|
if (err!=UNZ_OK)
|
||||||
{
|
{
|
||||||
printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
|
printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (file_info.uncompressed_size>0)
|
if (file_info.uncompressed_size>0)
|
||||||
ratio = (file_info.compressed_size*100)/file_info.uncompressed_size;
|
ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size);
|
||||||
|
|
||||||
/* display a '*' if the file is crypted */
|
/* display a '*' if the file is encrypted */
|
||||||
if ((file_info.flag & 1) != 0)
|
if ((file_info.flag & 1) != 0)
|
||||||
charCrypt='*';
|
charCrypt='*';
|
||||||
|
|
||||||
|
@ -215,20 +271,18 @@ int do_list(uf)
|
||||||
else if ((iLevel==2) || (iLevel==3))
|
else if ((iLevel==2) || (iLevel==3))
|
||||||
string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
|
string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
|
||||||
}
|
}
|
||||||
#ifdef HAVE_BZIP2
|
|
||||||
else
|
else
|
||||||
if (file_info.compression_method==Z_BZIP2ED)
|
if (file_info.compression_method==Z_BZIP2ED)
|
||||||
{
|
{
|
||||||
string_method="BZip2 ";
|
string_method="BZip2 ";
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
string_method="Unkn. ";
|
string_method="Unkn. ";
|
||||||
|
|
||||||
printf("%7lu %6s%c%7lu %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n",
|
Display64BitsSize(file_info.uncompressed_size,7);
|
||||||
file_info.uncompressed_size,string_method,
|
printf(" %6s%c",string_method,charCrypt);
|
||||||
charCrypt,
|
Display64BitsSize(file_info.compressed_size,7);
|
||||||
file_info.compressed_size,
|
printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n",
|
||||||
ratio,
|
ratio,
|
||||||
(uLong)file_info.tmu_date.tm_mon + 1,
|
(uLong)file_info.tmu_date.tm_mon + 1,
|
||||||
(uLong)file_info.tmu_date.tm_mday,
|
(uLong)file_info.tmu_date.tm_mday,
|
||||||
|
@ -250,13 +304,8 @@ int do_list(uf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
static int do_extract_currentfile(unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password) {
|
||||||
unzFile uf;
|
char filename_inzip[65536+1];
|
||||||
const int* popt_extract_without_path;
|
|
||||||
int* popt_overwrite;
|
|
||||||
const char* password;
|
|
||||||
{
|
|
||||||
char filename_inzip[256];
|
|
||||||
char* filename_withoutpath;
|
char* filename_withoutpath;
|
||||||
char* p;
|
char* p;
|
||||||
int err=UNZ_OK;
|
int err=UNZ_OK;
|
||||||
|
@ -264,9 +313,8 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
||||||
void* buf;
|
void* buf;
|
||||||
uInt size_buf;
|
uInt size_buf;
|
||||||
|
|
||||||
unz_file_info file_info;
|
unz_file_info64 file_info;
|
||||||
uLong ratio=0;
|
err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
|
||||||
err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
|
|
||||||
|
|
||||||
if (err!=UNZ_OK)
|
if (err!=UNZ_OK)
|
||||||
{
|
{
|
||||||
|
@ -308,6 +356,20 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
||||||
else
|
else
|
||||||
write_filename = filename_withoutpath;
|
write_filename = filename_withoutpath;
|
||||||
|
|
||||||
|
if (write_filename[0]!='\0')
|
||||||
|
{
|
||||||
|
const char* relative_check = write_filename;
|
||||||
|
while (relative_check[1]!='\0')
|
||||||
|
{
|
||||||
|
if (relative_check[0]=='.' && relative_check[1]=='.')
|
||||||
|
write_filename = relative_check;
|
||||||
|
relative_check++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (write_filename[0]=='/' || write_filename[0]=='.')
|
||||||
|
write_filename++;
|
||||||
|
|
||||||
err = unzOpenCurrentFilePassword(uf,password);
|
err = unzOpenCurrentFilePassword(uf,password);
|
||||||
if (err!=UNZ_OK)
|
if (err!=UNZ_OK)
|
||||||
{
|
{
|
||||||
|
@ -318,7 +380,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
||||||
{
|
{
|
||||||
char rep=0;
|
char rep=0;
|
||||||
FILE* ftestexist;
|
FILE* ftestexist;
|
||||||
ftestexist = fopen(write_filename,"rb");
|
ftestexist = FOPEN_FUNC(write_filename,"rb");
|
||||||
if (ftestexist!=NULL)
|
if (ftestexist!=NULL)
|
||||||
{
|
{
|
||||||
fclose(ftestexist);
|
fclose(ftestexist);
|
||||||
|
@ -349,8 +411,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
||||||
|
|
||||||
if ((skip==0) && (err==UNZ_OK))
|
if ((skip==0) && (err==UNZ_OK))
|
||||||
{
|
{
|
||||||
fout=fopen(write_filename,"wb");
|
fout=FOPEN_FUNC(write_filename,"wb");
|
||||||
|
|
||||||
/* some zipfile don't contain directory alone before file */
|
/* some zipfile don't contain directory alone before file */
|
||||||
if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
|
if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
|
||||||
(filename_withoutpath!=(char*)filename_inzip))
|
(filename_withoutpath!=(char*)filename_inzip))
|
||||||
|
@ -359,7 +420,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
||||||
*(filename_withoutpath-1)='\0';
|
*(filename_withoutpath-1)='\0';
|
||||||
makedir(write_filename);
|
makedir(write_filename);
|
||||||
*(filename_withoutpath-1)=c;
|
*(filename_withoutpath-1)=c;
|
||||||
fout=fopen(write_filename,"wb");
|
fout=FOPEN_FUNC(write_filename,"wb");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fout==NULL)
|
if (fout==NULL)
|
||||||
|
@ -381,7 +442,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (err>0)
|
if (err>0)
|
||||||
if (fwrite(buf,err,1,fout)!=1)
|
if (fwrite(buf,(unsigned)err,1,fout)!=1)
|
||||||
{
|
{
|
||||||
printf("error in writing extracted file\n");
|
printf("error in writing extracted file\n");
|
||||||
err=UNZ_ERRNO;
|
err=UNZ_ERRNO;
|
||||||
|
@ -414,18 +475,12 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
|
static int do_extract(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password) {
|
||||||
unzFile uf;
|
|
||||||
int opt_extract_without_path;
|
|
||||||
int opt_overwrite;
|
|
||||||
const char* password;
|
|
||||||
{
|
|
||||||
uLong i;
|
uLong i;
|
||||||
unz_global_info gi;
|
unz_global_info64 gi;
|
||||||
int err;
|
int err;
|
||||||
FILE* fout=NULL;
|
|
||||||
|
|
||||||
err = unzGetGlobalInfo (uf,&gi);
|
err = unzGetGlobalInfo64(uf,&gi);
|
||||||
if (err!=UNZ_OK)
|
if (err!=UNZ_OK)
|
||||||
printf("error %d with zipfile in unzGetGlobalInfo \n",err);
|
printf("error %d with zipfile in unzGetGlobalInfo \n",err);
|
||||||
|
|
||||||
|
@ -450,14 +505,7 @@ int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password)
|
static int do_extract_onefile(unzFile uf, const char* filename, int opt_extract_without_path, int opt_overwrite, const char* 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)
|
if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
|
||||||
{
|
{
|
||||||
printf("file %s not found in the zipfile\n",filename);
|
printf("file %s not found in the zipfile\n",filename);
|
||||||
|
@ -473,10 +521,7 @@ int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,passwo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(argc,argv)
|
int main(int argc, char *argv[]) {
|
||||||
int argc;
|
|
||||||
char *argv[];
|
|
||||||
{
|
|
||||||
const char *zipfilename=NULL;
|
const char *zipfilename=NULL;
|
||||||
const char *filename_to_extract=NULL;
|
const char *filename_to_extract=NULL;
|
||||||
const char *password=NULL;
|
const char *password=NULL;
|
||||||
|
@ -507,7 +552,7 @@ int main(argc,argv)
|
||||||
|
|
||||||
while ((*p)!='\0')
|
while ((*p)!='\0')
|
||||||
{
|
{
|
||||||
char c=*(p++);;
|
char c=*(p++);
|
||||||
if ((c=='l') || (c=='L'))
|
if ((c=='l') || (c=='L'))
|
||||||
opt_do_list = 1;
|
opt_do_list = 1;
|
||||||
if ((c=='v') || (c=='V'))
|
if ((c=='v') || (c=='V'))
|
||||||
|
@ -545,26 +590,26 @@ int main(argc,argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
# ifdef USEWIN32IOAPI
|
# ifdef USEWIN32IOAPI
|
||||||
zlib_filefunc_def ffunc;
|
zlib_filefunc64_def ffunc;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
strncpy(filename_try, zipfilename,MAXFILENAME-1);
|
strncpy(filename_try, zipfilename,MAXFILENAME-1);
|
||||||
/* strncpy doesnt append the trailing NULL, of the string is too long. */
|
/* strncpy doesn't append the trailing NULL, of the string is too long. */
|
||||||
filename_try[ MAXFILENAME ] = '\0';
|
filename_try[ MAXFILENAME ] = '\0';
|
||||||
|
|
||||||
# ifdef USEWIN32IOAPI
|
# ifdef USEWIN32IOAPI
|
||||||
fill_win32_filefunc(&ffunc);
|
fill_win32_filefunc64A(&ffunc);
|
||||||
uf = unzOpen2(zipfilename,&ffunc);
|
uf = unzOpen2_64(zipfilename,&ffunc);
|
||||||
# else
|
# else
|
||||||
uf = unzOpen(zipfilename);
|
uf = unzOpen64(zipfilename);
|
||||||
# endif
|
# endif
|
||||||
if (uf==NULL)
|
if (uf==NULL)
|
||||||
{
|
{
|
||||||
strcat(filename_try,".zip");
|
strcat(filename_try,".zip");
|
||||||
# ifdef USEWIN32IOAPI
|
# ifdef USEWIN32IOAPI
|
||||||
uf = unzOpen2(filename_try,&ffunc);
|
uf = unzOpen2_64(filename_try,&ffunc);
|
||||||
# else
|
# else
|
||||||
uf = unzOpen(filename_try);
|
uf = unzOpen64(filename_try);
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -580,7 +625,11 @@ int main(argc,argv)
|
||||||
ret_value = do_list(uf);
|
ret_value = do_list(uf);
|
||||||
else if (opt_do_extract==1)
|
else if (opt_do_extract==1)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (opt_extractdir && _chdir(dirname))
|
||||||
|
#else
|
||||||
if (opt_extractdir && chdir(dirname))
|
if (opt_extractdir && chdir(dirname))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
printf("Error changing into %s, aborting\n", dirname);
|
printf("Error changing into %s, aborting\n", dirname);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
@ -589,8 +638,7 @@ int main(argc,argv)
|
||||||
if (filename_to_extract == NULL)
|
if (filename_to_extract == NULL)
|
||||||
ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password);
|
ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password);
|
||||||
else
|
else
|
||||||
ret_value = do_extract_onefile(uf,filename_to_extract,
|
ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password);
|
||||||
opt_do_extract_withoutpath,opt_overwrite,password);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unzClose(uf);
|
unzClose(uf);
|
||||||
|
|
180
unzip/minizip.c
180
unzip/minizip.c
|
@ -1,14 +1,46 @@
|
||||||
/*
|
/*
|
||||||
minizip.c
|
minizip.c
|
||||||
Version 1.01h, December 28th, 2009
|
Version 1.1, February 14h, 2010
|
||||||
|
sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Changes:
|
Modifications of Unzip for Zip64
|
||||||
Aug 3, 2006. jg. support storing files with out paths. (-j)
|
Copyright (C) 2007-2008 Even Rouault
|
||||||
Aug 3, 2006. jg. files with paths should not have leading slashes.
|
|
||||||
|
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
|
||||||
|
|
||||||
|
#if defined(__APPLE__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_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 <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -16,19 +48,19 @@ Changes:
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#ifdef unix
|
#ifdef _WIN32
|
||||||
|
# include <direct.h>
|
||||||
|
# include <io.h>
|
||||||
|
#else
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# include <utime.h>
|
# include <utime.h>
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
# include <sys/stat.h>
|
# include <sys/stat.h>
|
||||||
#else
|
|
||||||
# include <direct.h>
|
|
||||||
# include <io.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "zip.h"
|
#include "zip.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
#define USEWIN32IOAPI
|
#define USEWIN32IOAPI
|
||||||
#include "iowin32.h"
|
#include "iowin32.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,12 +70,10 @@ Changes:
|
||||||
#define WRITEBUFFERSIZE (16384)
|
#define WRITEBUFFERSIZE (16384)
|
||||||
#define MAXFILENAME (256)
|
#define MAXFILENAME (256)
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef _WIN32
|
||||||
uLong filetime(f, tmzip, dt)
|
/* f: name of file to get info on, tmzip: return value: access,
|
||||||
char *f; /* name of file to get info on */
|
modification and creation times, dt: dostime */
|
||||||
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
|
||||||
uLong *dt; /* dostime */
|
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
{
|
{
|
||||||
FILETIME ftLocal;
|
FILETIME ftLocal;
|
||||||
|
@ -62,12 +92,11 @@ uLong filetime(f, tmzip, dt)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#ifdef unix
|
#if defined(unix) || defined(__APPLE__)
|
||||||
uLong filetime(f, tmzip, dt)
|
/* f: name of file to get info on, tmzip: return value: access,
|
||||||
char *f; /* name of file to get info on */
|
modification and creation times, dt: dostime */
|
||||||
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
|
||||||
uLong *dt; /* dostime */
|
(void)dt;
|
||||||
{
|
|
||||||
int ret=0;
|
int ret=0;
|
||||||
struct stat s; /* results of stat() */
|
struct stat s; /* results of stat() */
|
||||||
struct tm* filedate;
|
struct tm* filedate;
|
||||||
|
@ -76,12 +105,12 @@ uLong filetime(f, tmzip, dt)
|
||||||
if (strcmp(f,"-")!=0)
|
if (strcmp(f,"-")!=0)
|
||||||
{
|
{
|
||||||
char name[MAXFILENAME+1];
|
char name[MAXFILENAME+1];
|
||||||
int len = strlen(f);
|
size_t len = strlen(f);
|
||||||
if (len > MAXFILENAME)
|
if (len > MAXFILENAME)
|
||||||
len = MAXFILENAME;
|
len = MAXFILENAME;
|
||||||
|
|
||||||
strncpy(name, f,MAXFILENAME-1);
|
strncpy(name, f,MAXFILENAME-1);
|
||||||
/* strncpy doesnt append the trailing NULL, of the string is too long. */
|
/* strncpy doesn't append the trailing NULL, of the string is too long. */
|
||||||
name[ MAXFILENAME ] = '\0';
|
name[ MAXFILENAME ] = '\0';
|
||||||
|
|
||||||
if (name[len - 1] == '/')
|
if (name[len - 1] == '/')
|
||||||
|
@ -105,11 +134,12 @@ uLong filetime(f, tmzip, dt)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
uLong filetime(f, tmzip, dt)
|
/* f: name of file to get info on, tmzip: return value: access,
|
||||||
char *f; /* name of file to get info on */
|
modification and creation times, dt: dostime */
|
||||||
tm_zip *tmzip; /* return value: access, modific. and creation times */
|
static int filetime(const char *f, tm_zip *tmzip, uLong *dt) {
|
||||||
uLong *dt; /* dostime */
|
(void)f;
|
||||||
{
|
(void)tmzip;
|
||||||
|
(void)dt;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -118,12 +148,10 @@ uLong filetime(f, tmzip, dt)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int check_exist_file(filename)
|
static int check_exist_file(const char* filename) {
|
||||||
const char* filename;
|
|
||||||
{
|
|
||||||
FILE* ftestexist;
|
FILE* ftestexist;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
ftestexist = fopen(filename,"rb");
|
ftestexist = FOPEN_FUNC(filename,"rb");
|
||||||
if (ftestexist==NULL)
|
if (ftestexist==NULL)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else
|
else
|
||||||
|
@ -131,33 +159,30 @@ int check_exist_file(filename)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_banner()
|
static void do_banner(void) {
|
||||||
{
|
printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n");
|
||||||
printf("MiniZip 1.01e-jg, demo of zLib + Zip package written by Gilles Vollant\n");
|
printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n");
|
||||||
printf("minor updates, jg.\n");
|
|
||||||
printf("more info at http://www.winimage.com/zLibDll/minizip.html\n\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_help()
|
static void do_help(void) {
|
||||||
{
|
|
||||||
printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \
|
printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \
|
||||||
" -o Overwrite existing file.zip\n" \
|
" -o Overwrite existing file.zip\n" \
|
||||||
" -a Append to existing file.zip\n" \
|
" -a Append to existing file.zip\n" \
|
||||||
" -0 Store only\n" \
|
" -0 Store only\n" \
|
||||||
" -1 Compress faster\n" \
|
" -1 Compress faster\n" \
|
||||||
" -9 Compress better\n" \
|
" -9 Compress better\n\n" \
|
||||||
" -j exclude path. store only the file name.\n\n");
|
" -j exclude path. store only the file name.\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calculate the CRC32 of a file,
|
/* calculate the CRC32 of a file,
|
||||||
because to encrypt a file, we need known the CRC32 of the file before */
|
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)
|
static int getFileCrc(const char* filenameinzip, void* buf, unsigned long size_buf, unsigned long* result_crc) {
|
||||||
{
|
|
||||||
unsigned long calculate_crc=0;
|
unsigned long calculate_crc=0;
|
||||||
int err=ZIP_OK;
|
int err=ZIP_OK;
|
||||||
FILE * fin = fopen(filenameinzip,"rb");
|
FILE * fin = FOPEN_FUNC(filenameinzip,"rb");
|
||||||
|
|
||||||
unsigned long size_read = 0;
|
unsigned long size_read = 0;
|
||||||
unsigned long total_read = 0;
|
/* unsigned long total_read = 0; */
|
||||||
if (fin==NULL)
|
if (fin==NULL)
|
||||||
{
|
{
|
||||||
err = ZIP_ERRNO;
|
err = ZIP_ERRNO;
|
||||||
|
@ -167,7 +192,7 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
err = ZIP_OK;
|
err = ZIP_OK;
|
||||||
size_read = (int)fread(buf,1,size_buf,fin);
|
size_read = fread(buf,1,size_buf,fin);
|
||||||
if (size_read < size_buf)
|
if (size_read < size_buf)
|
||||||
if (feof(fin)==0)
|
if (feof(fin)==0)
|
||||||
{
|
{
|
||||||
|
@ -176,8 +201,8 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size_read>0)
|
if (size_read>0)
|
||||||
calculate_crc = crc32(calculate_crc,buf,size_read);
|
calculate_crc = crc32_z(calculate_crc,buf,size_read);
|
||||||
total_read += size_read;
|
/* total_read += size_read; */
|
||||||
|
|
||||||
} while ((err == ZIP_OK) && (size_read>0));
|
} while ((err == ZIP_OK) && (size_read>0));
|
||||||
|
|
||||||
|
@ -189,10 +214,28 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(argc,argv)
|
static int isLargeFile(const char* filename) {
|
||||||
int argc;
|
int largeFile = 0;
|
||||||
char *argv[];
|
ZPOS64_T pos = 0;
|
||||||
|
FILE* pFile = FOPEN_FUNC(filename, "rb");
|
||||||
|
|
||||||
|
if(pFile != NULL)
|
||||||
{
|
{
|
||||||
|
FSEEKO_FUNC(pFile, 0, SEEK_END);
|
||||||
|
pos = (ZPOS64_T)FTELLO_FUNC(pFile);
|
||||||
|
|
||||||
|
printf("File : %s is %llu bytes\n", filename, pos);
|
||||||
|
|
||||||
|
if(pos >= 0xffffffff)
|
||||||
|
largeFile = 1;
|
||||||
|
|
||||||
|
fclose(pFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
return largeFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
int i;
|
int i;
|
||||||
int opt_overwrite=0;
|
int opt_overwrite=0;
|
||||||
int opt_compress_level=Z_DEFAULT_COMPRESSION;
|
int opt_compress_level=Z_DEFAULT_COMPRESSION;
|
||||||
|
@ -201,7 +244,7 @@ int main(argc,argv)
|
||||||
char filename_try[MAXFILENAME+16];
|
char filename_try[MAXFILENAME+16];
|
||||||
int zipok;
|
int zipok;
|
||||||
int err=0;
|
int err=0;
|
||||||
int size_buf=0;
|
size_t size_buf=0;
|
||||||
void* buf=NULL;
|
void* buf=NULL;
|
||||||
const char* password=NULL;
|
const char* password=NULL;
|
||||||
|
|
||||||
|
@ -222,7 +265,7 @@ int main(argc,argv)
|
||||||
|
|
||||||
while ((*p)!='\0')
|
while ((*p)!='\0')
|
||||||
{
|
{
|
||||||
char c=*(p++);;
|
char c=*(p++);
|
||||||
if ((c=='o') || (c=='O'))
|
if ((c=='o') || (c=='O'))
|
||||||
opt_overwrite = 1;
|
opt_overwrite = 1;
|
||||||
if ((c=='a') || (c=='A'))
|
if ((c=='a') || (c=='A'))
|
||||||
|
@ -268,7 +311,7 @@ int main(argc,argv)
|
||||||
|
|
||||||
zipok = 1 ;
|
zipok = 1 ;
|
||||||
strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1);
|
strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1);
|
||||||
/* strncpy doesnt append the trailing NULL, of the string is too long. */
|
/* strncpy doesn't append the trailing NULL, of the string is too long. */
|
||||||
filename_try[ MAXFILENAME ] = '\0';
|
filename_try[ MAXFILENAME ] = '\0';
|
||||||
|
|
||||||
len=(int)strlen(filename_try);
|
len=(int)strlen(filename_try);
|
||||||
|
@ -317,11 +360,11 @@ int main(argc,argv)
|
||||||
zipFile zf;
|
zipFile zf;
|
||||||
int errclose;
|
int errclose;
|
||||||
# ifdef USEWIN32IOAPI
|
# ifdef USEWIN32IOAPI
|
||||||
zlib_filefunc_def ffunc;
|
zlib_filefunc64_def ffunc;
|
||||||
fill_win32_filefunc(&ffunc);
|
fill_win32_filefunc64A(&ffunc);
|
||||||
zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc);
|
zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc);
|
||||||
# else
|
# else
|
||||||
zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0);
|
zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (zf == NULL)
|
if (zf == NULL)
|
||||||
|
@ -338,15 +381,16 @@ int main(argc,argv)
|
||||||
((argv[i][1]=='o') || (argv[i][1]=='O') ||
|
((argv[i][1]=='o') || (argv[i][1]=='O') ||
|
||||||
(argv[i][1]=='a') || (argv[i][1]=='A') ||
|
(argv[i][1]=='a') || (argv[i][1]=='A') ||
|
||||||
(argv[i][1]=='p') || (argv[i][1]=='P') ||
|
(argv[i][1]=='p') || (argv[i][1]=='P') ||
|
||||||
((argv[i][1]>='0') || (argv[i][1]<='9'))) &&
|
((argv[i][1]>='0') && (argv[i][1]<='9'))) &&
|
||||||
(strlen(argv[i]) == 2)))
|
(strlen(argv[i]) == 2)))
|
||||||
{
|
{
|
||||||
FILE * fin;
|
FILE * fin = NULL;
|
||||||
int size_read;
|
size_t size_read;
|
||||||
const char* filenameinzip = argv[i];
|
const char* filenameinzip = argv[i];
|
||||||
const char *savefilenameinzip;
|
const char *savefilenameinzip;
|
||||||
zip_fileinfo zi;
|
zip_fileinfo zi;
|
||||||
unsigned long crcFile=0;
|
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_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.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
|
||||||
|
@ -364,7 +408,9 @@ int main(argc,argv)
|
||||||
if ((password != NULL) && (err==ZIP_OK))
|
if ((password != NULL) && (err==ZIP_OK))
|
||||||
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
|
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
|
||||||
|
|
||||||
/*the path name saved, should not include a leading slash. */
|
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. */
|
/*if it did, windows/xp and dynazip couldn't read the zip file. */
|
||||||
savefilenameinzip = filenameinzip;
|
savefilenameinzip = filenameinzip;
|
||||||
while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' )
|
while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' )
|
||||||
|
@ -391,19 +437,19 @@ int main(argc,argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
err = zipOpenNewFileInZip3(zf,savefilenameinzip,&zi,
|
err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi,
|
||||||
NULL,0,NULL,0,NULL /* comment*/,
|
NULL,0,NULL,0,NULL /* comment*/,
|
||||||
(opt_compress_level != 0) ? Z_DEFLATED : 0,
|
(opt_compress_level != 0) ? Z_DEFLATED : 0,
|
||||||
opt_compress_level,0,
|
opt_compress_level,0,
|
||||||
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
|
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
|
||||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||||
password,crcFile);
|
password,crcFile, zip64);
|
||||||
|
|
||||||
if (err != ZIP_OK)
|
if (err != ZIP_OK)
|
||||||
printf("error in opening %s in zipfile\n",filenameinzip);
|
printf("error in opening %s in zipfile\n",filenameinzip);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fin = fopen(filenameinzip,"rb");
|
fin = FOPEN_FUNC(filenameinzip,"rb");
|
||||||
if (fin==NULL)
|
if (fin==NULL)
|
||||||
{
|
{
|
||||||
err=ZIP_ERRNO;
|
err=ZIP_ERRNO;
|
||||||
|
@ -415,7 +461,7 @@ int main(argc,argv)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
err = ZIP_OK;
|
err = ZIP_OK;
|
||||||
size_read = (int)fread(buf,1,size_buf,fin);
|
size_read = fread(buf,1,size_buf,fin);
|
||||||
if (size_read < size_buf)
|
if (size_read < size_buf)
|
||||||
if (feof(fin)==0)
|
if (feof(fin)==0)
|
||||||
{
|
{
|
||||||
|
@ -425,7 +471,7 @@ int main(argc,argv)
|
||||||
|
|
||||||
if (size_read>0)
|
if (size_read>0)
|
||||||
{
|
{
|
||||||
err = zipWriteInFileInZip (zf,buf,size_read);
|
err = zipWriteInFileInZip (zf,buf,(unsigned)size_read);
|
||||||
if (err<0)
|
if (err<0)
|
||||||
{
|
{
|
||||||
printf("error in writing %s in the zipfile\n",
|
printf("error in writing %s in the zipfile\n",
|
||||||
|
|
|
@ -27,13 +27,7 @@
|
||||||
WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
|
WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered)
|
extern int ZEXPORT unzRepair(const char* file, const char* fileOut, const char* fileOutTmp, uLong* nRecovered, uLong* bytesRecovered) {
|
||||||
const char* file;
|
|
||||||
const char* fileOut;
|
|
||||||
const char* fileOutTmp;
|
|
||||||
uLong* nRecovered;
|
|
||||||
uLong* bytesRecovered;
|
|
||||||
{
|
|
||||||
int err = Z_OK;
|
int err = Z_OK;
|
||||||
FILE* fpZip = fopen(file, "rb");
|
FILE* fpZip = fopen(file, "rb");
|
||||||
FILE* fpOut = fopen(fileOut, "wb");
|
FILE* fpOut = fopen(fileOut, "wb");
|
||||||
|
@ -42,7 +36,7 @@ uLong* bytesRecovered;
|
||||||
int entries = 0;
|
int entries = 0;
|
||||||
uLong totalBytes = 0;
|
uLong totalBytes = 0;
|
||||||
char header[30];
|
char header[30];
|
||||||
char filename[256];
|
char filename[1024];
|
||||||
char extra[1024];
|
char extra[1024];
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int offsetCD = 0;
|
int offsetCD = 0;
|
||||||
|
@ -73,6 +67,7 @@ uLong* bytesRecovered;
|
||||||
|
|
||||||
/* Filename */
|
/* Filename */
|
||||||
if (fnsize > 0) {
|
if (fnsize > 0) {
|
||||||
|
if (fnsize < sizeof(filename)) {
|
||||||
if (fread(filename, 1, fnsize, fpZip) == fnsize) {
|
if (fread(filename, 1, fnsize, fpZip) == fnsize) {
|
||||||
if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {
|
if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {
|
||||||
offset += fnsize;
|
offset += fnsize;
|
||||||
|
@ -84,6 +79,10 @@ uLong* bytesRecovered;
|
||||||
err = Z_ERRNO;
|
err = Z_ERRNO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
err = Z_ERRNO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
err = Z_STREAM_ERROR;
|
err = Z_STREAM_ERROR;
|
||||||
break;
|
break;
|
||||||
|
@ -91,6 +90,7 @@ uLong* bytesRecovered;
|
||||||
|
|
||||||
/* Extra field */
|
/* Extra field */
|
||||||
if (extsize > 0) {
|
if (extsize > 0) {
|
||||||
|
if (extsize < sizeof(extra)) {
|
||||||
if (fread(extra, 1, extsize, fpZip) == extsize) {
|
if (fread(extra, 1, extsize, fpZip) == extsize) {
|
||||||
if (fwrite(extra, 1, extsize, fpOut) == extsize) {
|
if (fwrite(extra, 1, extsize, fpOut) == extsize) {
|
||||||
offset += extsize;
|
offset += extsize;
|
||||||
|
@ -102,6 +102,10 @@ uLong* bytesRecovered;
|
||||||
err = Z_ERRNO;
|
err = Z_ERRNO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
err = Z_ERRNO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Data */
|
/* Data */
|
||||||
|
|
|
@ -28,4 +28,10 @@ extern int ZEXPORT unzRepair(const char* file,
|
||||||
uLong* nRecovered,
|
uLong* nRecovered,
|
||||||
uLong* bytesRecovered);
|
uLong* bytesRecovered);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,360 @@
|
||||||
|
// skipset.h -- set operations using a skiplist
|
||||||
|
// Copyright (C) 2024 Mark Adler
|
||||||
|
// See MiniZip_info.txt for the license.
|
||||||
|
|
||||||
|
// This implements a skiplist set, i.e. just keys, no data, with ~O(log n) time
|
||||||
|
// insert and search operations. The application defines the type of a key, and
|
||||||
|
// provides a function to compare two keys.
|
||||||
|
|
||||||
|
// This header is not definitions of functions found in another source file --
|
||||||
|
// it creates the set functions, with the application's key type, right where
|
||||||
|
// the #include is. Before this header is #included, these must be defined:
|
||||||
|
//
|
||||||
|
// 1. A macro or typedef for set_key_t, the type of a key.
|
||||||
|
// 2. A macro or function set_cmp(a, b) to compare two keys. The return values
|
||||||
|
// are < 0 for a < b, 0 for a == b, and > 0 for a > b.
|
||||||
|
// 3. A macro or function set_drop(s, k) to release the key k's resources, if
|
||||||
|
// any, when doing a set_end() or set_clear(). s is a pointer to the set
|
||||||
|
// that key is in, for use with set_free() if desired.
|
||||||
|
//
|
||||||
|
// Example usage:
|
||||||
|
//
|
||||||
|
// typedef int set_key_t;
|
||||||
|
// #define set_cmp(a, b) ((a) < (b) ? -1 : (a) == (b) ? 0 : 1)
|
||||||
|
// #define set_drop(s, k)
|
||||||
|
// #include "skipset.h"
|
||||||
|
//
|
||||||
|
// int test(void) { // return 0: good, 1: bad, -1: out of memory
|
||||||
|
// set_t set;
|
||||||
|
// if (setjmp(set.env))
|
||||||
|
// return -1;
|
||||||
|
// set_start(&set);
|
||||||
|
// set_insert(&set, 2);
|
||||||
|
// set_insert(&set, 1);
|
||||||
|
// set_insert(&set, 7);
|
||||||
|
// int bad = !set_found(&set, 2);
|
||||||
|
// bad = bad || set_found(&set, 5);
|
||||||
|
// set_end(&set);
|
||||||
|
// return bad;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Interface summary (see more details below):
|
||||||
|
// - set_t is the type of the set being operated on (a set_t pointer is passed)
|
||||||
|
// - set_start() initializes a new, empty set (initialize set.env first)
|
||||||
|
// - set_insert() inserts a new key into the set, or not if it's already there
|
||||||
|
// - set_found() determines whether or not a key is in the set
|
||||||
|
// - set_end() ends the use of the set, freeing all memory
|
||||||
|
// - set_clear() empties the set, equivalent to set_end() and then set_start()
|
||||||
|
// - set_ok() checks if set appears to be usable, i.e. started and not ended
|
||||||
|
//
|
||||||
|
// Auxiliary functions available to the application:
|
||||||
|
// - set_alloc() allocates memory with optional tracking (#define SET_TRACK)
|
||||||
|
// - set_free() deallocates memory allocated by set_alloc()
|
||||||
|
// - set_rand() returns 32 random bits (seeded by set_start())
|
||||||
|
|
||||||
|
#ifndef SKIPSET_H
|
||||||
|
#define SKIPSET_H
|
||||||
|
|
||||||
|
#include <stdlib.h> // realloc(), free(), NULL, size_t
|
||||||
|
#include <setjmp.h> // jmp_buf, longjmp()
|
||||||
|
#include <errno.h> // ENOMEM
|
||||||
|
#include <stdint.h> // int16_t, uint32_t, uint64_t
|
||||||
|
#include <time.h> // time(), clock()
|
||||||
|
#include <assert.h> // assert.h
|
||||||
|
|
||||||
|
// Structures and functions below noted as "--private--" should not be used by
|
||||||
|
// the application. set_t is partially private and partially public -- see the
|
||||||
|
// comments there.
|
||||||
|
|
||||||
|
// There is no POSIX random() in MSVC, and rand() is awful. For portability, we
|
||||||
|
// cannot rely on a library function for random numbers. Instead we use the
|
||||||
|
// fast and effective algorithm below, invented by Melissa O'Neill.
|
||||||
|
|
||||||
|
// *Really* minimal PCG32 code / (c) 2014 M.E. O'Neill / www.pcg-random.org
|
||||||
|
// Licensed under Apache License 2.0 (NO WARRANTY, etc. see website)
|
||||||
|
// --private-- Random number generator state.
|
||||||
|
typedef struct {
|
||||||
|
uint64_t state; // 64-bit generator state
|
||||||
|
uint64_t inc; // 63-bit sequence id
|
||||||
|
} set_rand_t;
|
||||||
|
// --private-- Initialize the state *gen using seed and seq. seed seeds the
|
||||||
|
// advancing 64-bit state. seq is a sequence selection constant.
|
||||||
|
void set_seed(set_rand_t *gen, uint64_t seed, uint64_t seq) {
|
||||||
|
gen->inc = (seq << 1) | 1;
|
||||||
|
gen->state = (seed + gen->inc) * 6364136223846793005ULL + gen->inc;
|
||||||
|
}
|
||||||
|
// Return 32 random bits, advancing the state *gen.
|
||||||
|
uint32_t set_rand(set_rand_t *gen) {
|
||||||
|
uint64_t state = gen->state;
|
||||||
|
gen->state = state * 6364136223846793005ULL + gen->inc;
|
||||||
|
uint32_t mix = (uint32_t)(((state >> 18) ^ state) >> 27);
|
||||||
|
int rot = state >> 59;
|
||||||
|
return (mix >> rot) | (mix << ((-rot) & 31));
|
||||||
|
}
|
||||||
|
// End of PCG32 code.
|
||||||
|
|
||||||
|
// --private-- Linked-list node.
|
||||||
|
typedef struct set_node_s set_node_t;
|
||||||
|
struct set_node_s {
|
||||||
|
set_key_t key; // the key (not used for head or path)
|
||||||
|
int16_t size; // number of allocated pointers in right[]
|
||||||
|
int16_t fill; // number of pointers in right[] filled in
|
||||||
|
set_node_t **right; // pointer for each level, each to the right
|
||||||
|
};
|
||||||
|
|
||||||
|
// A set. The application sets env, may use gen with set_rand(), and may read
|
||||||
|
// allocs and memory. The remaining variables are --private-- .
|
||||||
|
typedef struct set_s {
|
||||||
|
set_node_t *head; // skiplist head -- no key, just links
|
||||||
|
set_node_t *path; // right[] is path to key from set_found()
|
||||||
|
set_node_t *node; // node under construction, in case of longjmp()
|
||||||
|
int16_t depth; // maximum depth of the skiplist
|
||||||
|
uint64_t ran; // a precious trove of random bits
|
||||||
|
set_rand_t gen; // random number generator state
|
||||||
|
jmp_buf env; // setjmp() environment for allocation errors
|
||||||
|
#ifdef SET_TRACK
|
||||||
|
size_t allocs; // number of allocations
|
||||||
|
size_t memory; // total amount of allocated memory (>= requests)
|
||||||
|
#endif
|
||||||
|
} set_t;
|
||||||
|
|
||||||
|
// Memory allocation and deallocation. set_alloc(set, ptr, size) returns a
|
||||||
|
// pointer to an allocation of size bytes if ptr is NULL, or the previous
|
||||||
|
// allocation ptr resized to size bytes. set_alloc() will never return NULL.
|
||||||
|
// set_free(set, ptr) frees an allocation created by set_alloc(). These may be
|
||||||
|
// used by the application. e.g. if allocation tracking is desired.
|
||||||
|
#ifdef SET_TRACK
|
||||||
|
// Track the number of allocations and the total backing memory size.
|
||||||
|
# if defined(_WIN32)
|
||||||
|
# include <malloc.h>
|
||||||
|
# define SET_ALLOC_SIZE(ptr) _msize(ptr)
|
||||||
|
# elif defined(__MACH__)
|
||||||
|
# include <malloc/malloc.h>
|
||||||
|
# define SET_ALLOC_SIZE(ptr) malloc_size(ptr)
|
||||||
|
# elif defined(__linux__)
|
||||||
|
# include <malloc.h>
|
||||||
|
# define SET_ALLOC_SIZE(ptr) malloc_usable_size(ptr)
|
||||||
|
# elif defined(__FreeBSD__)
|
||||||
|
# include <malloc_np.h>
|
||||||
|
# define SET_ALLOC_SIZE(ptr) malloc_usable_size(ptr)
|
||||||
|
# elif defined(__NetBSD__)
|
||||||
|
# include <jemalloc/jemalloc.h>
|
||||||
|
# define SET_ALLOC_SIZE(ptr) malloc_usable_size(ptr)
|
||||||
|
# else // e.g. OpenBSD
|
||||||
|
# define SET_ALLOC_SIZE(ptr) 0
|
||||||
|
# endif
|
||||||
|
// With tracking.
|
||||||
|
void *set_alloc(set_t *set, void *ptr, size_t size) {
|
||||||
|
size_t had = ptr == NULL ? 0 : SET_ALLOC_SIZE(ptr);
|
||||||
|
void *mem = realloc(ptr, size);
|
||||||
|
if (mem == NULL)
|
||||||
|
longjmp(set->env, ENOMEM);
|
||||||
|
set->allocs += ptr == NULL;
|
||||||
|
set->memory += SET_ALLOC_SIZE(mem) - had;
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
void set_free(set_t *set, void *ptr) {
|
||||||
|
if (ptr != NULL) {
|
||||||
|
set->allocs--;
|
||||||
|
set->memory -= SET_ALLOC_SIZE(ptr);
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// Without tracking.
|
||||||
|
void *set_alloc(set_t *set, void *ptr, size_t size) {
|
||||||
|
void *mem = realloc(ptr, size);
|
||||||
|
if (mem == NULL)
|
||||||
|
longjmp(set->env, ENOMEM);
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
void set_free(set_t *set, void *ptr) {
|
||||||
|
(void)set;
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// --private-- Grow node's array right[] as needed to be able to hold at least
|
||||||
|
// want links. If fill is true, assure that the first want links are filled in,
|
||||||
|
// setting them to set->head if not previously filled in. Otherwise it is
|
||||||
|
// assumed that the first want links are about to be filled in.
|
||||||
|
void set_grow(set_t *set, set_node_t *node, int want, int fill) {
|
||||||
|
if (node->size < want) {
|
||||||
|
int more = node->size ? node->size : 1;
|
||||||
|
while (more < want)
|
||||||
|
more <<= 1;
|
||||||
|
node->right = set_alloc(set, node->right, more * sizeof(set_node_t *));
|
||||||
|
node->size = (int16_t)more;
|
||||||
|
}
|
||||||
|
int i;
|
||||||
|
if (fill)
|
||||||
|
for (i = node->fill; i < want; i++)
|
||||||
|
node->right[i] = set->head;
|
||||||
|
node->fill = (int16_t)want;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --private-- Return a new node. key is left uninitialized.
|
||||||
|
set_node_t *set_node(set_t *set) {
|
||||||
|
set_node_t *node = set_alloc(set, NULL, sizeof(set_node_t));
|
||||||
|
node->size = 0;
|
||||||
|
node->fill = 0;
|
||||||
|
node->right = NULL;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --private-- Free the list linked from head, along with the keys.
|
||||||
|
void set_sweep(set_t *set) {
|
||||||
|
set_node_t *step = set->head->right[0];
|
||||||
|
while (step != set->head) {
|
||||||
|
set_node_t *next = step->right[0]; // save link to next node
|
||||||
|
set_drop(set, step->key);
|
||||||
|
set_free(set, step->right);
|
||||||
|
set_free(set, step);
|
||||||
|
step = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize a new set. set->env must be initialized using setjmp() before
|
||||||
|
// set_start() is called. A longjmp(set->env, ENOMEM) will be used to handle a
|
||||||
|
// memory allocation failure during any of the operations. (See setjmp.h and
|
||||||
|
// errno.h.) The set can still be used if this happens, assuming that it didn't
|
||||||
|
// happen during set_start(). Whether set_start() completed or not, set_end()
|
||||||
|
// can be used to free the set's memory after a longjmp().
|
||||||
|
void set_start(set_t *set) {
|
||||||
|
#ifdef SET_TRACK
|
||||||
|
set->allocs = 0;
|
||||||
|
set->memory = 0;
|
||||||
|
#endif
|
||||||
|
set->head = set->path = set->node = NULL; // in case set_node() fails
|
||||||
|
set->path = set_node(set);
|
||||||
|
set->head = set_node(set);
|
||||||
|
set_grow(set, set->head, 1, 1); // one link back to head for an empty set
|
||||||
|
*(unsigned char *)&set->head->key = 137; // set id
|
||||||
|
set->depth = 0;
|
||||||
|
set_seed(&set->gen, ((uint64_t)set << 32) ^
|
||||||
|
((uint64_t)time(NULL) << 12) ^ clock(), 0);
|
||||||
|
set->ran = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return true if *set appears to be in a usable state. If *set has been zeroed
|
||||||
|
// out, then set_ok(set) will be false and set_end(set) will be safe.
|
||||||
|
int set_ok(set_t *set) {
|
||||||
|
return set->head != NULL &&
|
||||||
|
set->head->right != NULL &&
|
||||||
|
*(unsigned char *)&set->head->key == 137;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty the set. This frees the memory used for the previous set contents.
|
||||||
|
// After set_clear(), *set is ready for use, as if after a set_start().
|
||||||
|
void set_clear(set_t *set) {
|
||||||
|
assert(set_ok(set) && "improper use");
|
||||||
|
|
||||||
|
// Free all the keys and their nodes.
|
||||||
|
set_sweep(set);
|
||||||
|
|
||||||
|
// Leave the head and path allocations as is. Clear their contents, with
|
||||||
|
// head pointing to itself and setting depth to zero, for an empty set.
|
||||||
|
set->head->right[0] = set->head;
|
||||||
|
set->head->fill = 1;
|
||||||
|
set->path->fill = 0;
|
||||||
|
set->depth = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done using the set -- free all allocations. The only operation on *set
|
||||||
|
// permitted after this is set_start(). Though another set_end() would do no
|
||||||
|
// harm. This can be done at any time after a set_start(), or after a longjmp()
|
||||||
|
// on any allocation failure, including during a set_start().
|
||||||
|
void set_end(set_t *set) {
|
||||||
|
if (set->head != NULL) {
|
||||||
|
// Empty the set and free the head node.
|
||||||
|
if (set->head->right != NULL) {
|
||||||
|
set_sweep(set);
|
||||||
|
set_free(set, set->head->right);
|
||||||
|
}
|
||||||
|
set_free(set, set->head);
|
||||||
|
set->head = NULL;
|
||||||
|
}
|
||||||
|
if (set->path != NULL) {
|
||||||
|
// Free the path work area.
|
||||||
|
set_free(set, set->path->right);
|
||||||
|
set_free(set, set->path);
|
||||||
|
set->path = NULL;
|
||||||
|
}
|
||||||
|
if (set->node != NULL) {
|
||||||
|
// Free the node that was under construction when longjmp() hit.
|
||||||
|
set_drop(set, set->node->key);
|
||||||
|
set_free(set, set->node->right);
|
||||||
|
set_free(set, set->node);
|
||||||
|
set->node = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for key. Return 1 if found or 0 if not. This also puts the path to get
|
||||||
|
// there in set->path, for use by set_insert().
|
||||||
|
int set_found(set_t *set, set_key_t key) {
|
||||||
|
assert(set_ok(set) && "improper use");
|
||||||
|
|
||||||
|
// Start at depth and work down and right as determined by key comparisons.
|
||||||
|
set_node_t *head = set->head, *here = head;
|
||||||
|
int i = set->depth;
|
||||||
|
set_grow(set, set->path, i + 1, 0);
|
||||||
|
do {
|
||||||
|
while (here->right[i] != head &&
|
||||||
|
set_cmp(here->right[i]->key, key) < 0)
|
||||||
|
here = here->right[i];
|
||||||
|
set->path->right[i] = here;
|
||||||
|
} while (i--);
|
||||||
|
|
||||||
|
// See if the key matches.
|
||||||
|
here = here->right[0];
|
||||||
|
return here != head && set_cmp(here->key, key) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert the key key. Return 0 on success, or 1 if key is already in the set.
|
||||||
|
int set_insert(set_t *set, set_key_t key) {
|
||||||
|
assert(set_ok(set) && "improper use");
|
||||||
|
|
||||||
|
if (set_found(set, key))
|
||||||
|
// That key is already in the set.
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// Randomly generate a new level-- level 0 with probability 1/2, 1 with
|
||||||
|
// probability 1/4, 2 with probability 1/8, etc.
|
||||||
|
int level = 0;
|
||||||
|
for (;;) {
|
||||||
|
if (set->ran == 1)
|
||||||
|
// Ran out. Get another 32 random bits.
|
||||||
|
set->ran = set_rand(&set->gen) | (1ULL << 32);
|
||||||
|
int bit = set->ran & 1;
|
||||||
|
set->ran >>= 1;
|
||||||
|
if (bit)
|
||||||
|
break;
|
||||||
|
assert(level < 32767 &&
|
||||||
|
"Overhead, without any fuss, the stars were going out.");
|
||||||
|
level++;
|
||||||
|
}
|
||||||
|
if (level > set->depth) {
|
||||||
|
// The maximum depth is now deeper. Update the structures.
|
||||||
|
set_grow(set, set->path, level + 1, 1);
|
||||||
|
set_grow(set, set->head, level + 1, 1);
|
||||||
|
set->depth = (int16_t)level;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make a new node for the provided key, and insert it in the lists up to
|
||||||
|
// and including level.
|
||||||
|
set->node = set_node(set);
|
||||||
|
set->node->key = key;
|
||||||
|
set_grow(set, set->node, level + 1, 0);
|
||||||
|
int i;
|
||||||
|
for (i = 0; i <= level; i++) {
|
||||||
|
set->node->right[i] = set->path->right[i]->right[i];
|
||||||
|
set->path->right[i]->right[i] = set->node;
|
||||||
|
}
|
||||||
|
set->node = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error ** another skiplist set already created here
|
||||||
|
// Would need to implement a prefix in order to support multiple sets.
|
||||||
|
#endif
|
1283
unzip/unzip.c
1283
unzip/unzip.c
File diff suppressed because it is too large
Load Diff
211
unzip/unzip.h
211
unzip/unzip.h
|
@ -1,18 +1,18 @@
|
||||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
/* unzip.h -- IO for uncompress .zip files using zlib
|
||||||
Version 1.01h, December 28th, 2009
|
Version 1.1, February 14h, 2010
|
||||||
|
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
|
Modifications of Unzip for Zip64
|
||||||
WinZip, InfoZip tools and compatible.
|
Copyright (C) 2007-2008 Even Rouault
|
||||||
|
|
||||||
Multi volume ZipFile (span) are not supported.
|
Modifications for Zip64 support on both zip and unzip
|
||||||
Encryption compatible with pkzip 2.04g only supported
|
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||||
Old compressions used by old PKZip 1.x are not supported
|
|
||||||
|
|
||||||
|
For more info read MiniZip_info.txt
|
||||||
|
|
||||||
I WAIT FEEDBACK at mail info@winimage.com
|
---------------------------------------------------------------------------------
|
||||||
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
|
|
||||||
|
|
||||||
Condition of use and distribution are the same than zlib :
|
Condition of use and distribution are the same than zlib :
|
||||||
|
|
||||||
|
@ -32,18 +32,16 @@
|
||||||
misrepresented as being the original software.
|
misrepresented as being the original software.
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Changes
|
||||||
|
|
||||||
|
See header of unzip64.c
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* for more info about .ZIP format, see
|
#ifndef _unz64_H
|
||||||
http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
|
#define _unz64_H
|
||||||
http://www.info-zip.org/pub/infozip/doc/
|
|
||||||
PkWare has also a specification at :
|
|
||||||
ftp://ftp.pkware.com/probdesc.zip
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _unz_H
|
|
||||||
#define _unz_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -85,16 +83,23 @@ typedef voidp unzFile;
|
||||||
/* tm_unz contain date/time info */
|
/* tm_unz contain date/time info */
|
||||||
typedef struct tm_unz_s
|
typedef struct tm_unz_s
|
||||||
{
|
{
|
||||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
int tm_sec; /* seconds after the minute - [0,59] */
|
||||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
int tm_min; /* minutes after the hour - [0,59] */
|
||||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
int tm_hour; /* hours since midnight - [0,23] */
|
||||||
uInt tm_mday; /* day of the month - [1,31] */
|
int tm_mday; /* day of the month - [1,31] */
|
||||||
uInt tm_mon; /* months since January - [0,11] */
|
int tm_mon; /* months since January - [0,11] */
|
||||||
uInt tm_year; /* years - [1980..2044] */
|
int tm_year; /* years - [1980..2044] */
|
||||||
} tm_unz;
|
} tm_unz;
|
||||||
|
|
||||||
/* unz_global_info structure contain global data about the ZIPfile
|
/* unz_global_info structure contain global data about the ZIPfile
|
||||||
These data comes from the end of central dir */
|
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
|
typedef struct unz_global_info_s
|
||||||
{
|
{
|
||||||
uLong number_entry; /* total number of entries in
|
uLong number_entry; /* total number of entries in
|
||||||
|
@ -102,8 +107,28 @@ typedef struct unz_global_info_s
|
||||||
uLong size_comment; /* size of the global comment of the zipfile */
|
uLong size_comment; /* size of the global comment of the zipfile */
|
||||||
} unz_global_info;
|
} unz_global_info;
|
||||||
|
|
||||||
|
|
||||||
/* unz_file_info contain information about a file in the zipfile */
|
/* 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
|
typedef struct unz_file_info_s
|
||||||
{
|
{
|
||||||
uLong version; /* version made by 2 bytes */
|
uLong version; /* version made by 2 bytes */
|
||||||
|
@ -125,20 +150,21 @@ typedef struct unz_file_info_s
|
||||||
tm_unz tmu_date;
|
tm_unz tmu_date;
|
||||||
} unz_file_info;
|
} unz_file_info;
|
||||||
|
|
||||||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
|
extern int ZEXPORT unzStringFileNameCompare(const char* fileName1,
|
||||||
const char* fileName2,
|
const char* fileName2,
|
||||||
int iCaseSensitivity));
|
int iCaseSensitivity);
|
||||||
/*
|
/*
|
||||||
Compare two filename (fileName1,fileName2).
|
Compare two filenames (fileName1,fileName2).
|
||||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
If iCaseSensitivity = 1, comparison is case sensitive (like strcmp)
|
||||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi
|
||||||
or strcasecmp)
|
or strcasecmp)
|
||||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
If iCaseSensitivity = 0, case sensitivity is default of your operating system
|
||||||
(like 1 on Unix, 2 on Windows)
|
(like 1 on Unix, 2 on Windows)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
extern unzFile ZEXPORT unzOpen(const char *path);
|
||||||
|
extern unzFile ZEXPORT unzOpen64(const void *path);
|
||||||
/*
|
/*
|
||||||
Open a Zip file. path contain the full pathname (by example,
|
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
|
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
|
||||||
|
@ -147,33 +173,49 @@ extern unzFile ZEXPORT unzOpen OF((const char *path));
|
||||||
return value is NULL.
|
return value is NULL.
|
||||||
Else, the return value is a unzFile Handle, usable with other function
|
Else, the return value is a unzFile Handle, usable with other function
|
||||||
of this unzip package.
|
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 ZEXPORT unzOpen2 OF((const char *path,
|
|
||||||
zlib_filefunc_def* pzlib_filefunc_def));
|
extern unzFile ZEXPORT unzOpen2(const char *path,
|
||||||
|
zlib_filefunc_def* pzlib_filefunc_def);
|
||||||
/*
|
/*
|
||||||
Open a Zip file, like unzOpen, but provide a set of file low level API
|
Open a Zip file, like unzOpen, but provide a set of file low level API
|
||||||
for read/write the zip file (see ioapi.h)
|
for read/write the zip file (see ioapi.h)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzClose OF((unzFile file));
|
extern unzFile ZEXPORT unzOpen2_64(const void *path,
|
||||||
|
zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
/*
|
/*
|
||||||
Close a ZipFile opened with unzipOpen.
|
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 ZEXPORT unzClose(unzFile file);
|
||||||
|
/*
|
||||||
|
Close a ZipFile opened with unzOpen.
|
||||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
these files MUST be closed with unzCloseCurrentFile before call unzClose.
|
||||||
return UNZ_OK if there is no problem. */
|
return UNZ_OK if there is no problem. */
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
extern int ZEXPORT unzGetGlobalInfo(unzFile file,
|
||||||
unz_global_info *pglobal_info));
|
unz_global_info *pglobal_info);
|
||||||
|
|
||||||
|
extern int ZEXPORT unzGetGlobalInfo64(unzFile file,
|
||||||
|
unz_global_info64 *pglobal_info);
|
||||||
/*
|
/*
|
||||||
Write info about the ZipFile in the *pglobal_info structure.
|
Write info about the ZipFile in the *pglobal_info structure.
|
||||||
No preparation of the structure is needed
|
No preparation of the structure is needed
|
||||||
return UNZ_OK if there is no problem. */
|
return UNZ_OK if there is no problem. */
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
extern int ZEXPORT unzGetGlobalComment(unzFile file,
|
||||||
char *szComment,
|
char *szComment,
|
||||||
uLong uSizeBuf));
|
uLong uSizeBuf);
|
||||||
/*
|
/*
|
||||||
Get the global comment string of the ZipFile, in the szComment buffer.
|
Get the global comment string of the ZipFile, in the szComment buffer.
|
||||||
uSizeBuf is the size of the szComment buffer.
|
uSizeBuf is the size of the szComment buffer.
|
||||||
|
@ -184,22 +226,22 @@ extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/* Unzip package allow you browse the directory of the zipfile */
|
/* Unzip package allow you browse the directory of the zipfile */
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
extern int ZEXPORT unzGoToFirstFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Set the current file of the zipfile to the first file.
|
Set the current file of the zipfile to the first file.
|
||||||
return UNZ_OK if there is no problem
|
return UNZ_OK if there is no problem
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
extern int ZEXPORT unzGoToNextFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Set the current file of the zipfile to the next file.
|
Set the current file of the zipfile to the next file.
|
||||||
return UNZ_OK if there is no problem
|
return UNZ_OK if there is no problem
|
||||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzLocateFile OF((unzFile file,
|
extern int ZEXPORT unzLocateFile(unzFile file,
|
||||||
const char *szFileName,
|
const char *szFileName,
|
||||||
int iCaseSensitivity));
|
int iCaseSensitivity);
|
||||||
/*
|
/*
|
||||||
Try locate the file szFileName in the zipfile.
|
Try locate the file szFileName in the zipfile.
|
||||||
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
||||||
|
@ -227,52 +269,87 @@ extern int ZEXPORT unzGoToFilePos(
|
||||||
unzFile file,
|
unzFile file,
|
||||||
unz_file_pos* file_pos);
|
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 ZEXPORT unzGetFilePos64(
|
||||||
|
unzFile file,
|
||||||
|
unz64_file_pos* file_pos);
|
||||||
|
|
||||||
|
extern int ZEXPORT unzGoToFilePos64(
|
||||||
|
unzFile file,
|
||||||
|
const unz64_file_pos* file_pos);
|
||||||
|
|
||||||
/* ****************************************** */
|
/* ****************************************** */
|
||||||
|
|
||||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file,
|
||||||
|
unz_file_info64 *pfile_info,
|
||||||
|
char *szFileName,
|
||||||
|
uLong fileNameBufferSize,
|
||||||
|
void *extraField,
|
||||||
|
uLong extraFieldBufferSize,
|
||||||
|
char *szComment,
|
||||||
|
uLong commentBufferSize);
|
||||||
|
|
||||||
|
extern int ZEXPORT unzGetCurrentFileInfo(unzFile file,
|
||||||
unz_file_info *pfile_info,
|
unz_file_info *pfile_info,
|
||||||
char *szFileName,
|
char *szFileName,
|
||||||
uLong fileNameBufferSize,
|
uLong fileNameBufferSize,
|
||||||
void *extraField,
|
void *extraField,
|
||||||
uLong extraFieldBufferSize,
|
uLong extraFieldBufferSize,
|
||||||
char *szComment,
|
char *szComment,
|
||||||
uLong commentBufferSize));
|
uLong commentBufferSize);
|
||||||
/*
|
/*
|
||||||
Get Info about the current file
|
Get Info about the current file
|
||||||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
|
if pfile_info!=NULL, the *pfile_info structure will contain some info about
|
||||||
the current file
|
the current file
|
||||||
if szFileName!=NULL, the filemane string will be copied in szFileName
|
if szFileName!=NULL, the filename string will be copied in szFileName
|
||||||
(fileNameBufferSize is the size of the buffer)
|
(fileNameBufferSize is the size of the buffer)
|
||||||
if extraField!=NULL, the extra field information will be copied in extraField
|
if extraField!=NULL, the extra field information will be copied in extraField
|
||||||
(extraFieldBufferSize is the size of the buffer).
|
(extraFieldBufferSize is the size of the buffer).
|
||||||
This is the Central-header version of the extra field
|
This is the Central-header version of the extra field
|
||||||
if szComment!=NULL, the comment string of the file will be copied in szComment
|
if szComment!=NULL, the comment string of the file will be copied in szComment
|
||||||
(commentBufferSize is the size of the buffer)
|
(commentBufferSize is the size of the buffer)
|
||||||
|
The file name and comment will be zero-terminated if there is room in the
|
||||||
|
provided buffer. Otherwise the buffer will contain as much as will fit. If at
|
||||||
|
least 65537 bytes of room is provided, then the result will always be
|
||||||
|
complete and zero-terminated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** Addition for GDAL : START */
|
||||||
|
|
||||||
|
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file);
|
||||||
|
|
||||||
|
/** Addition for GDAL : END */
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/* for reading the content of the current zipfile, you can open it, read data
|
/* 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)
|
from it, and close it (you can close it before reading all the file)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
extern int ZEXPORT unzOpenCurrentFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Open for reading data the current file in the zipfile.
|
Open for reading data the current file in the zipfile.
|
||||||
If there is no error, the return value is UNZ_OK.
|
If there is no error, the return value is UNZ_OK.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
|
extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file,
|
||||||
const char* password));
|
const char* password);
|
||||||
/*
|
/*
|
||||||
Open for reading data the current file in the zipfile.
|
Open for reading data the current file in the zipfile.
|
||||||
password is a crypting password
|
password is a crypting password
|
||||||
If there is no error, the return value is UNZ_OK.
|
If there is no error, the return value is UNZ_OK.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
|
extern int ZEXPORT unzOpenCurrentFile2(unzFile file,
|
||||||
int* method,
|
int* method,
|
||||||
int* level,
|
int* level,
|
||||||
int raw));
|
int raw);
|
||||||
/*
|
/*
|
||||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||||
if raw==1
|
if raw==1
|
||||||
|
@ -282,11 +359,11 @@ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
|
||||||
but you CANNOT set method parameter as NULL
|
but you CANNOT set method parameter as NULL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
|
extern int ZEXPORT unzOpenCurrentFile3(unzFile file,
|
||||||
int* method,
|
int* method,
|
||||||
int* level,
|
int* level,
|
||||||
int raw,
|
int raw,
|
||||||
const char* password));
|
const char* password);
|
||||||
/*
|
/*
|
||||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||||
if raw==1
|
if raw==1
|
||||||
|
@ -297,39 +374,41 @@ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
extern int ZEXPORT unzCloseCurrentFile(unzFile file);
|
||||||
/*
|
/*
|
||||||
Close the file in zip opened with unzOpenCurrentFile
|
Close the file in zip opened with unzOpenCurrentFile
|
||||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
extern int ZEXPORT unzReadCurrentFile(unzFile file,
|
||||||
voidp buf,
|
voidp buf,
|
||||||
unsigned len));
|
unsigned len);
|
||||||
/*
|
/*
|
||||||
Read bytes from the current file (opened by unzOpenCurrentFile)
|
Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||||
buf contain buffer where data must be copied
|
buf contain buffer where data must be copied
|
||||||
len the size of buf.
|
len the size of buf.
|
||||||
|
|
||||||
return the number of byte copied if somes bytes are copied
|
return the number of byte copied if some bytes are copied
|
||||||
return 0 if the end of file was reached
|
return 0 if the end of file was reached
|
||||||
return <0 with error code if there is an error
|
return <0 with error code if there is an error
|
||||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
extern z_off_t ZEXPORT unztell(unzFile file);
|
||||||
|
|
||||||
|
extern ZPOS64_T ZEXPORT unztell64(unzFile file);
|
||||||
/*
|
/*
|
||||||
Give the current position in uncompressed data
|
Give the current position in uncompressed data
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzeof OF((unzFile file));
|
extern int ZEXPORT unzeof(unzFile file);
|
||||||
/*
|
/*
|
||||||
return 1 if the end of file was reached, 0 elsewhere
|
return 1 if the end of file was reached, 0 elsewhere
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
extern int ZEXPORT unzGetLocalExtrafield(unzFile file,
|
||||||
voidp buf,
|
voidp buf,
|
||||||
unsigned len));
|
unsigned len);
|
||||||
/*
|
/*
|
||||||
Read extra field from the current file (opened by unzOpenCurrentFile)
|
Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||||
This is the local-header version of the extra field (sometimes, there is
|
This is the local-header version of the extra field (sometimes, there is
|
||||||
|
@ -346,9 +425,11 @@ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
/* Get the current file offset */
|
/* Get the current file offset */
|
||||||
|
extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file);
|
||||||
extern uLong ZEXPORT unzGetOffset (unzFile file);
|
extern uLong ZEXPORT unzGetOffset (unzFile file);
|
||||||
|
|
||||||
/* Set the current file offset */
|
/* Set the current file offset */
|
||||||
|
extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos);
|
||||||
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
|
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
|
||||||
|
|
||||||
|
|
||||||
|
@ -357,4 +438,4 @@ extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _unz_H */
|
#endif /* _unz64_H */
|
||||||
|
|
1953
unzip/zip.c
1953
unzip/zip.c
File diff suppressed because it is too large
Load Diff
237
unzip/zip.h
237
unzip/zip.h
|
@ -1,19 +1,15 @@
|
||||||
/* zip.h -- IO for compress .zip files using zlib
|
/* zip.h -- IO on .zip files using zlib
|
||||||
Version 1.01h, December 28th, 2009
|
Version 1.1, February 14h, 2010
|
||||||
|
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
Copyright (C) 1998-2009 Gilles Vollant
|
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||||
|
|
||||||
This unzip package allow creates .ZIP file, compatible with PKZip 2.04g
|
Modifications for Zip64 support
|
||||||
WinZip, InfoZip tools and compatible.
|
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||||
Multi volume ZipFile (span) are not supported.
|
|
||||||
Encryption compatible with pkzip 2.04g only supported
|
|
||||||
Old compressions used by old PKZip 1.x are not supported
|
|
||||||
|
|
||||||
For uncompress .zip file, look at unzip.h
|
For more info read MiniZip_info.txt
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
I WAIT FEEDBACK at mail info@winimage.com
|
|
||||||
Visit also http://www.winimage.com/zLibDll/unzip.html for evolution
|
|
||||||
|
|
||||||
Condition of use and distribution are the same than zlib :
|
Condition of use and distribution are the same than zlib :
|
||||||
|
|
||||||
|
@ -33,23 +29,23 @@
|
||||||
misrepresented as being the original software.
|
misrepresented as being the original software.
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Changes
|
||||||
|
|
||||||
|
See header of zip.h
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* for more info about .ZIP format, see
|
#ifndef _zip12_H
|
||||||
http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
|
#define _zip12_H
|
||||||
http://www.info-zip.org/pub/infozip/doc/
|
|
||||||
PkWare has also a specification at :
|
|
||||||
ftp://ftp.pkware.com/probdesc.zip
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _zip_H
|
|
||||||
#define _zip_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//#define HAVE_BZIP2
|
||||||
|
|
||||||
#ifndef _ZLIB_H
|
#ifndef _ZLIB_H
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -58,6 +54,12 @@ extern "C" {
|
||||||
#include "ioapi.h"
|
#include "ioapi.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_BZIP2
|
||||||
|
#include "bzlib.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define Z_BZIP2ED 12
|
||||||
|
|
||||||
#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
|
#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
|
||||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||||
from (void*) without cast */
|
from (void*) without cast */
|
||||||
|
@ -86,12 +88,12 @@ typedef voidp zipFile;
|
||||||
/* tm_zip contain date/time info */
|
/* tm_zip contain date/time info */
|
||||||
typedef struct tm_zip_s
|
typedef struct tm_zip_s
|
||||||
{
|
{
|
||||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
int tm_sec; /* seconds after the minute - [0,59] */
|
||||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
int tm_min; /* minutes after the hour - [0,59] */
|
||||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
int tm_hour; /* hours since midnight - [0,23] */
|
||||||
uInt tm_mday; /* day of the month - [1,31] */
|
int tm_mday; /* day of the month - [1,31] */
|
||||||
uInt tm_mon; /* months since January - [0,11] */
|
int tm_mon; /* months since January - [0,11] */
|
||||||
uInt tm_year; /* years - [1980..2044] */
|
int tm_year; /* years - [1980..2044] */
|
||||||
} tm_zip;
|
} tm_zip;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -111,7 +113,8 @@ typedef const char* zipcharpc;
|
||||||
#define APPEND_STATUS_CREATEAFTER (1)
|
#define APPEND_STATUS_CREATEAFTER (1)
|
||||||
#define APPEND_STATUS_ADDINZIP (2)
|
#define APPEND_STATUS_ADDINZIP (2)
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
|
extern zipFile ZEXPORT zipOpen(const char *pathname, int append);
|
||||||
|
extern zipFile ZEXPORT zipOpen64(const void *pathname, int append);
|
||||||
/*
|
/*
|
||||||
Create a zipfile.
|
Create a zipfile.
|
||||||
pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
|
pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
|
||||||
|
@ -128,15 +131,25 @@ extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
|
||||||
|
|
||||||
/* Note : there is no delete function into a zipfile.
|
/* 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
|
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 delte
|
Of course, you can use RAW reading and writing to copy the file you did not want delete
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern zipFile ZEXPORT zipOpen2 OF((const char *pathname,
|
extern zipFile ZEXPORT zipOpen2(const char *pathname,
|
||||||
int append,
|
int append,
|
||||||
zipcharpc* globalcomment,
|
zipcharpc* globalcomment,
|
||||||
zlib_filefunc_def* pzlib_filefunc_def));
|
zlib_filefunc_def* pzlib_filefunc_def);
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
|
extern zipFile ZEXPORT zipOpen2_64(const void *pathname,
|
||||||
|
int append,
|
||||||
|
zipcharpc* globalcomment,
|
||||||
|
zlib_filefunc64_def* pzlib_filefunc_def);
|
||||||
|
|
||||||
|
extern zipFile ZEXPORT zipOpen3(const void *pathname,
|
||||||
|
int append,
|
||||||
|
zipcharpc* globalcomment,
|
||||||
|
zlib_filefunc64_32_def* pzlib_filefunc64_32_def);
|
||||||
|
|
||||||
|
extern int ZEXPORT zipOpenNewFileInZip(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
|
@ -145,22 +158,9 @@ extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
|
||||||
uInt size_extrafield_global,
|
uInt size_extrafield_global,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level));
|
int level);
|
||||||
/*
|
|
||||||
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)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
extern int ZEXPORT zipOpenNewFileInZip64(zipFile file,
|
||||||
extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
|
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
|
@ -170,13 +170,55 @@ extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
|
||||||
const char* comment,
|
const char* comment,
|
||||||
int method,
|
int method,
|
||||||
int level,
|
int level,
|
||||||
int raw));
|
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 for the local header
|
||||||
|
if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
|
||||||
|
contains the extrafield data for the global 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 ZEXPORT zipOpenNewFileInZip2(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 ZEXPORT zipOpenNewFileInZip2_64(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
|
Same than zipOpenNewFileInZip, except if raw=1, we write raw file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip3(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
|
@ -191,15 +233,34 @@ extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
|
||||||
int memLevel,
|
int memLevel,
|
||||||
int strategy,
|
int strategy,
|
||||||
const char* password,
|
const char* password,
|
||||||
uLong crcForCrypting));
|
uLong crcForCrypting);
|
||||||
|
|
||||||
|
extern int ZEXPORT zipOpenNewFileInZip3_64(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
|
Same than zipOpenNewFileInZip2, except
|
||||||
windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
|
windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
|
||||||
password : crypting password (NULL for no crypting)
|
password : crypting password (NULL for no crypting)
|
||||||
crcForCtypting : crc of file to compress (needed for crypting)
|
crcForCrypting : crc of file to compress (needed for crypting)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file,
|
extern int ZEXPORT zipOpenNewFileInZip4(zipFile file,
|
||||||
const char* filename,
|
const char* filename,
|
||||||
const zip_fileinfo* zipfi,
|
const zip_fileinfo* zipfi,
|
||||||
const void* extrafield_local,
|
const void* extrafield_local,
|
||||||
|
@ -216,42 +277,94 @@ extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file,
|
||||||
const char* password,
|
const char* password,
|
||||||
uLong crcForCrypting,
|
uLong crcForCrypting,
|
||||||
uLong versionMadeBy,
|
uLong versionMadeBy,
|
||||||
uLong flagBase));
|
uLong flagBase);
|
||||||
|
|
||||||
|
|
||||||
|
extern int ZEXPORT zipOpenNewFileInZip4_64(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
|
Same than zipOpenNewFileInZip4, except
|
||||||
versionMadeBy : value for Version made by field
|
versionMadeBy : value for Version made by field
|
||||||
flag : value for flag field (compression level info will be added)
|
flag : value for flag field (compression level info will be added)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
|
|
||||||
|
extern int ZEXPORT zipWriteInFileInZip(zipFile file,
|
||||||
const void* buf,
|
const void* buf,
|
||||||
unsigned len));
|
unsigned len);
|
||||||
/*
|
/*
|
||||||
Write data in the zipfile
|
Write data in the zipfile
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
|
extern int ZEXPORT zipCloseFileInZip(zipFile file);
|
||||||
/*
|
/*
|
||||||
Close the current file in the zipfile
|
Close the current file in the zipfile
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
|
extern int ZEXPORT zipCloseFileInZipRaw(zipFile file,
|
||||||
uLong uncompressed_size,
|
uLong uncompressed_size,
|
||||||
uLong crc32));
|
uLong crc32);
|
||||||
|
|
||||||
|
extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file,
|
||||||
|
ZPOS64_T uncompressed_size,
|
||||||
|
uLong crc32);
|
||||||
|
|
||||||
|
extern int ZEXPORT zipAlreadyThere(zipFile file,
|
||||||
|
char const* name);
|
||||||
/*
|
/*
|
||||||
Close the current file in the zipfile, for fiel opened with
|
See if name is already in file's central directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Close the current file in the zipfile, for file opened with
|
||||||
parameter raw=1 in zipOpenNewFileInZip2
|
parameter raw=1 in zipOpenNewFileInZip2
|
||||||
uncompressed_size and crc32 are value for the uncompressed size
|
uncompressed_size and crc32 are value for the uncompressed size
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ZEXPORT zipClose OF((zipFile file,
|
extern int ZEXPORT zipClose(zipFile file,
|
||||||
const char* global_comment));
|
const char* global_comment);
|
||||||
/*
|
/*
|
||||||
Close the zipfile
|
Close the zipfile
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
extern int ZEXPORT zipRemoveExtraInfoBlock(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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _zip_H */
|
#endif /* _zip64_H */
|
||||||
|
|
Loading…
Reference in New Issue