]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/unzip.c
Fixed notebook redraw problems when using XP theme with Classic appearance.
[wxWidgets.git] / src / common / unzip.c
index ff71a474da12c0358092616e47f2bcb7facbe3d3..04f8a8c0b824c39d5060eec748bba64e88ee7e3a 100644 (file)
@@ -1,15 +1,44 @@
-/* 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/platform.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>
@@ -125,6 +154,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 +184,7 @@ local int unzlocal_getByte(fin,pi)
     }
     else
     {
-        if (ferror(fin)) 
+        if (ferror(fin))
             return UNZ_ERRNO;
         else
             return UNZ_EOF;
@@ -155,7 +193,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 +205,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 +227,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 +239,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 +283,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 +304,7 @@ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivit
                return strcmp(fileName1,fileName2);
 
        return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
-} 
+}
 
 #define BUFREADCOMMENT (0x400)
 
@@ -282,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;
 
@@ -301,13 +339,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 +354,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;
@@ -347,12 +385,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;
@@ -361,6 +399,7 @@ extern unzFile ZEXPORT unzOpen (path)
         return NULL;
 
     fin=fopen(path,"rb");
+
        if (fin==NULL)
                return NULL;
 
@@ -400,7 +439,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 +448,7 @@ extern unzFile ZEXPORT unzOpen (path)
        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;
 
@@ -418,18 +457,17 @@ extern unzFile ZEXPORT unzOpen (path)
                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;
 }
 
 
@@ -495,7 +533,7 @@ local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
 */
 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,
@@ -536,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;
@@ -606,7 +646,7 @@ local int unzlocal_GetCurrentFileInfoInternal (file,
                lSeek -= uSizeRead;
        }
 
-       
+
        if ((err==UNZ_OK) && (extraField!=NULL))
        {
                uLong uSizeRead ;
@@ -616,19 +656,22 @@ 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))
        {
                uLong uSizeRead ;
@@ -641,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;
@@ -719,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)
@@ -754,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;
@@ -783,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);
        }
@@ -825,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;
@@ -865,7 +920,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;
 
@@ -887,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.
@@ -933,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;
@@ -952,29 +1007,29 @@ 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;
 
 
@@ -1019,9 +1074,9 @@ 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 = 
+               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 +1090,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,
@@ -1044,8 +1099,8 @@ 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 = 
+
+                       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,16 +1108,16 @@ 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
                                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);
@@ -1094,8 +1149,8 @@ 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 +1158,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 +1193,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;
@@ -1152,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
@@ -1170,7 +1225,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,12 +1246,12 @@ 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
@@ -1204,9 +1259,9 @@ 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->offset_local_extrafield +
                          pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0)
                return UNZ_ERRNO;
 
@@ -1267,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)
@@ -1292,3 +1346,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 */