X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/076bae67da7d0d6909f4a4f364b8fe04fdf59b9d..99e839da3c9c40a3dac7cf1bb841d6459fcac1b0:/src/common/unzip.c diff --git a/src/common/unzip.c b/src/common/unzip.c index eb27f0df89..04f8a8c0b8 100644 --- a/src/common/unzip.c +++ b/src/common/unzip.c @@ -12,16 +12,26 @@ $Id$ */ - - -#include "wx/setup.h" +#include "wx/platform.h" #if wxUSE_ZLIB && wxUSE_ZIPSTREAM #include #include #include +/* #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__ @@ -144,11 +154,16 @@ typedef struct file if we are decompressing it */ } unz_s; -#if defined (__VISAGECPP__) +#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 for end of file. @@ -305,13 +320,13 @@ local uLong unzlocal_SearchCentralDir(fin) 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; @@ -329,7 +344,7 @@ local uLong unzlocal_SearchCentralDir(fin) else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; - + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (fseek(fin,uReadPos,SEEK_SET)!=0) @@ -353,48 +368,6 @@ local uLong unzlocal_SearchCentralDir(fin) return uPosFound; } -#ifdef __WXMAC__ -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 @@ -425,13 +398,8 @@ extern unzFile ZEXPORT unzOpen (path) if (unz_copyright[0]!=' ') return NULL; -#ifdef __WXMAC__ - strcpy( wxBuffer , path ) ; - wxUnix2MacFilename( wxBuffer ) ; - fin=fopen(wxBuffer,"rb"); -#else fin=fopen(path,"rb"); -#endif + if (fin==NULL) return NULL; @@ -494,12 +462,12 @@ extern unzFile ZEXPORT unzOpen (path) (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; } @@ -606,10 +574,12 @@ local int unzlocal_GetCurrentFileInfoInternal (file, /* 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; @@ -676,7 +646,7 @@ local int unzlocal_GetCurrentFileInfoInternal (file, lSeek -= uSizeRead; } - + if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; @@ -686,10 +656,13 @@ local int unzlocal_GetCurrentFileInfoInternal (file, 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; @@ -698,7 +671,7 @@ local int unzlocal_GetCurrentFileInfoInternal (file, else lSeek+=file_info.size_file_extra; - + if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; @@ -711,10 +684,13 @@ local int unzlocal_GetCurrentFileInfoInternal (file, 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; @@ -789,7 +765,7 @@ extern int ZEXPORT unzGoToFirstFile (file) extern int ZEXPORT unzGoToNextFile (file) unzFile file; { - unz_s* s; + unz_s* s; int err; if (file==NULL) @@ -824,13 +800,19 @@ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) 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; @@ -853,8 +835,9 @@ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) 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); } @@ -895,10 +878,12 @@ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, 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; @@ -957,7 +942,7 @@ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, 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. @@ -1003,7 +988,7 @@ extern int ZEXPORT unzOpenCurrentFile (file) } 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; @@ -1040,11 +1025,11 @@ extern int ZEXPORT unzOpenCurrentFile (file) 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 + iSizeVar; - + pfile_in_zip_read_info->stream.avail_in = (uInt)0; @@ -1089,7 +1074,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) 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 = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; @@ -1114,7 +1099,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) 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 = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; @@ -1128,11 +1113,11 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - + for (i=0;istream.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); @@ -1164,7 +1149,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; - + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); @@ -1222,7 +1207,7 @@ extern int ZEXPORT unzeof (file) if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; - + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else @@ -1266,7 +1251,7 @@ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) if (buf==NULL) return (int)size_to_read; - + if (len>size_to_read) read_now = (uInt)size_to_read; else @@ -1274,7 +1259,7 @@ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) 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->pos_local_extrafield,SEEK_SET)!=0) @@ -1337,7 +1322,6 @@ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) char *szComment; uLong uSizeBuf; { - int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL)