]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/unzip.c
fixed memory leak in colour parsing code
[wxWidgets.git] / src / common / unzip.c
index ce2260231ceec58a4c67c8837aeb907b6a136e50..551b1c6b2d78394eb3be4f5d8bef730dd6e58baa 100644 (file)
@@ -1,9 +1,19 @@
-/* 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 <stdlib.h>
 #include <string.h>
 #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 <stddef.h>
@@ -128,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
@@ -149,7 +174,7 @@ local int unzlocal_getByte(fin,pi)
     }
     else
     {
-        if (ferror(fin)) 
+        if (ferror(fin))
             return UNZ_ERRNO;
         else
             return UNZ_EOF;
@@ -158,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;
@@ -170,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
@@ -192,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;
@@ -204,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
@@ -248,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
@@ -269,7 +294,7 @@ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivit
                return strcmp(fileName1,fileName2);
 
        return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
-} 
+}
 
 #define BUFREADCOMMENT (0x400)
 
@@ -304,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;
@@ -319,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;
@@ -333,6 +358,48 @@ local uLong unzlocal_SearchCentralDir(fin)
        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
@@ -350,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;
@@ -363,7 +430,13 @@ extern unzFile ZEXPORT unzOpen (path)
     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;
 
@@ -403,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;
@@ -412,7 +485,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;
 
@@ -421,7 +494,6 @@ 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);
@@ -498,7 +570,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,
@@ -539,10 +611,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;
@@ -619,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))
@@ -644,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;
@@ -759,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;
 
@@ -786,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);
        }
@@ -828,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;
@@ -868,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;
 
@@ -955,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;
@@ -1024,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)
@@ -1038,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,
@@ -1048,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;
                }
@@ -1056,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
@@ -1098,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));
 
@@ -1106,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;
                }
        }
@@ -1141,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;
@@ -1173,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)
@@ -1194,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)
@@ -1209,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;
 
@@ -1270,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)
@@ -1296,4 +1384,9 @@ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
        return (int)uReadThis;
 }
 
-#endif
+#else
+
+/* the file shouldn't be empty, som compilers don't like it */
+static const int dummyVariableInUnzip = 17;
+
+#endif /* wxUSE_ZLIB && wxUSE_ZIPSTREAM */