diff options
Diffstat (limited to 'Build/source/extra/unzip/api.c')
-rw-r--r-- | Build/source/extra/unzip/api.c | 601 |
1 files changed, 0 insertions, 601 deletions
diff --git a/Build/source/extra/unzip/api.c b/Build/source/extra/unzip/api.c deleted file mode 100644 index 5a4e73abf8b..00000000000 --- a/Build/source/extra/unzip/api.c +++ /dev/null @@ -1,601 +0,0 @@ -/*--------------------------------------------------------------------------- - - api.c - - This module supplies an UnZip engine for use directly from C/C++ - programs. The functions are: - - UzpVer *UzpVersion(void); - void UzpVersion2(UzpVer2 *version) - int UzpMain(int argc, char *argv[]); - int UzpAltMain(int argc, char *argv[], UzpInit *init); - int UzpValidate(char *archive, int AllCodes); - void UzpFreeMemBuffer(UzpBuffer *retstr); - int UzpUnzipToMemory(char *zip, char *file, UzpOpts *optflgs, - UzpCB *UsrFuncts, UzpBuffer *retstr); - - non-WINDLL only (a special WINDLL variant is defined in windll/windll.c): - int UzpGrep(char *archive, char *file, char *pattern, int cmd, int SkipBin, - UzpCB *UsrFuncts); - - 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 -#include <setjmp.h> - -#define UNZIP_INTERNAL -#include "unzip.h" -#include "version.h" -#ifdef WINDLL -# include "windll/windll.h" -#endif - -#ifdef DLL /* This source file supplies DLL-only interface code. */ - -jmp_buf dll_error_return; - -/*--------------------------------------------------------------------------- - 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; -} - -void UZ_EXP UzpVersion2(UzpVer2 *version) -{ - - version->structlen = UZPVER_LEN; - -#ifdef BETA - version->flag = 1; -#else - version->flag = 0; -#endif - strcpy(version->betalevel, BETALEVEL); - strcpy(version->date, VERSION_DATE); - -#ifdef ZLIB_VERSION - strcpy(version->zlib_version, ZLIB_VERSION); - version->flag |= 2; -#else - version->zlib_version[0] = '\0'; -#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; -} - - - - - -#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 /* !WINDLL */ - - - - -#ifndef __16BIT__ - -void UZ_EXP UzpFreeMemBuffer(UzpBuffer *retstr) -{ - if (retstr->strptr != NULL) { - free(retstr->strptr); - retstr->strptr = NULL; - } -} - - - - -#ifndef WINDLL - -static int UzpDLL_Init OF((zvoid *pG, UzpCB *UsrFuncts)); - -static int UzpDLL_Init(pG, UsrFuncts) -zvoid *pG; -UzpCB *UsrFuncts; -{ - int (*dummyfn)(); - - if (UsrFuncts->structlen >= (sizeof(ulg) + sizeof(dummyfn)) && - UsrFuncts->msgfn) - ((Uz_Globs *)pG)->message = UsrFuncts->msgfn; - else - return FALSE; - - if (UsrFuncts->structlen >= (sizeof(ulg) + 2*sizeof(dummyfn)) && - UsrFuncts->inputfn) - ((Uz_Globs *)pG)->input = UsrFuncts->inputfn; - - if (UsrFuncts->structlen >= (sizeof(ulg) + 3*sizeof(dummyfn)) && - UsrFuncts->pausefn) - ((Uz_Globs *)pG)->mpause = UsrFuncts->pausefn; - - if (UsrFuncts->structlen >= (sizeof(ulg) + 4*sizeof(dummyfn)) && - UsrFuncts->passwdfn) - ((Uz_Globs *)pG)->decr_passwd = UsrFuncts->passwdfn; - - if (UsrFuncts->structlen >= (sizeof(ulg) + 5*sizeof(dummyfn)) && - UsrFuncts->statrepfn) - ((Uz_Globs *)pG)->statreportcb = UsrFuncts->statrepfn; - - return TRUE; -} - - -int UZ_EXP UzpUnzipToMemory(char *zip, char *file, UzpOpts *optflgs, - UzpCB *UsrFuncts, UzpBuffer *retstr) -{ - int r; -#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) - char *intern_zip, *intern_file; -#endif - - CONSTRUCTGLOBALS(); -#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) - intern_zip = (char *)malloc(strlen(zip)+1); - if (intern_zip == NULL) { - DESTROYGLOBALS() - return PK_MEM; - } - intern_file = (char *)malloc(strlen(file)+1); - if (intern_file == NULL) { - DESTROYGLOBALS() - free(intern_zip); - return PK_MEM; - } - ISO_TO_INTERN(zip, intern_zip); - ISO_TO_INTERN(file, intern_file); -# define zip intern_zip -# define file intern_file -#endif - /* Copy those options that are meaningful for UzpUnzipToMemory, instead of - * a simple "memcpy(G.UzO, optflgs, sizeof(UzpOpts));" - */ - uO.pwdarg = optflgs->pwdarg; - uO.aflag = optflgs->aflag; - uO.C_flag = optflgs->C_flag; - uO.qflag = optflgs->qflag; /* currently, overridden in unzipToMemory */ - - if (!UzpDLL_Init((zvoid *)&G, UsrFuncts)) { - DESTROYGLOBALS(); - return PK_BADERR; - } - G.redirect_data = 1; - - r = (unzipToMemory(__G__ zip, file, retstr) <= PK_WARN); - - DESTROYGLOBALS() -#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) -# undef file -# undef zip - free(intern_file); - free(intern_zip); -#endif - if (!r && retstr->strlength) { - free(retstr->strptr); - retstr->strptr = NULL; - } - return r; -} -#endif /* !WINDLL */ -#endif /* !__16BIT__ */ - - - - - -#ifdef OS2DLL - -int UZ_EXP UzpFileTree(char *name, cbList(callBack), char *cpInclude[], - char *cpExclude[]) -{ - int r; - - CONSTRUCTGLOBALS(); - uO.qflag = 2; - uO.vflag = 1; - uO.C_flag = 1; - G.wildzipfn = name; - G.process_all_files = TRUE; - if (cpInclude) { - char **ptr = cpInclude; - - while (*ptr != NULL) ptr++; - G.filespecs = ptr - cpInclude; - G.pfnames = cpInclude, G.process_all_files = FALSE; - } - if (cpExclude) { - char **ptr = cpExclude; - - while (*ptr != NULL) ptr++; - G.xfilespecs = ptr - 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; - uO.qflag = 2; - 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; - } - return r; /* returns `PK_???' error values */ -} - - - -int redirect_outfile(__G) - __GDEF -{ - if (G.redirect_size != 0 || G.redirect_buffer != NULL) - return FALSE; - -#ifndef NO_SLIDE_REDIR - G.redirect_slide = !G.pInfo->textmode; -#endif - G.redirect_size = (G.pInfo->textmode ? - G.lrec.ucsize * lenEOL : 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 -#ifdef __16BIT__ - if ((ulg)((extent)G.redirect_size) != G.redirect_size) - return FALSE; -#endif - 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; -} - - - - -int close_redirect(__G) - __GDEF -{ - if (G.pInfo->textmode) { - *G.redirect_pointer = '\0'; - G.redirect_size = G.redirect_pointer - G.redirect_buffer; - if ((G.redirect_buffer = - realloc(G.redirect_buffer, G.redirect_size + 1)) == NULL) { - G.redirect_size = 0; - return EOF; - } - } - return 0; -} - - - - -#ifndef __16BIT__ -#ifndef WINDLL - -/* Purpose: Determine if file in archive contains the string szSearch - - Parameters: archive = archive name - file = file contained in the archive. This cannot be - a wild card to be meaningful - pattern = string to search for - cmd = 0 - case-insensitive search - 1 - case-sensitve search - 2 - case-insensitive, whole words only - 3 - case-sensitive, whole words only - SkipBin = if true, skip any files that have control - characters other than CR, LF, or tab in the first - 100 characters. - - Returns: TRUE if a match is found - FALSE if no match is found - -1 on error - - Comments: This does not pretend to be as useful as the standard - Unix grep, which returns the strings associated with a - particular pattern, nor does it search past the first - matching occurrence of the pattern. - */ - -int UZ_EXP UzpGrep(char *archive, char *file, char *pattern, int cmd, - int SkipBin, UzpCB *UsrFuncts) -{ - int retcode = FALSE, compare; - ulg i, j, patternLen, buflen; - char * sz, *p; - UzpOpts flgopts; - UzpBuffer retstr; - - memzero(&flgopts, sizeof(UzpOpts)); /* no special options */ - - if (!UzpUnzipToMemory(archive, file, &flgopts, UsrFuncts, &retstr)) { - return -1; /* not enough memory, file not found, or other error */ - } - - if (SkipBin) { - if (retstr.strlength < 100) - buflen = retstr.strlength; - else - buflen = 100; - for (i = 0; i < buflen; i++) { - if (iscntrl(retstr.strptr[i])) { - if ((retstr.strptr[i] != 0x0A) && - (retstr.strptr[i] != 0x0D) && - (retstr.strptr[i] != 0x09)) - { - /* OK, we now think we have a binary file of some sort */ - free(retstr.strptr); - return FALSE; - } - } - } - } - - patternLen = strlen(pattern); - - if (retstr.strlength < patternLen) { - free(retstr.strptr); - return FALSE; - } - - sz = malloc(patternLen + 3); /* add two in case doing whole words only */ - if (cmd > 1) { - strcpy(sz, " "); - strcat(sz, pattern); - strcat(sz, " "); - } else - strcpy(sz, pattern); - - if ((cmd == 0) || (cmd == 2)) { - for (i = 0; i < strlen(sz); i++) - sz[i] = toupper(sz[i]); - for (i = 0; i < retstr.strlength; i++) - retstr.strptr[i] = toupper(retstr.strptr[i]); - } - - for (i = 0; i < (retstr.strlength - patternLen); i++) { - p = &retstr.strptr[i]; - compare = TRUE; - for (j = 0; j < patternLen; j++) { - /* We cannot do strncmp here, as we may be dealing with a - * "binary" file, such as a word processing file, or perhaps - * even a true executable of some sort. */ - if (p[j] != sz[j]) { - compare = FALSE; - break; - } - } - if (compare == TRUE) { - retcode = TRUE; - break; - } - } - - free(sz); - free(retstr.strptr); - - return retcode; -} -#endif /* !WINDLL */ -#endif /* !__16BIT__ */ - - - - -int UZ_EXP UzpValidate(char *archive, int AllCodes) -{ - int retcode; - CONSTRUCTGLOBALS(); - - uO.jflag = 1; - uO.tflag = 1; - uO.overwrite_none = 0; - G.extract_flag = (!uO.zipinfo_mode && - !uO.cflag && !uO.tflag && !uO.vflag && !uO.zflag -#ifdef TIMESTAMP - && !uO.T_flag -#endif - ); - - uO.qflag = 2; /* turn off all messages */ - G.fValidate = TRUE; - G.pfnames = (char **)&fnames[0]; /* assign default filename vector */ -#ifdef WINDLL - Wiz_NoPrinting(TRUE); -#endif - - if (archive == NULL) { /* something is screwed up: no filename */ - DESTROYGLOBALS(); - return PK_NOZIP; - } - - G.wildzipfn = (char *)malloc(FILNAMSIZ + 1); - strcpy(G.wildzipfn, archive); -#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) - _ISO_INTERN(G.wildzipfn); -#endif - - G.process_all_files = TRUE; /* for speed */ - - retcode = setjmp(dll_error_return); - - if (retcode) { -#ifdef WINDLL - Wiz_NoPrinting(FALSE); -#endif - free(G.wildzipfn); - DESTROYGLOBALS(); - return PK_BADERR; - } - - retcode = process_zipfiles(__G); - - free(G.wildzipfn); -#ifdef WINDLL - Wiz_NoPrinting(FALSE); -#endif - DESTROYGLOBALS(); - - /* PK_WARN == 1 and PK_FIND == 11. When we are just looking at an - archive, we should still be able to see the files inside it, - even if we can't decode them for some reason. - - We also still want to be able to get at files even if there is - something odd about the zip archive, hence allow PK_WARN, - PK_FIND, IZ_UNSUP as well as PK_ERR - */ - - if (AllCodes) - return retcode; - - if ((retcode == PK_OK) || (retcode == PK_WARN) || (retcode == PK_ERR) || - (retcode == IZ_UNSUP) || (retcode == PK_FIND)) - return TRUE; - else - return FALSE; -} - -#endif /* DLL */ |