which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@5403 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			225 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*---------------------------------------------------------------------------
 | |
| 
 | |
|   api.c
 | |
| 
 | |
|   This module supplies an UnZip engine for use directly from C/C++
 | |
|   programs.  The functions are:
 | |
| 
 | |
|     UzpVer *UzpVersion(void);
 | |
|     int UzpMain(int argc, char *argv[]);
 | |
|     int UzpAltMain(int argc, char *argv[], UzpInit *init);
 | |
|     int UzpUnzipToMemory(char *zip, char *file, UzpBuffer *retstr);
 | |
| 
 | |
|   OS/2 only (for now):
 | |
| 
 | |
|     int UzpFileTree(char *name, cbList(callBack), char *cpInclude[],
 | |
|           char *cpExclude[]);
 | |
| 
 | |
|   You must define `DLL' in order to include the API extensions.
 | |
| 
 | |
|   ---------------------------------------------------------------------------*/
 | |
| 
 | |
| 
 | |
| #ifdef OS2
 | |
| #  define  INCL_DOSMEMMGR
 | |
| #  include <os2.h>
 | |
| #endif
 | |
| 
 | |
| #define UNZIP_INTERNAL
 | |
| #include "unzip.h"
 | |
| #include "version.h"
 | |
| #ifdef USE_ZLIB
 | |
| #  include "zlib.h"
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------
 | |
|     Documented API entry points
 | |
|   ---------------------------------------------------------------------------*/
 | |
| 
 | |
| 
 | |
| UzpVer * UZ_EXP UzpVersion()   /* should be pointer to const struct */
 | |
| {
 | |
|     static UzpVer version;     /* doesn't change between calls */
 | |
| 
 | |
| 
 | |
|     version.structlen = UZPVER_LEN;
 | |
| 
 | |
| #ifdef BETA
 | |
|     version.flag = 1;
 | |
| #else
 | |
|     version.flag = 0;
 | |
| #endif
 | |
|     version.betalevel = BETALEVEL;
 | |
|     version.date = VERSION_DATE;
 | |
| 
 | |
| #ifdef ZLIB_VERSION
 | |
|     version.zlib_version = ZLIB_VERSION;
 | |
|     version.flag |= 2;
 | |
| #else
 | |
|     version.zlib_version = NULL;
 | |
| #endif
 | |
| 
 | |
|     /* someday each of these may have a separate patchlevel: */
 | |
|     version.unzip.major = UZ_MAJORVER;
 | |
|     version.unzip.minor = UZ_MINORVER;
 | |
|     version.unzip.patchlevel = PATCHLEVEL;
 | |
| 
 | |
|     version.zipinfo.major = ZI_MAJORVER;
 | |
|     version.zipinfo.minor = ZI_MINORVER;
 | |
|     version.zipinfo.patchlevel = PATCHLEVEL;
 | |
| 
 | |
|     /* these are retained for backward compatibility only: */
 | |
|     version.os2dll.major = UZ_MAJORVER;
 | |
|     version.os2dll.minor = UZ_MINORVER;
 | |
|     version.os2dll.patchlevel = PATCHLEVEL;
 | |
| 
 | |
|     version.windll.major = UZ_MAJORVER;
 | |
|     version.windll.minor = UZ_MINORVER;
 | |
|     version.windll.patchlevel = PATCHLEVEL;
 | |
| 
 | |
|     return &version;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| #ifndef WINDLL
 | |
| 
 | |
| int UZ_EXP UzpAltMain(int argc, char *argv[], UzpInit *init)
 | |
| {
 | |
|     int r, (*dummyfn)();
 | |
| 
 | |
| 
 | |
|     CONSTRUCTGLOBALS();
 | |
| 
 | |
|     if (init->structlen >= (sizeof(ulg) + sizeof(dummyfn)) && init->msgfn)
 | |
|         G.message = init->msgfn;
 | |
| 
 | |
|     if (init->structlen >= (sizeof(ulg) + 2*sizeof(dummyfn)) && init->inputfn)
 | |
|         G.input = init->inputfn;
 | |
| 
 | |
|     if (init->structlen >= (sizeof(ulg) + 3*sizeof(dummyfn)) && init->pausefn)
 | |
|         G.mpause = init->pausefn;
 | |
| 
 | |
|     if (init->structlen >= (sizeof(ulg) + 4*sizeof(dummyfn)) && init->userfn)
 | |
|         (*init->userfn)();    /* allow void* arg? */
 | |
| 
 | |
|     r = unzip(__G__ argc, argv);
 | |
|     DESTROYGLOBALS()
 | |
|     RETURN(r);
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| 
 | |
| int UZ_EXP UzpUnzipToMemory(char *zip,char *file,UzpBuffer *retstr)
 | |
| {
 | |
|     int r;
 | |
| 
 | |
|     CONSTRUCTGLOBALS();
 | |
|     G.redirect_data = 1;
 | |
|     r = unzipToMemory(__G__ zip,file,retstr)==0;
 | |
|     DESTROYGLOBALS()
 | |
|     return r;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| #ifdef OS2DLL
 | |
| 
 | |
| int UZ_EXP UzpFileTree(char *name, cbList(callBack), char *cpInclude[],
 | |
|                 char *cpExclude[])
 | |
| {
 | |
|     int r;
 | |
| 
 | |
|     CONSTRUCTGLOBALS();
 | |
|     G.qflag = 2;
 | |
|     G.vflag = 1;
 | |
|     G.C_flag = 1;
 | |
|     G.wildzipfn = name;
 | |
|     G.process_all_files = TRUE;
 | |
|     if (cpInclude)
 | |
|         G.pfnames = cpInclude, G.process_all_files = FALSE;
 | |
|     if (cpExclude)
 | |
|         G.pxnames = cpExclude, G.process_all_files = FALSE;
 | |
|   
 | |
|     G.processExternally = callBack;
 | |
|     r = process_zipfiles(__G)==0;
 | |
|     DESTROYGLOBALS()
 | |
|     return r;
 | |
| }
 | |
| 
 | |
| #endif /* OS2DLL */
 | |
| 
 | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------
 | |
|     Helper functions
 | |
|   ---------------------------------------------------------------------------*/
 | |
| 
 | |
| 
 | |
| void setFileNotFound(__G)
 | |
|     __GDEF
 | |
| {
 | |
|     G.filenotfound++;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| int unzipToMemory(__GPRO__ char *zip, char *file, UzpBuffer *retstr)
 | |
| {
 | |
|     int r;
 | |
|     char *incname[2];
 | |
| 
 | |
|     G.process_all_files = FALSE;
 | |
|     G.extract_flag = TRUE;
 | |
|     G.qflag = 2;
 | |
|     G.C_flag = 1;
 | |
|     G.wildzipfn = zip;
 | |
| 
 | |
|     G.pfnames = incname;
 | |
|     incname[0] = file;
 | |
|     incname[1] = NULL;
 | |
|     G.filespecs = 1;
 | |
| 
 | |
|     r = process_zipfiles(__G);
 | |
|     if (retstr) {
 | |
|         retstr->strptr = (char *)G.redirect_buffer;
 | |
|         retstr->strlength = G.redirect_size;
 | |
|     }
 | |
|     r |= G.filenotfound;
 | |
|     if (r)
 | |
|         return r;   /* GRR:  these two lines don't make much sense... */
 | |
|     return r;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| int redirect_outfile(__G)
 | |
|      __GDEF
 | |
| {
 | |
|     G.redirect_size = G.lrec.ucsize;
 | |
| #ifdef OS2
 | |
|     DosAllocMem((void **)&G.redirect_buffer, G.redirect_size+1,
 | |
|       PAG_READ|PAG_WRITE|PAG_COMMIT);
 | |
|     G.redirect_pointer = G.redirect_buffer;
 | |
| #else
 | |
|     G.redirect_pointer = G.redirect_buffer = malloc(G.redirect_size+1);
 | |
| #endif
 | |
|     if (!G.redirect_buffer)
 | |
|         return FALSE;
 | |
|     G.redirect_pointer[G.redirect_size] = 0;
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| int writeToMemory(__GPRO__ uch *rawbuf, ulg size)
 | |
| {
 | |
|     if (rawbuf != G.redirect_pointer)
 | |
|         memcpy(G.redirect_pointer,rawbuf,size);
 | |
|     G.redirect_pointer += size;
 | |
|     return 0;
 | |
| }
 |