From 4f04e06be1910e15abed260ebb676ecd4e42baaa Mon Sep 17 00:00:00 2001 From: Luiz Rafael Culik Date: Thu, 1 Jun 2000 02:24:51 +0000 Subject: [PATCH] see changelog 20000531-23:20 GMT -3 --- harbour/contrib/hbzlib/doc/zip.txt | 113 ++++++++++++ harbour/contrib/hbzlib/hbzip.h | 4 +- harbour/contrib/hbzlib/test.prg | 5 +- harbour/contrib/hbzlib/unzip.h | 274 +++++++++++++++++++++++++++++ harbour/contrib/hbzlib/zipfile2.c | 29 +-- 5 files changed, 410 insertions(+), 15 deletions(-) create mode 100644 harbour/contrib/hbzlib/doc/zip.txt create mode 100644 harbour/contrib/hbzlib/unzip.h diff --git a/harbour/contrib/hbzlib/doc/zip.txt b/harbour/contrib/hbzlib/doc/zip.txt new file mode 100644 index 0000000000..1c1082c88b --- /dev/null +++ b/harbour/contrib/hbzlib/doc/zip.txt @@ -0,0 +1,113 @@ +/* + * $DOC$ + * $FUNCNAME$ + * HB_ZIPFILE() + * $CATEGORY$ + * ZIP FUNCTION + * $ONELINER$ + * Create a zip file + * $SYNTAX$ + * HB_ZIPFILE( , | , , + * , ) ---> lCompress + * $ARGUMENTS$ + * Name of the zip file + * + * Name of a file to Compress ,Drive and/or path + * can be used + * + * An array containing files to compress,Drive and/or path + * can be used + * + * Compression level ranging from 0 to 9 + * + * Code block to execute while compressing + * + * Toggle to overwite the file if exists + * $RETURNS$ + * .T. if file was create,otherwise .f. + * $DESCRIPTION$ + * This function create a zip file named . If the extension + * is ommited , .ZIP will be assumed. If the second parameter is a + * character string, this file will be added to the zip file.If the + * second parameter is an array,all files names contained in + * will be compressed. + * + * If is used, it detemines the compression type where 0 means + * No compression and 9 means best compression. + * + * If is used, every time the file is opened to compress it + * will do the action specified. + * + * If is used , it toggles to overwrite or not the existing + * file.Default is to overwrite the file. + * $EXAMPLES$ + * FUNCTION MAIN() + * IF HB_ZIPFILE( "TEST.ZIP","TEST.PRG") + * qout("File was successly create") + * ENDIF + * IF HB_ZIPFILE( "TEST1.ZIP",{"TEST.PRG","c:\windows\win.ini"}) + * qout("File was successly create") + * ENDIF + * IF HB_ZIPFILE( "TEST2.ZIP",{"TEST.PRG","c:\windows\win.ini"},8,{|cFile|,qout(cFile)}) + * qout("File was successly create") + * ENDIF + * + * Return Nil + * $STATUS$ + * R + * $COMPLIANCE$ + * This function is a Harbour extension + * $PLATFORMS$ + * Win32 + * $FILES$ + * Library is zlib.lib and zlib_bor.lib For Borland Compilers + * Library is zlib.lib zlib_ms.lib for MSVC compilers + * $END$ + */ + +/* + * $DOC$ + * $FUNCNAME$ + * HB_UNZIPFILE() + * $CATEGORY$ + * ZIP FUNCTION + * $ONELINER$ + * Unzip a compressed file + * $SYNTAX$ + * HB_UNZIPFILE( , ) ---> lCompress + * $ARGUMENTS$ + * Name of the zip file + * + * Code block to execute while compressing + * + * $RETURNS$ + * .T. if all file was successfuly restored,otherwise .f. + * $DESCRIPTION$ + * This function restores all files contained inside the . + * If the extension is ommited ,.ZIP will be assumed. If a file already + * exists, it wlllbe overwriten. + * + * If is used, every time the file is opened to compress it + * will do the action specified. + * $EXAMPLES$ + * FUNCTION MAIN() + * IF HB_UNZIPFILE( "TEST.ZIP") + * qout("File was successly create") + * ENDIF + * IF HB_ZIPFILE( "TEST2.ZIP",{|cFile|,qout(cFile)}) + * qout("File was successly create") + * ENDIF + * + * Return Nil + * $STATUS$ + * S + * $COMPLIANCE$ + * This function is a Harbour extension + * $PLATFORMS$ + * Win32 + * $FILES$ + * Library is zlib.lib and zlib_bor.lib For Borland Compilers + * Library is zlib.lib zlib_ms.lib for MSVC compilers + * $END$ + */ + diff --git a/harbour/contrib/hbzlib/hbzip.h b/harbour/contrib/hbzlib/hbzip.h index 38a86a725f..8e696dd16d 100644 --- a/harbour/contrib/hbzlib/hbzip.h +++ b/harbour/contrib/hbzlib/hbzip.h @@ -54,8 +54,8 @@ extern uLong hb___filetime(char *f, tm_zip *tmzip, uLong *dt); extern char *hb___CheckFile( char * szFile); extern int hb___CompressOneFile(char *szFile,char *szFiletoCompress,int iCompLevel,PHB_ITEM pBlock,BOOL iOverWrite); extern int hb___CompressMultipleFile(char *szFile,PHB_ITEM pArray,int iCompLevel,PHB_ITEM pBlock,BOOL iOverWrite); -extern int hb___unZipFiles(char *szFile); -extern int hb___ExtractCurrentFile(unzFile uf,const int* popt_extract_without_path,int* popt_overwrite); +extern int hb___unZipFiles(char *szFile,PHB_ITEM pBlock); +extern int hb___ExtractCurrentFile(unzFile uf,const int* popt_extract_without_path,int* popt_overwrite,PHB_ITEM pBlock); extern void hb____ChangeFileDate(const char *filename,uLong dosdate,tm_unz tmu_date); extern int hb___MyMkdir(const char *DirectoryName); extern int hb___MakeDir(char *NewDirectory); diff --git a/harbour/contrib/hbzlib/test.prg b/harbour/contrib/hbzlib/test.prg index c9b018cf0b..20dce416b5 100644 --- a/harbour/contrib/hbzlib/test.prg +++ b/harbour/contrib/hbzlib/test.prg @@ -1,11 +1,14 @@ Function Main() +/* HB_ZIPFILE('test.zip','zip.h',,{|cFile| qout(cFile)}) HB_ZIPFILE('test2.zip','zip.h') +*/ Hb_ZIPFILE('test12.zip',{'.\test.prg','.\zlib.h','.\zip.h','..\..\obj\b32\test.obj'},8,{|cfile| qout(cfile)}) /* erase zip.h ? 'unzipping file' hb_unzipfile('test.zip') -hb_unzipfile('test12.zip') */ +hb_unzipfile('test12.zip',{|cFile| qout(cFile)}) + return nil diff --git a/harbour/contrib/hbzlib/unzip.h b/harbour/contrib/hbzlib/unzip.h new file mode 100644 index 0000000000..4829b99072 --- /dev/null +++ b/harbour/contrib/hbzlib/unzip.h @@ -0,0 +1,274 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 0.15 beta, Mar 19th, 1998, + + Copyright (C) 1998 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Encryption and multi volume ZipFile (span) are not supported. + Old compressions used by old PKZip 1.x are not supported + + THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE + CAN CHANGE IN FUTURE VERSION !! + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ +/* for more info about .ZIP format, see + ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip */ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer + "zlib/zlib111.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/harbour/contrib/hbzlib/zipfile2.c b/harbour/contrib/hbzlib/zipfile2.c index 708bc58feb..5269e509a4 100644 --- a/harbour/contrib/hbzlib/zipfile2.c +++ b/harbour/contrib/hbzlib/zipfile2.c @@ -118,7 +118,7 @@ int hb___MakeDir(char *NewDirectory) return 1; } -int hb___ExtractOneFile(unzFile uf,const char* filename,int opt_extract_without_path,int opt_overwrite) +int hb___ExtractOneFile(unzFile uf,const char* filename,int opt_extract_without_path,int opt_overwrite,PHB_ITEM pBlock) { err = UNZ_OK; if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) @@ -127,13 +127,13 @@ int hb___ExtractOneFile(unzFile uf,const char* filename,int opt_extract_without_ } if (hb___ExtractCurrentFile(uf,&opt_extract_without_path, - &opt_overwrite) == UNZ_OK) + &opt_overwrite,pBlock) == UNZ_OK) return 0; else return 1; } -int hb___Extract(unzFile uf,int opt_extract_without_path,int opt_overwrite) +int hb___Extract(unzFile uf,int opt_extract_without_path,int opt_overwrite,PHB_ITEM pBlock) { uLong uiCount; unz_global_info szGlobalUnzipInfo; @@ -146,10 +146,10 @@ int hb___Extract(unzFile uf,int opt_extract_without_path,int opt_overwrite) for (uiCount=1;uiCount<=szGlobalUnzipInfo.number_entry;uiCount++) { if (hb___ExtractCurrentFile(uf,&opt_extract_without_path, - &opt_overwrite) != UNZ_OK) + &opt_overwrite, pBlock) != UNZ_OK) break; - if ((uiCount+1)