-/* unzip.c -- IO on .zip files using zlib
+/*
+
+This file was altered for needs of wxWindows.
+$Id$
+
+*/
+
+/* unzip.c -- IO on .zip files using zlib
Version 0.15 beta, Mar 19th, 1998,
Read unzip.h for more info
+
*/
+#ifndef __VISAGECPP__
+#include "wx/defs.h"
+#endif
+
+#include "wx/setup.h"
+
+#if wxUSE_ZLIB && wxUSE_ZIPSTREAM
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+/*
#include "zlib.h"
+ normally, the compiler options should contain -I../zlib, but it is
+ apparently not the case for all MSW makefiles and so, unless we use
+ configure (which defines __WX_SETUP_H__) or it is explicitly overridden by
+ the user (who can define wxUSE_ZLIB_H_IN_PATH), we hardcode the path here
+*/
+#if defined(__WXMSW__) && !defined(__WX_SETUP_H__) && !defined(wxUSE_ZLIB_H_IN_PATH)
+ #include "../zlib/zlib.h"
+#else
+ #include "zlib.h"
+#endif
+
+
+/* Not the right solution (paths in makefiles) but... */
+#ifdef __BORLANDC__
+#include "../common/unzip.h"
+#else
#include "unzip.h"
+#endif
#ifdef STDC
# include <stddef.h>
file if we are decompressing it */
} unz_s;
+#if defined (__VISAGECPP__) || defined(__BORLANDC__)
+/* VA always requires prototypes */
+int unzlocal_CheckCurrentFileCoherencyHeader (unz_s*, uInt*, uLong*, uInt*);
+#endif
+
+/* disable warnings about K&R declarations until the end of file */
+#ifdef _MSC_VER
+#pragma warning(disable:4131)
+#endif /* VC++ */
/* ===========================================================================
Read a byte from a gz_stream; update next_in and avail_in. Return EOF
}
else
{
- if (ferror(fin))
+ if (ferror(fin))
return UNZ_ERRNO;
else
return UNZ_EOF;
/* ===========================================================================
- Reads a long in LSB order from the given gz_stream. Sets
+ Reads a long in LSB order from the given gz_stream. Sets
*/
local int unzlocal_getShort (fin,pX)
FILE* fin;
err = unzlocal_getByte(fin,&i);
x = (uLong)i;
-
+
if (err==UNZ_OK)
err = unzlocal_getByte(fin,&i);
x += ((uLong)i)<<8;
-
+
if (err==UNZ_OK)
*pX = x;
else
err = unzlocal_getByte(fin,&i);
x = (uLong)i;
-
+
if (err==UNZ_OK)
err = unzlocal_getByte(fin,&i);
x += ((uLong)i)<<8;
if (err==UNZ_OK)
err = unzlocal_getByte(fin,&i);
x += ((uLong)i)<<24;
-
+
if (err==UNZ_OK)
*pX = x;
else
#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
#endif
-/*
+/*
Compare two filename (fileName1,fileName2).
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
return strcmp(fileName1,fileName2);
return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
-}
+}
#define BUFREADCOMMENT (0x400)
uLong uBackRead;
uLong uMaxBack=0xffff; /* maximum size of global comment */
uLong uPosFound=0;
-
+
if (fseek(fin,0,SEEK_END) != 0)
return 0;
uSizeFile = ftell( fin );
-
+
if (uMaxBack>uSizeFile)
uMaxBack = uSizeFile;
{
uLong uReadSize,uReadPos ;
int i;
- if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
uBackRead = uMaxBack;
else
uBackRead+=BUFREADCOMMENT;
uReadPos = uSizeFile-uBackRead ;
-
- uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
(BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
if (fseek(fin,uReadPos,SEEK_SET)!=0)
break;
break;
for (i=(int)uReadSize-3; (i--)>0;)
- if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
{
uPosFound = uReadPos+i;
return uPosFound;
}
+#if defined(__WXMAC__) && !defined(__UNIX__)
+void wxUnix2MacFilename (char *s) ;
+void
+wxUnix2MacFilename (char *s)
+{
+ if (s)
+ {
+ if ( *s == '.' )
+ {
+ /* relative path , since it goes on with slash which is translated to a : */
+ memmove( s , s+1 ,strlen( s ) ) ;
+ }
+ else if ( *s == '/' )
+ {
+ /* absolute path -> on mac just start with the drive name */
+ memmove( s , s+1 ,strlen( s ) ) ;
+ }
+ else
+ {
+/* wxASSERT_MSG( 1 , "unkown path beginning" ) ; */
+ }
+ while (*s)
+ {
+ if (*s == '/' || *s == '\\')
+ {
+ /* convert any back-directory situations */
+ if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) )
+ {
+ *s = ':';
+ memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ;
+ }
+ else
+ *s = ':';
+ }
+
+ s++ ;
+ }
+ }
+}
+extern char * wxBuffer ;
+#endif
+
/*
Open a Zip file. path contain the full pathname (by example,
on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer
uLong central_pos,uL;
FILE * fin ;
- uLong number_disk; /* number of the current dist, used for
+ uLong number_disk; /* number of the current dist, used for
spaning ZIP, unsupported, always 0*/
uLong number_disk_with_CD; /* number the the disk with central dir, used
for spaning ZIP, unsupported, always 0*/
uLong number_entry_CD; /* total number of entries in
- the central dir
+ the central dir
(same than number_entry on nospan) */
int err=UNZ_OK;
if (unz_copyright[0]!=' ')
return NULL;
+#if defined(__WXMAC__) && !defined(__UNIX__)
+ strcpy( wxBuffer , path ) ;
+ wxUnix2MacFilename( wxBuffer ) ;
+ fin=fopen(wxBuffer,"rb");
+#else
fin=fopen(path,"rb");
+#endif
if (fin==NULL)
return NULL;
if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK)
err=UNZ_ERRNO;
- /* offset of start of central directory with respect to the
+ /* offset of start of central directory with respect to the
starting disk number */
if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK)
err=UNZ_ERRNO;
if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK)
err=UNZ_ERRNO;
- if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
(err==UNZ_OK))
err=UNZ_BADZIPFILE;
fclose(fin);
return NULL;
}
-
us.file=fin;
us.byte_before_the_zipfile = central_pos -
(us.offset_central_dir+us.size_central_dir);
us.central_pos = central_pos;
us.pfile_in_zip_read = NULL;
-
+
s=(unz_s*)ALLOC(sizeof(unz_s));
*s=us;
- unzGoToFirstFile((unzFile)s);
- return (unzFile)s;
+ unzGoToFirstFile((unzFile)s);
+ return (unzFile)s;
}
*/
local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
unz_file_info *pfile_info,
- unz_file_info_internal
+ unz_file_info_internal
*pfile_info_internal,
char *szFileName,
uLong fileNameBufferSize,
/* we check the magic */
if (err==UNZ_OK)
+ {
if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
err=UNZ_ERRNO;
else if (uMagic!=0x02014b50)
err=UNZ_BADZIPFILE;
+ }
if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK)
err=UNZ_ERRNO;
lSeek -= uSizeRead;
}
-
+
if ((err==UNZ_OK) && (extraField!=NULL))
{
uLong uSizeRead ;
uSizeRead = extraFieldBufferSize;
if (lSeek!=0)
+ {
if (fseek(s->file,lSeek,SEEK_CUR)==0)
lSeek=0;
else
err=UNZ_ERRNO;
+ }
+
if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1)
err=UNZ_ERRNO;
lSeek += file_info.size_file_extra - uSizeRead;
}
else
- lSeek+=file_info.size_file_extra;
+ lSeek+=file_info.size_file_extra;
+
-
if ((err==UNZ_OK) && (szComment!=NULL))
{
uLong uSizeRead ;
uSizeRead = commentBufferSize;
if (lSeek!=0)
+ {
if (fseek(s->file,lSeek,SEEK_CUR)==0)
lSeek=0;
else
err=UNZ_ERRNO;
+ }
+
if ((file_info.size_file_comment>0) && (commentBufferSize>0))
if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1)
err=UNZ_ERRNO;
extern int ZEXPORT unzGoToNextFile (file)
unzFile file;
{
- unz_s* s;
+ unz_s* s;
int err;
if (file==NULL)
const char *szFileName;
int iCaseSensitivity;
{
- unz_s* s;
+ unz_s* s;
int err;
+ const char *c;
+ char *c2;
+ char szFileName2[UNZ_MAXFILENAMEINZIP+1];
-
uLong num_fileSaved;
uLong pos_in_central_dirSaved;
+ for (c = szFileName, c2 = szFileName2; *c != '\0'; c++, c2++)
+ if (*c == '\\') *c2 = '/';
+ else *c2 = *c;
+ *c2 = '\0';
if (file==NULL)
return UNZ_PARAMERROR;
unzGetCurrentFileInfo(file,NULL,
szCurrentFileName,sizeof(szCurrentFileName)-1,
NULL,0,NULL,0);
+ for (c2 = szCurrentFileName; *c2 != '\0'; c2++) if (*c2 == '\\') *c2 = '/';
if (unzStringFileNameCompare(szCurrentFileName,
- szFileName,iCaseSensitivity)==0)
+ szFileName2,iCaseSensitivity)==0)
return UNZ_OK;
err = unzGoToNextFile(file);
}
if (err==UNZ_OK)
+ {
if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
err=UNZ_ERRNO;
else if (uMagic!=0x04034b50)
err=UNZ_BADZIPFILE;
+ }
if (unzlocal_getShort(s->file,&uData) != UNZ_OK)
err=UNZ_ERRNO;
if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */
err=UNZ_ERRNO;
- else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
((uFlags & 8)==0))
err=UNZ_BADZIPFILE;
return err;
}
-
+
/*
Open for reading data the current file in the zipfile.
If there is no error and the file is opened, the return value is UNZ_OK.
}
pfile_in_zip_read_info->stream_initialised=0;
-
+
if ((s->cur_file_info.compression_method!=0) &&
(s->cur_file_info.compression_method!=Z_DEFLATED))
err=UNZ_BADZIPFILE;
{
pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
pfile_in_zip_read_info->stream.zfree = (free_func)0;
- pfile_in_zip_read_info->stream.opaque = (voidpf)0;
-
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+
err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
if (err == Z_OK)
pfile_in_zip_read_info->stream_initialised=1;
/* windowBits is passed < 0 to tell that there is no zlib header.
* Note that in this case inflate *requires* an extra "dummy" byte
* after the compressed stream in order to complete decompression and
- * return Z_STREAM_END.
- * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+ * return Z_STREAM_END.
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
* size of both compressed and uncompressed data
*/
}
- pfile_in_zip_read_info->rest_read_compressed =
+ pfile_in_zip_read_info->rest_read_compressed =
s->cur_file_info.compressed_size ;
- pfile_in_zip_read_info->rest_read_uncompressed =
+ pfile_in_zip_read_info->rest_read_uncompressed =
s->cur_file_info.uncompressed_size ;
-
- pfile_in_zip_read_info->pos_in_zipfile =
- s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+
+ pfile_in_zip_read_info->pos_in_zipfile =
+ s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
iSizeVar;
-
+
pfile_in_zip_read_info->stream.avail_in = (uInt)0;
pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
pfile_in_zip_read_info->stream.avail_out = (uInt)len;
-
+
if (len>pfile_in_zip_read_info->rest_read_uncompressed)
- pfile_in_zip_read_info->stream.avail_out =
+ pfile_in_zip_read_info->stream.avail_out =
(uInt)pfile_in_zip_read_info->rest_read_uncompressed;
while (pfile_in_zip_read_info->stream.avail_out>0)
if (uReadThis == 0)
return UNZ_EOF;
if (fseek(pfile_in_zip_read_info->file,
- pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->pos_in_zipfile +
pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0)
return UNZ_ERRNO;
if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1,
pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
-
- pfile_in_zip_read_info->stream.next_in =
+
+ pfile_in_zip_read_info->stream.next_in =
(Bytef*)pfile_in_zip_read_info->read_buffer;
pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
}
if (pfile_in_zip_read_info->compression_method==0)
{
uInt uDoCopy,i ;
- if (pfile_in_zip_read_info->stream.avail_out <
+ if (pfile_in_zip_read_info->stream.avail_out <
pfile_in_zip_read_info->stream.avail_in)
uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
else
uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
-
+
for (i=0;i<uDoCopy;i++)
*(pfile_in_zip_read_info->stream.next_out+i) =
*(pfile_in_zip_read_info->stream.next_in+i);
-
+
pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
pfile_in_zip_read_info->stream.next_out,
uDoCopy);
uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
uOutThis = uTotalOutAfter-uTotalOutBefore;
-
- pfile_in_zip_read_info->crc32 =
+
+ pfile_in_zip_read_info->crc32 =
crc32(pfile_in_zip_read_info->crc32,bufBefore,
(uInt)(uOutThis));
uOutThis;
iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
-
+
if (err==Z_STREAM_END)
return (iRead==0) ? UNZ_EOF : iRead;
- if (err!=Z_OK)
+ if (err!=Z_OK)
break;
}
}
/*
- 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 unzeof (file)
unzFile file;
if (pfile_in_zip_read_info==NULL)
return UNZ_PARAMERROR;
-
+
if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
return 1;
else
if buf!=NULL, len is the size of the buffer, the extra header is copied in
buf.
- the return value is the number of bytes copied in buf, or (if <0)
+ the return value is the number of bytes copied in buf, or (if <0)
the error code
*/
extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
if (pfile_in_zip_read_info==NULL)
return UNZ_PARAMERROR;
- size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+ size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
pfile_in_zip_read_info->pos_local_extrafield);
if (buf==NULL)
return (int)size_to_read;
-
+
if (len>size_to_read)
read_now = (uInt)size_to_read;
else
if (read_now==0)
return 0;
-
+
if (fseek(pfile_in_zip_read_info->file,
- pfile_in_zip_read_info->offset_local_extrafield +
+ pfile_in_zip_read_info->offset_local_extrafield +
pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0)
return UNZ_ERRNO;
char *szComment;
uLong uSizeBuf;
{
- int err=UNZ_OK;
unz_s* s;
uLong uReadThis ;
if (file==NULL)
*(szComment+s->gi.size_comment)='\0';
return (int)uReadThis;
}
+
+#else
+
+/* the file shouldn't be empty, som compilers don't like it */
+static const int dummyVariableInUnzip = 17;
+
+#endif /* wxUSE_ZLIB && wxUSE_ZIPSTREAM */