kusano fc6ab3
/* unzip.c -- IO for uncompress .zip files using zlib
kusano fc6ab3
   Version 1.1, February 14h, 2010
kusano fc6ab3
   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
kusano fc6ab3
kusano fc6ab3
         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
kusano fc6ab3
kusano fc6ab3
         Modifications of Unzip for Zip64
kusano fc6ab3
         Copyright (C) 2007-2008 Even Rouault
kusano fc6ab3
kusano fc6ab3
         Modifications for Zip64 support on both zip and unzip
kusano fc6ab3
         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
kusano fc6ab3
kusano fc6ab3
         For more info read MiniZip_info.txt
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
  ------------------------------------------------------------------------------------
kusano fc6ab3
  Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
kusano fc6ab3
  compatibility with older software. The following is from the original crypt.c.
kusano fc6ab3
  Code woven in by Terry Thorsen 1/2003.
kusano fc6ab3
kusano fc6ab3
  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
kusano fc6ab3
kusano fc6ab3
  See the accompanying file LICENSE, version 2000-Apr-09 or later
kusano fc6ab3
  (the contents of which are also included in zip.h) for terms of use.
kusano fc6ab3
  If, for some reason, all these files are missing, the Info-ZIP license
kusano fc6ab3
  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
kusano fc6ab3
kusano fc6ab3
        crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]
kusano fc6ab3
kusano fc6ab3
  The encryption/decryption parts of this source code (as opposed to the
kusano fc6ab3
  non-echoing password parts) were originally written in Europe.  The
kusano fc6ab3
  whole source package can be freely distributed, including from the USA.
kusano fc6ab3
  (Prior to January 2000, re-export from the US was a violation of US law.)
kusano fc6ab3
kusano fc6ab3
        This encryption code is a direct transcription of the algorithm from
kusano fc6ab3
  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
kusano fc6ab3
  file (appnote.txt) is distributed with the PKZIP program (even in the
kusano fc6ab3
  version without encryption capabilities).
kusano fc6ab3
kusano fc6ab3
        ------------------------------------------------------------------------------------
kusano fc6ab3
kusano fc6ab3
        Changes in unzip.c
kusano fc6ab3
kusano fc6ab3
        2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos
kusano fc6ab3
  2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz*
kusano fc6ab3
  2007-2008 - Even Rouault - Remove old C style function prototypes
kusano fc6ab3
  2007-2008 - Even Rouault - Add unzip support for ZIP64
kusano fc6ab3
kusano fc6ab3
        Copyright (C) 2007-2008 Even Rouault
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
        Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again).
kusano fc6ab3
  Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
kusano fc6ab3
                                should only read the compressed/uncompressed size from the Zip64 format if
kusano fc6ab3
                                the size from normal header was 0xFFFFFFFF
kusano fc6ab3
  Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
kusano fc6ab3
        Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required)
kusano fc6ab3
                                Patch created by Daniel Borca
kusano fc6ab3
kusano fc6ab3
  Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
kusano fc6ab3
kusano fc6ab3
  Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson
kusano fc6ab3
kusano fc6ab3
*/
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
#include <stdio.h></stdio.h>
kusano fc6ab3
#include <stdlib.h></stdlib.h>
kusano fc6ab3
#include <string.h></string.h>
kusano fc6ab3
kusano fc6ab3
#ifndef NOUNCRYPT
kusano fc6ab3
        #define NOUNCRYPT
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
#include "zlib.h"
kusano fc6ab3
#include "unzip.h"
kusano fc6ab3
kusano fc6ab3
#ifdef STDC
kusano fc6ab3
#  include <stddef.h></stddef.h>
kusano fc6ab3
#  include <string.h></string.h>
kusano fc6ab3
#  include <stdlib.h></stdlib.h>
kusano fc6ab3
#endif
kusano fc6ab3
#ifdef NO_ERRNO_H
kusano fc6ab3
    extern int errno;
kusano fc6ab3
#else
kusano fc6ab3
#   include <errno.h></errno.h>
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
#ifndef local
kusano fc6ab3
#  define local static
kusano fc6ab3
#endif
kusano fc6ab3
/* compile with -Dlocal if your debugger can't find static symbols */
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
#ifndef CASESENSITIVITYDEFAULT_NO
kusano fc6ab3
#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
kusano fc6ab3
#    define CASESENSITIVITYDEFAULT_NO
kusano fc6ab3
#  endif
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
#ifndef UNZ_BUFSIZE
kusano fc6ab3
#define UNZ_BUFSIZE (16384)
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
#ifndef UNZ_MAXFILENAMEINZIP
kusano fc6ab3
#define UNZ_MAXFILENAMEINZIP (256)
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
#ifndef ALLOC
kusano fc6ab3
# define ALLOC(size) (malloc(size))
kusano fc6ab3
#endif
kusano fc6ab3
#ifndef TRYFREE
kusano fc6ab3
# define TRYFREE(p) {if (p) free(p);}
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
#define SIZECENTRALDIRITEM (0x2e)
kusano fc6ab3
#define SIZEZIPLOCALHEADER (0x1e)
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
const char unz_copyright[] =
kusano fc6ab3
   " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
kusano fc6ab3
kusano fc6ab3
/* unz_file_info_interntal contain internal info about a file in zipfile*/
kusano fc6ab3
typedef struct unz_file_info64_internal_s
kusano fc6ab3
{
kusano fc6ab3
    ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
kusano fc6ab3
} unz_file_info64_internal;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/* file_in_zip_read_info_s contain internal information about a file in zipfile,
kusano fc6ab3
    when reading and decompress it */
kusano fc6ab3
typedef struct
kusano fc6ab3
{
kusano fc6ab3
    char  *read_buffer;         /* internal buffer for compressed data */
kusano fc6ab3
    z_stream stream;            /* zLib stream structure for inflate */
kusano fc6ab3
kusano fc6ab3
#ifdef HAVE_BZIP2
kusano fc6ab3
    bz_stream bstream;          /* bzLib stream structure for bziped */
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
    ZPOS64_T pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
kusano fc6ab3
    uLong stream_initialised;   /* flag set if stream structure is initialised*/
kusano fc6ab3
kusano fc6ab3
    ZPOS64_T offset_local_extrafield;/* offset of the local extra field */
kusano fc6ab3
    uInt  size_local_extrafield;/* size of the local extra field */
kusano fc6ab3
    ZPOS64_T pos_local_extrafield;   /* position in the local extra field in read*/
kusano fc6ab3
    ZPOS64_T total_out_64;
kusano fc6ab3
kusano fc6ab3
    uLong crc32;                /* crc32 of all data uncompressed */
kusano fc6ab3
    uLong crc32_wait;           /* crc32 we must obtain after decompress all */
kusano fc6ab3
    ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
kusano fc6ab3
    ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
kusano fc6ab3
    zlib_filefunc64_32_def z_filefunc;
kusano fc6ab3
    voidpf filestream;        /* io structore of the zipfile */
kusano fc6ab3
    uLong compression_method;   /* compression method (0==store) */
kusano fc6ab3
    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
kusano fc6ab3
    int   raw;
kusano fc6ab3
} file_in_zip64_read_info_s;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/* unz64_s contain internal information about the zipfile
kusano fc6ab3
*/
kusano fc6ab3
typedef struct
kusano fc6ab3
{
kusano fc6ab3
    zlib_filefunc64_32_def z_filefunc;
kusano fc6ab3
    int is64bitOpenFunction;
kusano fc6ab3
    voidpf filestream;        /* io structore of the zipfile */
kusano fc6ab3
    unz_global_info64 gi;       /* public global information */
kusano fc6ab3
    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
kusano fc6ab3
    ZPOS64_T num_file;             /* number of the current file in the zipfile*/
kusano fc6ab3
    ZPOS64_T pos_in_central_dir;   /* pos of the current file in the central dir*/
kusano fc6ab3
    ZPOS64_T current_file_ok;      /* flag about the usability of the current file*/
kusano fc6ab3
    ZPOS64_T central_pos;          /* position of the beginning of the central dir*/
kusano fc6ab3
kusano fc6ab3
    ZPOS64_T size_central_dir;     /* size of the central directory  */
kusano fc6ab3
    ZPOS64_T offset_central_dir;   /* offset of start of central directory with
kusano fc6ab3
                                   respect to the starting disk number */
kusano fc6ab3
kusano fc6ab3
    unz_file_info64 cur_file_info; /* public info about the current file in zip*/
kusano fc6ab3
    unz_file_info64_internal cur_file_info_internal; /* private info about it*/
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current
kusano fc6ab3
                                        file if we are decompressing it */
kusano fc6ab3
    int encrypted;
kusano fc6ab3
kusano fc6ab3
    int isZip64;
kusano fc6ab3
kusano fc6ab3
#    ifndef NOUNCRYPT
kusano fc6ab3
    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
kusano fc6ab3
    const z_crc_t* pcrc_32_tab;
kusano fc6ab3
#    endif
kusano fc6ab3
} unz64_s;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
#ifndef NOUNCRYPT
kusano fc6ab3
#include "crypt.h"
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
/* ===========================================================================
kusano fc6ab3
     Read a byte from a gz_stream; update next_in and avail_in. Return EOF
kusano fc6ab3
   for end of file.
kusano fc6ab3
   IN assertion: the stream s has been sucessfully opened for reading.
kusano fc6ab3
*/
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
local int unz64local_getByte OF((
kusano fc6ab3
    const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
    voidpf filestream,
kusano fc6ab3
    int *pi));
kusano fc6ab3
kusano fc6ab3
local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)
kusano fc6ab3
{
kusano fc6ab3
    unsigned char c;
kusano fc6ab3
    int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
kusano fc6ab3
    if (err==1)
kusano fc6ab3
    {
kusano fc6ab3
        *pi = (int)c;
kusano fc6ab3
        return UNZ_OK;
kusano fc6ab3
    }
kusano fc6ab3
    else
kusano fc6ab3
    {
kusano fc6ab3
        if (ZERROR64(*pzlib_filefunc_def,filestream))
kusano fc6ab3
            return UNZ_ERRNO;
kusano fc6ab3
        else
kusano fc6ab3
            return UNZ_EOF;
kusano fc6ab3
    }
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/* ===========================================================================
kusano fc6ab3
   Reads a long in LSB order from the given gz_stream. Sets
kusano fc6ab3
*/
kusano fc6ab3
local int unz64local_getShort OF((
kusano fc6ab3
    const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
    voidpf filestream,
kusano fc6ab3
    uLong *pX));
kusano fc6ab3
kusano fc6ab3
local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
                             voidpf filestream,
kusano fc6ab3
                             uLong *pX)
kusano fc6ab3
{
kusano fc6ab3
    uLong x ;
kusano fc6ab3
    int i = 0;
kusano fc6ab3
    int err;
kusano fc6ab3
kusano fc6ab3
    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x = (uLong)i;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((uLong)i)<<8;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        *pX = x;
kusano fc6ab3
    else
kusano fc6ab3
        *pX = 0;
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
local int unz64local_getLong OF((
kusano fc6ab3
    const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
    voidpf filestream,
kusano fc6ab3
    uLong *pX));
kusano fc6ab3
kusano fc6ab3
local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
                            voidpf filestream,
kusano fc6ab3
                            uLong *pX)
kusano fc6ab3
{
kusano fc6ab3
    uLong x ;
kusano fc6ab3
    int i = 0;
kusano fc6ab3
    int err;
kusano fc6ab3
kusano fc6ab3
    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x = (uLong)i;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((uLong)i)<<8;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((uLong)i)<<16;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x += ((uLong)i)<<24;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        *pX = x;
kusano fc6ab3
    else
kusano fc6ab3
        *pX = 0;
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
local int unz64local_getLong64 OF((
kusano fc6ab3
    const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
    voidpf filestream,
kusano fc6ab3
    ZPOS64_T *pX));
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
                            voidpf filestream,
kusano fc6ab3
                            ZPOS64_T *pX)
