diff options
Diffstat (limited to 'Build/source/extra/unzip/windll/windll.c')
-rw-r--r-- | Build/source/extra/unzip/windll/windll.c | 744 |
1 files changed, 0 insertions, 744 deletions
diff --git a/Build/source/extra/unzip/windll/windll.c b/Build/source/extra/unzip/windll/windll.c deleted file mode 100644 index ced6d5d6b4b..00000000000 --- a/Build/source/extra/unzip/windll/windll.c +++ /dev/null @@ -1,744 +0,0 @@ -/* - Copyright (C) 1996 Mike White - Permission is granted to any individual or institution to use, copy, or - redistribute this software so long as all of the original files are included, - that it is not sold for profit, and that this copyright notice is retained. - -*/ -/* Windows Info-ZIP Unzip DLL module - * - * Author: Mike White - * - * Original: 1996 - * - * This module has the entry points for "unzipping" a zip file. - */ - -/*--------------------------------------------------------------------------- - - This file is the WINDLL replacement for the generic ``main program source - file'' unzip.c. - - See the general comments in the header part of unzip.c. - - Copyrights: see accompanying file "COPYING" in UnZip source distribution. - (This software is free but NOT IN THE PUBLIC DOMAIN. There - are some restrictions on commercial use.) - - ---------------------------------------------------------------------------*/ - -#include <windows.h> -#ifdef __RSXNT__ -# include "win32/rsxntwin.h" -#endif -#ifdef __BORLANDC__ -#include <dir.h> -#endif -#define UNZIP_INTERNAL -#include "unzip.h" -#include "crypt.h" -#include "version.h" -#include "windll.h" -#include "structs.h" -#include "consts.h" - -/* Added type casts to prevent potential "type mismatch" error messages. */ -#ifdef REENTRANT -# undef __G -# undef __G__ -# define __G (Uz_Globs *)pG -# define __G__ (Uz_Globs *)pG, -#endif - -HANDLE hwildZipFN; -HANDLE hInst; /* current instance */ -HANDLE hDCL; -int fNoPrinting = 0; -extern jmp_buf dll_error_return; - -/* For displaying status messages and error messages */ -static int UZ_EXP DllMessagePrint(zvoid *pG, uch *buf, ulg size, int flag); - -#if 0 /* currently unused */ -/* For displaying files extracted to the display window */ -int DllDisplayPrint(zvoid *pG, uch *buf, ulg size, int flag); -#endif /* never */ - -/* Callback function for status report and/or user interception */ -static int UZ_EXP Wiz_StatReportCB(zvoid *pG, int fnflag, ZCONST char *zfn, - ZCONST char *efn, ZCONST zvoid *details); - -/* Dummy sound function for those applications that don't use sound */ -static void WINAPI DummySound(void); - -#ifndef UNZIPLIB -/* DLL Entry Point */ - -#ifdef __BORLANDC__ -#pragma argsused -/* Borland seems to want DllEntryPoint instead of DllMain like MSVC */ -#define DllMain DllEntryPoint -#endif -#ifdef WIN32 -BOOL WINAPI DllMain( HINSTANCE hInstance, - DWORD dwReason, - LPVOID plvReserved) -#else -int FAR PASCAL LibMain( HINSTANCE hInstance, - WORD wDataSegment, - WORD wHeapSize, - LPSTR lpszCmdLine ) -#endif -{ -#ifndef WIN32 -/* The startup code for the DLL initializes the local heap(if there is one) - * with a call to LocalInit which locks the data segment. - */ - -if ( wHeapSize != 0 ) - { - UnlockData( 0 ); - } -hInst = hInstance; -return 1; /* Indicate that the DLL was initialized successfully. */ -#else -BOOL rc = TRUE; -switch( dwReason ) - { - case DLL_PROCESS_ATTACH: - // DLL is loaded. Do your initialization here. - // If cannot init, set rc to FALSE. - hInst = hInstance; - break; - - case DLL_PROCESS_DETACH: - // DLL is unloaded. Do your cleanup here. - break; - default: - break; - } -return rc; -#endif -} - -#ifdef __BORLANDC__ -#pragma argsused -#endif -int FAR PASCAL WEP ( int bSystemExit ) -{ -return 1; -} -#endif /* !UNZIPLIB */ - -/* DLL calls */ - -/* - ExtractOnlyNewer = true if you are to extract only newer - SpaceToUnderscore = true if convert space to underscore - PromptToOverwrite = true if prompt to overwrite is wanted - fQuiet = quiet flag. 1 = few messages, 2 = no messages, 0 = all messages - ncflag = write to stdout if true - ntflag = test zip file - nvflag = verbose listing - nUflag = "update" (extract only newer/new files) - nzflag = display zip file comment - ndflag = all args are files/dir to be extracted - noflag = overwrite all files - naflag = do end-of-line translation - nZIflag = get Zip Info if TRUE - C_flag = be case insensitive if TRUE - fPrivilege = restore ACL's if 1, use privileges if 2 - lpszZipFN = zip file name - lpszExtractDir = directory to extract to; NULL means: current directory -*/ - -BOOL WINAPI Wiz_SetOpts(pG, C) -zvoid *pG; -LPDCL C; -{ - uO.qflag = C->fQuiet; /* Quiet flag */ - G.pfnames = (char **)&fnames[0]; /* assign default file name vector */ - G.pxnames = (char **)&fnames[1]; - - uO.jflag = !C->ndflag; - uO.cflag = C->ncflag; - uO.overwrite_all = C->noflag; - uO.tflag = C->ntflag ; - uO.vflag = C->nvflag; - uO.zflag = C->nzflag; - uO.uflag = C->nUflag; - uO.aflag = C->naflag; - uO.C_flag = C->C_flag; - uO.uflag = C->ExtractOnlyNewer; - G.prompt_always = C->PromptToOverwrite; -#ifdef WIN32 - uO.X_flag = C->fPrivilege; -#endif - uO.overwrite_none = !uO.overwrite_all; - uO.sflag = C->SpaceToUnderscore; /* Translate spaces to underscores? */ - if (C->nZIflag) - { - uO.zipinfo_mode = TRUE; - uO.hflag = TRUE; - uO.lflag = 10; - uO.qflag = 2; - } - else - { - uO.zipinfo_mode = FALSE; - } - - G.extract_flag = (!uO.zipinfo_mode && - !uO.cflag && !uO.tflag && !uO.vflag && !uO.zflag -#ifdef TIMESTAMP - && !uO.T_flag -#endif - ); - - if (C->lpszExtractDir != NULL && G.extract_flag) - { -#ifndef CRTL_CP_IS_ISO - char *pExDirRoot = (char *)malloc(strlen(C->lpszExtractDir)+1); - - if (pExDirRoot == NULL) - return FALSE; - ISO_TO_INTERN(C->lpszExtractDir, pExDirRoot); -#else -# define pExDirRoot C->lpszExtractDir -#endif - uO.exdir = pExDirRoot; - } - else - { - uO.exdir = (char *)NULL; - } - -/* G.wildzipfn needs to be initialized so that do_wild does not wind - up clearing out the zip file name when it returns in process.c -*/ - hwildZipFN = GlobalAlloc(GPTR, FILNAMSIZ); - if (hwildZipFN == (HGLOBAL) NULL) - return FALSE; - - G.wildzipfn = GlobalLock(hwildZipFN); - lstrcpy(G.wildzipfn, C->lpszZipFN); - _ISO_INTERN(G.wildzipfn); - - return TRUE; /* set up was OK */ -} - -void FreeDllMem(__GPRO) -{ - if (G.wildzipfn) { - GlobalUnlock(hwildZipFN); - G.wildzipfn = NULL; - } - if (hwildZipFN) - hwildZipFN = GlobalFree(hwildZipFN); - - uO.zipinfo_mode = FALSE; -} - -int WINAPI Wiz_SingleEntryUnzip(int ifnc, char **ifnv, int xfnc, char **xfnv, - LPDCL C, LPUSERFUNCTIONS lpUserFunc) -{ -int retcode; -CONSTRUCTGLOBALS(); - -if (!Wiz_Init((zvoid *)&G, lpUserFunc)) - { - DESTROYGLOBALS(); - return PK_BADERR; - } - -if (C->lpszZipFN == NULL) /* Something has screwed up, we don't have a filename */ - { - DESTROYGLOBALS(); - return PK_NOZIP; - } - -Wiz_SetOpts((zvoid *)&G, C); - -#ifdef SFX -G.zipfn = C->lpszZipFN; -G.argv0 = C->lpszZipFN; -#endif - -/* Here is the actual call to "unzip" the files (or whatever else you - * are doing.) - */ -retcode = Wiz_Unzip((zvoid *)&G, ifnc, ifnv, xfnc, xfnv); - -DESTROYGLOBALS(); -return retcode; -} - - -BOOL WINAPI Wiz_Init(pG, lpUserFunc) -zvoid *pG; -LPUSERFUNCTIONS lpUserFunc; -{ -G.message = DllMessagePrint; -G.statreportcb = Wiz_StatReportCB; -if (lpUserFunc->sound == NULL) - lpUserFunc->sound = DummySound; -G.lpUserFunctions = lpUserFunc; - -if (!G.lpUserFunctions->print || - !G.lpUserFunctions->sound || - !G.lpUserFunctions->replace) - return FALSE; - -return TRUE; -} - -int WINAPI Wiz_Unzip(pG, ifnc, ifnv, xfnc, xfnv) -zvoid *pG; -int ifnc; -char **ifnv; -int xfnc; -char **xfnv; -{ -int retcode, f_cnt; -#ifndef CRTL_CP_IS_ISO -char **intern_ifv = NULL, **intern_xfv = NULL; -#endif - -if (ifnv == (char **)NULL && ifnc != 0) - ifnc = 0; -else - for (f_cnt = 0; f_cnt < ifnc; f_cnt++) - if (ifnv[f_cnt] == (char *)NULL) { - ifnc = f_cnt; - break; - } -if (xfnv == (char **)NULL && xfnc != 0) - xfnc = 0; -else - for (f_cnt = 0; f_cnt < xfnc; f_cnt++) - if (xfnv[f_cnt] == (char *)NULL) { - xfnc = f_cnt; - break; - } - -G.process_all_files = (ifnc == 0 && xfnc == 0); /* for speed */ -G.filespecs = ifnc; -G.xfilespecs = xfnc; - -if (ifnc > 0) { -#ifdef CRTL_CP_IS_ISO - G.pfnames = ifnv; -#else /* !CRTL_CP_IS_ISO */ - unsigned bufsize = 0; - - intern_ifv = (char **)malloc((ifnc+1)*sizeof(char **)); - if (intern_ifv == (char **)NULL) - { - FreeDllMem(__G); - return PK_BADERR; - } - - for (f_cnt = ifnc; --f_cnt >= 0;) - bufsize += strlen(ifnv[f_cnt]) + 1; - intern_ifv[0] = (char *)malloc(bufsize); - if (intern_ifv[0] == (char *)NULL) - { - free(intern_ifv); - FreeDllMem(__G); - return PK_BADERR; - } - - for (f_cnt = 0; ; f_cnt++) - { - ISO_TO_INTERN(ifnv[f_cnt], intern_ifv[f_cnt]); - if ((f_cnt+1) >= ifnc) - break; - intern_ifv[f_cnt+1] = intern_ifv[f_cnt] + - (strlen(intern_ifv[f_cnt]) + 1); - } - intern_ifv[ifnc] = (char *)NULL; - G.pfnames = intern_ifv; -#endif /* ?CRTL_CP_IS_ISO */ - } - -if (xfnc > 0) { -#ifdef CRTL_CP_IS_ISO - G.pxnames = xfnv; -#else /* !CRTL_CP_IS_ISO */ - unsigned bufsize = 0; - - intern_xfv = (char **)malloc((xfnc+1)*sizeof(char **)); - if (intern_xfv == (char **)NULL) - { - if (ifnc > 0) - { - free(intern_ifv[0]); - free(intern_ifv); - } - FreeDllMem(__G); - return PK_BADERR; - } - - for (f_cnt = xfnc; --f_cnt >= 0;) - bufsize += strlen(xfnv[f_cnt]) + 1; - intern_xfv[0] = (char *)malloc(bufsize); - if (intern_xfv[0] == (char *)NULL) - { - free(intern_xfv); - if (ifnc > 0) - { - free(intern_ifv[0]); - free(intern_ifv); - } - FreeDllMem(__G); - return PK_BADERR; - } - - for (f_cnt = 0; ; f_cnt++) - { - ISO_TO_INTERN(xfnv[f_cnt], intern_xfv[f_cnt]); - if ((f_cnt+1) >= xfnc) - break; - intern_xfv[f_cnt+1] = intern_xfv[f_cnt] + - (strlen(intern_xfv[f_cnt]) + 1); - } - intern_xfv[xfnc] = (char *)NULL; - G.pxnames = intern_xfv; -#endif /* ?CRTL_CP_IS_ISO */ - } - -/*--------------------------------------------------------------------------- - Okey dokey, we have everything we need to get started. Let's roll. - ---------------------------------------------------------------------------*/ - -retcode = setjmp(dll_error_return); -if (retcode) - { -#ifndef CRTL_CP_IS_ISO - if (xfnc > 0) - { - free(intern_xfv[0]); - free(intern_xfv); - } - if (ifnc > 0) - { - free(intern_ifv[0]); - free(intern_ifv); - } -#endif - FreeDllMem(__G); - return PK_BADERR; - } - -retcode = process_zipfiles(__G); -#ifndef CRTL_CP_IS_ISO -if (xfnc > 0) - { - free(intern_xfv[0]); - free(intern_xfv); - } -if (ifnc > 0) - { - free(intern_ifv[0]); - free(intern_ifv); - } -#endif -FreeDllMem(__G); -return retcode; -} - - -int win_fprintf(zvoid *pG, FILE *file, unsigned int size, char far *buffer) -{ -if ((file != stderr) && (file != stdout)) - { - return write(fileno(file),(char far *)(buffer),size); - } -if (!fNoPrinting) - return G.lpUserFunctions->print((LPSTR)buffer, size); -return (int)size; -} - -/********************************** - * Function DllMessagePrint() * - * * - * Send messages to status window * - **********************************/ -#ifdef __BORLANDC__ -#pragma argsused -#endif -static int UZ_EXP DllMessagePrint(pG, buf, size, flag) - zvoid *pG; /* globals struct: always passed */ - uch *buf; /* preformatted string to be printed */ - ulg size; /* length of string (may include nulls) */ - int flag; /* flag bits */ -{ -if (!fNoPrinting) - return G.lpUserFunctions->print((LPSTR)buf, size); -else - return (int)size; -} - -#if 0 /* currently unused */ -/******************************** - * Function DllDisplayPrint() * - * * - * Send files to display window * - ********************************/ -#ifdef __BORLANDC__ -#pragma argsused -#endif -int DllDisplayPrint(pG, buf, size, flag) - zvoid *pG; /* globals struct: always passed */ - uch *buf; /* preformatted string to be printed */ - ulg size; /* length of string (may include nulls) */ - int flag; /* flag bits */ -{ -return (!fNoPrinting ? G.lpUserFunctions->print((LPSTR)buf, size) : (int)size); -} -#endif /* never */ - - -/********************************** - * Function UzpPassword() * - * * - * Prompt for decryption password * - **********************************/ -#ifdef __BORLANDC__ -#pragma argsused -#endif -int UZ_EXP UzpPassword(pG, rcnt, pwbuf, size, zfn, efn) - zvoid *pG; /* globals struct: always passed */ - int *rcnt; /* retry counter */ - char *pwbuf; /* buffer for password */ - int size; /* size of password buffer */ - ZCONST char *zfn; /* name of zip archiv */ - ZCONST char *efn; /* name of archiv entry being processed */ -{ -#if CRYPT - LPSTR m; - - if (*rcnt == 0) { - *rcnt = 2; - m = "Enter password for: "; - } else { - (*rcnt)--; - m = "Password incorrect--reenter: "; - } - - return (*G.lpUserFunctions->password)((LPSTR)pwbuf, size, m, (LPSTR)efn); -#else /* !CRYPT */ - return IZ_PW_ERROR; /* internal error, function should never get called */ -#endif /* ?CRYPT */ -} /* end function UzpPassword() */ - -/* Turn off all messages to the calling application */ -void WINAPI Wiz_NoPrinting(int f) -{ -fNoPrinting = f; -} - -/* Dummy sound function for those applications that don't use sound */ -static void WINAPI DummySound(void) -{ -} - -/* Interface between WINDLL specific service callback functions and the - generic DLL's "status report & user interception" callback */ -#ifdef __BORLANDC__ -#pragma argsused -#endif -static int WINAPI Wiz_StatReportCB(zvoid *pG, int fnflag, ZCONST char *zfn, - ZCONST char *efn, ZCONST zvoid *details) -{ - int rval = UZ_ST_CONTINUE; - - switch (fnflag) { - case UZ_ST_START_EXTRACT: - if (G.lpUserFunctions->sound != NULL) - (*G.lpUserFunctions->sound)(); - break; - case UZ_ST_FINISH_MEMBER: - if ((G.lpUserFunctions->ServCallBk != NULL) && - (*G.lpUserFunctions->ServCallBk)(efn, *((unsigned long *)details))) - rval = UZ_ST_BREAK; - break; - case UZ_ST_IN_PROGRESS: - break; - default: - break; - } - return rval; -} - - -#ifndef SFX -#ifndef __16BIT__ - -int WINAPI Wiz_UnzipToMemory(LPSTR zip, LPSTR file, - LPUSERFUNCTIONS lpUserFunctions, UzpBuffer *retstr) -{ - int r; -#ifndef CRTL_CP_IS_ISO - char *intern_zip, *intern_file; -#endif - - CONSTRUCTGLOBALS(); -#ifndef 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 - if (!Wiz_Init((zvoid *)&G, lpUserFunctions)) { - DESTROYGLOBALS(); - return PK_BADERR; - } - G.redirect_data = 1; - - r = (unzipToMemory(__G__ zip, file, retstr) == PK_COOL); - - DESTROYGLOBALS() -#ifndef 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; -} - - - - -/* 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 WINAPI Wiz_Grep(LPSTR archive, LPSTR file, LPSTR pattern, int cmd, - int SkipBin, LPUSERFUNCTIONS lpUserFunctions) -{ - int retcode = FALSE, compare; - ulg i, j, patternLen, buflen; - char * sz, *p; - UzpBuffer retstr; - - /* Turn off any windows printing functions, as they may not have been - * identified yet. There is no requirement that we initialize the - * dll with printing stuff for this. */ - Wiz_NoPrinting(TRUE); - - if (!Wiz_UnzipToMemory(archive, file, lpUserFunctions, &retstr)) { - Wiz_NoPrinting(FALSE); - 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); - Wiz_NoPrinting(FALSE); - return FALSE; - } - } - } - } - - patternLen = strlen(pattern); - - if (retstr.strlength < patternLen) { - free(retstr.strptr); - Wiz_NoPrinting(FALSE); - 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); - Wiz_NoPrinting(FALSE); /* Turn printing back on */ - return retcode; -} -#endif /* !__16BIT__ */ - -int WINAPI Wiz_Validate(LPSTR archive, int AllCodes) -{ - return UzpValidate((char *)archive, AllCodes); -} - -#endif /* !SFX */ |