X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5526e819eca4465ed5520d49bccfebc6a28045e0..cdddaeea1043fa8fd0c0efdce98b7370fb02ac05:/src/common/unzip.c diff --git a/src/common/unzip.c b/src/common/unzip.c index ff71a474da..be48958cfb 100644 --- a/src/common/unzip.c +++ b/src/common/unzip.c @@ -1,15 +1,34 @@ -/* 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 + */ + +#include "wx/setup.h" + +#if wxUSE_ZLIB && wxUSE_ZIPSTREAM + #include #include #include #include "zlib.h" + +/* Not the right solution (paths in makefiles) but... */ +#ifdef __BORLANDC__ +#include "../common/unzip.h" +#else #include "unzip.h" +#endif #ifdef STDC # include @@ -125,6 +144,15 @@ typedef struct 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 @@ -146,7 +174,7 @@ local int unzlocal_getByte(fin,pi) } else { - if (ferror(fin)) + if (ferror(fin)) return UNZ_ERRNO; else return UNZ_EOF; @@ -155,7 +183,7 @@ local int unzlocal_getByte(fin,pi) /* =========================================================================== - 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; @@ -167,11 +195,11 @@ local int unzlocal_getShort (fin,pX) 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 @@ -189,7 +217,7 @@ local int unzlocal_getLong (fin,pX) err = unzlocal_getByte(fin,&i); x = (uLong)i; - + if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<8; @@ -201,7 +229,7 @@ local int unzlocal_getLong (fin,pX) if (err==UNZ_OK) err = unzlocal_getByte(fin,&i); x += ((uLong)i)<<24; - + if (err==UNZ_OK) *pX = x; else @@ -245,7 +273,7 @@ local int strcmpcasenosensitive_internal (fileName1,fileName2) #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 @@ -266,7 +294,7 @@ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivit return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} +} #define BUFREADCOMMENT (0x400) @@ -301,13 +329,13 @@ local uLong unzlocal_SearchCentralDir(fin) { 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; @@ -316,7 +344,7 @@ local uLong unzlocal_SearchCentralDir(fin) 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; @@ -330,6 +358,48 @@ 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 @@ -347,12 +417,12 @@ extern unzFile ZEXPORT unzOpen (path) 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; @@ -360,7 +430,13 @@ 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; @@ -400,7 +476,7 @@ extern unzFile ZEXPORT unzOpen (path) 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; @@ -409,7 +485,7 @@ extern unzFile ZEXPORT unzOpen (path) if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; - if ((central_posfile,&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; @@ -616,17 +693,20 @@ 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; 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)) @@ -641,10 +721,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; @@ -756,12 +839,18 @@ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) { 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; @@ -783,8 +872,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); } @@ -825,10 +915,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; @@ -865,7 +957,7 @@ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, 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; @@ -952,27 +1044,27 @@ extern int ZEXPORT unzOpenCurrentFile (file) { 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; @@ -1021,7 +1113,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) 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) @@ -1035,7 +1127,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) 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, @@ -1045,7 +1137,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) 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; } @@ -1053,7 +1145,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) 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 @@ -1095,7 +1187,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 = + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); @@ -1103,10 +1195,10 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) 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; } } @@ -1138,7 +1230,7 @@ extern z_off_t ZEXPORT unztell (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 unzeof (file) unzFile file; @@ -1170,7 +1262,7 @@ extern int ZEXPORT unzeof (file) 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) @@ -1191,7 +1283,7 @@ 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) @@ -1206,7 +1298,7 @@ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) 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; @@ -1267,7 +1359,6 @@ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) char *szComment; uLong uSizeBuf; { - int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL) @@ -1292,3 +1383,10 @@ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) *(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 */