kusano fc6ab3
{
kusano fc6ab3
    ZPOS64_T x ;
kusano fc6ab3
    int i = 0;
kusano fc6ab3
    int err;
kusano fc6ab3
kusano fc6ab3
    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x = (ZPOS64_T)i;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((ZPOS64_T)i)<<8;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((ZPOS64_T)i)<<16;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((ZPOS64_T)i)<<24;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((ZPOS64_T)i)<<32;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((ZPOS64_T)i)<<40;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((ZPOS64_T)i)<<48;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
kusano fc6ab3
    x |= ((ZPOS64_T)i)<<56;
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
        *pX = x;
kusano fc6ab3
    else
kusano fc6ab3
        *pX = 0;
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/* My own strcmpi / strcasecmp */
kusano fc6ab3
local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2)
kusano fc6ab3
{
kusano fc6ab3
    for (;;)
kusano fc6ab3
    {
kusano fc6ab3
        char c1=*(fileName1++);
kusano fc6ab3
        char c2=*(fileName2++);
kusano fc6ab3
        if ((c1>='a') && (c1<='z'))
kusano fc6ab3
            c1 -= 0x20;
kusano fc6ab3
        if ((c2>='a') && (c2<='z'))
kusano fc6ab3
            c2 -= 0x20;
kusano fc6ab3
        if (c1=='\0')
kusano fc6ab3
            return ((c2=='\0') ? 0 : -1);
kusano fc6ab3
        if (c2=='\0')
kusano fc6ab3
            return 1;
kusano fc6ab3
        if (c1
kusano fc6ab3
            return -1;
kusano fc6ab3
        if (c1>c2)
kusano fc6ab3
            return 1;
kusano fc6ab3
    }
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
#ifdef  CASESENSITIVITYDEFAULT_NO
kusano fc6ab3
#define CASESENSITIVITYDEFAULTVALUE 2
kusano fc6ab3
#else
kusano fc6ab3
#define CASESENSITIVITYDEFAULTVALUE 1
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
#ifndef STRCMPCASENOSENTIVEFUNCTION
kusano fc6ab3
#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
   Compare two filename (fileName1,fileName2).
kusano fc6ab3
   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
kusano fc6ab3
   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
kusano fc6ab3
                                                                or strcasecmp)
kusano fc6ab3
   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
kusano fc6ab3
        (like 1 on Unix, 2 on Windows)
kusano fc6ab3
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzStringFileNameCompare (const char*  fileName1,
kusano fc6ab3
                                                 const char*  fileName2,
kusano fc6ab3
                                                 int iCaseSensitivity)
kusano fc6ab3
kusano fc6ab3
{
kusano fc6ab3
    if (iCaseSensitivity==0)
kusano fc6ab3
        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
kusano fc6ab3
kusano fc6ab3
    if (iCaseSensitivity==1)
kusano fc6ab3
        return strcmp(fileName1,fileName2);
kusano fc6ab3
kusano fc6ab3
    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
#ifndef BUFREADCOMMENT
kusano fc6ab3
#define BUFREADCOMMENT (0x400)
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Locate the Central directory of a zipfile (at the end, just before
kusano fc6ab3
    the global comment)
kusano fc6ab3
*/
kusano fc6ab3
local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
kusano fc6ab3
local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
kusano fc6ab3
{
kusano fc6ab3
    unsigned char* buf;
kusano fc6ab3
    ZPOS64_T uSizeFile;
kusano fc6ab3
    ZPOS64_T uBackRead;
kusano fc6ab3
    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
kusano fc6ab3
    ZPOS64_T uPosFound=0;
kusano fc6ab3
kusano fc6ab3
    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
kusano fc6ab3
kusano fc6ab3
    if (uMaxBack>uSizeFile)
kusano fc6ab3
        uMaxBack = uSizeFile;
kusano fc6ab3
kusano fc6ab3
    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
kusano fc6ab3
    if (buf==NULL)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    uBackRead = 4;
kusano fc6ab3
    while (uBackRead
kusano fc6ab3
    {
kusano fc6ab3
        uLong uReadSize;
kusano fc6ab3
        ZPOS64_T uReadPos ;
kusano fc6ab3
        int i;
kusano fc6ab3
        if (uBackRead+BUFREADCOMMENT>uMaxBack)
kusano fc6ab3
            uBackRead = uMaxBack;
kusano fc6ab3
        else
kusano fc6ab3
            uBackRead+=BUFREADCOMMENT;
kusano fc6ab3
        uReadPos = uSizeFile-uBackRead ;
kusano fc6ab3
kusano fc6ab3
        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
kusano fc6ab3
                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
kusano fc6ab3
        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
            break;
kusano fc6ab3
kusano fc6ab3
        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
kusano fc6ab3
            break;
kusano fc6ab3
kusano fc6ab3
        for (i=(int)uReadSize-3; (i--)>0;)
kusano fc6ab3
            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
kusano fc6ab3
                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
kusano fc6ab3
            {
kusano fc6ab3
                uPosFound = uReadPos+i;
kusano fc6ab3
                break;
kusano fc6ab3
            }
kusano fc6ab3
kusano fc6ab3
        if (uPosFound!=0)
kusano fc6ab3
            break;
kusano fc6ab3
    }
kusano fc6ab3
    TRYFREE(buf);
kusano fc6ab3
    return uPosFound;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Locate the Central directory 64 of a zipfile (at the end, just before
kusano fc6ab3
    the global comment)
kusano fc6ab3
*/
kusano fc6ab3
local ZPOS64_T unz64local_SearchCentralDir64 OF((
kusano fc6ab3
    const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
    voidpf filestream));
kusano fc6ab3
kusano fc6ab3
local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
kusano fc6ab3
                                      voidpf filestream)
kusano fc6ab3
{
kusano fc6ab3
    unsigned char* buf;
kusano fc6ab3
    ZPOS64_T uSizeFile;
kusano fc6ab3
    ZPOS64_T uBackRead;
kusano fc6ab3
    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
kusano fc6ab3
    ZPOS64_T uPosFound=0;
kusano fc6ab3
    uLong uL;
kusano fc6ab3
                ZPOS64_T relativeOffset;
kusano fc6ab3
kusano fc6ab3
    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
kusano fc6ab3
kusano fc6ab3
    if (uMaxBack>uSizeFile)
kusano fc6ab3
        uMaxBack = uSizeFile;
kusano fc6ab3
kusano fc6ab3
    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
kusano fc6ab3
    if (buf==NULL)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    uBackRead = 4;
kusano fc6ab3
    while (uBackRead
kusano fc6ab3
    {
kusano fc6ab3
        uLong uReadSize;
kusano fc6ab3
        ZPOS64_T uReadPos;
kusano fc6ab3
        int i;
kusano fc6ab3
        if (uBackRead+BUFREADCOMMENT>uMaxBack)
kusano fc6ab3
            uBackRead = uMaxBack;
kusano fc6ab3
        else
kusano fc6ab3
            uBackRead+=BUFREADCOMMENT;
kusano fc6ab3
        uReadPos = uSizeFile-uBackRead ;
kusano fc6ab3
kusano fc6ab3
        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
kusano fc6ab3
                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
kusano fc6ab3
        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
            break;
kusano fc6ab3
kusano fc6ab3
        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
kusano fc6ab3
            break;
kusano fc6ab3
kusano fc6ab3
        for (i=(int)uReadSize-3; (i--)>0;)
kusano fc6ab3
            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
kusano fc6ab3
                ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
kusano fc6ab3
            {
kusano fc6ab3
                uPosFound = uReadPos+i;
kusano fc6ab3
                break;
kusano fc6ab3
            }
kusano fc6ab3
kusano fc6ab3
        if (uPosFound!=0)
kusano fc6ab3
            break;
kusano fc6ab3
    }
kusano fc6ab3
    TRYFREE(buf);
kusano fc6ab3
    if (uPosFound == 0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    /* Zip64 end of central directory locator */
kusano fc6ab3
    if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    /* the signature, already checked */
kusano fc6ab3
    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    /* number of the disk with the start of the zip64 end of  central directory */
kusano fc6ab3
    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
kusano fc6ab3
        return 0;
kusano fc6ab3
    if (uL != 0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    /* relative offset of the zip64 end of central directory record */
kusano fc6ab3
    if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    /* total number of disks */
kusano fc6ab3
    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
kusano fc6ab3
        return 0;
kusano fc6ab3
    if (uL != 1)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    /* Goto end of central directory record */
kusano fc6ab3
    if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
     /* the signature */
kusano fc6ab3
    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    if (uL != 0x06064b50)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    return relativeOffset;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Open a Zip file. path contain the full pathname (by example,
kusano fc6ab3
     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
kusano fc6ab3
     "zlib/zlib114.zip".
kusano fc6ab3
     If the zipfile cannot be opened (file doesn't exist or in not valid), the
kusano fc6ab3
       return value is NULL.
kusano fc6ab3
     Else, the return value is a unzFile Handle, usable with other function
kusano fc6ab3
       of this unzip package.
kusano fc6ab3
*/
kusano fc6ab3
local unzFile unzOpenInternal (const void *path,
kusano fc6ab3
                               zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
kusano fc6ab3
                               int is64bitOpenFunction)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s us;
kusano fc6ab3
    unz64_s *s;
kusano fc6ab3
    ZPOS64_T central_pos;
kusano fc6ab3
    uLong   uL;
kusano fc6ab3
kusano fc6ab3
    uLong number_disk;          /* number of the current dist, used for
kusano fc6ab3
                                   spaning ZIP, unsupported, always 0*/
kusano fc6ab3
    uLong number_disk_with_CD;  /* number the the disk with central dir, used
kusano fc6ab3
                                   for spaning ZIP, unsupported, always 0*/
kusano fc6ab3
    ZPOS64_T number_entry_CD;      /* total number of entries in
kusano fc6ab3
                                   the central dir
kusano fc6ab3
                                   (same than number_entry on nospan) */
kusano fc6ab3
kusano fc6ab3
    int err=UNZ_OK;
kusano fc6ab3
kusano fc6ab3
    if (unz_copyright[0]!=' ')
kusano fc6ab3
        return NULL;
kusano fc6ab3
kusano fc6ab3
    us.z_filefunc.zseek32_file = NULL;
kusano fc6ab3
    us.z_filefunc.ztell32_file = NULL;
kusano fc6ab3
    if (pzlib_filefunc64_32_def==NULL)
kusano fc6ab3
        fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
kusano fc6ab3
    else
kusano fc6ab3
        us.z_filefunc = *pzlib_filefunc64_32_def;
kusano fc6ab3
    us.is64bitOpenFunction = is64bitOpenFunction;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    us.filestream = ZOPEN64(us.z_filefunc,
kusano fc6ab3
                                                 path,
kusano fc6ab3
                                                 ZLIB_FILEFUNC_MODE_READ |
kusano fc6ab3
                                                 ZLIB_FILEFUNC_MODE_EXISTING);
kusano fc6ab3
    if (us.filestream==NULL)
kusano fc6ab3
        return NULL;
kusano fc6ab3
kusano fc6ab3
    central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
kusano fc6ab3
    if (central_pos)
kusano fc6ab3
    {
kusano fc6ab3
        uLong uS;
kusano fc6ab3
        ZPOS64_T uL64;
kusano fc6ab3
kusano fc6ab3
        us.isZip64 = 1;
kusano fc6ab3
kusano fc6ab3
        if (ZSEEK64(us.z_filefunc, us.filestream,
kusano fc6ab3
                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* the signature, already checked */
kusano fc6ab3
        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* size of zip64 end of central directory record */
kusano fc6ab3
        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* version made by */
kusano fc6ab3
        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* version needed to extract */
kusano fc6ab3
        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* number of this disk */
kusano fc6ab3
        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* number of the disk with the start of the central directory */
kusano fc6ab3
        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* total number of entries in the central directory on this disk */
kusano fc6ab3
        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* total number of entries in the central directory */
kusano fc6ab3
        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        if ((number_entry_CD!=us.gi.number_entry) ||
kusano fc6ab3
            (number_disk_with_CD!=0) ||
kusano fc6ab3
            (number_disk!=0))
kusano fc6ab3
            err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
        /* size of the central directory */
kusano fc6ab3
        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* offset of start of central directory with respect to the
kusano fc6ab3
          starting disk number */
kusano fc6ab3
        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        us.gi.size_comment = 0;
kusano fc6ab3
    }
kusano fc6ab3
    else
kusano fc6ab3
    {
kusano fc6ab3
        central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
kusano fc6ab3
        if (central_pos==0)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        us.isZip64 = 0;
kusano fc6ab3
kusano fc6ab3
        if (ZSEEK64(us.z_filefunc, us.filestream,
kusano fc6ab3
                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* the signature, already checked */
kusano fc6ab3
        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* number of this disk */
kusano fc6ab3
        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* number of the disk with the start of the central directory */
kusano fc6ab3
        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        /* total number of entries in the central dir on this disk */
kusano fc6ab3
        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
        us.gi.number_entry = uL;
kusano fc6ab3
kusano fc6ab3
        /* total number of entries in the central dir */
kusano fc6ab3
        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
        number_entry_CD = uL;
kusano fc6ab3
kusano fc6ab3
        if ((number_entry_CD!=us.gi.number_entry) ||
kusano fc6ab3
            (number_disk_with_CD!=0) ||
kusano fc6ab3
            (number_disk!=0))
kusano fc6ab3
            err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
        /* size of the central directory */
kusano fc6ab3
        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
        us.size_central_dir = uL;
kusano fc6ab3
kusano fc6ab3
        /* offset of start of central directory with respect to the
kusano fc6ab3
            starting disk number */
kusano fc6ab3
        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
        us.offset_central_dir = uL;
kusano fc6ab3
kusano fc6ab3
        /* zipfile comment length */
kusano fc6ab3
        if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    if ((central_pos
kusano fc6ab3
        (err==UNZ_OK))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    if (err!=UNZ_OK)
kusano fc6ab3
    {
kusano fc6ab3
        ZCLOSE64(us.z_filefunc, us.filestream);
kusano fc6ab3
        return NULL;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    us.byte_before_the_zipfile = central_pos -
kusano fc6ab3
                            (us.offset_central_dir+us.size_central_dir);
kusano fc6ab3
    us.central_pos = central_pos;
kusano fc6ab3
    us.pfile_in_zip_read = NULL;
kusano fc6ab3
    us.encrypted = 0;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    s=(unz64_s*)ALLOC(sizeof(unz64_s));
kusano fc6ab3
    if( s != NULL)
kusano fc6ab3
    {
kusano fc6ab3
        *s=us;
kusano fc6ab3
        unzGoToFirstFile((unzFile)s);
kusano fc6ab3
    }
kusano fc6ab3
    return (unzFile)s;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
extern unzFile ZEXPORT unzOpen2 (const char *path,
kusano fc6ab3
                                        zlib_filefunc_def* pzlib_filefunc32_def)
kusano fc6ab3
{
kusano fc6ab3
    if (pzlib_filefunc32_def != NULL)
kusano fc6ab3
    {
kusano fc6ab3
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
kusano fc6ab3
        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
kusano fc6ab3
        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
kusano fc6ab3
    }
kusano fc6ab3
    else
kusano fc6ab3
        return unzOpenInternal(path, NULL, 0);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern unzFile ZEXPORT unzOpen2_64 (const void *path,
kusano fc6ab3
                                     zlib_filefunc64_def* pzlib_filefunc_def)
kusano fc6ab3
{
kusano fc6ab3
    if (pzlib_filefunc_def != NULL)
kusano fc6ab3
    {
kusano fc6ab3
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
kusano fc6ab3
        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
kusano fc6ab3
        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
kusano fc6ab3
        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
kusano fc6ab3
        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
kusano fc6ab3
    }
kusano fc6ab3
    else
kusano fc6ab3
        return unzOpenInternal(path, NULL, 1);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern unzFile ZEXPORT unzOpen (const char *path)
kusano fc6ab3
{
kusano fc6ab3
    return unzOpenInternal(path, NULL, 0);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern unzFile ZEXPORT unzOpen64 (const void *path)
kusano fc6ab3
{
kusano fc6ab3
    return unzOpenInternal(path, NULL, 1);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Close a ZipFile opened with unzOpen.
kusano fc6ab3
  If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
kusano fc6ab3
    these files MUST be closed with unzCloseCurrentFile before call unzClose.
kusano fc6ab3
  return UNZ_OK if there is no problem. */
kusano fc6ab3
extern int ZEXPORT unzClose (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
kusano fc6ab3
    if (s->pfile_in_zip_read!=NULL)
kusano fc6ab3
        unzCloseCurrentFile(file);
kusano fc6ab3
kusano fc6ab3
    ZCLOSE64(s->z_filefunc, s->filestream);
kusano fc6ab3
    TRYFREE(s);
kusano fc6ab3
    return UNZ_OK;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Write info about the ZipFile in the *pglobal_info structure.
kusano fc6ab3
  No preparation of the structure is needed
kusano fc6ab3
  return UNZ_OK if there is no problem. */
kusano fc6ab3
extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    *pglobal_info=s->gi;
kusano fc6ab3
    return UNZ_OK;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    /* to do : check if number_entry is not truncated */
kusano fc6ab3
    pglobal_info32->number_entry = (uLong)s->gi.number_entry;
kusano fc6ab3
    pglobal_info32->size_comment = s->gi.size_comment;
kusano fc6ab3
    return UNZ_OK;
kusano fc6ab3
}
kusano fc6ab3
/*
kusano fc6ab3
   Translate date/time from Dos format to tm_unz (readable more easilty)
kusano fc6ab3
*/
kusano fc6ab3
local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
kusano fc6ab3
{
kusano fc6ab3
    ZPOS64_T uDate;
kusano fc6ab3
    uDate = (ZPOS64_T)(ulDosDate>>16);
kusano fc6ab3
    ptm->tm_mday = (uInt)(uDate&0x1f) ;
kusano fc6ab3
    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
kusano fc6ab3
    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
kusano fc6ab3
kusano fc6ab3
    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
kusano fc6ab3
    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
kusano fc6ab3
    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Get Info about the current file in the zipfile, with internal only info
kusano fc6ab3
*/
kusano fc6ab3
local int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
kusano fc6ab3
                                                  unz_file_info64 *pfile_info,
kusano fc6ab3
                                                  unz_file_info64_internal
kusano fc6ab3
                                                  *pfile_info_internal,
kusano fc6ab3
                                                  char *szFileName,
kusano fc6ab3
                                                  uLong fileNameBufferSize,
kusano fc6ab3
                                                  void *extraField,
kusano fc6ab3
                                                  uLong extraFieldBufferSize,
kusano fc6ab3
                                                  char *szComment,
kusano fc6ab3
                                                  uLong commentBufferSize));
kusano fc6ab3
kusano fc6ab3
local int unz64local_GetCurrentFileInfoInternal (unzFile file,
kusano fc6ab3
                                                  unz_file_info64 *pfile_info,
kusano fc6ab3
                                                  unz_file_info64_internal
kusano fc6ab3
                                                  *pfile_info_internal,
kusano fc6ab3
                                                  char *szFileName,
kusano fc6ab3
                                                  uLong fileNameBufferSize,
kusano fc6ab3
                                                  void *extraField,
kusano fc6ab3
                                                  uLong extraFieldBufferSize,
kusano fc6ab3
                                                  char *szComment,
kusano fc6ab3
                                                  uLong commentBufferSize)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    unz_file_info64 file_info;
kusano fc6ab3
    unz_file_info64_internal file_info_internal;
kusano fc6ab3
    int err=UNZ_OK;
kusano fc6ab3
    uLong uMagic;
kusano fc6ab3
    long lSeek=0;
kusano fc6ab3
    uLong uL;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    if (ZSEEK64(s->z_filefunc, s->filestream,
kusano fc6ab3
              s->pos_in_central_dir+s->byte_before_the_zipfile,
kusano fc6ab3
              ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    /* we check the magic */
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
    {
kusano fc6ab3
        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
        else if (uMagic!=0x02014b50)
kusano fc6ab3
            err=UNZ_BADZIPFILE;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    file_info.compressed_size = uL;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    file_info.uncompressed_size = uL;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
                // relative offset of local header
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    file_info_internal.offset_curfile = uL;
kusano fc6ab3
kusano fc6ab3
    lSeek+=file_info.size_filename;
kusano fc6ab3
    if ((err==UNZ_OK) && (szFileName!=NULL))
kusano fc6ab3
    {
kusano fc6ab3
        uLong uSizeRead ;
kusano fc6ab3
        if (file_info.size_filename
kusano fc6ab3
        {
kusano fc6ab3
            *(szFileName+file_info.size_filename)='\0';
kusano fc6ab3
            uSizeRead = file_info.size_filename;
kusano fc6ab3
        }
kusano fc6ab3
        else
kusano fc6ab3
            uSizeRead = fileNameBufferSize;
kusano fc6ab3
kusano fc6ab3
        if ((file_info.size_filename>0) && (fileNameBufferSize>0))
kusano fc6ab3
            if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
        lSeek -= uSizeRead;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    // Read extrafield
kusano fc6ab3
    if ((err==UNZ_OK) && (extraField!=NULL))
kusano fc6ab3
    {
kusano fc6ab3
        ZPOS64_T uSizeRead ;
kusano fc6ab3
        if (file_info.size_file_extra
kusano fc6ab3
            uSizeRead = file_info.size_file_extra;
kusano fc6ab3
        else
kusano fc6ab3
            uSizeRead = extraFieldBufferSize;
kusano fc6ab3
kusano fc6ab3
        if (lSeek!=0)
kusano fc6ab3
        {
kusano fc6ab3
            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
kusano fc6ab3
                lSeek=0;
kusano fc6ab3
            else
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
        }
kusano fc6ab3
kusano fc6ab3
        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
kusano fc6ab3
            if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead)
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
        lSeek += file_info.size_file_extra - (uLong)uSizeRead;
kusano fc6ab3
    }
kusano fc6ab3
    else
kusano fc6ab3
        lSeek += file_info.size_file_extra;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
kusano fc6ab3
    {
kusano fc6ab3
                                uLong acc = 0;
kusano fc6ab3
kusano fc6ab3
        // since lSeek now points to after the extra field we need to move back
kusano fc6ab3
        lSeek -= file_info.size_file_extra;
kusano fc6ab3
kusano fc6ab3
        if (lSeek!=0)
kusano fc6ab3
        {
kusano fc6ab3
            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
kusano fc6ab3
                lSeek=0;
kusano fc6ab3
            else
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
        }
kusano fc6ab3
kusano fc6ab3
        while(acc < file_info.size_file_extra)
kusano fc6ab3
        {
kusano fc6ab3
            uLong headerId;
kusano fc6ab3
                                                uLong dataSize;
kusano fc6ab3
kusano fc6ab3
            if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
            if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
            /* ZIP64 extra fields */
kusano fc6ab3
            if (headerId == 0x0001)
kusano fc6ab3
            {
kusano fc6ab3
                                                        uLong uL;
kusano fc6ab3
kusano fc6ab3
                                                                if(file_info.uncompressed_size == MAXU32)
kusano fc6ab3
                                                                {
kusano fc6ab3
                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
kusano fc6ab3
                                                                                        err=UNZ_ERRNO;
kusano fc6ab3
                                                                }
kusano fc6ab3
kusano fc6ab3
                                                                if(file_info.compressed_size == MAXU32)
kusano fc6ab3
                                                                {
kusano fc6ab3
                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
kusano fc6ab3
                                                                                  err=UNZ_ERRNO;
kusano fc6ab3
                                                                }
kusano fc6ab3
kusano fc6ab3
                                                                if(file_info_internal.offset_curfile == MAXU32)
kusano fc6ab3
                                                                {
kusano fc6ab3
                                                                        /* Relative Header offset */
kusano fc6ab3
                                                                        if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
kusano fc6ab3
                                                                                err=UNZ_ERRNO;
kusano fc6ab3
                                                                }
kusano fc6ab3
kusano fc6ab3
                                                                if(file_info.disk_num_start == MAXU32)
kusano fc6ab3
                                                                {
kusano fc6ab3
                                                                        /* Disk Start Number */
kusano fc6ab3
                                                                        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
kusano fc6ab3
                                                                                err=UNZ_ERRNO;
kusano fc6ab3
                                                                }
kusano fc6ab3
kusano fc6ab3
            }
kusano fc6ab3
            else
kusano fc6ab3
            {
kusano fc6ab3
                if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
kusano fc6ab3
                    err=UNZ_ERRNO;
kusano fc6ab3
            }
kusano fc6ab3
kusano fc6ab3
            acc += 2 + 2 + dataSize;
kusano fc6ab3
        }
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    if ((err==UNZ_OK) && (szComment!=NULL))
kusano fc6ab3
    {
kusano fc6ab3
        uLong uSizeRead ;
kusano fc6ab3
        if (file_info.size_file_comment
kusano fc6ab3
        {
kusano fc6ab3
            *(szComment+file_info.size_file_comment)='\0';
kusano fc6ab3
            uSizeRead = file_info.size_file_comment;
kusano fc6ab3
        }
kusano fc6ab3
        else
kusano fc6ab3
            uSizeRead = commentBufferSize;
kusano fc6ab3
kusano fc6ab3
        if (lSeek!=0)
kusano fc6ab3
        {
kusano fc6ab3
            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
kusano fc6ab3
                lSeek=0;
kusano fc6ab3
            else
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
        }
kusano fc6ab3
kusano fc6ab3
        if ((file_info.size_file_comment>0) && (commentBufferSize>0))
kusano fc6ab3
            if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
kusano fc6ab3
                err=UNZ_ERRNO;
kusano fc6ab3
        lSeek+=file_info.size_file_comment - uSizeRead;
kusano fc6ab3
    }
kusano fc6ab3
    else
kusano fc6ab3
        lSeek+=file_info.size_file_comment;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    if ((err==UNZ_OK) && (pfile_info!=NULL))
kusano fc6ab3
        *pfile_info=file_info;
kusano fc6ab3
kusano fc6ab3
    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
kusano fc6ab3
        *pfile_info_internal=file_info_internal;
kusano fc6ab3
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Write info about the ZipFile in the *pglobal_info structure.
kusano fc6ab3
  No preparation of the structure is needed
kusano fc6ab3
  return UNZ_OK if there is no problem.
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file,
kusano fc6ab3
                                          unz_file_info64 * pfile_info,
kusano fc6ab3
                                          char * szFileName, uLong fileNameBufferSize,
kusano fc6ab3
                                          void *extraField, uLong extraFieldBufferSize,
kusano fc6ab3
                                          char* szComment,  uLong commentBufferSize)
kusano fc6ab3
{
kusano fc6ab3
    return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
kusano fc6ab3
                                                szFileName,fileNameBufferSize,
kusano fc6ab3
                                                extraField,extraFieldBufferSize,
kusano fc6ab3
                                                szComment,commentBufferSize);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
kusano fc6ab3
                                          unz_file_info * pfile_info,
kusano fc6ab3
                                          char * szFileName, uLong fileNameBufferSize,
kusano fc6ab3
                                          void *extraField, uLong extraFieldBufferSize,
kusano fc6ab3
                                          char* szComment,  uLong commentBufferSize)
kusano fc6ab3
{
kusano fc6ab3
    int err;
kusano fc6ab3
    unz_file_info64 file_info64;
kusano fc6ab3
    err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
kusano fc6ab3
                                                szFileName,fileNameBufferSize,
kusano fc6ab3
                                                extraField,extraFieldBufferSize,
kusano fc6ab3
                                                szComment,commentBufferSize);
kusano fc6ab3
    if ((err==UNZ_OK) && (pfile_info != NULL))
kusano fc6ab3
    {
kusano fc6ab3
        pfile_info->version = file_info64.version;
kusano fc6ab3
        pfile_info->version_needed = file_info64.version_needed;
kusano fc6ab3
        pfile_info->flag = file_info64.flag;
kusano fc6ab3
        pfile_info->compression_method = file_info64.compression_method;
kusano fc6ab3
        pfile_info->dosDate = file_info64.dosDate;
kusano fc6ab3
        pfile_info->crc = file_info64.crc;
kusano fc6ab3
kusano fc6ab3
        pfile_info->size_filename = file_info64.size_filename;
kusano fc6ab3
        pfile_info->size_file_extra = file_info64.size_file_extra;
kusano fc6ab3
        pfile_info->size_file_comment = file_info64.size_file_comment;
kusano fc6ab3
kusano fc6ab3
        pfile_info->disk_num_start = file_info64.disk_num_start;
kusano fc6ab3
        pfile_info->internal_fa = file_info64.internal_fa;
kusano fc6ab3
        pfile_info->external_fa = file_info64.external_fa;
kusano fc6ab3
kusano fc6ab3
        pfile_info->tmu_date = file_info64.tmu_date,
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
        pfile_info->compressed_size = (uLong)file_info64.compressed_size;
kusano fc6ab3
        pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
kusano fc6ab3
kusano fc6ab3
    }
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
/*
kusano fc6ab3
  Set the current file of the zipfile to the first file.
kusano fc6ab3
  return UNZ_OK if there is no problem
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzGoToFirstFile (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    int err=UNZ_OK;
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    s->pos_in_central_dir=s->offset_central_dir;
kusano fc6ab3
    s->num_file=0;
kusano fc6ab3
    err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
kusano fc6ab3
                                             &s->cur_file_info_internal,
kusano fc6ab3
                                             NULL,0,NULL,0,NULL,0);
kusano fc6ab3
    s->current_file_ok = (err == UNZ_OK);
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Set the current file of the zipfile to the next file.
kusano fc6ab3
  return UNZ_OK if there is no problem
kusano fc6ab3
  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzGoToNextFile (unzFile  file)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    int err;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    if (!s->current_file_ok)
kusano fc6ab3
        return UNZ_END_OF_LIST_OF_FILE;
kusano fc6ab3
    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */
kusano fc6ab3
      if (s->num_file+1==s->gi.number_entry)
kusano fc6ab3
        return UNZ_END_OF_LIST_OF_FILE;
kusano fc6ab3
kusano fc6ab3
    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
kusano fc6ab3
            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
kusano fc6ab3
    s->num_file++;
kusano fc6ab3
    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
kusano fc6ab3
                                               &s->cur_file_info_internal,
kusano fc6ab3
                                               NULL,0,NULL,0,NULL,0);
kusano fc6ab3
    s->current_file_ok = (err == UNZ_OK);
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Try locate the file szFileName in the zipfile.
kusano fc6ab3
  For the iCaseSensitivity signification, see unzStringFileNameCompare
kusano fc6ab3
kusano fc6ab3
  return value :
kusano fc6ab3
  UNZ_OK if the file is found. It becomes the current file.
kusano fc6ab3
  UNZ_END_OF_LIST_OF_FILE if the file is not found
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    int err;
kusano fc6ab3
kusano fc6ab3
    /* We remember the 'current' position in the file so that we can jump
kusano fc6ab3
     * back there if we fail.
kusano fc6ab3
     */
kusano fc6ab3
    unz_file_info64 cur_file_infoSaved;
kusano fc6ab3
    unz_file_info64_internal cur_file_info_internalSaved;
kusano fc6ab3
    ZPOS64_T num_fileSaved;
kusano fc6ab3
    ZPOS64_T pos_in_central_dirSaved;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    if (!s->current_file_ok)
kusano fc6ab3
        return UNZ_END_OF_LIST_OF_FILE;
kusano fc6ab3
kusano fc6ab3
    /* Save the current state */
kusano fc6ab3
    num_fileSaved = s->num_file;
kusano fc6ab3
    pos_in_central_dirSaved = s->pos_in_central_dir;
kusano fc6ab3
    cur_file_infoSaved = s->cur_file_info;
kusano fc6ab3
    cur_file_info_internalSaved = s->cur_file_info_internal;
kusano fc6ab3
kusano fc6ab3
    err = unzGoToFirstFile(file);
kusano fc6ab3
kusano fc6ab3
    while (err == UNZ_OK)
kusano fc6ab3
    {
kusano fc6ab3
        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
kusano fc6ab3
        err = unzGetCurrentFileInfo64(file,NULL,
kusano fc6ab3
                                    szCurrentFileName,sizeof(szCurrentFileName)-1,
kusano fc6ab3
                                    NULL,0,NULL,0);
kusano fc6ab3
        if (err == UNZ_OK)
kusano fc6ab3
        {
kusano fc6ab3
            if (unzStringFileNameCompare(szCurrentFileName,
kusano fc6ab3
                                            szFileName,iCaseSensitivity)==0)
kusano fc6ab3
                return UNZ_OK;
kusano fc6ab3
            err = unzGoToNextFile(file);
kusano fc6ab3
        }
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    /* We failed, so restore the state of the 'current file' to where we
kusano fc6ab3
     * were.
kusano fc6ab3
     */
kusano fc6ab3
    s->num_file = num_fileSaved ;
kusano fc6ab3
    s->pos_in_central_dir = pos_in_central_dirSaved ;
kusano fc6ab3
    s->cur_file_info = cur_file_infoSaved;
kusano fc6ab3
    s->cur_file_info_internal = cur_file_info_internalSaved;
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
///////////////////////////////////////////
kusano fc6ab3
// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
kusano fc6ab3
// I need random access
kusano fc6ab3
//
kusano fc6ab3
// Further optimization could be realized by adding an ability
kusano fc6ab3
// to cache the directory in memory. The goal being a single
kusano fc6ab3
// comprehensive file read to put the file I need in a memory.
kusano fc6ab3
*/
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
typedef struct unz_file_pos_s
kusano fc6ab3
{
kusano fc6ab3
    ZPOS64_T pos_in_zip_directory;   // offset in file
kusano fc6ab3
    ZPOS64_T num_of_file;            // # of file
kusano fc6ab3
} unz_file_pos;
kusano fc6ab3
*/
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos*  file_pos)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL || file_pos==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    if (!s->current_file_ok)
kusano fc6ab3
        return UNZ_END_OF_LIST_OF_FILE;
kusano fc6ab3
kusano fc6ab3
    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;
kusano fc6ab3
    file_pos->num_of_file           = s->num_file;
kusano fc6ab3
kusano fc6ab3
    return UNZ_OK;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzGetFilePos(
kusano fc6ab3
    unzFile file,
kusano fc6ab3
    unz_file_pos* file_pos)
kusano fc6ab3
{
kusano fc6ab3
    unz64_file_pos file_pos64;
kusano fc6ab3
    int err = unzGetFilePos64(file,&file_pos64);
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
    {
kusano fc6ab3
        file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
kusano fc6ab3
        file_pos->num_of_file = (uLong)file_pos64.num_of_file;
kusano fc6ab3
    }
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    int err;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL || file_pos==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
kusano fc6ab3
    /* jump to the right spot */
kusano fc6ab3
    s->pos_in_central_dir = file_pos->pos_in_zip_directory;
kusano fc6ab3
    s->num_file           = file_pos->num_of_file;
kusano fc6ab3
kusano fc6ab3
    /* set the current file */
kusano fc6ab3
    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
kusano fc6ab3
                                               &s->cur_file_info_internal,
kusano fc6ab3
                                               NULL,0,NULL,0,NULL,0);
kusano fc6ab3
    /* return results */
kusano fc6ab3
    s->current_file_ok = (err == UNZ_OK);
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzGoToFilePos(
kusano fc6ab3
    unzFile file,
kusano fc6ab3
    unz_file_pos* file_pos)
kusano fc6ab3
{
kusano fc6ab3
    unz64_file_pos file_pos64;
kusano fc6ab3
    if (file_pos == NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
    file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
kusano fc6ab3
    file_pos64.num_of_file = file_pos->num_of_file;
kusano fc6ab3
    return unzGoToFilePos64(file,&file_pos64);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
// Unzip Helper Functions - should be here?
kusano fc6ab3
///////////////////////////////////////////
kusano fc6ab3
*/
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Read the local header of the current zipfile
kusano fc6ab3
  Check the coherency of the local header and info in the end of central
kusano fc6ab3
        directory about this file
kusano fc6ab3
  store in *piSizeVar the size of extra info in local header
kusano fc6ab3
        (filename and size of extra field data)
kusano fc6ab3
*/
kusano fc6ab3
local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar,
kusano fc6ab3
                                                    ZPOS64_T * poffset_local_extrafield,
kusano fc6ab3
                                                    uInt  * psize_local_extrafield)
kusano fc6ab3
{
kusano fc6ab3
    uLong uMagic,uData,uFlags;
kusano fc6ab3
    uLong size_filename;
kusano fc6ab3
    uLong size_extra_field;
kusano fc6ab3
    int err=UNZ_OK;
kusano fc6ab3
kusano fc6ab3
    *piSizeVar = 0;
kusano fc6ab3
    *poffset_local_extrafield = 0;
kusano fc6ab3
    *psize_local_extrafield = 0;
kusano fc6ab3
kusano fc6ab3
    if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
kusano fc6ab3
                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
        return UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    if (err==UNZ_OK)
kusano fc6ab3
    {
kusano fc6ab3
        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
kusano fc6ab3
            err=UNZ_ERRNO;
kusano fc6ab3
        else if (uMagic!=0x04034b50)
kusano fc6ab3
            err=UNZ_BADZIPFILE;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
/*
kusano fc6ab3
    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
*/
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
kusano fc6ab3
/* #ifdef HAVE_BZIP2 */
kusano fc6ab3
                         (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
kusano fc6ab3
/* #endif */
kusano fc6ab3
                         (s->cur_file_info.compression_method!=Z_DEFLATED))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    *piSizeVar += (uInt)size_filename;
kusano fc6ab3
kusano fc6ab3
    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
kusano fc6ab3
        err=UNZ_ERRNO;
kusano fc6ab3
    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
kusano fc6ab3
                                    SIZEZIPLOCALHEADER + size_filename;
kusano fc6ab3
    *psize_local_extrafield = (uInt)size_extra_field;
kusano fc6ab3
kusano fc6ab3
    *piSizeVar += (uInt)size_extra_field;
kusano fc6ab3
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Open for reading data the current file in the zipfile.
kusano fc6ab3
  If there is no error and the file is opened, the return value is UNZ_OK.
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
kusano fc6ab3
                                            int* level, int raw, const char* password)
kusano fc6ab3
{
kusano fc6ab3
    int err=UNZ_OK;
kusano fc6ab3
    uInt iSizeVar;
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    ZPOS64_T offset_local_extrafield;  /* offset of the local extra field */
kusano fc6ab3
    uInt  size_local_extrafield;    /* size of the local extra field */
kusano fc6ab3
#    ifndef NOUNCRYPT
kusano fc6ab3
    char source[12];
kusano fc6ab3
#    else
kusano fc6ab3
    if (password != NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
#    endif
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    if (!s->current_file_ok)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
    if (s->pfile_in_zip_read != NULL)
kusano fc6ab3
        unzCloseCurrentFile(file);
kusano fc6ab3
kusano fc6ab3
    if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
kusano fc6ab3
        return UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s));
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return UNZ_INTERNALERROR;
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
kusano fc6ab3
    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
kusano fc6ab3
    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
kusano fc6ab3
    pfile_in_zip_read_info->pos_local_extrafield=0;
kusano fc6ab3
    pfile_in_zip_read_info->raw=raw;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info->read_buffer==NULL)
kusano fc6ab3
    {
kusano fc6ab3
        TRYFREE(pfile_in_zip_read_info);
kusano fc6ab3
        return UNZ_INTERNALERROR;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->stream_initialised=0;
kusano fc6ab3
kusano fc6ab3
    if (method!=NULL)
kusano fc6ab3
        *method = (int)s->cur_file_info.compression_method;
kusano fc6ab3
kusano fc6ab3
    if (level!=NULL)
kusano fc6ab3
    {
kusano fc6ab3
        *level = 6;
kusano fc6ab3
        switch (s->cur_file_info.flag & 0x06)
kusano fc6ab3
        {
kusano fc6ab3
          case 6 : *level = 1; break;
kusano fc6ab3
          case 4 : *level = 2; break;
kusano fc6ab3
          case 2 : *level = 9; break;
kusano fc6ab3
        }
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    if ((s->cur_file_info.compression_method!=0) &&
kusano fc6ab3
/* #ifdef HAVE_BZIP2 */
kusano fc6ab3
        (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
kusano fc6ab3
/* #endif */
kusano fc6ab3
        (s->cur_file_info.compression_method!=Z_DEFLATED))
kusano fc6ab3
kusano fc6ab3
        err=UNZ_BADZIPFILE;
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
kusano fc6ab3
    pfile_in_zip_read_info->crc32=0;
kusano fc6ab3
    pfile_in_zip_read_info->total_out_64=0;
kusano fc6ab3
    pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
kusano fc6ab3
    pfile_in_zip_read_info->filestream=s->filestream;
kusano fc6ab3
    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
kusano fc6ab3
    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->stream.total_out = 0;
kusano fc6ab3
kusano fc6ab3
    if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
kusano fc6ab3
    {
kusano fc6ab3
#ifdef HAVE_BZIP2
kusano fc6ab3
      pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0;
kusano fc6ab3
      pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
kusano fc6ab3
      pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
kusano fc6ab3
      pfile_in_zip_read_info->bstream.state = (voidpf)0;
kusano fc6ab3
kusano fc6ab3
      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.zfree = (free_func)0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.next_in = (voidpf)0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.avail_in = 0;
kusano fc6ab3
kusano fc6ab3
      err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
kusano fc6ab3
      if (err == Z_OK)
kusano fc6ab3
        pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
kusano fc6ab3
      else
kusano fc6ab3
      {
kusano fc6ab3
        TRYFREE(pfile_in_zip_read_info);
kusano fc6ab3
        return err;
kusano fc6ab3
      }
kusano fc6ab3
#else
kusano fc6ab3
      pfile_in_zip_read_info->raw=1;
kusano fc6ab3
#endif
kusano fc6ab3
    }
kusano fc6ab3
    else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
kusano fc6ab3
    {
kusano fc6ab3
      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.zfree = (free_func)0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.next_in = 0;
kusano fc6ab3
      pfile_in_zip_read_info->stream.avail_in = 0;
kusano fc6ab3
kusano fc6ab3
      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
kusano fc6ab3
      if (err == Z_OK)
kusano fc6ab3
        pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
kusano fc6ab3
      else
kusano fc6ab3
      {
kusano fc6ab3
        TRYFREE(pfile_in_zip_read_info);
kusano fc6ab3
        return err;
kusano fc6ab3
      }
kusano fc6ab3
        /* windowBits is passed < 0 to tell that there is no zlib header.
kusano fc6ab3
         * Note that in this case inflate *requires* an extra "dummy" byte
kusano fc6ab3
         * after the compressed stream in order to complete decompression and
kusano fc6ab3
         * return Z_STREAM_END.
kusano fc6ab3
         * In unzip, i don't wait absolutely Z_STREAM_END because I known the
kusano fc6ab3
         * size of both compressed and uncompressed data
kusano fc6ab3
         */
kusano fc6ab3
    }
kusano fc6ab3
    pfile_in_zip_read_info->rest_read_compressed =
kusano fc6ab3
            s->cur_file_info.compressed_size ;
kusano fc6ab3
    pfile_in_zip_read_info->rest_read_uncompressed =
kusano fc6ab3
            s->cur_file_info.uncompressed_size ;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->pos_in_zipfile =
kusano fc6ab3
            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
kusano fc6ab3
              iSizeVar;
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->stream.avail_in = (uInt)0;
kusano fc6ab3
kusano fc6ab3
    s->pfile_in_zip_read = pfile_in_zip_read_info;
kusano fc6ab3
                s->encrypted = 0;
kusano fc6ab3
kusano fc6ab3
#    ifndef NOUNCRYPT
kusano fc6ab3
    if (password != NULL)
kusano fc6ab3
    {
kusano fc6ab3
        int i;
kusano fc6ab3
        s->pcrc_32_tab = get_crc_table();
kusano fc6ab3
        init_keys(password,s->keys,s->pcrc_32_tab);
kusano fc6ab3
        if (ZSEEK64(s->z_filefunc, s->filestream,
kusano fc6ab3
                  s->pfile_in_zip_read->pos_in_zipfile +
kusano fc6ab3
                     s->pfile_in_zip_read->byte_before_the_zipfile,
kusano fc6ab3
                  SEEK_SET)!=0)
kusano fc6ab3
            return UNZ_INTERNALERROR;
kusano fc6ab3
        if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
kusano fc6ab3
            return UNZ_INTERNALERROR;
kusano fc6ab3
kusano fc6ab3
        for (i = 0; i<12; i++)
kusano fc6ab3
            zdecode(s->keys,s->pcrc_32_tab,source[i]);
kusano fc6ab3
kusano fc6ab3
        s->pfile_in_zip_read->pos_in_zipfile+=12;
kusano fc6ab3
        s->encrypted=1;
kusano fc6ab3
    }
kusano fc6ab3
#    endif
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    return UNZ_OK;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzOpenCurrentFile (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char*  password)
kusano fc6ab3
{
kusano fc6ab3
    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw)
kusano fc6ab3
{
kusano fc6ab3
    return unzOpenCurrentFile3(file, method, level, raw, NULL);
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/** Addition for GDAL : START */
kusano fc6ab3
kusano fc6ab3
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return 0; //UNZ_PARAMERROR;
kusano fc6ab3
    pfile_in_zip_read_info=s->pfile_in_zip_read;
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return 0; //UNZ_PARAMERROR;
kusano fc6ab3
    return pfile_in_zip_read_info->pos_in_zipfile +
kusano fc6ab3
                         pfile_in_zip_read_info->byte_before_the_zipfile;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/** Addition for GDAL : END */
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Read bytes from the current file.
kusano fc6ab3
  buf contain buffer where data must be copied
kusano fc6ab3
  len the size of buf.
kusano fc6ab3
kusano fc6ab3
  return the number of byte copied if somes bytes are copied
kusano fc6ab3
  return 0 if the end of file was reached
kusano fc6ab3
  return <0 with error code if there is an error
kusano fc6ab3
    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzReadCurrentFile  (unzFile file, voidp buf, unsigned len)
kusano fc6ab3
{
kusano fc6ab3
    int err=UNZ_OK;
kusano fc6ab3
    uInt iRead = 0;
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    pfile_in_zip_read_info=s->pfile_in_zip_read;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info->read_buffer == NULL)
kusano fc6ab3
        return UNZ_END_OF_LIST_OF_FILE;
kusano fc6ab3
    if (len==0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->stream.avail_out = (uInt)len;
kusano fc6ab3
kusano fc6ab3
    if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
kusano fc6ab3
        (!(pfile_in_zip_read_info->raw)))
kusano fc6ab3
        pfile_in_zip_read_info->stream.avail_out =
kusano fc6ab3
            (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
kusano fc6ab3
kusano fc6ab3
    if ((len>pfile_in_zip_read_info->rest_read_compressed+
kusano fc6ab3
           pfile_in_zip_read_info->stream.avail_in) &&
kusano fc6ab3
         (pfile_in_zip_read_info->raw))
kusano fc6ab3
        pfile_in_zip_read_info->stream.avail_out =
kusano fc6ab3
            (uInt)pfile_in_zip_read_info->rest_read_compressed+
kusano fc6ab3
            pfile_in_zip_read_info->stream.avail_in;
kusano fc6ab3
kusano fc6ab3
    while (pfile_in_zip_read_info->stream.avail_out>0)
kusano fc6ab3
    {
kusano fc6ab3
        if ((pfile_in_zip_read_info->stream.avail_in==0) &&
kusano fc6ab3
            (pfile_in_zip_read_info->rest_read_compressed>0))
kusano fc6ab3
        {
kusano fc6ab3
            uInt uReadThis = UNZ_BUFSIZE;
kusano fc6ab3
            if (pfile_in_zip_read_info->rest_read_compressed
kusano fc6ab3
                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
kusano fc6ab3
            if (uReadThis == 0)
kusano fc6ab3
                return UNZ_EOF;
kusano fc6ab3
            if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
kusano fc6ab3
                      pfile_in_zip_read_info->filestream,
kusano fc6ab3
                      pfile_in_zip_read_info->pos_in_zipfile +
kusano fc6ab3
                         pfile_in_zip_read_info->byte_before_the_zipfile,
kusano fc6ab3
                         ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
                return UNZ_ERRNO;
kusano fc6ab3
            if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
kusano fc6ab3
                      pfile_in_zip_read_info->filestream,
kusano fc6ab3
                      pfile_in_zip_read_info->read_buffer,
kusano fc6ab3
                      uReadThis)!=uReadThis)
kusano fc6ab3
                return UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
#            ifndef NOUNCRYPT
kusano fc6ab3
            if(s->encrypted)
kusano fc6ab3
            {
kusano fc6ab3
                uInt i;
kusano fc6ab3
                for(i=0;i
kusano fc6ab3
                  pfile_in_zip_read_info->read_buffer[i] =
kusano fc6ab3
                      zdecode(s->keys,s->pcrc_32_tab,
kusano fc6ab3
                              pfile_in_zip_read_info->read_buffer[i]);
kusano fc6ab3
            }
kusano fc6ab3
#            endif
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->stream.next_in =
kusano fc6ab3
                (Bytef*)pfile_in_zip_read_info->read_buffer;
kusano fc6ab3
            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
kusano fc6ab3
        }
kusano fc6ab3
kusano fc6ab3
        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
kusano fc6ab3
        {
kusano fc6ab3
            uInt uDoCopy,i ;
kusano fc6ab3
kusano fc6ab3
            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
kusano fc6ab3
                (pfile_in_zip_read_info->rest_read_compressed == 0))
kusano fc6ab3
                return (iRead==0) ? UNZ_EOF : iRead;
kusano fc6ab3
kusano fc6ab3
            if (pfile_in_zip_read_info->stream.avail_out <
kusano fc6ab3
                            pfile_in_zip_read_info->stream.avail_in)
kusano fc6ab3
                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
kusano fc6ab3
            else
kusano fc6ab3
                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
kusano fc6ab3
kusano fc6ab3
            for (i=0;i
kusano fc6ab3
                *(pfile_in_zip_read_info->stream.next_out+i) =
kusano fc6ab3
                        *(pfile_in_zip_read_info->stream.next_in+i);
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
kusano fc6ab3
                                pfile_in_zip_read_info->stream.next_out,
kusano fc6ab3
                                uDoCopy);
kusano fc6ab3
            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
kusano fc6ab3
            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
kusano fc6ab3
            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
kusano fc6ab3
            pfile_in_zip_read_info->stream.next_out += uDoCopy;
kusano fc6ab3
            pfile_in_zip_read_info->stream.next_in += uDoCopy;
kusano fc6ab3
            pfile_in_zip_read_info->stream.total_out += uDoCopy;
kusano fc6ab3
            iRead += uDoCopy;
kusano fc6ab3
        }
kusano fc6ab3
        else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
kusano fc6ab3
        {
kusano fc6ab3
#ifdef HAVE_BZIP2
kusano fc6ab3
            uLong uTotalOutBefore,uTotalOutAfter;
kusano fc6ab3
            const Bytef *bufBefore;
kusano fc6ab3
            uLong uOutThis;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->bstream.next_in        = (char*)pfile_in_zip_read_info->stream.next_in;
kusano fc6ab3
            pfile_in_zip_read_info->bstream.avail_in       = pfile_in_zip_read_info->stream.avail_in;
kusano fc6ab3
            pfile_in_zip_read_info->bstream.total_in_lo32  = pfile_in_zip_read_info->stream.total_in;
kusano fc6ab3
            pfile_in_zip_read_info->bstream.total_in_hi32  = 0;
kusano fc6ab3
            pfile_in_zip_read_info->bstream.next_out       = (char*)pfile_in_zip_read_info->stream.next_out;
kusano fc6ab3
            pfile_in_zip_read_info->bstream.avail_out      = pfile_in_zip_read_info->stream.avail_out;
kusano fc6ab3
            pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
kusano fc6ab3
            pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
kusano fc6ab3
kusano fc6ab3
            uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
kusano fc6ab3
            bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
kusano fc6ab3
kusano fc6ab3
            err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
kusano fc6ab3
kusano fc6ab3
            uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
kusano fc6ab3
            uOutThis = uTotalOutAfter-uTotalOutBefore;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis));
kusano fc6ab3
            pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
kusano fc6ab3
            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->stream.next_in   = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
kusano fc6ab3
            pfile_in_zip_read_info->stream.avail_in  = pfile_in_zip_read_info->bstream.avail_in;
kusano fc6ab3
            pfile_in_zip_read_info->stream.total_in  = pfile_in_zip_read_info->bstream.total_in_lo32;
kusano fc6ab3
            pfile_in_zip_read_info->stream.next_out  = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
kusano fc6ab3
            pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
kusano fc6ab3
            pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
kusano fc6ab3
kusano fc6ab3
            if (err==BZ_STREAM_END)
kusano fc6ab3
              return (iRead==0) ? UNZ_EOF : iRead;
kusano fc6ab3
            if (err!=BZ_OK)
kusano fc6ab3
              break;
kusano fc6ab3
#endif
kusano fc6ab3
        } // end Z_BZIP2ED
kusano fc6ab3
        else
kusano fc6ab3
        {
kusano fc6ab3
            ZPOS64_T uTotalOutBefore,uTotalOutAfter;
kusano fc6ab3
            const Bytef *bufBefore;
kusano fc6ab3
            ZPOS64_T uOutThis;
kusano fc6ab3
            int flush=Z_SYNC_FLUSH;
kusano fc6ab3
kusano fc6ab3
            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
kusano fc6ab3
            bufBefore = pfile_in_zip_read_info->stream.next_out;
kusano fc6ab3
kusano fc6ab3
            /*
kusano fc6ab3
            if ((pfile_in_zip_read_info->rest_read_uncompressed ==
kusano fc6ab3
                     pfile_in_zip_read_info->stream.avail_out) &&
kusano fc6ab3
                (pfile_in_zip_read_info->rest_read_compressed == 0))
kusano fc6ab3
                flush = Z_FINISH;
kusano fc6ab3
            */
kusano fc6ab3
            err=inflate(&pfile_in_zip_read_info->stream,flush);
kusano fc6ab3
kusano fc6ab3
            if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
kusano fc6ab3
              err = Z_DATA_ERROR;
kusano fc6ab3
kusano fc6ab3
            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
kusano fc6ab3
            uOutThis = uTotalOutAfter-uTotalOutBefore;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->crc32 =
kusano fc6ab3
                crc32(pfile_in_zip_read_info->crc32,bufBefore,
kusano fc6ab3
                        (uInt)(uOutThis));
kusano fc6ab3
kusano fc6ab3
            pfile_in_zip_read_info->rest_read_uncompressed -=
kusano fc6ab3
                uOutThis;
kusano fc6ab3
kusano fc6ab3
            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
kusano fc6ab3
kusano fc6ab3
            if (err==Z_STREAM_END)
kusano fc6ab3
                return (iRead==0) ? UNZ_EOF : iRead;
kusano fc6ab3
            if (err!=Z_OK)
kusano fc6ab3
                break;
kusano fc6ab3
        }
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    if (err==Z_OK)
kusano fc6ab3
        return iRead;
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Give the current position in uncompressed data
kusano fc6ab3
*/
kusano fc6ab3
extern z_off_t ZEXPORT unztell (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    pfile_in_zip_read_info=s->pfile_in_zip_read;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
    return (z_off_t)pfile_in_zip_read_info->stream.total_out;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern ZPOS64_T ZEXPORT unztell64 (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return (ZPOS64_T)-1;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    pfile_in_zip_read_info=s->pfile_in_zip_read;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return (ZPOS64_T)-1;
kusano fc6ab3
kusano fc6ab3
    return pfile_in_zip_read_info->total_out_64;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  return 1 if the end of file was reached, 0 elsewhere
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzeof (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    pfile_in_zip_read_info=s->pfile_in_zip_read;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
kusano fc6ab3
        return 1;
kusano fc6ab3
    else
kusano fc6ab3
        return 0;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
Read extra field from the current file (opened by unzOpenCurrentFile)
kusano fc6ab3
This is the local-header version of the extra field (sometimes, there is
kusano fc6ab3
more info in the local-header version than in the central-header)
kusano fc6ab3
kusano fc6ab3
  if buf==NULL, it return the size of the local extra field that can be read
kusano fc6ab3
kusano fc6ab3
  if buf!=NULL, len is the size of the buffer, the extra header is copied in
kusano fc6ab3
    buf.
kusano fc6ab3
  the return value is the number of bytes copied in buf, or (if <0)
kusano fc6ab3
    the error code
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    uInt read_now;
kusano fc6ab3
    ZPOS64_T size_to_read;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    pfile_in_zip_read_info=s->pfile_in_zip_read;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
kusano fc6ab3
                pfile_in_zip_read_info->pos_local_extrafield);
kusano fc6ab3
kusano fc6ab3
    if (buf==NULL)
kusano fc6ab3
        return (int)size_to_read;
kusano fc6ab3
kusano fc6ab3
    if (len>size_to_read)
kusano fc6ab3
        read_now = (uInt)size_to_read;
kusano fc6ab3
    else
kusano fc6ab3
        read_now = (uInt)len ;
kusano fc6ab3
kusano fc6ab3
    if (read_now==0)
kusano fc6ab3
        return 0;
kusano fc6ab3
kusano fc6ab3
    if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
kusano fc6ab3
              pfile_in_zip_read_info->filestream,
kusano fc6ab3
              pfile_in_zip_read_info->offset_local_extrafield +
kusano fc6ab3
              pfile_in_zip_read_info->pos_local_extrafield,
kusano fc6ab3
              ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
        return UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
kusano fc6ab3
              pfile_in_zip_read_info->filestream,
kusano fc6ab3
              buf,read_now)!=read_now)
kusano fc6ab3
        return UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    return (int)read_now;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Close the file in zip opened with unzOpenCurrentFile
kusano fc6ab3
  Return UNZ_CRCERROR if all the file was read but the CRC is not good
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzCloseCurrentFile (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    int err=UNZ_OK;
kusano fc6ab3
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    file_in_zip64_read_info_s* pfile_in_zip_read_info;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    pfile_in_zip_read_info=s->pfile_in_zip_read;
kusano fc6ab3
kusano fc6ab3
    if (pfile_in_zip_read_info==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
kusano fc6ab3
        (!pfile_in_zip_read_info->raw))
kusano fc6ab3
    {
kusano fc6ab3
        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
kusano fc6ab3
            err=UNZ_CRCERROR;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    TRYFREE(pfile_in_zip_read_info->read_buffer);
kusano fc6ab3
    pfile_in_zip_read_info->read_buffer = NULL;
kusano fc6ab3
    if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
kusano fc6ab3
        inflateEnd(&pfile_in_zip_read_info->stream);
kusano fc6ab3
#ifdef HAVE_BZIP2
kusano fc6ab3
    else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
kusano fc6ab3
        BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
kusano fc6ab3
#endif
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
    pfile_in_zip_read_info->stream_initialised = 0;
kusano fc6ab3
    TRYFREE(pfile_in_zip_read_info);
kusano fc6ab3
kusano fc6ab3
    s->pfile_in_zip_read=NULL;
kusano fc6ab3
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
kusano fc6ab3
/*
kusano fc6ab3
  Get the global comment string of the ZipFile, in the szComment buffer.
kusano fc6ab3
  uSizeBuf is the size of the szComment buffer.
kusano fc6ab3
  return the number of byte copied or an error code <0
kusano fc6ab3
*/
kusano fc6ab3
extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    uLong uReadThis ;
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return (int)UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
kusano fc6ab3
    uReadThis = uSizeBuf;
kusano fc6ab3
    if (uReadThis>s->gi.size_comment)
kusano fc6ab3
        uReadThis = s->gi.size_comment;
kusano fc6ab3
kusano fc6ab3
    if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
kusano fc6ab3
        return UNZ_ERRNO;
kusano fc6ab3
kusano fc6ab3
    if (uReadThis>0)
kusano fc6ab3
    {
kusano fc6ab3
      *szComment='\0';
kusano fc6ab3
      if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
kusano fc6ab3
        return UNZ_ERRNO;
kusano fc6ab3
    }
kusano fc6ab3
kusano fc6ab3
    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
kusano fc6ab3
        *(szComment+s->gi.size_comment)='\0';
kusano fc6ab3
    return (int)uReadThis;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
/* Additions by RX '2004 */
kusano fc6ab3
extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
          return 0; //UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
    if (!s->current_file_ok)
kusano fc6ab3
      return 0;
kusano fc6ab3
    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
kusano fc6ab3
      if (s->num_file==s->gi.number_entry)
kusano fc6ab3
         return 0;
kusano fc6ab3
    return s->pos_in_central_dir;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern uLong ZEXPORT unzGetOffset (unzFile file)
kusano fc6ab3
{
kusano fc6ab3
    ZPOS64_T offset64;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
          return 0; //UNZ_PARAMERROR;
kusano fc6ab3
    offset64 = unzGetOffset64(file);
kusano fc6ab3
    return (uLong)offset64;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
kusano fc6ab3
{
kusano fc6ab3
    unz64_s* s;
kusano fc6ab3
    int err;
kusano fc6ab3
kusano fc6ab3
    if (file==NULL)
kusano fc6ab3
        return UNZ_PARAMERROR;
kusano fc6ab3
    s=(unz64_s*)file;
kusano fc6ab3
kusano fc6ab3
    s->pos_in_central_dir = pos;
kusano fc6ab3
    s->num_file = s->gi.number_entry;      /* hack */
kusano fc6ab3
    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
kusano fc6ab3
                                              &s->cur_file_info_internal,
kusano fc6ab3
                                              NULL,0,NULL,0,NULL,0);
kusano fc6ab3
    s->current_file_ok = (err == UNZ_OK);
kusano fc6ab3
    return err;
kusano fc6ab3
}
kusano fc6ab3
kusano fc6ab3
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
kusano fc6ab3
{
kusano fc6ab3
    return unzSetOffset64(file,pos);
kusano fc6ab3
}