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;
|
|
}
|