mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
Add Info-ZIP unzip.com
This commit is contained in:
parent
1531f1a4a7
commit
af4687cc3f
55 changed files with 36744 additions and 2 deletions
1
Makefile
1
Makefile
|
@ -155,6 +155,7 @@ include third_party/mbedtls/test/test.mk
|
||||||
include third_party/quickjs/quickjs.mk
|
include third_party/quickjs/quickjs.mk
|
||||||
include third_party/lz4cli/lz4cli.mk
|
include third_party/lz4cli/lz4cli.mk
|
||||||
include third_party/zip/zip.mk
|
include third_party/zip/zip.mk
|
||||||
|
include third_party/unzip/unzip.mk
|
||||||
include tool/build/lib/buildlib.mk
|
include tool/build/lib/buildlib.mk
|
||||||
include third_party/chibicc/chibicc.mk
|
include third_party/chibicc/chibicc.mk
|
||||||
include third_party/chibicc/test/test.mk
|
include third_party/chibicc/test/test.mk
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#ifndef COSMOPOLITAN_LIBC_CALLS_IOCTL_H_
|
#ifndef COSMOPOLITAN_LIBC_CALLS_IOCTL_H_
|
||||||
#define COSMOPOLITAN_LIBC_CALLS_IOCTL_H_
|
#define COSMOPOLITAN_LIBC_CALLS_IOCTL_H_
|
||||||
#include "libc/macros.internal.h"
|
|
||||||
#include "libc/sysv/consts/fio.h"
|
#include "libc/sysv/consts/fio.h"
|
||||||
#include "libc/sysv/consts/sio.h"
|
#include "libc/sysv/consts/sio.h"
|
||||||
#include "libc/sysv/consts/termios.h"
|
#include "libc/sysv/consts/termios.h"
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "libc/calls/ioctl.h"
|
#include "libc/calls/ioctl.h"
|
||||||
#include "libc/calls/strace.internal.h"
|
#include "libc/calls/strace.internal.h"
|
||||||
#include "libc/calls/syscall-sysv.internal.h"
|
#include "libc/calls/syscall-sysv.internal.h"
|
||||||
|
#include "libc/macros.internal.h"
|
||||||
#include "libc/mem/mem.h"
|
#include "libc/mem/mem.h"
|
||||||
#include "libc/sock/internal.h"
|
#include "libc/sock/internal.h"
|
||||||
#include "libc/sock/sock.h"
|
#include "libc/sock/sock.h"
|
||||||
|
|
1
third_party/third_party.mk
vendored
1
third_party/third_party.mk
vendored
|
@ -25,6 +25,7 @@ o/$(MODE)/third_party: \
|
||||||
o/$(MODE)/third_party/sqlite3 \
|
o/$(MODE)/third_party/sqlite3 \
|
||||||
o/$(MODE)/third_party/stb \
|
o/$(MODE)/third_party/stb \
|
||||||
o/$(MODE)/third_party/tidy \
|
o/$(MODE)/third_party/tidy \
|
||||||
|
o/$(MODE)/third_party/unzip \
|
||||||
o/$(MODE)/third_party/xed \
|
o/$(MODE)/third_party/xed \
|
||||||
o/$(MODE)/third_party/zip \
|
o/$(MODE)/third_party/zip \
|
||||||
o/$(MODE)/third_party/zlib
|
o/$(MODE)/third_party/zlib
|
||||||
|
|
62
third_party/unzip/LICENSE
vendored
Normal file
62
third_party/unzip/LICENSE
vendored
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
This is version 2009-Jan-02 of the Info-ZIP license.
|
||||||
|
The definitive version of this document should be available at
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely and
|
||||||
|
a copy at http://www.info-zip.org/pub/infozip/license.html.
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
For the purposes of this copyright and license, "Info-ZIP" is defined as
|
||||||
|
the following set of individuals:
|
||||||
|
|
||||||
|
Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois,
|
||||||
|
Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth,
|
||||||
|
Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz,
|
||||||
|
David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko,
|
||||||
|
Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs,
|
||||||
|
Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda,
|
||||||
|
Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren,
|
||||||
|
Rich Wales, Mike White.
|
||||||
|
|
||||||
|
This software is provided "as is," without warranty of any kind, express
|
||||||
|
or implied. In no event shall Info-ZIP or its contributors be held liable
|
||||||
|
for any direct, indirect, incidental, special or consequential damages
|
||||||
|
arising out of the use of or inability to use 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 above disclaimer and the following restrictions:
|
||||||
|
|
||||||
|
1. Redistributions of source code (in whole or in part) must retain
|
||||||
|
the above copyright notice, definition, disclaimer, and this list
|
||||||
|
of conditions.
|
||||||
|
|
||||||
|
2. Redistributions in binary form (compiled executables and libraries)
|
||||||
|
must reproduce the above copyright notice, definition, disclaimer,
|
||||||
|
and this list of conditions in documentation and/or other materials
|
||||||
|
provided with the distribution. Additional documentation is not needed
|
||||||
|
for executables where a command line license option provides these and
|
||||||
|
a note regarding this option is in the executable's startup banner. The
|
||||||
|
sole exception to this condition is redistribution of a standard
|
||||||
|
UnZipSFX binary (including SFXWiz) as part of a self-extracting archive;
|
||||||
|
that is permitted without inclusion of this license, as long as the
|
||||||
|
normal SFX banner has not been removed from the binary or disabled.
|
||||||
|
|
||||||
|
3. Altered versions--including, but not limited to, ports to new operating
|
||||||
|
systems, existing ports with new graphical interfaces, versions with
|
||||||
|
modified or added functionality, and dynamic, shared, or static library
|
||||||
|
versions not from Info-ZIP--must be plainly marked as such and must not
|
||||||
|
be misrepresented as being the original source or, if binaries,
|
||||||
|
compiled from the original source. Such altered versions also must not
|
||||||
|
be misrepresented as being Info-ZIP releases--including, but not
|
||||||
|
limited to, labeling of the altered versions with the names "Info-ZIP"
|
||||||
|
(or any variation thereof, including, but not limited to, different
|
||||||
|
capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the
|
||||||
|
explicit permission of Info-ZIP. Such altered versions are further
|
||||||
|
prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP
|
||||||
|
e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP
|
||||||
|
will provide support for the altered versions.
|
||||||
|
|
||||||
|
4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip,"
|
||||||
|
"UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its
|
||||||
|
own source and binary releases.
|
27
third_party/unzip/README.cosmo
vendored
Normal file
27
third_party/unzip/README.cosmo
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
DESCRIPTION
|
||||||
|
|
||||||
|
The UNIX unzip command, courtesy of the Info-ZIP project.
|
||||||
|
|
||||||
|
PROVENANCE
|
||||||
|
|
||||||
|
unzip610b.zip (circa 2010)
|
||||||
|
https://sourceforge.net/projects/infozip/files/unreleased%20Betas/UnZip%20betas/
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
|
||||||
|
BSD-like with Apache-like requirement that changes be documented.
|
||||||
|
|
||||||
|
LOCAL CHANGES
|
||||||
|
|
||||||
|
The only way this software differs from the normal InfoZIP sources is
|
||||||
|
that we're linking the Cosmopolitan C Library, which enables it to be
|
||||||
|
built as an Actually Portable Executable.
|
||||||
|
|
||||||
|
Minor changes include:
|
||||||
|
|
||||||
|
- Normalization of header / build config for platform / repository
|
||||||
|
sed -i -e '/# *include *<.*/d' *.*
|
||||||
|
sed -i -e 's!# *include *"!#include "third_party/unzip/!' *.*
|
||||||
|
sed -i -e '1 i\// clang-format off' *.c *.h
|
||||||
|
|
||||||
|
- Fixed a lot of static analysis buffer overflow warnings.
|
706
third_party/unzip/api.c
vendored
Normal file
706
third_party/unzip/api.c
vendored
Normal file
|
@ -0,0 +1,706 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
api.c
|
||||||
|
|
||||||
|
This module supplies an UnZip engine for use directly from C/C++
|
||||||
|
programs. The functions are:
|
||||||
|
|
||||||
|
ZCONST UzpVer *UzpVersion(void);
|
||||||
|
unsigned 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
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
#include "third_party/unzip/unzvers.h"
|
||||||
|
|
||||||
|
#ifdef DLL /* This source file supplies DLL-only interface code. */
|
||||||
|
|
||||||
|
#ifndef POCKET_UNZIP /* WinCE pUnZip defines this elsewhere. */
|
||||||
|
jmp_buf dll_error_return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Documented API entry points
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
ZCONST UzpVer * UZ_EXP UzpVersion() /* returns pointer to const struct */
|
||||||
|
{
|
||||||
|
static ZCONST UzpVer version = { /* doesn't change between calls */
|
||||||
|
/* structure size */
|
||||||
|
UZPVER_LEN,
|
||||||
|
/* version flags */
|
||||||
|
#ifdef BETA
|
||||||
|
# ifdef ZLIB_VERSION
|
||||||
|
3,
|
||||||
|
# else
|
||||||
|
1,
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifdef ZLIB_VERSION
|
||||||
|
2,
|
||||||
|
# else
|
||||||
|
0,
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
/* betalevel and date strings */
|
||||||
|
UZ_BETALEVEL, UZ_VERSION_DATE,
|
||||||
|
/* zlib_version string */
|
||||||
|
#ifdef ZLIB_VERSION
|
||||||
|
ZLIB_VERSION,
|
||||||
|
#else
|
||||||
|
NULL,
|
||||||
|
#endif
|
||||||
|
/*== someday each of these may have a separate patchlevel: ==*/
|
||||||
|
/* unzip version */
|
||||||
|
{UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, 0},
|
||||||
|
/* zipinfo version */
|
||||||
|
{ZI_MAJORVER, ZI_MINORVER, UZ_PATCHLEVEL, 0},
|
||||||
|
/* os2dll version (retained for backward compatibility) */
|
||||||
|
{UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, 0},
|
||||||
|
/* windll version (retained for backward compatibility)*/
|
||||||
|
{UZ_MAJORVER, UZ_MINORVER, UZ_PATCHLEVEL, 0},
|
||||||
|
#ifdef OS2DLL
|
||||||
|
/* os2dll API minimum compatible version*/
|
||||||
|
{UZ_OS2API_COMP_MAJOR, UZ_OS2API_COMP_MINOR, UZ_OS2API_COMP_REVIS, 0}
|
||||||
|
#else /* !OS2DLL */
|
||||||
|
#ifdef WINDLL
|
||||||
|
/* windll API minimum compatible version*/
|
||||||
|
{UZ_WINAPI_COMP_MAJOR, UZ_WINAPI_COMP_MINOR, UZ_WINAPI_COMP_REVIS, 0}
|
||||||
|
#else /* !WINDLL */
|
||||||
|
/* generic DLL API minimum compatible version*/
|
||||||
|
{UZ_GENAPI_COMP_MAJOR, UZ_GENAPI_COMP_MINOR, UZ_GENAPI_COMP_REVIS, 0}
|
||||||
|
#endif /* ?WINDLL */
|
||||||
|
#endif /* ?OS2DLL */
|
||||||
|
};
|
||||||
|
|
||||||
|
return &version;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned UZ_EXP UzpVersion2(UzpVer2 *version)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (version->structlen != sizeof(UzpVer2))
|
||||||
|
return sizeof(UzpVer2);
|
||||||
|
|
||||||
|
#ifdef BETA
|
||||||
|
version->flag = 1;
|
||||||
|
#else
|
||||||
|
version->flag = 0;
|
||||||
|
#endif
|
||||||
|
strcpy(version->betalevel, UZ_BETALEVEL);
|
||||||
|
strcpy(version->date, UZ_VERSION_DATE);
|
||||||
|
|
||||||
|
#ifdef ZLIB_VERSION
|
||||||
|
/* Although ZLIB_VERSION is a compile-time constant, we implement an
|
||||||
|
"overrun-safe" copy because its actual value is not under our control.
|
||||||
|
*/
|
||||||
|
strncpy(version->zlib_version, ZLIB_VERSION,
|
||||||
|
sizeof(version->zlib_version) - 1);
|
||||||
|
version->zlib_version[sizeof(version->zlib_version) - 1] = '\0';
|
||||||
|
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 = UZ_PATCHLEVEL;
|
||||||
|
|
||||||
|
version->zipinfo.major = ZI_MAJORVER;
|
||||||
|
version->zipinfo.minor = ZI_MINORVER;
|
||||||
|
version->zipinfo.patchlevel = UZ_PATCHLEVEL;
|
||||||
|
|
||||||
|
/* these are retained for backward compatibility only: */
|
||||||
|
version->os2dll.major = UZ_MAJORVER;
|
||||||
|
version->os2dll.minor = UZ_MINORVER;
|
||||||
|
version->os2dll.patchlevel = UZ_PATCHLEVEL;
|
||||||
|
|
||||||
|
version->windll.major = UZ_MAJORVER;
|
||||||
|
version->windll.minor = UZ_MINORVER;
|
||||||
|
version->windll.patchlevel = UZ_PATCHLEVEL;
|
||||||
|
|
||||||
|
#ifdef OS2DLL
|
||||||
|
/* os2dll API minimum compatible version*/
|
||||||
|
version->dllapimin.major = UZ_OS2API_COMP_MAJOR;
|
||||||
|
version->dllapimin.minor = UZ_OS2API_COMP_MINOR;
|
||||||
|
version->dllapimin.patchlevel = UZ_OS2API_COMP_REVIS;
|
||||||
|
#else /* !OS2DLL */
|
||||||
|
#ifdef WINDLL
|
||||||
|
/* windll API minimum compatible version*/
|
||||||
|
version->dllapimin.major = UZ_WINAPI_COMP_MAJOR;
|
||||||
|
version->dllapimin.minor = UZ_WINAPI_COMP_MINOR;
|
||||||
|
version->dllapimin.patchlevel = UZ_WINAPI_COMP_REVIS;
|
||||||
|
#else /* !WINDLL */
|
||||||
|
/* generic DLL API minimum compatible version*/
|
||||||
|
version->dllapimin.major = UZ_GENAPI_COMP_MAJOR;
|
||||||
|
version->dllapimin.minor = UZ_GENAPI_COMP_MINOR;
|
||||||
|
version->dllapimin.patchlevel = UZ_GENAPI_COMP_REVIS;
|
||||||
|
#endif /* ?WINDLL */
|
||||||
|
#endif /* ?OS2DLL */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
#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 != NULL && retstr->strptr != NULL) {
|
||||||
|
free(retstr->strptr);
|
||||||
|
retstr->strptr = NULL;
|
||||||
|
retstr->strlength = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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 */
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Helper functions
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
void setFileNotFound(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
G.filenotfound++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
int unzipToMemory(__GPRO__ char *zip, char *file, UzpBuffer *retstr)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
char *incname[2];
|
||||||
|
|
||||||
|
if ((zip == NULL) || (strlen(zip) > ((WSIZE>>2) - 160)))
|
||||||
|
return PK_PARAM;
|
||||||
|
if ((file == NULL) || (strlen(file) > ((WSIZE>>2) - 160)))
|
||||||
|
return PK_PARAM;
|
||||||
|
|
||||||
|
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 */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
/*
|
||||||
|
With the advent of 64 bit support, for now I am assuming that
|
||||||
|
if the size of the file is greater than an unsigned long, there
|
||||||
|
will simply not be enough memory to handle it, and am returning
|
||||||
|
FALSE.
|
||||||
|
*/
|
||||||
|
int redirect_outfile(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
#ifdef ZIP64_SUPPORT
|
||||||
|
__int64 check_conversion;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (G.redirect_size != 0 || G.redirect_buffer != NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
#ifndef NO_SLIDE_REDIR
|
||||||
|
G.redirect_slide = !G.pInfo->textmode;
|
||||||
|
#endif
|
||||||
|
#if (lenEOL != 1)
|
||||||
|
if (G.pInfo->textmode) {
|
||||||
|
G.redirect_size = (ulg)(G.lrec.ucsize * lenEOL);
|
||||||
|
if (G.redirect_size < G.lrec.ucsize)
|
||||||
|
G.redirect_size = (ulg)((G.lrec.ucsize > (ulg)-2L) ?
|
||||||
|
G.lrec.ucsize : -2L);
|
||||||
|
#ifdef ZIP64_SUPPORT
|
||||||
|
check_conversion = G.lrec.ucsize * lenEOL;
|
||||||
|
#endif
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
G.redirect_size = (ulg)G.lrec.ucsize;
|
||||||
|
#ifdef ZIP64_SUPPORT
|
||||||
|
check_conversion = (__int64)G.lrec.ucsize;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ZIP64_SUPPORT
|
||||||
|
if ((__int64)G.redirect_size != check_conversion)
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __16BIT__
|
||||||
|
if ((ulg)((extent)G.redirect_size) != G.redirect_size)
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
|
#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((extent)(G.redirect_size+1));
|
||||||
|
#endif
|
||||||
|
if (!G.redirect_buffer)
|
||||||
|
return FALSE;
|
||||||
|
G.redirect_pointer[G.redirect_size] = '\0';
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int writeToMemory(__GPRO__ ZCONST uch *rawbuf, extent size)
|
||||||
|
{
|
||||||
|
int errflg = FALSE;
|
||||||
|
|
||||||
|
if ((uch *)rawbuf != G.redirect_pointer) {
|
||||||
|
extent redir_avail = (G.redirect_buffer + G.redirect_size) -
|
||||||
|
G.redirect_pointer;
|
||||||
|
|
||||||
|
/* Check for output buffer overflow */
|
||||||
|
if (size > redir_avail) {
|
||||||
|
/* limit transfer data to available space, set error return flag */
|
||||||
|
size = redir_avail;
|
||||||
|
errflg = TRUE;
|
||||||
|
}
|
||||||
|
memcpy(G.redirect_pointer, rawbuf, size);
|
||||||
|
}
|
||||||
|
G.redirect_pointer += size;
|
||||||
|
return errflg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int close_redirect(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
if (G.pInfo->textmode) {
|
||||||
|
*G.redirect_pointer = '\0';
|
||||||
|
G.redirect_size = (ulg)(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 SFX
|
||||||
|
#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 wildcard 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 */
|
||||||
|
|
||||||
|
if (archive == NULL) { /* something is screwed up: no filename */
|
||||||
|
DESTROYGLOBALS();
|
||||||
|
retcode = PK_NOZIP;
|
||||||
|
goto exit_retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(archive) >= FILNAMSIZ) {
|
||||||
|
/* length of supplied archive name exceed the system's filename limit */
|
||||||
|
DESTROYGLOBALS();
|
||||||
|
retcode = PK_PARAM;
|
||||||
|
goto exit_retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
G.wildzipfn = (char *)malloc(FILNAMSIZ);
|
||||||
|
strcpy(G.wildzipfn, archive);
|
||||||
|
#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO))
|
||||||
|
_ISO_INTERN(G.wildzipfn);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WINDLL
|
||||||
|
Wiz_NoPrinting(TRUE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
G.process_all_files = TRUE; /* for speed */
|
||||||
|
|
||||||
|
if (setjmp(dll_error_return) != 0) {
|
||||||
|
#ifdef WINDLL
|
||||||
|
Wiz_NoPrinting(FALSE);
|
||||||
|
#endif
|
||||||
|
free(G.wildzipfn);
|
||||||
|
DESTROYGLOBALS();
|
||||||
|
retcode = PK_BADERR;
|
||||||
|
goto exit_retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
|
||||||
|
exit_retcode:
|
||||||
|
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 /* !SFX */
|
||||||
|
#endif /* DLL */
|
156
third_party/unzip/apihelp.c
vendored
Normal file
156
third_party/unzip/apihelp.c
vendored
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2001 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/* apihelp.c */
|
||||||
|
|
||||||
|
#ifdef API_DOC
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
#include "third_party/unzip/unzvers.h"
|
||||||
|
|
||||||
|
|
||||||
|
APIDocStruct APIDoc[] = {
|
||||||
|
{
|
||||||
|
"UZPVERSION" , "UzpVersion" ,
|
||||||
|
"UzpVer *UzpVersion(void);",
|
||||||
|
"Get version numbers of the API and the underlying UnZip code.\n\n"
|
||||||
|
"\t\tThis is used for comparing the version numbers of the run-time\n"
|
||||||
|
"\t\tDLL code with those expected from the unzip.h at compile time.\n"
|
||||||
|
"\t\tIf the version numbers do not match, there may be compatibility\n"
|
||||||
|
"\t\tproblems with further use of the DLL.\n\n"
|
||||||
|
" Example:\t/* Check the major version number of the DLL code. */\n"
|
||||||
|
"\t\tUzpVer *pVersion;\n"
|
||||||
|
"\t\tpVersion = UzpVersion();\n"
|
||||||
|
"\t\tif (pVersion->unzip.major != UZ_MAJORVER)\n"
|
||||||
|
"\t\t fprintf(stderr, \"error: using wrong version of DLL\\n\");\n\n"
|
||||||
|
"\t\tSee unzip.h for details and unzipstb.c for an example.\n"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"UZPMAIN" , "UzpMain" ,
|
||||||
|
"int UzpMain(int argc, char *argv[]);",
|
||||||
|
"Provide a direct entry point to the command line interface.\n\n"
|
||||||
|
"\t\tThis is used by the UnZip stub but you can use it in your\n"
|
||||||
|
"\t\town program as well. Output is sent to stdout.\n"
|
||||||
|
"\t\t0 on return indicates success.\n\n"
|
||||||
|
" Example:\t/* Extract 'test.zip' silently, junking paths. */\n"
|
||||||
|
"\t\tchar *argv[] = { \"-q\", \"-j\", \"test.zip\" };\n"
|
||||||
|
"\t\tint argc = 3;\n"
|
||||||
|
"\t\tif (UzpMain(argc,argv))\n"
|
||||||
|
"\t\t printf(\"error: unzip failed\\n\");\n\n"
|
||||||
|
"\t\tSee unzip.h for details.\n"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"UZPALTMAIN" , "UzpAltMain" ,
|
||||||
|
"int UzpAltMain(int argc, char *argv[], UzpInit *init);",
|
||||||
|
"Provide a direct entry point to the command line interface,\n"
|
||||||
|
"optionally installing replacement I/O handler functions.\n\n"
|
||||||
|
"\t\tAs with UzpMain(), output is sent to stdout by default.\n"
|
||||||
|
"\t\t`InputFn *inputfn' is not yet implemented. 0 on return\n"
|
||||||
|
"\t\tindicates success.\n\n"
|
||||||
|
" Example:\t/* Replace normal output and `more' functions. */\n"
|
||||||
|
"\t\tchar *argv[] = { \"-q\", \"-j\", \"test.zip\" };\n"
|
||||||
|
"\t\tint argc = 3;\n"
|
||||||
|
"\t\tUzpInit init = { 16, MyMessageFn, NULL, MyPauseFn };\n"
|
||||||
|
"\t\tif (UzpAltMain(argc,argv,&init))\n"
|
||||||
|
"\t\t printf(\"error: unzip failed\\n\");\n\n"
|
||||||
|
"\t\tSee unzip.h for details.\n"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"UZPUNZIPTOMEMORY", "UzpUnzipToMemory",
|
||||||
|
"int UzpUnzipToMemory(char *zip, char *file, UzpBuffer *retstr);",
|
||||||
|
"Pass the name of the zip file and the name of the file\n"
|
||||||
|
"\t\tyou wish to extract. UzpUnzipToMemory will create a\n"
|
||||||
|
"\t\tbuffer and return it in *retstr; 0 on return indicates\n"
|
||||||
|
"\t\tfailure.\n\n"
|
||||||
|
"\t\tSee unzip.h for details.\n"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"UZPFILETREE", "UzpFileTree",
|
||||||
|
"int UzpFileTree(char *name, cbList(callBack),\n"
|
||||||
|
"\t\t\tchar *cpInclude[], char *cpExclude[]);",
|
||||||
|
"Pass the name of the zip file, a callback function, an\n"
|
||||||
|
"\t\tinclude and exclude file list. UzpFileTree calls the\n"
|
||||||
|
"\t\tcallback for each valid file found in the zip file.\n"
|
||||||
|
"\t\t0 on return indicates failure.\n\n"
|
||||||
|
"\t\tSee unzip.h for details.\n"
|
||||||
|
},
|
||||||
|
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int function_help OF((__GPRO__ APIDocStruct *doc, char *fname));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int function_help(__G__ doc, fname)
|
||||||
|
__GDEF
|
||||||
|
APIDocStruct *doc;
|
||||||
|
char *fname;
|
||||||
|
{
|
||||||
|
strcpy(slide, fname);
|
||||||
|
/* strupr(slide); non-standard */
|
||||||
|
while (doc->compare && STRNICMP(doc->compare,slide,strlen(fname)))
|
||||||
|
doc++;
|
||||||
|
if (!doc->compare)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
Info(slide, 0, ((char *)slide,
|
||||||
|
" Function:\t%s\n\n Syntax:\t%s\n\n Purpose:\t%s",
|
||||||
|
doc->function, doc->syntax, doc->purpose));
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void APIhelp(__G__ argc, argv)
|
||||||
|
__GDEF
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
{
|
||||||
|
if (argc > 1) {
|
||||||
|
struct APIDocStruct *doc;
|
||||||
|
|
||||||
|
if (function_help(__G__ APIDoc, argv[1]))
|
||||||
|
return;
|
||||||
|
#ifdef SYSTEM_API_DETAILS
|
||||||
|
if (function_help(__G__ SYSTEM_API_DETAILS, argv[1]))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
Info(slide, 0, ((char *)slide,
|
||||||
|
"%s is not a documented command.\n\n", argv[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Info(slide, 0, ((char *)slide, "\
|
||||||
|
This API provides a number of external C and REXX functions for handling\n\
|
||||||
|
zipfiles in OS/2. Programmers are encouraged to expand this API.\n\
|
||||||
|
\n\
|
||||||
|
C functions: -- See unzip.h for details\n\
|
||||||
|
UzpVer *UzpVersion(void);\n\
|
||||||
|
int UzpMain(int argc, char *argv[]);\n\
|
||||||
|
int UzpAltMain(int argc, char *argv[], UzpInit *init);\n\
|
||||||
|
int UzpUnzipToMemory(char *zip, char *file, UzpBuffer *retstr);\n\
|
||||||
|
int UzpFileTree(char *name, cbList(callBack),\n\
|
||||||
|
char *cpInclude[], char *cpExclude[]);\n\n"));
|
||||||
|
|
||||||
|
#ifdef SYSTEM_API_BRIEF
|
||||||
|
Info(slide, 0, ((char *)slide, SYSTEM_API_BRIEF));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Info(slide, 0, ((char *)slide,
|
||||||
|
"\nFor more information, type 'unzip -A <function-name>'\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* API_DOC */
|
56
third_party/unzip/consts.h
vendored
Normal file
56
third_party/unzip/consts.h
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2001 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
consts.h
|
||||||
|
|
||||||
|
This file contains global, initialized variables that never change. It is
|
||||||
|
included by unzip.c and windll/windll.c.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
#include "third_party/unzip/crc32.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* And'ing with mask_bits[n] masks the lower n bits */
|
||||||
|
ZCONST unsigned near mask_bits[17] = {
|
||||||
|
0x0000,
|
||||||
|
0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
|
||||||
|
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
|
||||||
|
};
|
||||||
|
|
||||||
|
ZCONST char Far VersionDate[] = UZ_VERSION_DATE; /* now defined in unzvers.h */
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
ZCONST char Far EndSigMsg[] =
|
||||||
|
"\nnote: didn't find end-of-central-dir signature at end of central dir.\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ZCONST char Far CentSigMsg[] =
|
||||||
|
"error: expected central file header signature not found (file #%lu).\n";
|
||||||
|
ZCONST char Far SeekMsg[] =
|
||||||
|
"error [%s]: attempt to seek before beginning of zipfile\n%s";
|
||||||
|
ZCONST char Far FilenameNotMatched[] = "caution: filename not matched: %s\n";
|
||||||
|
ZCONST char Far ExclFilenameNotMatched[] =
|
||||||
|
"caution: excluded filename not matched: %s\n";
|
||||||
|
|
||||||
|
#ifdef VMS
|
||||||
|
ZCONST char Far ReportMsg[] = "\
|
||||||
|
(please check that you have transferred or created the zipfile in the\n\
|
||||||
|
appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles)\n";
|
||||||
|
#else
|
||||||
|
ZCONST char Far ReportMsg[] = "\
|
||||||
|
(please check that you have transferred or created the zipfile in the\n\
|
||||||
|
appropriate BINARY mode and that you have compiled UnZip properly)\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
ZCONST char Far Zipnfo[] = "zipinfo";
|
||||||
|
ZCONST char Far CompiledWith[] = "Compiled with %s%s for %s%s%s%s.\n\n";
|
||||||
|
#endif
|
733
third_party/unzip/crc32.c
vendored
Normal file
733
third_party/unzip/crc32.c
vendored
Normal file
|
@ -0,0 +1,733 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2007 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2005-Feb-10 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/* crc32.c -- compute the CRC-32 of a data stream
|
||||||
|
* Copyright (C) 1995 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*
|
||||||
|
* Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
|
||||||
|
* CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
|
||||||
|
* tables for updating the shift register in one step with three exclusive-ors
|
||||||
|
* instead of four steps with four exclusive-ors. This results about a factor
|
||||||
|
* of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: crc32.c,v 2.0 2007/01/07 05:20:36 spc Exp $ */
|
||||||
|
|
||||||
|
#define __CRC32_C /* identifies this source module */
|
||||||
|
|
||||||
|
#include "third_party/unzip/zip.h"
|
||||||
|
|
||||||
|
#if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
|
||||||
|
|
||||||
|
#ifndef ZCONST
|
||||||
|
# define ZCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "third_party/unzip/crc32.h"
|
||||||
|
|
||||||
|
/* When only the table of precomputed CRC values is needed, only the basic
|
||||||
|
system-independent table containing 256 entries is created; any support
|
||||||
|
for "unfolding" optimization is disabled.
|
||||||
|
*/
|
||||||
|
#if (defined(USE_ZLIB) || defined(CRC_TABLE_ONLY))
|
||||||
|
# ifdef IZ_CRCOPTIM_UNFOLDTBL
|
||||||
|
# undef IZ_CRCOPTIM_UNFOLDTBL
|
||||||
|
# endif
|
||||||
|
#endif /* (USE_ZLIB || CRC_TABLE_ONLY) */
|
||||||
|
|
||||||
|
#if defined(IZ_CRCOPTIM_UNFOLDTBL)
|
||||||
|
# define CRC_TBLS 4
|
||||||
|
#else
|
||||||
|
# define CRC_TBLS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
|
||||||
|
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
|
||||||
|
|
||||||
|
Polynomials over GF(2) are represented in binary, one bit per coefficient,
|
||||||
|
with the lowest powers in the most significant bit. Then adding polynomials
|
||||||
|
is just exclusive-or, and multiplying a polynomial by x is a right shift by
|
||||||
|
one. If we call the above polynomial p, and represent a byte as the
|
||||||
|
polynomial q, also with the lowest power in the most significant bit (so the
|
||||||
|
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
|
||||||
|
where a mod b means the remainder after dividing a by b.
|
||||||
|
|
||||||
|
This calculation is done using the shift-register method of multiplying and
|
||||||
|
taking the remainder. The register is initialized to zero, and for each
|
||||||
|
incoming bit, x^32 is added mod p to the register if the bit is a one (where
|
||||||
|
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
|
||||||
|
x (which is shifting right by one and adding x^32 mod p if the bit shifted
|
||||||
|
out is a one). We start with the highest power (least significant bit) of
|
||||||
|
q and repeat for all eight bits of q.
|
||||||
|
|
||||||
|
The first (or only) table is simply the CRC of all possible eight bit values.
|
||||||
|
This is all the information needed to generate CRC's on data a byte-at-a-time
|
||||||
|
for all combinations of CRC register values and incoming bytes.
|
||||||
|
The remaining 3 tables (if IZ_CRCOPTIM_UNFOLDTBL is enabled) allow for
|
||||||
|
word-at-a-time CRC calculation, where a word is four bytes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
|
||||||
|
/* =========================================================================
|
||||||
|
* Make the crc table. This function is needed only if you want to compute
|
||||||
|
* the table dynamically.
|
||||||
|
*/
|
||||||
|
|
||||||
|
local void make_crc_table OF((void));
|
||||||
|
|
||||||
|
#if (defined(DYNALLOC_CRCTAB) && defined(REENTRANT))
|
||||||
|
error: Dynamic allocation of CRC table not safe with reentrant code.
|
||||||
|
#endif /* DYNALLOC_CRCTAB && REENTRANT */
|
||||||
|
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
local ulg near *crc_table = NULL;
|
||||||
|
# if 0 /* not used, since sizeof("near *") <= sizeof(int) */
|
||||||
|
/* Use this section when access to a "local int" is faster than access to
|
||||||
|
a "local pointer" (e.g.: i86 16bit code with far pointers). */
|
||||||
|
local int crc_table_empty = 1;
|
||||||
|
# define CRC_TABLE_IS_EMPTY (crc_table_empty != 0)
|
||||||
|
# define MARK_CRCTAB_FILLED crc_table_empty = 0
|
||||||
|
# define MARK_CRCTAB_EMPTY crc_table_empty = 1
|
||||||
|
# else
|
||||||
|
/* Use this section on systems where the size of pointers and ints is
|
||||||
|
equal (e.g.: all 32bit systems). */
|
||||||
|
# define CRC_TABLE_IS_EMPTY (crc_table == NULL)
|
||||||
|
# define MARK_CRCTAB_FILLED crc_table = crctab_p
|
||||||
|
# define MARK_CRCTAB_EMPTY crc_table = NULL
|
||||||
|
# endif
|
||||||
|
#else /* !DYNALLOC_CRCTAB */
|
||||||
|
local ulg near crc_table[CRC_TBLS*256];
|
||||||
|
local int crc_table_empty = 1;
|
||||||
|
# define CRC_TABLE_IS_EMPTY (crc_table_empty != 0)
|
||||||
|
# define MARK_CRCTAB_FILLED crc_table_empty = 0
|
||||||
|
#endif /* ?DYNALLOC_CRCTAB */
|
||||||
|
|
||||||
|
|
||||||
|
local void make_crc_table()
|
||||||
|
{
|
||||||
|
ulg c; /* crc shift register */
|
||||||
|
int n; /* counter for all possible eight bit values */
|
||||||
|
int k; /* byte being shifted into crc apparatus */
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
ulg near *crctab_p; /* temporary pointer to allocated crc_table area */
|
||||||
|
#else /* !DYNALLOC_CRCTAB */
|
||||||
|
# define crctab_p crc_table
|
||||||
|
#endif /* DYNALLOC_CRCTAB */
|
||||||
|
|
||||||
|
#ifdef COMPUTE_XOR_PATTERN
|
||||||
|
/* This piece of code has been left here to explain how the XOR pattern
|
||||||
|
* used in the creation of the crc_table values can be recomputed.
|
||||||
|
* For production versions of this function, it is more efficient to
|
||||||
|
* supply the resultant pattern at compile time.
|
||||||
|
*/
|
||||||
|
ulg xor; /* polynomial exclusive-or pattern */
|
||||||
|
/* terms of polynomial defining this crc (except x^32): */
|
||||||
|
static ZCONST uch p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
||||||
|
|
||||||
|
/* make exclusive-or pattern from polynomial (0xedb88320L) */
|
||||||
|
xor = 0L;
|
||||||
|
for (n = 0; n < sizeof(p)/sizeof(uch); n++)
|
||||||
|
xor |= 1L << (31 - p[n]);
|
||||||
|
#else
|
||||||
|
# define xor 0xedb88320L
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
crctab_p = (ulg near *) nearmalloc (CRC_TBLS*256*sizeof(ulg));
|
||||||
|
if (crctab_p == NULL) {
|
||||||
|
ziperr(ZE_MEM, "crc_table allocation");
|
||||||
|
}
|
||||||
|
#endif /* DYNALLOC_CRCTAB */
|
||||||
|
|
||||||
|
/* generate a crc for every 8-bit value */
|
||||||
|
for (n = 0; n < 256; n++) {
|
||||||
|
c = (ulg)n;
|
||||||
|
for (k = 8; k; k--)
|
||||||
|
c = c & 1 ? xor ^ (c >> 1) : c >> 1;
|
||||||
|
crctab_p[n] = REV_BE(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef IZ_CRCOPTIM_UNFOLDTBL
|
||||||
|
/* generate crc for each value followed by one, two, and three zeros */
|
||||||
|
for (n = 0; n < 256; n++) {
|
||||||
|
c = crctab_p[n];
|
||||||
|
for (k = 1; k < 4; k++) {
|
||||||
|
c = CRC32(c, 0, crctab_p);
|
||||||
|
crctab_p[k*256+n] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* IZ_CRCOPTIM_UNFOLDTBL */
|
||||||
|
|
||||||
|
MARK_CRCTAB_FILLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !DYNAMIC_CRC_TABLE */
|
||||||
|
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
error: Inconsistent flags, DYNALLOC_CRCTAB without DYNAMIC_CRC_TABLE.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ========================================================================
|
||||||
|
* Table of CRC-32's of all single-byte values (made by make_crc_table)
|
||||||
|
*/
|
||||||
|
local ZCONST ulg near crc_table[CRC_TBLS*256] = {
|
||||||
|
# ifdef IZ_CRC_BE_OPTIMIZ
|
||||||
|
0x00000000L, 0x96300777L, 0x2c610eeeL, 0xba510999L, 0x19c46d07L,
|
||||||
|
0x8ff46a70L, 0x35a563e9L, 0xa395649eL, 0x3288db0eL, 0xa4b8dc79L,
|
||||||
|
0x1ee9d5e0L, 0x88d9d297L, 0x2b4cb609L, 0xbd7cb17eL, 0x072db8e7L,
|
||||||
|
0x911dbf90L, 0x6410b71dL, 0xf220b06aL, 0x4871b9f3L, 0xde41be84L,
|
||||||
|
0x7dd4da1aL, 0xebe4dd6dL, 0x51b5d4f4L, 0xc785d383L, 0x56986c13L,
|
||||||
|
0xc0a86b64L, 0x7af962fdL, 0xecc9658aL, 0x4f5c0114L, 0xd96c0663L,
|
||||||
|
0x633d0ffaL, 0xf50d088dL, 0xc8206e3bL, 0x5e10694cL, 0xe44160d5L,
|
||||||
|
0x727167a2L, 0xd1e4033cL, 0x47d4044bL, 0xfd850dd2L, 0x6bb50aa5L,
|
||||||
|
0xfaa8b535L, 0x6c98b242L, 0xd6c9bbdbL, 0x40f9bcacL, 0xe36cd832L,
|
||||||
|
0x755cdf45L, 0xcf0dd6dcL, 0x593dd1abL, 0xac30d926L, 0x3a00de51L,
|
||||||
|
0x8051d7c8L, 0x1661d0bfL, 0xb5f4b421L, 0x23c4b356L, 0x9995bacfL,
|
||||||
|
0x0fa5bdb8L, 0x9eb80228L, 0x0888055fL, 0xb2d90cc6L, 0x24e90bb1L,
|
||||||
|
0x877c6f2fL, 0x114c6858L, 0xab1d61c1L, 0x3d2d66b6L, 0x9041dc76L,
|
||||||
|
0x0671db01L, 0xbc20d298L, 0x2a10d5efL, 0x8985b171L, 0x1fb5b606L,
|
||||||
|
0xa5e4bf9fL, 0x33d4b8e8L, 0xa2c90778L, 0x34f9000fL, 0x8ea80996L,
|
||||||
|
0x18980ee1L, 0xbb0d6a7fL, 0x2d3d6d08L, 0x976c6491L, 0x015c63e6L,
|
||||||
|
0xf4516b6bL, 0x62616c1cL, 0xd8306585L, 0x4e0062f2L, 0xed95066cL,
|
||||||
|
0x7ba5011bL, 0xc1f40882L, 0x57c40ff5L, 0xc6d9b065L, 0x50e9b712L,
|
||||||
|
0xeab8be8bL, 0x7c88b9fcL, 0xdf1ddd62L, 0x492dda15L, 0xf37cd38cL,
|
||||||
|
0x654cd4fbL, 0x5861b24dL, 0xce51b53aL, 0x7400bca3L, 0xe230bbd4L,
|
||||||
|
0x41a5df4aL, 0xd795d83dL, 0x6dc4d1a4L, 0xfbf4d6d3L, 0x6ae96943L,
|
||||||
|
0xfcd96e34L, 0x468867adL, 0xd0b860daL, 0x732d0444L, 0xe51d0333L,
|
||||||
|
0x5f4c0aaaL, 0xc97c0dddL, 0x3c710550L, 0xaa410227L, 0x10100bbeL,
|
||||||
|
0x86200cc9L, 0x25b56857L, 0xb3856f20L, 0x09d466b9L, 0x9fe461ceL,
|
||||||
|
0x0ef9de5eL, 0x98c9d929L, 0x2298d0b0L, 0xb4a8d7c7L, 0x173db359L,
|
||||||
|
0x810db42eL, 0x3b5cbdb7L, 0xad6cbac0L, 0x2083b8edL, 0xb6b3bf9aL,
|
||||||
|
0x0ce2b603L, 0x9ad2b174L, 0x3947d5eaL, 0xaf77d29dL, 0x1526db04L,
|
||||||
|
0x8316dc73L, 0x120b63e3L, 0x843b6494L, 0x3e6a6d0dL, 0xa85a6a7aL,
|
||||||
|
0x0bcf0ee4L, 0x9dff0993L, 0x27ae000aL, 0xb19e077dL, 0x44930ff0L,
|
||||||
|
0xd2a30887L, 0x68f2011eL, 0xfec20669L, 0x5d5762f7L, 0xcb676580L,
|
||||||
|
0x71366c19L, 0xe7066b6eL, 0x761bd4feL, 0xe02bd389L, 0x5a7ada10L,
|
||||||
|
0xcc4add67L, 0x6fdfb9f9L, 0xf9efbe8eL, 0x43beb717L, 0xd58eb060L,
|
||||||
|
0xe8a3d6d6L, 0x7e93d1a1L, 0xc4c2d838L, 0x52f2df4fL, 0xf167bbd1L,
|
||||||
|
0x6757bca6L, 0xdd06b53fL, 0x4b36b248L, 0xda2b0dd8L, 0x4c1b0aafL,
|
||||||
|
0xf64a0336L, 0x607a0441L, 0xc3ef60dfL, 0x55df67a8L, 0xef8e6e31L,
|
||||||
|
0x79be6946L, 0x8cb361cbL, 0x1a8366bcL, 0xa0d26f25L, 0x36e26852L,
|
||||||
|
0x95770cccL, 0x03470bbbL, 0xb9160222L, 0x2f260555L, 0xbe3bbac5L,
|
||||||
|
0x280bbdb2L, 0x925ab42bL, 0x046ab35cL, 0xa7ffd7c2L, 0x31cfd0b5L,
|
||||||
|
0x8b9ed92cL, 0x1daede5bL, 0xb0c2649bL, 0x26f263ecL, 0x9ca36a75L,
|
||||||
|
0x0a936d02L, 0xa906099cL, 0x3f360eebL, 0x85670772L, 0x13570005L,
|
||||||
|
0x824abf95L, 0x147ab8e2L, 0xae2bb17bL, 0x381bb60cL, 0x9b8ed292L,
|
||||||
|
0x0dbed5e5L, 0xb7efdc7cL, 0x21dfdb0bL, 0xd4d2d386L, 0x42e2d4f1L,
|
||||||
|
0xf8b3dd68L, 0x6e83da1fL, 0xcd16be81L, 0x5b26b9f6L, 0xe177b06fL,
|
||||||
|
0x7747b718L, 0xe65a0888L, 0x706a0fffL, 0xca3b0666L, 0x5c0b0111L,
|
||||||
|
0xff9e658fL, 0x69ae62f8L, 0xd3ff6b61L, 0x45cf6c16L, 0x78e20aa0L,
|
||||||
|
0xeed20dd7L, 0x5483044eL, 0xc2b30339L, 0x612667a7L, 0xf71660d0L,
|
||||||
|
0x4d476949L, 0xdb776e3eL, 0x4a6ad1aeL, 0xdc5ad6d9L, 0x660bdf40L,
|
||||||
|
0xf03bd837L, 0x53aebca9L, 0xc59ebbdeL, 0x7fcfb247L, 0xe9ffb530L,
|
||||||
|
0x1cf2bdbdL, 0x8ac2bacaL, 0x3093b353L, 0xa6a3b424L, 0x0536d0baL,
|
||||||
|
0x9306d7cdL, 0x2957de54L, 0xbf67d923L, 0x2e7a66b3L, 0xb84a61c4L,
|
||||||
|
0x021b685dL, 0x942b6f2aL, 0x37be0bb4L, 0xa18e0cc3L, 0x1bdf055aL,
|
||||||
|
0x8def022dL
|
||||||
|
# ifdef IZ_CRCOPTIM_UNFOLDTBL
|
||||||
|
,
|
||||||
|
0x00000000L, 0x41311b19L, 0x82623632L, 0xc3532d2bL, 0x04c56c64L,
|
||||||
|
0x45f4777dL, 0x86a75a56L, 0xc796414fL, 0x088ad9c8L, 0x49bbc2d1L,
|
||||||
|
0x8ae8effaL, 0xcbd9f4e3L, 0x0c4fb5acL, 0x4d7eaeb5L, 0x8e2d839eL,
|
||||||
|
0xcf1c9887L, 0x5112c24aL, 0x1023d953L, 0xd370f478L, 0x9241ef61L,
|
||||||
|
0x55d7ae2eL, 0x14e6b537L, 0xd7b5981cL, 0x96848305L, 0x59981b82L,
|
||||||
|
0x18a9009bL, 0xdbfa2db0L, 0x9acb36a9L, 0x5d5d77e6L, 0x1c6c6cffL,
|
||||||
|
0xdf3f41d4L, 0x9e0e5acdL, 0xa2248495L, 0xe3159f8cL, 0x2046b2a7L,
|
||||||
|
0x6177a9beL, 0xa6e1e8f1L, 0xe7d0f3e8L, 0x2483dec3L, 0x65b2c5daL,
|
||||||
|
0xaaae5d5dL, 0xeb9f4644L, 0x28cc6b6fL, 0x69fd7076L, 0xae6b3139L,
|
||||||
|
0xef5a2a20L, 0x2c09070bL, 0x6d381c12L, 0xf33646dfL, 0xb2075dc6L,
|
||||||
|
0x715470edL, 0x30656bf4L, 0xf7f32abbL, 0xb6c231a2L, 0x75911c89L,
|
||||||
|
0x34a00790L, 0xfbbc9f17L, 0xba8d840eL, 0x79dea925L, 0x38efb23cL,
|
||||||
|
0xff79f373L, 0xbe48e86aL, 0x7d1bc541L, 0x3c2ade58L, 0x054f79f0L,
|
||||||
|
0x447e62e9L, 0x872d4fc2L, 0xc61c54dbL, 0x018a1594L, 0x40bb0e8dL,
|
||||||
|
0x83e823a6L, 0xc2d938bfL, 0x0dc5a038L, 0x4cf4bb21L, 0x8fa7960aL,
|
||||||
|
0xce968d13L, 0x0900cc5cL, 0x4831d745L, 0x8b62fa6eL, 0xca53e177L,
|
||||||
|
0x545dbbbaL, 0x156ca0a3L, 0xd63f8d88L, 0x970e9691L, 0x5098d7deL,
|
||||||
|
0x11a9ccc7L, 0xd2fae1ecL, 0x93cbfaf5L, 0x5cd76272L, 0x1de6796bL,
|
||||||
|
0xdeb55440L, 0x9f844f59L, 0x58120e16L, 0x1923150fL, 0xda703824L,
|
||||||
|
0x9b41233dL, 0xa76bfd65L, 0xe65ae67cL, 0x2509cb57L, 0x6438d04eL,
|
||||||
|
0xa3ae9101L, 0xe29f8a18L, 0x21cca733L, 0x60fdbc2aL, 0xafe124adL,
|
||||||
|
0xeed03fb4L, 0x2d83129fL, 0x6cb20986L, 0xab2448c9L, 0xea1553d0L,
|
||||||
|
0x29467efbL, 0x687765e2L, 0xf6793f2fL, 0xb7482436L, 0x741b091dL,
|
||||||
|
0x352a1204L, 0xf2bc534bL, 0xb38d4852L, 0x70de6579L, 0x31ef7e60L,
|
||||||
|
0xfef3e6e7L, 0xbfc2fdfeL, 0x7c91d0d5L, 0x3da0cbccL, 0xfa368a83L,
|
||||||
|
0xbb07919aL, 0x7854bcb1L, 0x3965a7a8L, 0x4b98833bL, 0x0aa99822L,
|
||||||
|
0xc9fab509L, 0x88cbae10L, 0x4f5def5fL, 0x0e6cf446L, 0xcd3fd96dL,
|
||||||
|
0x8c0ec274L, 0x43125af3L, 0x022341eaL, 0xc1706cc1L, 0x804177d8L,
|
||||||
|
0x47d73697L, 0x06e62d8eL, 0xc5b500a5L, 0x84841bbcL, 0x1a8a4171L,
|
||||||
|
0x5bbb5a68L, 0x98e87743L, 0xd9d96c5aL, 0x1e4f2d15L, 0x5f7e360cL,
|
||||||
|
0x9c2d1b27L, 0xdd1c003eL, 0x120098b9L, 0x533183a0L, 0x9062ae8bL,
|
||||||
|
0xd153b592L, 0x16c5f4ddL, 0x57f4efc4L, 0x94a7c2efL, 0xd596d9f6L,
|
||||||
|
0xe9bc07aeL, 0xa88d1cb7L, 0x6bde319cL, 0x2aef2a85L, 0xed796bcaL,
|
||||||
|
0xac4870d3L, 0x6f1b5df8L, 0x2e2a46e1L, 0xe136de66L, 0xa007c57fL,
|
||||||
|
0x6354e854L, 0x2265f34dL, 0xe5f3b202L, 0xa4c2a91bL, 0x67918430L,
|
||||||
|
0x26a09f29L, 0xb8aec5e4L, 0xf99fdefdL, 0x3accf3d6L, 0x7bfde8cfL,
|
||||||
|
0xbc6ba980L, 0xfd5ab299L, 0x3e099fb2L, 0x7f3884abL, 0xb0241c2cL,
|
||||||
|
0xf1150735L, 0x32462a1eL, 0x73773107L, 0xb4e17048L, 0xf5d06b51L,
|
||||||
|
0x3683467aL, 0x77b25d63L, 0x4ed7facbL, 0x0fe6e1d2L, 0xccb5ccf9L,
|
||||||
|
0x8d84d7e0L, 0x4a1296afL, 0x0b238db6L, 0xc870a09dL, 0x8941bb84L,
|
||||||
|
0x465d2303L, 0x076c381aL, 0xc43f1531L, 0x850e0e28L, 0x42984f67L,
|
||||||
|
0x03a9547eL, 0xc0fa7955L, 0x81cb624cL, 0x1fc53881L, 0x5ef42398L,
|
||||||
|
0x9da70eb3L, 0xdc9615aaL, 0x1b0054e5L, 0x5a314ffcL, 0x996262d7L,
|
||||||
|
0xd85379ceL, 0x174fe149L, 0x567efa50L, 0x952dd77bL, 0xd41ccc62L,
|
||||||
|
0x138a8d2dL, 0x52bb9634L, 0x91e8bb1fL, 0xd0d9a006L, 0xecf37e5eL,
|
||||||
|
0xadc26547L, 0x6e91486cL, 0x2fa05375L, 0xe836123aL, 0xa9070923L,
|
||||||
|
0x6a542408L, 0x2b653f11L, 0xe479a796L, 0xa548bc8fL, 0x661b91a4L,
|
||||||
|
0x272a8abdL, 0xe0bccbf2L, 0xa18dd0ebL, 0x62defdc0L, 0x23efe6d9L,
|
||||||
|
0xbde1bc14L, 0xfcd0a70dL, 0x3f838a26L, 0x7eb2913fL, 0xb924d070L,
|
||||||
|
0xf815cb69L, 0x3b46e642L, 0x7a77fd5bL, 0xb56b65dcL, 0xf45a7ec5L,
|
||||||
|
0x370953eeL, 0x763848f7L, 0xb1ae09b8L, 0xf09f12a1L, 0x33cc3f8aL,
|
||||||
|
0x72fd2493L
|
||||||
|
,
|
||||||
|
0x00000000L, 0x376ac201L, 0x6ed48403L, 0x59be4602L, 0xdca80907L,
|
||||||
|
0xebc2cb06L, 0xb27c8d04L, 0x85164f05L, 0xb851130eL, 0x8f3bd10fL,
|
||||||
|
0xd685970dL, 0xe1ef550cL, 0x64f91a09L, 0x5393d808L, 0x0a2d9e0aL,
|
||||||
|
0x3d475c0bL, 0x70a3261cL, 0x47c9e41dL, 0x1e77a21fL, 0x291d601eL,
|
||||||
|
0xac0b2f1bL, 0x9b61ed1aL, 0xc2dfab18L, 0xf5b56919L, 0xc8f23512L,
|
||||||
|
0xff98f713L, 0xa626b111L, 0x914c7310L, 0x145a3c15L, 0x2330fe14L,
|
||||||
|
0x7a8eb816L, 0x4de47a17L, 0xe0464d38L, 0xd72c8f39L, 0x8e92c93bL,
|
||||||
|
0xb9f80b3aL, 0x3cee443fL, 0x0b84863eL, 0x523ac03cL, 0x6550023dL,
|
||||||
|
0x58175e36L, 0x6f7d9c37L, 0x36c3da35L, 0x01a91834L, 0x84bf5731L,
|
||||||
|
0xb3d59530L, 0xea6bd332L, 0xdd011133L, 0x90e56b24L, 0xa78fa925L,
|
||||||
|
0xfe31ef27L, 0xc95b2d26L, 0x4c4d6223L, 0x7b27a022L, 0x2299e620L,
|
||||||
|
0x15f32421L, 0x28b4782aL, 0x1fdeba2bL, 0x4660fc29L, 0x710a3e28L,
|
||||||
|
0xf41c712dL, 0xc376b32cL, 0x9ac8f52eL, 0xada2372fL, 0xc08d9a70L,
|
||||||
|
0xf7e75871L, 0xae591e73L, 0x9933dc72L, 0x1c259377L, 0x2b4f5176L,
|
||||||
|
0x72f11774L, 0x459bd575L, 0x78dc897eL, 0x4fb64b7fL, 0x16080d7dL,
|
||||||
|
0x2162cf7cL, 0xa4748079L, 0x931e4278L, 0xcaa0047aL, 0xfdcac67bL,
|
||||||
|
0xb02ebc6cL, 0x87447e6dL, 0xdefa386fL, 0xe990fa6eL, 0x6c86b56bL,
|
||||||
|
0x5bec776aL, 0x02523168L, 0x3538f369L, 0x087faf62L, 0x3f156d63L,
|
||||||
|
0x66ab2b61L, 0x51c1e960L, 0xd4d7a665L, 0xe3bd6464L, 0xba032266L,
|
||||||
|
0x8d69e067L, 0x20cbd748L, 0x17a11549L, 0x4e1f534bL, 0x7975914aL,
|
||||||
|
0xfc63de4fL, 0xcb091c4eL, 0x92b75a4cL, 0xa5dd984dL, 0x989ac446L,
|
||||||
|
0xaff00647L, 0xf64e4045L, 0xc1248244L, 0x4432cd41L, 0x73580f40L,
|
||||||
|
0x2ae64942L, 0x1d8c8b43L, 0x5068f154L, 0x67023355L, 0x3ebc7557L,
|
||||||
|
0x09d6b756L, 0x8cc0f853L, 0xbbaa3a52L, 0xe2147c50L, 0xd57ebe51L,
|
||||||
|
0xe839e25aL, 0xdf53205bL, 0x86ed6659L, 0xb187a458L, 0x3491eb5dL,
|
||||||
|
0x03fb295cL, 0x5a456f5eL, 0x6d2fad5fL, 0x801b35e1L, 0xb771f7e0L,
|
||||||
|
0xeecfb1e2L, 0xd9a573e3L, 0x5cb33ce6L, 0x6bd9fee7L, 0x3267b8e5L,
|
||||||
|
0x050d7ae4L, 0x384a26efL, 0x0f20e4eeL, 0x569ea2ecL, 0x61f460edL,
|
||||||
|
0xe4e22fe8L, 0xd388ede9L, 0x8a36abebL, 0xbd5c69eaL, 0xf0b813fdL,
|
||||||
|
0xc7d2d1fcL, 0x9e6c97feL, 0xa90655ffL, 0x2c101afaL, 0x1b7ad8fbL,
|
||||||
|
0x42c49ef9L, 0x75ae5cf8L, 0x48e900f3L, 0x7f83c2f2L, 0x263d84f0L,
|
||||||
|
0x115746f1L, 0x944109f4L, 0xa32bcbf5L, 0xfa958df7L, 0xcdff4ff6L,
|
||||||
|
0x605d78d9L, 0x5737bad8L, 0x0e89fcdaL, 0x39e33edbL, 0xbcf571deL,
|
||||||
|
0x8b9fb3dfL, 0xd221f5ddL, 0xe54b37dcL, 0xd80c6bd7L, 0xef66a9d6L,
|
||||||
|
0xb6d8efd4L, 0x81b22dd5L, 0x04a462d0L, 0x33cea0d1L, 0x6a70e6d3L,
|
||||||
|
0x5d1a24d2L, 0x10fe5ec5L, 0x27949cc4L, 0x7e2adac6L, 0x494018c7L,
|
||||||
|
0xcc5657c2L, 0xfb3c95c3L, 0xa282d3c1L, 0x95e811c0L, 0xa8af4dcbL,
|
||||||
|
0x9fc58fcaL, 0xc67bc9c8L, 0xf1110bc9L, 0x740744ccL, 0x436d86cdL,
|
||||||
|
0x1ad3c0cfL, 0x2db902ceL, 0x4096af91L, 0x77fc6d90L, 0x2e422b92L,
|
||||||
|
0x1928e993L, 0x9c3ea696L, 0xab546497L, 0xf2ea2295L, 0xc580e094L,
|
||||||
|
0xf8c7bc9fL, 0xcfad7e9eL, 0x9613389cL, 0xa179fa9dL, 0x246fb598L,
|
||||||
|
0x13057799L, 0x4abb319bL, 0x7dd1f39aL, 0x3035898dL, 0x075f4b8cL,
|
||||||
|
0x5ee10d8eL, 0x698bcf8fL, 0xec9d808aL, 0xdbf7428bL, 0x82490489L,
|
||||||
|
0xb523c688L, 0x88649a83L, 0xbf0e5882L, 0xe6b01e80L, 0xd1dadc81L,
|
||||||
|
0x54cc9384L, 0x63a65185L, 0x3a181787L, 0x0d72d586L, 0xa0d0e2a9L,
|
||||||
|
0x97ba20a8L, 0xce0466aaL, 0xf96ea4abL, 0x7c78ebaeL, 0x4b1229afL,
|
||||||
|
0x12ac6fadL, 0x25c6adacL, 0x1881f1a7L, 0x2feb33a6L, 0x765575a4L,
|
||||||
|
0x413fb7a5L, 0xc429f8a0L, 0xf3433aa1L, 0xaafd7ca3L, 0x9d97bea2L,
|
||||||
|
0xd073c4b5L, 0xe71906b4L, 0xbea740b6L, 0x89cd82b7L, 0x0cdbcdb2L,
|
||||||
|
0x3bb10fb3L, 0x620f49b1L, 0x55658bb0L, 0x6822d7bbL, 0x5f4815baL,
|
||||||
|
0x06f653b8L, 0x319c91b9L, 0xb48adebcL, 0x83e01cbdL, 0xda5e5abfL,
|
||||||
|
0xed3498beL
|
||||||
|
,
|
||||||
|
0x00000000L, 0x6567bcb8L, 0x8bc809aaL, 0xeeafb512L, 0x5797628fL,
|
||||||
|
0x32f0de37L, 0xdc5f6b25L, 0xb938d79dL, 0xef28b4c5L, 0x8a4f087dL,
|
||||||
|
0x64e0bd6fL, 0x018701d7L, 0xb8bfd64aL, 0xddd86af2L, 0x3377dfe0L,
|
||||||
|
0x56106358L, 0x9f571950L, 0xfa30a5e8L, 0x149f10faL, 0x71f8ac42L,
|
||||||
|
0xc8c07bdfL, 0xada7c767L, 0x43087275L, 0x266fcecdL, 0x707fad95L,
|
||||||
|
0x1518112dL, 0xfbb7a43fL, 0x9ed01887L, 0x27e8cf1aL, 0x428f73a2L,
|
||||||
|
0xac20c6b0L, 0xc9477a08L, 0x3eaf32a0L, 0x5bc88e18L, 0xb5673b0aL,
|
||||||
|
0xd00087b2L, 0x6938502fL, 0x0c5fec97L, 0xe2f05985L, 0x8797e53dL,
|
||||||
|
0xd1878665L, 0xb4e03addL, 0x5a4f8fcfL, 0x3f283377L, 0x8610e4eaL,
|
||||||
|
0xe3775852L, 0x0dd8ed40L, 0x68bf51f8L, 0xa1f82bf0L, 0xc49f9748L,
|
||||||
|
0x2a30225aL, 0x4f579ee2L, 0xf66f497fL, 0x9308f5c7L, 0x7da740d5L,
|
||||||
|
0x18c0fc6dL, 0x4ed09f35L, 0x2bb7238dL, 0xc518969fL, 0xa07f2a27L,
|
||||||
|
0x1947fdbaL, 0x7c204102L, 0x928ff410L, 0xf7e848a8L, 0x3d58149bL,
|
||||||
|
0x583fa823L, 0xb6901d31L, 0xd3f7a189L, 0x6acf7614L, 0x0fa8caacL,
|
||||||
|
0xe1077fbeL, 0x8460c306L, 0xd270a05eL, 0xb7171ce6L, 0x59b8a9f4L,
|
||||||
|
0x3cdf154cL, 0x85e7c2d1L, 0xe0807e69L, 0x0e2fcb7bL, 0x6b4877c3L,
|
||||||
|
0xa20f0dcbL, 0xc768b173L, 0x29c70461L, 0x4ca0b8d9L, 0xf5986f44L,
|
||||||
|
0x90ffd3fcL, 0x7e5066eeL, 0x1b37da56L, 0x4d27b90eL, 0x284005b6L,
|
||||||
|
0xc6efb0a4L, 0xa3880c1cL, 0x1ab0db81L, 0x7fd76739L, 0x9178d22bL,
|
||||||
|
0xf41f6e93L, 0x03f7263bL, 0x66909a83L, 0x883f2f91L, 0xed589329L,
|
||||||
|
0x546044b4L, 0x3107f80cL, 0xdfa84d1eL, 0xbacff1a6L, 0xecdf92feL,
|
||||||
|
0x89b82e46L, 0x67179b54L, 0x027027ecL, 0xbb48f071L, 0xde2f4cc9L,
|
||||||
|
0x3080f9dbL, 0x55e74563L, 0x9ca03f6bL, 0xf9c783d3L, 0x176836c1L,
|
||||||
|
0x720f8a79L, 0xcb375de4L, 0xae50e15cL, 0x40ff544eL, 0x2598e8f6L,
|
||||||
|
0x73888baeL, 0x16ef3716L, 0xf8408204L, 0x9d273ebcL, 0x241fe921L,
|
||||||
|
0x41785599L, 0xafd7e08bL, 0xcab05c33L, 0x3bb659edL, 0x5ed1e555L,
|
||||||
|
0xb07e5047L, 0xd519ecffL, 0x6c213b62L, 0x094687daL, 0xe7e932c8L,
|
||||||
|
0x828e8e70L, 0xd49eed28L, 0xb1f95190L, 0x5f56e482L, 0x3a31583aL,
|
||||||
|
0x83098fa7L, 0xe66e331fL, 0x08c1860dL, 0x6da63ab5L, 0xa4e140bdL,
|
||||||
|
0xc186fc05L, 0x2f294917L, 0x4a4ef5afL, 0xf3762232L, 0x96119e8aL,
|
||||||
|
0x78be2b98L, 0x1dd99720L, 0x4bc9f478L, 0x2eae48c0L, 0xc001fdd2L,
|
||||||
|
0xa566416aL, 0x1c5e96f7L, 0x79392a4fL, 0x97969f5dL, 0xf2f123e5L,
|
||||||
|
0x05196b4dL, 0x607ed7f5L, 0x8ed162e7L, 0xebb6de5fL, 0x528e09c2L,
|
||||||
|
0x37e9b57aL, 0xd9460068L, 0xbc21bcd0L, 0xea31df88L, 0x8f566330L,
|
||||||
|
0x61f9d622L, 0x049e6a9aL, 0xbda6bd07L, 0xd8c101bfL, 0x366eb4adL,
|
||||||
|
0x53090815L, 0x9a4e721dL, 0xff29cea5L, 0x11867bb7L, 0x74e1c70fL,
|
||||||
|
0xcdd91092L, 0xa8beac2aL, 0x46111938L, 0x2376a580L, 0x7566c6d8L,
|
||||||
|
0x10017a60L, 0xfeaecf72L, 0x9bc973caL, 0x22f1a457L, 0x479618efL,
|
||||||
|
0xa939adfdL, 0xcc5e1145L, 0x06ee4d76L, 0x6389f1ceL, 0x8d2644dcL,
|
||||||
|
0xe841f864L, 0x51792ff9L, 0x341e9341L, 0xdab12653L, 0xbfd69aebL,
|
||||||
|
0xe9c6f9b3L, 0x8ca1450bL, 0x620ef019L, 0x07694ca1L, 0xbe519b3cL,
|
||||||
|
0xdb362784L, 0x35999296L, 0x50fe2e2eL, 0x99b95426L, 0xfcdee89eL,
|
||||||
|
0x12715d8cL, 0x7716e134L, 0xce2e36a9L, 0xab498a11L, 0x45e63f03L,
|
||||||
|
0x208183bbL, 0x7691e0e3L, 0x13f65c5bL, 0xfd59e949L, 0x983e55f1L,
|
||||||
|
0x2106826cL, 0x44613ed4L, 0xaace8bc6L, 0xcfa9377eL, 0x38417fd6L,
|
||||||
|
0x5d26c36eL, 0xb389767cL, 0xd6eecac4L, 0x6fd61d59L, 0x0ab1a1e1L,
|
||||||
|
0xe41e14f3L, 0x8179a84bL, 0xd769cb13L, 0xb20e77abL, 0x5ca1c2b9L,
|
||||||
|
0x39c67e01L, 0x80fea99cL, 0xe5991524L, 0x0b36a036L, 0x6e511c8eL,
|
||||||
|
0xa7166686L, 0xc271da3eL, 0x2cde6f2cL, 0x49b9d394L, 0xf0810409L,
|
||||||
|
0x95e6b8b1L, 0x7b490da3L, 0x1e2eb11bL, 0x483ed243L, 0x2d596efbL,
|
||||||
|
0xc3f6dbe9L, 0xa6916751L, 0x1fa9b0ccL, 0x7ace0c74L, 0x9461b966L,
|
||||||
|
0xf10605deL
|
||||||
|
# endif /* IZ_CRCOPTIM_UNFOLDTBL */
|
||||||
|
# else /* !IZ_CRC_BE_OPTIMIZ */
|
||||||
|
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
|
||||||
|
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
|
||||||
|
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
|
||||||
|
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
|
||||||
|
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
|
||||||
|
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
|
||||||
|
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
|
||||||
|
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
|
||||||
|
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
|
||||||
|
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
|
||||||
|
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
|
||||||
|
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
|
||||||
|
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
|
||||||
|
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
|
||||||
|
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
|
||||||
|
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
|
||||||
|
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
|
||||||
|
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
|
||||||
|
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
|
||||||
|
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
|
||||||
|
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
|
||||||
|
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
|
||||||
|
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
|
||||||
|
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
|
||||||
|
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
|
||||||
|
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
|
||||||
|
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
|
||||||
|
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
|
||||||
|
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
|
||||||
|
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
|
||||||
|
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
|
||||||
|
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
|
||||||
|
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
|
||||||
|
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
|
||||||
|
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
|
||||||
|
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
|
||||||
|
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
|
||||||
|
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
|
||||||
|
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
|
||||||
|
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
|
||||||
|
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
|
||||||
|
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
|
||||||
|
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
|
||||||
|
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
|
||||||
|
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
|
||||||
|
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
|
||||||
|
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
|
||||||
|
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
|
||||||
|
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
|
||||||
|
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
|
||||||
|
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
|
||||||
|
0x2d02ef8dL
|
||||||
|
# ifdef IZ_CRCOPTIM_UNFOLDTBL
|
||||||
|
,
|
||||||
|
0x00000000L, 0x191b3141L, 0x32366282L, 0x2b2d53c3L, 0x646cc504L,
|
||||||
|
0x7d77f445L, 0x565aa786L, 0x4f4196c7L, 0xc8d98a08L, 0xd1c2bb49L,
|
||||||
|
0xfaefe88aL, 0xe3f4d9cbL, 0xacb54f0cL, 0xb5ae7e4dL, 0x9e832d8eL,
|
||||||
|
0x87981ccfL, 0x4ac21251L, 0x53d92310L, 0x78f470d3L, 0x61ef4192L,
|
||||||
|
0x2eaed755L, 0x37b5e614L, 0x1c98b5d7L, 0x05838496L, 0x821b9859L,
|
||||||
|
0x9b00a918L, 0xb02dfadbL, 0xa936cb9aL, 0xe6775d5dL, 0xff6c6c1cL,
|
||||||
|
0xd4413fdfL, 0xcd5a0e9eL, 0x958424a2L, 0x8c9f15e3L, 0xa7b24620L,
|
||||||
|
0xbea97761L, 0xf1e8e1a6L, 0xe8f3d0e7L, 0xc3de8324L, 0xdac5b265L,
|
||||||
|
0x5d5daeaaL, 0x44469febL, 0x6f6bcc28L, 0x7670fd69L, 0x39316baeL,
|
||||||
|
0x202a5aefL, 0x0b07092cL, 0x121c386dL, 0xdf4636f3L, 0xc65d07b2L,
|
||||||
|
0xed705471L, 0xf46b6530L, 0xbb2af3f7L, 0xa231c2b6L, 0x891c9175L,
|
||||||
|
0x9007a034L, 0x179fbcfbL, 0x0e848dbaL, 0x25a9de79L, 0x3cb2ef38L,
|
||||||
|
0x73f379ffL, 0x6ae848beL, 0x41c51b7dL, 0x58de2a3cL, 0xf0794f05L,
|
||||||
|
0xe9627e44L, 0xc24f2d87L, 0xdb541cc6L, 0x94158a01L, 0x8d0ebb40L,
|
||||||
|
0xa623e883L, 0xbf38d9c2L, 0x38a0c50dL, 0x21bbf44cL, 0x0a96a78fL,
|
||||||
|
0x138d96ceL, 0x5ccc0009L, 0x45d73148L, 0x6efa628bL, 0x77e153caL,
|
||||||
|
0xbabb5d54L, 0xa3a06c15L, 0x888d3fd6L, 0x91960e97L, 0xded79850L,
|
||||||
|
0xc7cca911L, 0xece1fad2L, 0xf5facb93L, 0x7262d75cL, 0x6b79e61dL,
|
||||||
|
0x4054b5deL, 0x594f849fL, 0x160e1258L, 0x0f152319L, 0x243870daL,
|
||||||
|
0x3d23419bL, 0x65fd6ba7L, 0x7ce65ae6L, 0x57cb0925L, 0x4ed03864L,
|
||||||
|
0x0191aea3L, 0x188a9fe2L, 0x33a7cc21L, 0x2abcfd60L, 0xad24e1afL,
|
||||||
|
0xb43fd0eeL, 0x9f12832dL, 0x8609b26cL, 0xc94824abL, 0xd05315eaL,
|
||||||
|
0xfb7e4629L, 0xe2657768L, 0x2f3f79f6L, 0x362448b7L, 0x1d091b74L,
|
||||||
|
0x04122a35L, 0x4b53bcf2L, 0x52488db3L, 0x7965de70L, 0x607eef31L,
|
||||||
|
0xe7e6f3feL, 0xfefdc2bfL, 0xd5d0917cL, 0xcccba03dL, 0x838a36faL,
|
||||||
|
0x9a9107bbL, 0xb1bc5478L, 0xa8a76539L, 0x3b83984bL, 0x2298a90aL,
|
||||||
|
0x09b5fac9L, 0x10aecb88L, 0x5fef5d4fL, 0x46f46c0eL, 0x6dd93fcdL,
|
||||||
|
0x74c20e8cL, 0xf35a1243L, 0xea412302L, 0xc16c70c1L, 0xd8774180L,
|
||||||
|
0x9736d747L, 0x8e2de606L, 0xa500b5c5L, 0xbc1b8484L, 0x71418a1aL,
|
||||||
|
0x685abb5bL, 0x4377e898L, 0x5a6cd9d9L, 0x152d4f1eL, 0x0c367e5fL,
|
||||||
|
0x271b2d9cL, 0x3e001cddL, 0xb9980012L, 0xa0833153L, 0x8bae6290L,
|
||||||
|
0x92b553d1L, 0xddf4c516L, 0xc4eff457L, 0xefc2a794L, 0xf6d996d5L,
|
||||||
|
0xae07bce9L, 0xb71c8da8L, 0x9c31de6bL, 0x852aef2aL, 0xca6b79edL,
|
||||||
|
0xd37048acL, 0xf85d1b6fL, 0xe1462a2eL, 0x66de36e1L, 0x7fc507a0L,
|
||||||
|
0x54e85463L, 0x4df36522L, 0x02b2f3e5L, 0x1ba9c2a4L, 0x30849167L,
|
||||||
|
0x299fa026L, 0xe4c5aeb8L, 0xfdde9ff9L, 0xd6f3cc3aL, 0xcfe8fd7bL,
|
||||||
|
0x80a96bbcL, 0x99b25afdL, 0xb29f093eL, 0xab84387fL, 0x2c1c24b0L,
|
||||||
|
0x350715f1L, 0x1e2a4632L, 0x07317773L, 0x4870e1b4L, 0x516bd0f5L,
|
||||||
|
0x7a468336L, 0x635db277L, 0xcbfad74eL, 0xd2e1e60fL, 0xf9ccb5ccL,
|
||||||
|
0xe0d7848dL, 0xaf96124aL, 0xb68d230bL, 0x9da070c8L, 0x84bb4189L,
|
||||||
|
0x03235d46L, 0x1a386c07L, 0x31153fc4L, 0x280e0e85L, 0x674f9842L,
|
||||||
|
0x7e54a903L, 0x5579fac0L, 0x4c62cb81L, 0x8138c51fL, 0x9823f45eL,
|
||||||
|
0xb30ea79dL, 0xaa1596dcL, 0xe554001bL, 0xfc4f315aL, 0xd7626299L,
|
||||||
|
0xce7953d8L, 0x49e14f17L, 0x50fa7e56L, 0x7bd72d95L, 0x62cc1cd4L,
|
||||||
|
0x2d8d8a13L, 0x3496bb52L, 0x1fbbe891L, 0x06a0d9d0L, 0x5e7ef3ecL,
|
||||||
|
0x4765c2adL, 0x6c48916eL, 0x7553a02fL, 0x3a1236e8L, 0x230907a9L,
|
||||||
|
0x0824546aL, 0x113f652bL, 0x96a779e4L, 0x8fbc48a5L, 0xa4911b66L,
|
||||||
|
0xbd8a2a27L, 0xf2cbbce0L, 0xebd08da1L, 0xc0fdde62L, 0xd9e6ef23L,
|
||||||
|
0x14bce1bdL, 0x0da7d0fcL, 0x268a833fL, 0x3f91b27eL, 0x70d024b9L,
|
||||||
|
0x69cb15f8L, 0x42e6463bL, 0x5bfd777aL, 0xdc656bb5L, 0xc57e5af4L,
|
||||||
|
0xee530937L, 0xf7483876L, 0xb809aeb1L, 0xa1129ff0L, 0x8a3fcc33L,
|
||||||
|
0x9324fd72L
|
||||||
|
,
|
||||||
|
0x00000000L, 0x01c26a37L, 0x0384d46eL, 0x0246be59L, 0x0709a8dcL,
|
||||||
|
0x06cbc2ebL, 0x048d7cb2L, 0x054f1685L, 0x0e1351b8L, 0x0fd13b8fL,
|
||||||
|
0x0d9785d6L, 0x0c55efe1L, 0x091af964L, 0x08d89353L, 0x0a9e2d0aL,
|
||||||
|
0x0b5c473dL, 0x1c26a370L, 0x1de4c947L, 0x1fa2771eL, 0x1e601d29L,
|
||||||
|
0x1b2f0bacL, 0x1aed619bL, 0x18abdfc2L, 0x1969b5f5L, 0x1235f2c8L,
|
||||||
|
0x13f798ffL, 0x11b126a6L, 0x10734c91L, 0x153c5a14L, 0x14fe3023L,
|
||||||
|
0x16b88e7aL, 0x177ae44dL, 0x384d46e0L, 0x398f2cd7L, 0x3bc9928eL,
|
||||||
|
0x3a0bf8b9L, 0x3f44ee3cL, 0x3e86840bL, 0x3cc03a52L, 0x3d025065L,
|
||||||
|
0x365e1758L, 0x379c7d6fL, 0x35dac336L, 0x3418a901L, 0x3157bf84L,
|
||||||
|
0x3095d5b3L, 0x32d36beaL, 0x331101ddL, 0x246be590L, 0x25a98fa7L,
|
||||||
|
0x27ef31feL, 0x262d5bc9L, 0x23624d4cL, 0x22a0277bL, 0x20e69922L,
|
||||||
|
0x2124f315L, 0x2a78b428L, 0x2bbade1fL, 0x29fc6046L, 0x283e0a71L,
|
||||||
|
0x2d711cf4L, 0x2cb376c3L, 0x2ef5c89aL, 0x2f37a2adL, 0x709a8dc0L,
|
||||||
|
0x7158e7f7L, 0x731e59aeL, 0x72dc3399L, 0x7793251cL, 0x76514f2bL,
|
||||||
|
0x7417f172L, 0x75d59b45L, 0x7e89dc78L, 0x7f4bb64fL, 0x7d0d0816L,
|
||||||
|
0x7ccf6221L, 0x798074a4L, 0x78421e93L, 0x7a04a0caL, 0x7bc6cafdL,
|
||||||
|
0x6cbc2eb0L, 0x6d7e4487L, 0x6f38fadeL, 0x6efa90e9L, 0x6bb5866cL,
|
||||||
|
0x6a77ec5bL, 0x68315202L, 0x69f33835L, 0x62af7f08L, 0x636d153fL,
|
||||||
|
0x612bab66L, 0x60e9c151L, 0x65a6d7d4L, 0x6464bde3L, 0x662203baL,
|
||||||
|
0x67e0698dL, 0x48d7cb20L, 0x4915a117L, 0x4b531f4eL, 0x4a917579L,
|
||||||
|
0x4fde63fcL, 0x4e1c09cbL, 0x4c5ab792L, 0x4d98dda5L, 0x46c49a98L,
|
||||||
|
0x4706f0afL, 0x45404ef6L, 0x448224c1L, 0x41cd3244L, 0x400f5873L,
|
||||||
|
0x4249e62aL, 0x438b8c1dL, 0x54f16850L, 0x55330267L, 0x5775bc3eL,
|
||||||
|
0x56b7d609L, 0x53f8c08cL, 0x523aaabbL, 0x507c14e2L, 0x51be7ed5L,
|
||||||
|
0x5ae239e8L, 0x5b2053dfL, 0x5966ed86L, 0x58a487b1L, 0x5deb9134L,
|
||||||
|
0x5c29fb03L, 0x5e6f455aL, 0x5fad2f6dL, 0xe1351b80L, 0xe0f771b7L,
|
||||||
|
0xe2b1cfeeL, 0xe373a5d9L, 0xe63cb35cL, 0xe7fed96bL, 0xe5b86732L,
|
||||||
|
0xe47a0d05L, 0xef264a38L, 0xeee4200fL, 0xeca29e56L, 0xed60f461L,
|
||||||
|
0xe82fe2e4L, 0xe9ed88d3L, 0xebab368aL, 0xea695cbdL, 0xfd13b8f0L,
|
||||||
|
0xfcd1d2c7L, 0xfe976c9eL, 0xff5506a9L, 0xfa1a102cL, 0xfbd87a1bL,
|
||||||
|
0xf99ec442L, 0xf85cae75L, 0xf300e948L, 0xf2c2837fL, 0xf0843d26L,
|
||||||
|
0xf1465711L, 0xf4094194L, 0xf5cb2ba3L, 0xf78d95faL, 0xf64fffcdL,
|
||||||
|
0xd9785d60L, 0xd8ba3757L, 0xdafc890eL, 0xdb3ee339L, 0xde71f5bcL,
|
||||||
|
0xdfb39f8bL, 0xddf521d2L, 0xdc374be5L, 0xd76b0cd8L, 0xd6a966efL,
|
||||||
|
0xd4efd8b6L, 0xd52db281L, 0xd062a404L, 0xd1a0ce33L, 0xd3e6706aL,
|
||||||
|
0xd2241a5dL, 0xc55efe10L, 0xc49c9427L, 0xc6da2a7eL, 0xc7184049L,
|
||||||
|
0xc25756ccL, 0xc3953cfbL, 0xc1d382a2L, 0xc011e895L, 0xcb4dafa8L,
|
||||||
|
0xca8fc59fL, 0xc8c97bc6L, 0xc90b11f1L, 0xcc440774L, 0xcd866d43L,
|
||||||
|
0xcfc0d31aL, 0xce02b92dL, 0x91af9640L, 0x906dfc77L, 0x922b422eL,
|
||||||
|
0x93e92819L, 0x96a63e9cL, 0x976454abL, 0x9522eaf2L, 0x94e080c5L,
|
||||||
|
0x9fbcc7f8L, 0x9e7eadcfL, 0x9c381396L, 0x9dfa79a1L, 0x98b56f24L,
|
||||||
|
0x99770513L, 0x9b31bb4aL, 0x9af3d17dL, 0x8d893530L, 0x8c4b5f07L,
|
||||||
|
0x8e0de15eL, 0x8fcf8b69L, 0x8a809decL, 0x8b42f7dbL, 0x89044982L,
|
||||||
|
0x88c623b5L, 0x839a6488L, 0x82580ebfL, 0x801eb0e6L, 0x81dcdad1L,
|
||||||
|
0x8493cc54L, 0x8551a663L, 0x8717183aL, 0x86d5720dL, 0xa9e2d0a0L,
|
||||||
|
0xa820ba97L, 0xaa6604ceL, 0xaba46ef9L, 0xaeeb787cL, 0xaf29124bL,
|
||||||
|
0xad6fac12L, 0xacadc625L, 0xa7f18118L, 0xa633eb2fL, 0xa4755576L,
|
||||||
|
0xa5b73f41L, 0xa0f829c4L, 0xa13a43f3L, 0xa37cfdaaL, 0xa2be979dL,
|
||||||
|
0xb5c473d0L, 0xb40619e7L, 0xb640a7beL, 0xb782cd89L, 0xb2cddb0cL,
|
||||||
|
0xb30fb13bL, 0xb1490f62L, 0xb08b6555L, 0xbbd72268L, 0xba15485fL,
|
||||||
|
0xb853f606L, 0xb9919c31L, 0xbcde8ab4L, 0xbd1ce083L, 0xbf5a5edaL,
|
||||||
|
0xbe9834edL
|
||||||
|
,
|
||||||
|
0x00000000L, 0xb8bc6765L, 0xaa09c88bL, 0x12b5afeeL, 0x8f629757L,
|
||||||
|
0x37def032L, 0x256b5fdcL, 0x9dd738b9L, 0xc5b428efL, 0x7d084f8aL,
|
||||||
|
0x6fbde064L, 0xd7018701L, 0x4ad6bfb8L, 0xf26ad8ddL, 0xe0df7733L,
|
||||||
|
0x58631056L, 0x5019579fL, 0xe8a530faL, 0xfa109f14L, 0x42acf871L,
|
||||||
|
0xdf7bc0c8L, 0x67c7a7adL, 0x75720843L, 0xcdce6f26L, 0x95ad7f70L,
|
||||||
|
0x2d111815L, 0x3fa4b7fbL, 0x8718d09eL, 0x1acfe827L, 0xa2738f42L,
|
||||||
|
0xb0c620acL, 0x087a47c9L, 0xa032af3eL, 0x188ec85bL, 0x0a3b67b5L,
|
||||||
|
0xb28700d0L, 0x2f503869L, 0x97ec5f0cL, 0x8559f0e2L, 0x3de59787L,
|
||||||
|
0x658687d1L, 0xdd3ae0b4L, 0xcf8f4f5aL, 0x7733283fL, 0xeae41086L,
|
||||||
|
0x525877e3L, 0x40edd80dL, 0xf851bf68L, 0xf02bf8a1L, 0x48979fc4L,
|
||||||
|
0x5a22302aL, 0xe29e574fL, 0x7f496ff6L, 0xc7f50893L, 0xd540a77dL,
|
||||||
|
0x6dfcc018L, 0x359fd04eL, 0x8d23b72bL, 0x9f9618c5L, 0x272a7fa0L,
|
||||||
|
0xbafd4719L, 0x0241207cL, 0x10f48f92L, 0xa848e8f7L, 0x9b14583dL,
|
||||||
|
0x23a83f58L, 0x311d90b6L, 0x89a1f7d3L, 0x1476cf6aL, 0xaccaa80fL,
|
||||||
|
0xbe7f07e1L, 0x06c36084L, 0x5ea070d2L, 0xe61c17b7L, 0xf4a9b859L,
|
||||||
|
0x4c15df3cL, 0xd1c2e785L, 0x697e80e0L, 0x7bcb2f0eL, 0xc377486bL,
|
||||||
|
0xcb0d0fa2L, 0x73b168c7L, 0x6104c729L, 0xd9b8a04cL, 0x446f98f5L,
|
||||||
|
0xfcd3ff90L, 0xee66507eL, 0x56da371bL, 0x0eb9274dL, 0xb6054028L,
|
||||||
|
0xa4b0efc6L, 0x1c0c88a3L, 0x81dbb01aL, 0x3967d77fL, 0x2bd27891L,
|
||||||
|
0x936e1ff4L, 0x3b26f703L, 0x839a9066L, 0x912f3f88L, 0x299358edL,
|
||||||
|
0xb4446054L, 0x0cf80731L, 0x1e4da8dfL, 0xa6f1cfbaL, 0xfe92dfecL,
|
||||||
|
0x462eb889L, 0x549b1767L, 0xec277002L, 0x71f048bbL, 0xc94c2fdeL,
|
||||||
|
0xdbf98030L, 0x6345e755L, 0x6b3fa09cL, 0xd383c7f9L, 0xc1366817L,
|
||||||
|
0x798a0f72L, 0xe45d37cbL, 0x5ce150aeL, 0x4e54ff40L, 0xf6e89825L,
|
||||||
|
0xae8b8873L, 0x1637ef16L, 0x048240f8L, 0xbc3e279dL, 0x21e91f24L,
|
||||||
|
0x99557841L, 0x8be0d7afL, 0x335cb0caL, 0xed59b63bL, 0x55e5d15eL,
|
||||||
|
0x47507eb0L, 0xffec19d5L, 0x623b216cL, 0xda874609L, 0xc832e9e7L,
|
||||||
|
0x708e8e82L, 0x28ed9ed4L, 0x9051f9b1L, 0x82e4565fL, 0x3a58313aL,
|
||||||
|
0xa78f0983L, 0x1f336ee6L, 0x0d86c108L, 0xb53aa66dL, 0xbd40e1a4L,
|
||||||
|
0x05fc86c1L, 0x1749292fL, 0xaff54e4aL, 0x322276f3L, 0x8a9e1196L,
|
||||||
|
0x982bbe78L, 0x2097d91dL, 0x78f4c94bL, 0xc048ae2eL, 0xd2fd01c0L,
|
||||||
|
0x6a4166a5L, 0xf7965e1cL, 0x4f2a3979L, 0x5d9f9697L, 0xe523f1f2L,
|
||||||
|
0x4d6b1905L, 0xf5d77e60L, 0xe762d18eL, 0x5fdeb6ebL, 0xc2098e52L,
|
||||||
|
0x7ab5e937L, 0x680046d9L, 0xd0bc21bcL, 0x88df31eaL, 0x3063568fL,
|
||||||
|
0x22d6f961L, 0x9a6a9e04L, 0x07bda6bdL, 0xbf01c1d8L, 0xadb46e36L,
|
||||||
|
0x15080953L, 0x1d724e9aL, 0xa5ce29ffL, 0xb77b8611L, 0x0fc7e174L,
|
||||||
|
0x9210d9cdL, 0x2aacbea8L, 0x38191146L, 0x80a57623L, 0xd8c66675L,
|
||||||
|
0x607a0110L, 0x72cfaefeL, 0xca73c99bL, 0x57a4f122L, 0xef189647L,
|
||||||
|
0xfdad39a9L, 0x45115eccL, 0x764dee06L, 0xcef18963L, 0xdc44268dL,
|
||||||
|
0x64f841e8L, 0xf92f7951L, 0x41931e34L, 0x5326b1daL, 0xeb9ad6bfL,
|
||||||
|
0xb3f9c6e9L, 0x0b45a18cL, 0x19f00e62L, 0xa14c6907L, 0x3c9b51beL,
|
||||||
|
0x842736dbL, 0x96929935L, 0x2e2efe50L, 0x2654b999L, 0x9ee8defcL,
|
||||||
|
0x8c5d7112L, 0x34e11677L, 0xa9362eceL, 0x118a49abL, 0x033fe645L,
|
||||||
|
0xbb838120L, 0xe3e09176L, 0x5b5cf613L, 0x49e959fdL, 0xf1553e98L,
|
||||||
|
0x6c820621L, 0xd43e6144L, 0xc68bceaaL, 0x7e37a9cfL, 0xd67f4138L,
|
||||||
|
0x6ec3265dL, 0x7c7689b3L, 0xc4caeed6L, 0x591dd66fL, 0xe1a1b10aL,
|
||||||
|
0xf3141ee4L, 0x4ba87981L, 0x13cb69d7L, 0xab770eb2L, 0xb9c2a15cL,
|
||||||
|
0x017ec639L, 0x9ca9fe80L, 0x241599e5L, 0x36a0360bL, 0x8e1c516eL,
|
||||||
|
0x866616a7L, 0x3eda71c2L, 0x2c6fde2cL, 0x94d3b949L, 0x090481f0L,
|
||||||
|
0xb1b8e695L, 0xa30d497bL, 0x1bb12e1eL, 0x43d23e48L, 0xfb6e592dL,
|
||||||
|
0xe9dbf6c3L, 0x516791a6L, 0xccb0a91fL, 0x740cce7aL, 0x66b96194L,
|
||||||
|
0xde0506f1L
|
||||||
|
# endif /* IZ_CRCOPTIM_UNFOLDTBL */
|
||||||
|
# endif /* ? IZ_CRC_BE_OPTIMIZ */
|
||||||
|
};
|
||||||
|
#endif /* ?DYNAMIC_CRC_TABLE */
|
||||||
|
|
||||||
|
/* use "OF((void))" here to work around a Borland TC++ 1.0 problem */
|
||||||
|
#ifdef USE_ZLIB
|
||||||
|
ZCONST uLongf *get_crc_table OF((void))
|
||||||
|
#else
|
||||||
|
ZCONST ulg near *get_crc_table OF((void))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
if (CRC_TABLE_IS_EMPTY)
|
||||||
|
make_crc_table();
|
||||||
|
#endif
|
||||||
|
#ifdef USE_ZLIB
|
||||||
|
return (ZCONST uLongf *)crc_table;
|
||||||
|
#else
|
||||||
|
return crc_table;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
void free_crc_table()
|
||||||
|
{
|
||||||
|
if (!CRC_TABLE_IS_EMPTY)
|
||||||
|
{
|
||||||
|
nearfree((ulg near *)crc_table);
|
||||||
|
MARK_CRCTAB_EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef USE_ZLIB
|
||||||
|
#ifndef CRC_TABLE_ONLY
|
||||||
|
#ifndef ASM_CRC
|
||||||
|
|
||||||
|
#define DO1(crc, buf) crc = CRC32(crc, *buf++, crc_32_tab)
|
||||||
|
#define DO2(crc, buf) DO1(crc, buf); DO1(crc, buf)
|
||||||
|
#define DO4(crc, buf) DO2(crc, buf); DO2(crc, buf)
|
||||||
|
#define DO8(crc, buf) DO4(crc, buf); DO4(crc, buf)
|
||||||
|
|
||||||
|
#if (defined(IZ_CRC_BE_OPTIMIZ) || defined(IZ_CRC_LE_OPTIMIZ))
|
||||||
|
|
||||||
|
# ifdef IZ_CRCOPTIM_UNFOLDTBL
|
||||||
|
# ifdef IZ_CRC_BE_OPTIMIZ
|
||||||
|
# define DO_OPT4(c, buf4) c ^= *(buf4)++; \
|
||||||
|
c = crc_32_tab[c & 0xff] ^ crc_32_tab[256+((c>>8) & 0xff)] ^ \
|
||||||
|
crc_32_tab[2*256+((c>>16) & 0xff)] ^ crc_32_tab[3*256+(c>>24)]
|
||||||
|
# else /* !IZ_CRC_BE_OPTIMIZ */
|
||||||
|
# define DO_OPT4(c, buf4) c ^= *(buf4)++; \
|
||||||
|
c = crc_32_tab[3*256+(c & 0xff)] ^ crc_32_tab[2*256+((c>>8) & 0xff)] \
|
||||||
|
^ crc_32_tab[256+((c>>16) & 0xff)] ^ crc_32_tab[c>>24]
|
||||||
|
# endif /* ?IZ_CRC_BE_OPTIMIZ */
|
||||||
|
# else /* !IZ_CRCOPTIM_UNFOLDTBL */
|
||||||
|
# define DO_OPT4(c, buf4) c ^= *(buf4)++; \
|
||||||
|
c = CRC32UPD(c, crc_32_tab); \
|
||||||
|
c = CRC32UPD(c, crc_32_tab); \
|
||||||
|
c = CRC32UPD(c, crc_32_tab); \
|
||||||
|
c = CRC32UPD(c, crc_32_tab)
|
||||||
|
# endif /* ?IZ_CRCOPTIM_UNFOLDTBL */
|
||||||
|
|
||||||
|
# define DO_OPT16(crc, buf4) DO_OPT4(crc, buf4); DO_OPT4(crc, buf4); \
|
||||||
|
DO_OPT4(crc, buf4); DO_OPT4(crc, buf4);
|
||||||
|
|
||||||
|
#endif /* (IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */
|
||||||
|
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
ulg crc32(crc, buf, len)
|
||||||
|
ulg crc; /* crc shift register */
|
||||||
|
register ZCONST uch *buf; /* pointer to bytes to pump through */
|
||||||
|
extent len; /* number of bytes in buf[] */
|
||||||
|
/* Run a set of bytes through the crc shift register. If buf is a NULL
|
||||||
|
pointer, then initialize the crc shift register contents instead.
|
||||||
|
Return the current crc in either case. */
|
||||||
|
{
|
||||||
|
register z_uint4 c;
|
||||||
|
register ZCONST ulg near *crc_32_tab;
|
||||||
|
|
||||||
|
if (buf == NULL) return 0L;
|
||||||
|
|
||||||
|
crc_32_tab = get_crc_table();
|
||||||
|
|
||||||
|
c = (REV_BE((z_uint4)crc) ^ 0xffffffffL);
|
||||||
|
|
||||||
|
#if (defined(IZ_CRC_BE_OPTIMIZ) || defined(IZ_CRC_LE_OPTIMIZ))
|
||||||
|
/* Align buf pointer to next DWORD boundary. */
|
||||||
|
while (len && ((ptrdiff_t)buf & 3)) {
|
||||||
|
DO1(c, buf);
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
ZCONST z_uint4 *buf4 = (ZCONST z_uint4 *)buf;
|
||||||
|
while (len >= 16) {
|
||||||
|
DO_OPT16(c, buf4);
|
||||||
|
len -= 16;
|
||||||
|
}
|
||||||
|
while (len >= 4) {
|
||||||
|
DO_OPT4(c, buf4);
|
||||||
|
len -= 4;
|
||||||
|
}
|
||||||
|
buf = (ZCONST uch *)buf4;
|
||||||
|
}
|
||||||
|
#else /* !(IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */
|
||||||
|
#ifndef NO_UNROLLED_LOOPS
|
||||||
|
while (len >= 8) {
|
||||||
|
DO8(c, buf);
|
||||||
|
len -= 8;
|
||||||
|
}
|
||||||
|
#endif /* !NO_UNROLLED_LOOPS */
|
||||||
|
#endif /* ?(IZ_CRC_BE_OPTIMIZ || IZ_CRC_LE_OPTIMIZ) */
|
||||||
|
if (len) do {
|
||||||
|
DO1(c, buf);
|
||||||
|
} while (--len);
|
||||||
|
|
||||||
|
return REV_BE(c) ^ 0xffffffffL; /* (instead of ~c for 64-bit machines) */
|
||||||
|
}
|
||||||
|
#endif /* !ASM_CRC */
|
||||||
|
#endif /* !CRC_TABLE_ONLY */
|
||||||
|
#endif /* !USE_ZLIB */
|
||||||
|
#endif /* !USE_ZLIB || USE_OWN_CRCTAB */
|
65
third_party/unzip/crc32.h
vendored
Normal file
65
third_party/unzip/crc32.h
vendored
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2008 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/* crc32.h -- compute the CRC-32 of a data stream
|
||||||
|
* Copyright (C) 1995 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __crc32_h
|
||||||
|
#define __crc32_h /* identifies this source module */
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
#include "third_party/unzip/unzpriv.h"
|
||||||
|
#include "third_party/zip/crc32.h"
|
||||||
|
|
||||||
|
/* This header should be read AFTER zip.h resp. unzip.h
|
||||||
|
* (the latter with UNZIP_INTERNAL defined...).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OF
|
||||||
|
# define OF(a) a
|
||||||
|
#endif
|
||||||
|
#ifndef ZCONST
|
||||||
|
# define ZCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
void free_crc_table OF((void));
|
||||||
|
#endif
|
||||||
|
#ifndef USE_ZLIB
|
||||||
|
ZCONST ulg near *get_crc_table OF((void));
|
||||||
|
#endif
|
||||||
|
#if (defined(USE_ZLIB) || defined(CRC_TABLE_ONLY))
|
||||||
|
# ifdef IZ_CRC_BE_OPTIMIZ
|
||||||
|
# undef IZ_CRC_BE_OPTIMIZ
|
||||||
|
# endif
|
||||||
|
#else /* !(USE_ZLIB || CRC_TABLE_ONLY) */
|
||||||
|
ulg crc32 OF((ulg crc, ZCONST uch *buf, extent len));
|
||||||
|
#endif /* ?(USE_ZLIB || CRC_TABLE_ONLY) */
|
||||||
|
|
||||||
|
#ifndef CRC_32_TAB
|
||||||
|
# define CRC_32_TAB crc_32_tab
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CRC32
|
||||||
|
# undef CRC32
|
||||||
|
#endif
|
||||||
|
#ifdef IZ_CRC_BE_OPTIMIZ
|
||||||
|
# define CRC32UPD(c, crctab) (crctab[((c) >> 24)] ^ ((c) << 8))
|
||||||
|
# define CRC32(c, b, crctab) (crctab[(((int)(c) >> 24) ^ (b))] ^ ((c) << 8))
|
||||||
|
# define REV_BE(w) (((w)>>24)+(((w)>>8)&0xff00)+ \
|
||||||
|
(((w)&0xff00)<<8)+(((w)&0xff)<<24))
|
||||||
|
#else
|
||||||
|
# define CRC32UPD(c, crctab) (crctab[((int)(c)) & 0xff] ^ ((c) >> 8))
|
||||||
|
# define CRC32(c, b, crctab) (crctab[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8))
|
||||||
|
# define REV_BE(w) w
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !__crc32_h */
|
653
third_party/unzip/crypt.c
vendored
Normal file
653
third_party/unzip/crypt.c
vendored
Normal file
|
@ -0,0 +1,653 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2007 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2005-Feb-10 or later
|
||||||
|
(the contents of which are also included in (un)zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
|
||||||
|
|
||||||
|
The main encryption/decryption source code for Info-Zip software was
|
||||||
|
originally written in Europe. To the best of our knowledge, it can
|
||||||
|
be freely distributed in both source and object forms from any country,
|
||||||
|
including the USA under License Exception TSU of the U.S. Export
|
||||||
|
Administration Regulations (section 740.13(e)) of 6 June 2002.
|
||||||
|
|
||||||
|
NOTE on copyright history:
|
||||||
|
Previous versions of this source package (up to version 2.8) were
|
||||||
|
not copyrighted and put in the public domain. If you cannot comply
|
||||||
|
with the Info-Zip LICENSE, you may want to look for one of those
|
||||||
|
public domain versions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This encryption code is a direct transcription of the algorithm from
|
||||||
|
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
|
||||||
|
file (appnote.txt) is distributed with the PKZIP program (even in the
|
||||||
|
version without encryption capabilities).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ZCRYPT_INTERNAL
|
||||||
|
#include "third_party/unzip/zip.h"
|
||||||
|
#include "third_party/unzip/crypt.h"
|
||||||
|
#include "third_party/unzip/ttyio.h"
|
||||||
|
|
||||||
|
#if CRYPT
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
# define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ZIP
|
||||||
|
/* For the encoding task used in Zip (and ZipCloak), we want to initialize
|
||||||
|
the crypt algorithm with some reasonably unpredictable bytes, see
|
||||||
|
the crypthead() function. The standard rand() library function is
|
||||||
|
used to supply these `random' bytes, which in turn is initialized by
|
||||||
|
a srand() call. The srand() function takes an "unsigned" (at least 16bit)
|
||||||
|
seed value as argument to determine the starting point of the rand()
|
||||||
|
pseudo-random number generator.
|
||||||
|
This seed number is constructed as "Seed = Seed1 .XOR. Seed2" with
|
||||||
|
Seed1 supplied by the current time (= "(unsigned)time()") and Seed2
|
||||||
|
as some (hopefully) nondeterministic bitmask. On many (most) systems,
|
||||||
|
we use some "process specific" number, as the PID or something similar,
|
||||||
|
but when nothing unpredictable is available, a fixed number may be
|
||||||
|
sufficient.
|
||||||
|
NOTE:
|
||||||
|
1.) This implementation requires the availability of the following
|
||||||
|
standard UNIX C runtime library functions: time(), rand(), srand().
|
||||||
|
On systems where some of them are missing, the environment that
|
||||||
|
incorporates the crypt routines must supply suitable replacement
|
||||||
|
functions.
|
||||||
|
2.) It is a very bad idea to use a second call to time() to set the
|
||||||
|
"Seed2" number! In this case, both "Seed1" and "Seed2" would be
|
||||||
|
(almost) identical, resulting in a (mostly) "zero" constant seed
|
||||||
|
number passed to srand().
|
||||||
|
|
||||||
|
The implementation environment defined in the "zip.h" header should
|
||||||
|
supply a reasonable definition for ZCR_SEED2 (an unsigned number; for
|
||||||
|
most implementations of rand() and srand(), only the lower 16 bits are
|
||||||
|
significant!). An example that works on many systems would be
|
||||||
|
"#define ZCR_SEED2 (unsigned)getpid()".
|
||||||
|
The default definition for ZCR_SEED2 supplied below should be regarded
|
||||||
|
as a fallback to allow successful compilation in "beta state"
|
||||||
|
environments.
|
||||||
|
*/
|
||||||
|
/* "last resort" source for second part of crypt seed pattern */
|
||||||
|
# ifndef ZCR_SEED2
|
||||||
|
# define ZCR_SEED2 (unsigned)3141592654L /* use PI as default pattern */
|
||||||
|
# endif
|
||||||
|
# ifdef GLOBAL /* used in Amiga system headers, maybe others too */
|
||||||
|
# undef GLOBAL
|
||||||
|
# endif
|
||||||
|
# define GLOBAL(g) g
|
||||||
|
#else /* !ZIP */
|
||||||
|
# define GLOBAL(g) G.g
|
||||||
|
#endif /* ?ZIP */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef UNZIP
|
||||||
|
/* char *key = (char *)NULL; moved to globals.h */
|
||||||
|
# ifndef FUNZIP
|
||||||
|
local int testp OF((__GPRO__ ZCONST uch *h));
|
||||||
|
local int testkey OF((__GPRO__ ZCONST uch *h, ZCONST char *key));
|
||||||
|
# endif
|
||||||
|
#endif /* UNZIP */
|
||||||
|
|
||||||
|
#ifndef UNZIP /* moved to globals.h for UnZip */
|
||||||
|
# ifndef Z_UINT4_DEFINED
|
||||||
|
# if !defined(NO_LIMITS_H)
|
||||||
|
# if (defined(UINT_MAX) && (UINT_MAX == 0xffffffffUL))
|
||||||
|
typedef unsigned int z_uint4;
|
||||||
|
# define Z_UINT4_DEFINED
|
||||||
|
# else
|
||||||
|
# if (defined(ULONG_MAX) && (ULONG_MAX == 0xffffffffUL))
|
||||||
|
typedef unsigned long z_uint4;
|
||||||
|
# define Z_UINT4_DEFINED
|
||||||
|
# else
|
||||||
|
# if (defined(USHRT_MAX) && (USHRT_MAX == 0xffffffffUL))
|
||||||
|
typedef unsigned short z_uint4;
|
||||||
|
# define Z_UINT4_DEFINED
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif /* !NO_LIMITS_H */
|
||||||
|
# endif /* !Z_UINT4_DEFINED */
|
||||||
|
# ifndef Z_UINT4_DEFINED
|
||||||
|
typedef ulg z_uint4;
|
||||||
|
# define Z_UINT4_DEFINED
|
||||||
|
# endif
|
||||||
|
local z_uint4 keys[3]; /* keys defining the pseudo-random sequence */
|
||||||
|
#endif /* !UNZIP */
|
||||||
|
|
||||||
|
#ifndef Trace
|
||||||
|
# ifdef CRYPT_DEBUG
|
||||||
|
# define Trace(x) fprintf x
|
||||||
|
# else
|
||||||
|
# define Trace(x)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "third_party/unzip/crc32.h"
|
||||||
|
|
||||||
|
#ifdef IZ_CRC_BE_OPTIMIZ
|
||||||
|
local z_uint4 near crycrctab[256];
|
||||||
|
local z_uint4 near *cry_crctb_p = NULL;
|
||||||
|
local z_uint4 near *crytab_init OF((__GPRO));
|
||||||
|
# define CRY_CRC_TAB cry_crctb_p
|
||||||
|
# undef CRC32
|
||||||
|
# define CRC32(c, b, crctab) (crctab[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8))
|
||||||
|
#else
|
||||||
|
# define CRY_CRC_TAB CRC_32_TAB
|
||||||
|
#endif /* ?IZ_CRC_BE_OPTIMIZ */
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Return the next byte in the pseudo-random sequence
|
||||||
|
*/
|
||||||
|
int decrypt_byte(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||||
|
* unpredictable manner on 16-bit systems; not a problem
|
||||||
|
* with any known compiler so far, though */
|
||||||
|
|
||||||
|
temp = ((unsigned)GLOBAL(keys[2]) & 0xffff) | 2;
|
||||||
|
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Update the encryption keys with the next byte of plain text
|
||||||
|
*/
|
||||||
|
int update_keys(__G__ c)
|
||||||
|
__GDEF
|
||||||
|
int c; /* byte of plain text */
|
||||||
|
{
|
||||||
|
GLOBAL(keys[0]) = CRC32(GLOBAL(keys[0]), c, CRY_CRC_TAB);
|
||||||
|
GLOBAL(keys[1]) = (GLOBAL(keys[1])
|
||||||
|
+ (GLOBAL(keys[0]) & 0xff))
|
||||||
|
* 134775813L + 1;
|
||||||
|
{
|
||||||
|
register int keyshift = (int)(GLOBAL(keys[1]) >> 24);
|
||||||
|
GLOBAL(keys[2]) = CRC32(GLOBAL(keys[2]), keyshift, CRY_CRC_TAB);
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Initialize the encryption keys and the random header according to
|
||||||
|
* the given password.
|
||||||
|
*/
|
||||||
|
void init_keys(__G__ passwd)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *passwd; /* password string with which to modify keys */
|
||||||
|
{
|
||||||
|
#ifdef IZ_CRC_BE_OPTIMIZ
|
||||||
|
if (cry_crctb_p == NULL) {
|
||||||
|
cry_crctb_p = crytab_init(__G);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
GLOBAL(keys[0]) = 305419896L;
|
||||||
|
GLOBAL(keys[1]) = 591751049L;
|
||||||
|
GLOBAL(keys[2]) = 878082192L;
|
||||||
|
while (*passwd != '\0') {
|
||||||
|
update_keys(__G__ (int)*passwd);
|
||||||
|
passwd++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Initialize the local copy of the table of precomputed crc32 values.
|
||||||
|
* Whereas the public crc32-table is optimized for crc32 calculations
|
||||||
|
* on arrays of bytes, the crypt code needs the crc32 values in an
|
||||||
|
* byte-order-independent form as 32-bit unsigned numbers. On systems
|
||||||
|
* with Big-Endian byte order using the optimized crc32 code, this
|
||||||
|
* requires inverting the byte-order of the values in the
|
||||||
|
* crypt-crc32-table.
|
||||||
|
*/
|
||||||
|
#ifdef IZ_CRC_BE_OPTIMIZ
|
||||||
|
local z_uint4 near *crytab_init(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
crycrctab[i] = REV_BE(CRC_32_TAB[i]);
|
||||||
|
}
|
||||||
|
return crycrctab;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ZIP
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Write encryption header to file zfile using the password passwd
|
||||||
|
* and the cyclic redundancy check crc.
|
||||||
|
*/
|
||||||
|
void crypthead(passwd, crc, zfile)
|
||||||
|
ZCONST char *passwd; /* password string */
|
||||||
|
ulg crc; /* crc of file being encrypted */
|
||||||
|
FILE *zfile; /* where to write header */
|
||||||
|
{
|
||||||
|
int n; /* index in random header */
|
||||||
|
int t; /* temporary */
|
||||||
|
int c; /* random byte */
|
||||||
|
uch header[RAND_HEAD_LEN]; /* random header */
|
||||||
|
static unsigned calls = 0; /* ensure different random header each time */
|
||||||
|
|
||||||
|
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
|
||||||
|
* output of rand() to get less predictability, since rand() is
|
||||||
|
* often poorly implemented.
|
||||||
|
*/
|
||||||
|
if (++calls == 1) {
|
||||||
|
srand((unsigned)time(NULL) ^ ZCR_SEED2);
|
||||||
|
}
|
||||||
|
init_keys(passwd);
|
||||||
|
for (n = 0; n < RAND_HEAD_LEN-2; n++) {
|
||||||
|
c = (rand() >> 7) & 0xff;
|
||||||
|
header[n] = (uch)zencode(c, t);
|
||||||
|
}
|
||||||
|
/* Encrypt random header (last two bytes is high word of crc) */
|
||||||
|
init_keys(passwd);
|
||||||
|
for (n = 0; n < RAND_HEAD_LEN-2; n++) {
|
||||||
|
header[n] = (uch)zencode(header[n], t);
|
||||||
|
}
|
||||||
|
header[RAND_HEAD_LEN-2] = (uch)zencode((int)(crc >> 16) & 0xff, t);
|
||||||
|
header[RAND_HEAD_LEN-1] = (uch)zencode((int)(crc >> 24) & 0xff, t);
|
||||||
|
fwrite(header, 1, RAND_HEAD_LEN, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef UTIL
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Encrypt the zip entry described by z from file source to file dest
|
||||||
|
* using the password passwd. Return an error code in the ZE_ class.
|
||||||
|
*/
|
||||||
|
int zipcloak(z, source, dest, passwd)
|
||||||
|
struct zlist far *z; /* zip entry to encrypt */
|
||||||
|
FILE *source, *dest; /* source and destination files */
|
||||||
|
ZCONST char *passwd; /* password string */
|
||||||
|
{
|
||||||
|
int c; /* input byte */
|
||||||
|
int res; /* result code */
|
||||||
|
ulg n; /* holds offset and counts size */
|
||||||
|
ush flag; /* previous flags */
|
||||||
|
int t; /* temporary */
|
||||||
|
int ztemp; /* temporary storage for zencode value */
|
||||||
|
|
||||||
|
/* Set encrypted bit, clear extended local header bit and write local
|
||||||
|
header to output file */
|
||||||
|
if ((n = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP;
|
||||||
|
z->off = n;
|
||||||
|
flag = z->flg;
|
||||||
|
z->flg |= 1, z->flg &= ~8;
|
||||||
|
z->lflg |= 1, z->lflg &= ~8;
|
||||||
|
z->siz += RAND_HEAD_LEN;
|
||||||
|
if ((res = putlocal(z, dest)) != ZE_OK) return res;
|
||||||
|
|
||||||
|
/* Initialize keys with password and write random header */
|
||||||
|
crypthead(passwd, z->crc, dest);
|
||||||
|
|
||||||
|
/* Skip local header in input file */
|
||||||
|
if (fseek(source, (long)((4 + LOCHEAD) + (ulg)z->nam + (ulg)z->ext),
|
||||||
|
SEEK_CUR)) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encrypt data */
|
||||||
|
for (n = z->siz - RAND_HEAD_LEN; n; n--) {
|
||||||
|
if ((c = getc(source)) == EOF) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
ztemp = zencode(c, t);
|
||||||
|
putc(ztemp, dest);
|
||||||
|
}
|
||||||
|
/* Skip extended local header in input file if there is one */
|
||||||
|
if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
if (fflush(dest) == EOF) return ZE_TEMP;
|
||||||
|
|
||||||
|
/* Update number of bytes written to output file */
|
||||||
|
tempzn += (4 + LOCHEAD) + z->nam + z->ext + z->siz;
|
||||||
|
|
||||||
|
return ZE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Decrypt the zip entry described by z from file source to file dest
|
||||||
|
* using the password passwd. Return an error code in the ZE_ class.
|
||||||
|
*/
|
||||||
|
int zipbare(z, source, dest, passwd)
|
||||||
|
struct zlist far *z; /* zip entry to encrypt */
|
||||||
|
FILE *source, *dest; /* source and destination files */
|
||||||
|
ZCONST char *passwd; /* password string */
|
||||||
|
{
|
||||||
|
#ifdef ZIP10
|
||||||
|
int c0 /* byte preceding the last input byte */
|
||||||
|
#endif
|
||||||
|
int c1; /* last input byte */
|
||||||
|
ulg offset; /* used for file offsets */
|
||||||
|
ulg size; /* size of input data */
|
||||||
|
int r; /* size of encryption header */
|
||||||
|
int res; /* return code */
|
||||||
|
ush flag; /* previous flags */
|
||||||
|
|
||||||
|
/* Save position and skip local header in input file */
|
||||||
|
if ((offset = (ulg)ftell(source)) == (ulg)-1L ||
|
||||||
|
fseek(source, (long)((4 + LOCHEAD) + (ulg)z->nam + (ulg)z->ext),
|
||||||
|
SEEK_CUR)) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
/* Initialize keys with password */
|
||||||
|
init_keys(passwd);
|
||||||
|
|
||||||
|
/* Decrypt encryption header, save last two bytes */
|
||||||
|
c1 = 0;
|
||||||
|
for (r = RAND_HEAD_LEN; r; r--) {
|
||||||
|
#ifdef ZIP10
|
||||||
|
c0 = c1;
|
||||||
|
#endif
|
||||||
|
if ((c1 = getc(source)) == EOF) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
Trace((stdout, " (%02x)", c1));
|
||||||
|
zdecode(c1);
|
||||||
|
Trace((stdout, " %02x", c1));
|
||||||
|
}
|
||||||
|
Trace((stdout, "\n"));
|
||||||
|
|
||||||
|
/* If last two bytes of header don't match crc (or file time in the
|
||||||
|
* case of an extended local header), back up and just copy. For
|
||||||
|
* pkzip 2.0, the check has been reduced to one byte only.
|
||||||
|
*/
|
||||||
|
#ifdef ZIP10
|
||||||
|
if ((ush)(c0 | (c1<<8)) !=
|
||||||
|
(z->flg & 8 ? (ush) z->tim & 0xffff : (ush)(z->crc >> 16))) {
|
||||||
|
#else
|
||||||
|
if ((ush)c1 != (z->flg & 8 ? (ush) z->tim >> 8 : (ush)(z->crc >> 24))) {
|
||||||
|
#endif
|
||||||
|
if (fseek(source, offset, SEEK_SET)) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
if ((res = zipcopy(z, source, dest)) != ZE_OK) return res;
|
||||||
|
return ZE_MISS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear encrypted bit and local header bit, and write local header to
|
||||||
|
output file */
|
||||||
|
if ((offset = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP;
|
||||||
|
z->off = offset;
|
||||||
|
flag = z->flg;
|
||||||
|
z->flg &= ~9;
|
||||||
|
z->lflg &= ~9;
|
||||||
|
z->siz -= RAND_HEAD_LEN;
|
||||||
|
if ((res = putlocal(z, dest)) != ZE_OK) return res;
|
||||||
|
|
||||||
|
/* Decrypt data */
|
||||||
|
for (size = z->siz; size; size--) {
|
||||||
|
if ((c1 = getc(source)) == EOF) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
zdecode(c1);
|
||||||
|
putc(c1, dest);
|
||||||
|
}
|
||||||
|
/* Skip extended local header in input file if there is one */
|
||||||
|
if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) {
|
||||||
|
return ferror(source) ? ZE_READ : ZE_EOF;
|
||||||
|
}
|
||||||
|
if (fflush(dest) == EOF) return ZE_TEMP;
|
||||||
|
|
||||||
|
/* Update number of bytes written to output file */
|
||||||
|
tempzn += (4 + LOCHEAD) + z->nam + z->ext + z->siz;
|
||||||
|
|
||||||
|
return ZE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else /* !UTIL */
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* If requested, encrypt the data in buf, and in any case call fwrite()
|
||||||
|
* with the arguments to zfwrite(). Return what fwrite() returns.
|
||||||
|
*
|
||||||
|
* A bug has been found when encrypting large files. See trees.c
|
||||||
|
* for details and the fix.
|
||||||
|
*/
|
||||||
|
unsigned zfwrite(buf, item_size, nb, f)
|
||||||
|
zvoid *buf; /* data buffer */
|
||||||
|
extent item_size; /* size of each item in bytes */
|
||||||
|
extent nb; /* number of items */
|
||||||
|
FILE *f; /* file to write to */
|
||||||
|
{
|
||||||
|
int t; /* temporary */
|
||||||
|
|
||||||
|
if (key != (char *)NULL) { /* key is the global password pointer */
|
||||||
|
ulg size; /* buffer size */
|
||||||
|
char *p = (char*)buf; /* steps through buffer */
|
||||||
|
|
||||||
|
/* Encrypt data in buffer */
|
||||||
|
for (size = item_size*(ulg)nb; size != 0; p++, size--) {
|
||||||
|
*p = (char)zencode(*p, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Write the buffer out */
|
||||||
|
return fwrite(buf, item_size, nb, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ?UTIL */
|
||||||
|
#endif /* ZIP */
|
||||||
|
|
||||||
|
|
||||||
|
#if (defined(UNZIP) && !defined(FUNZIP))
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Get the password and set up keys for current zipfile member.
|
||||||
|
* Return PK_ class error.
|
||||||
|
*/
|
||||||
|
int decrypt(__G__ passwrd)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *passwrd;
|
||||||
|
{
|
||||||
|
ush b;
|
||||||
|
int n, r;
|
||||||
|
uch h[RAND_HEAD_LEN];
|
||||||
|
|
||||||
|
Trace((stdout, "\n[incnt = %d]: ", GLOBAL(incnt)));
|
||||||
|
|
||||||
|
/* get header once (turn off "encrypted" flag temporarily so we don't
|
||||||
|
* try to decrypt the same data twice) */
|
||||||
|
GLOBAL(pInfo->encrypted) = FALSE;
|
||||||
|
defer_leftover_input(__G);
|
||||||
|
for (n = 0; n < RAND_HEAD_LEN; n++) {
|
||||||
|
b = NEXTBYTE;
|
||||||
|
h[n] = (uch)b;
|
||||||
|
Trace((stdout, " (%02x)", h[n]));
|
||||||
|
}
|
||||||
|
undefer_input(__G);
|
||||||
|
GLOBAL(pInfo->encrypted) = TRUE;
|
||||||
|
|
||||||
|
if (GLOBAL(newzip)) { /* this is first encrypted member in this zipfile */
|
||||||
|
GLOBAL(newzip) = FALSE;
|
||||||
|
if (passwrd != (char *)NULL) { /* user gave password on command line */
|
||||||
|
if (!GLOBAL(key)) {
|
||||||
|
if ((GLOBAL(key) = (char *)malloc(strlen(passwrd)+1)) ==
|
||||||
|
(char *)NULL)
|
||||||
|
return PK_MEM2;
|
||||||
|
strcpy(GLOBAL(key), passwrd);
|
||||||
|
GLOBAL(nopwd) = TRUE; /* inhibit password prompting! */
|
||||||
|
}
|
||||||
|
} else if (GLOBAL(key)) { /* get rid of previous zipfile's key */
|
||||||
|
free(GLOBAL(key));
|
||||||
|
GLOBAL(key) = (char *)NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if have key already, test it; else allocate memory for it */
|
||||||
|
if (GLOBAL(key)) {
|
||||||
|
if (!testp(__G__ h))
|
||||||
|
return PK_COOL; /* existing password OK (else prompt for new) */
|
||||||
|
else if (GLOBAL(nopwd))
|
||||||
|
return PK_WARN; /* user indicated no more prompting */
|
||||||
|
} else if ((GLOBAL(key) = (char *)malloc(IZ_PWLEN+1)) == (char *)NULL)
|
||||||
|
return PK_MEM2;
|
||||||
|
|
||||||
|
/* try a few keys */
|
||||||
|
n = 0;
|
||||||
|
do {
|
||||||
|
r = (*G.decr_passwd)((zvoid *)&G, &n, GLOBAL(key), IZ_PWLEN+1,
|
||||||
|
GLOBAL(zipfn), GLOBAL(filename));
|
||||||
|
if (r == IZ_PW_ERROR) { /* internal error in fetch of PW */
|
||||||
|
free (GLOBAL(key));
|
||||||
|
GLOBAL(key) = NULL;
|
||||||
|
return PK_MEM2;
|
||||||
|
}
|
||||||
|
if (r != IZ_PW_ENTERED) { /* user replied "skip" or "skip all" */
|
||||||
|
*GLOBAL(key) = '\0'; /* We try the NIL password, ... */
|
||||||
|
n = 0; /* and cancel fetch for this item. */
|
||||||
|
}
|
||||||
|
if (!testp(__G__ h))
|
||||||
|
return PK_COOL;
|
||||||
|
if (r == IZ_PW_CANCELALL) /* User replied "Skip all" */
|
||||||
|
GLOBAL(nopwd) = TRUE; /* inhibit any further PW prompt! */
|
||||||
|
} while (n > 0);
|
||||||
|
|
||||||
|
return PK_WARN;
|
||||||
|
|
||||||
|
} /* end function decrypt() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Test the password. Return -1 if bad, 0 if OK.
|
||||||
|
*/
|
||||||
|
local int testp(__G__ h)
|
||||||
|
__GDEF
|
||||||
|
ZCONST uch *h;
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
char *key_translated;
|
||||||
|
|
||||||
|
/* On systems with "obscure" native character coding (e.g., EBCDIC),
|
||||||
|
* the first test translates the password to the "main standard"
|
||||||
|
* character coding. */
|
||||||
|
|
||||||
|
#ifdef STR_TO_CP1
|
||||||
|
/* allocate buffer for translated password */
|
||||||
|
if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL)
|
||||||
|
return -1;
|
||||||
|
/* first try, test password translated "standard" charset */
|
||||||
|
r = testkey(__G__ h, STR_TO_CP1(key_translated, GLOBAL(key)));
|
||||||
|
#else /* !STR_TO_CP1 */
|
||||||
|
/* first try, test password as supplied on the extractor's host */
|
||||||
|
r = testkey(__G__ h, GLOBAL(key));
|
||||||
|
#endif /* ?STR_TO_CP1 */
|
||||||
|
|
||||||
|
#ifdef STR_TO_CP2
|
||||||
|
if (r != 0) {
|
||||||
|
#ifndef STR_TO_CP1
|
||||||
|
/* now prepare for second (and maybe third) test with translated pwd */
|
||||||
|
if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL)
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
/* second try, password translated to alternate ("standard") charset */
|
||||||
|
r = testkey(__G__ h, STR_TO_CP2(key_translated, GLOBAL(key)));
|
||||||
|
#ifdef STR_TO_CP3
|
||||||
|
if (r != 0)
|
||||||
|
/* third try, password translated to another "standard" charset */
|
||||||
|
r = testkey(__G__ h, STR_TO_CP3(key_translated, GLOBAL(key)));
|
||||||
|
#endif
|
||||||
|
#ifndef STR_TO_CP1
|
||||||
|
free(key_translated);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* STR_TO_CP2 */
|
||||||
|
|
||||||
|
#ifdef STR_TO_CP1
|
||||||
|
free(key_translated);
|
||||||
|
if (r != 0) {
|
||||||
|
/* last resort, test password as supplied on the extractor's host */
|
||||||
|
r = testkey(__G__ h, GLOBAL(key));
|
||||||
|
}
|
||||||
|
#endif /* STR_TO_CP1 */
|
||||||
|
|
||||||
|
return r;
|
||||||
|
|
||||||
|
} /* end function testp() */
|
||||||
|
|
||||||
|
|
||||||
|
local int testkey(__G__ h, key)
|
||||||
|
__GDEF
|
||||||
|
ZCONST uch *h; /* decrypted header */
|
||||||
|
ZCONST char *key; /* decryption password to test */
|
||||||
|
{
|
||||||
|
ush b;
|
||||||
|
#ifdef ZIP10
|
||||||
|
ush c;
|
||||||
|
#endif
|
||||||
|
int n;
|
||||||
|
uch *p;
|
||||||
|
uch hh[RAND_HEAD_LEN]; /* decrypted header */
|
||||||
|
|
||||||
|
/* set keys and save the encrypted header */
|
||||||
|
init_keys(__G__ key);
|
||||||
|
memcpy(hh, h, RAND_HEAD_LEN);
|
||||||
|
|
||||||
|
/* check password */
|
||||||
|
for (n = 0; n < RAND_HEAD_LEN; n++) {
|
||||||
|
zdecode(hh[n]);
|
||||||
|
Trace((stdout, " %02x", hh[n]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Trace((stdout,
|
||||||
|
"\n lrec.crc= %08lx crec.crc= %08lx pInfo->ExtLocHdr= %s\n",
|
||||||
|
GLOBAL(lrec.crc32), GLOBAL(pInfo->crc),
|
||||||
|
GLOBAL(pInfo->ExtLocHdr) ? "true":"false"));
|
||||||
|
Trace((stdout, " incnt = %d unzip offset into zipfile = %ld\n",
|
||||||
|
GLOBAL(incnt),
|
||||||
|
GLOBAL(cur_zipfile_bufstart)+(GLOBAL(inptr)-GLOBAL(inbuf))));
|
||||||
|
|
||||||
|
/* same test as in zipbare(): */
|
||||||
|
|
||||||
|
#ifdef ZIP10 /* check two bytes */
|
||||||
|
c = hh[RAND_HEAD_LEN-2], b = hh[RAND_HEAD_LEN-1];
|
||||||
|
Trace((stdout,
|
||||||
|
" (c | (b<<8)) = %04x (crc >> 16) = %04x lrec.time = %04x\n",
|
||||||
|
(ush)(c | (b<<8)), (ush)(GLOBAL(lrec.crc32) >> 16),
|
||||||
|
((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff))));
|
||||||
|
if ((ush)(c | (b<<8)) != (GLOBAL(pInfo->ExtLocHdr) ?
|
||||||
|
((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff) :
|
||||||
|
(ush)(GLOBAL(lrec.crc32) >> 16)))
|
||||||
|
return -1; /* bad */
|
||||||
|
#else
|
||||||
|
b = hh[RAND_HEAD_LEN-1];
|
||||||
|
Trace((stdout, " b = %02x (crc >> 24) = %02x (lrec.time >> 8) = %02x\n",
|
||||||
|
b, (ush)(GLOBAL(lrec.crc32) >> 24),
|
||||||
|
((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff));
|
||||||
|
if (b != (GLOBAL(pInfo->ExtLocHdr) ?
|
||||||
|
((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff :
|
||||||
|
(ush)(GLOBAL(lrec.crc32) >> 24)))
|
||||||
|
return -1; /* bad */
|
||||||
|
#endif
|
||||||
|
/* password OK: decrypt current buffer contents before leaving */
|
||||||
|
for (n = (long)GLOBAL(incnt) > GLOBAL(csize) ?
|
||||||
|
(int)GLOBAL(csize) : GLOBAL(incnt),
|
||||||
|
p = GLOBAL(inptr); n--; p++)
|
||||||
|
zdecode(*p);
|
||||||
|
return 0; /* OK */
|
||||||
|
|
||||||
|
} /* end function testkey() */
|
||||||
|
|
||||||
|
#endif /* UNZIP && !FUNZIP */
|
||||||
|
|
||||||
|
#else /* !CRYPT */
|
||||||
|
|
||||||
|
/* something "externally visible" to shut up compiler/linker warnings */
|
||||||
|
int zcr_dummy;
|
||||||
|
|
||||||
|
#endif /* ?CRYPT */
|
171
third_party/unzip/crypt.h
vendored
Normal file
171
third_party/unzip/crypt.h
vendored
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2007 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2005-Feb-10 or later
|
||||||
|
(the contents of which are also included in (un)zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
crypt.h (full version) by Info-ZIP. Last revised: [see CR_VERSION_DATE]
|
||||||
|
|
||||||
|
The main encryption/decryption source code for Info-Zip software was
|
||||||
|
originally written in Europe. To the best of our knowledge, it can
|
||||||
|
be freely distributed in both source and object forms from any country,
|
||||||
|
including the USA under License Exception TSU of the U.S. Export
|
||||||
|
Administration Regulations (section 740.13(e)) of 6 June 2002.
|
||||||
|
|
||||||
|
NOTE on copyright history:
|
||||||
|
Previous versions of this source package (up to version 2.8) were
|
||||||
|
not copyrighted and put in the public domain. If you cannot comply
|
||||||
|
with the Info-Zip LICENSE, you may want to look for one of those
|
||||||
|
public domain versions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __crypt_h /* don't include more than once */
|
||||||
|
#define __crypt_h
|
||||||
|
#include "third_party/unzip/crc32.h"
|
||||||
|
|
||||||
|
#ifdef CRYPT
|
||||||
|
# undef CRYPT
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
Logic of selecting "full crypt" code:
|
||||||
|
a) default behaviour:
|
||||||
|
- dummy crypt code when compiling UnZipSFX stub, to minimize size
|
||||||
|
- full crypt code when used to compile Zip, UnZip and fUnZip
|
||||||
|
b) USE_CRYPT defined:
|
||||||
|
- always full crypt code
|
||||||
|
c) NO_CRYPT defined:
|
||||||
|
- never full crypt code
|
||||||
|
NO_CRYPT takes precedence over USE_CRYPT
|
||||||
|
*/
|
||||||
|
#if defined(NO_CRYPT)
|
||||||
|
# define CRYPT 0 /* dummy version */
|
||||||
|
#else
|
||||||
|
#if defined(USE_CRYPT)
|
||||||
|
# define CRYPT 1 /* full version */
|
||||||
|
#else
|
||||||
|
#if !defined(SFX)
|
||||||
|
# define CRYPT 1 /* full version for zip and main unzip */
|
||||||
|
#else
|
||||||
|
# define CRYPT 0 /* dummy version for unzip sfx */
|
||||||
|
#endif
|
||||||
|
#endif /* ?USE_CRYPT */
|
||||||
|
#endif /* ?NO_CRYPT */
|
||||||
|
|
||||||
|
#if CRYPT
|
||||||
|
/* full version */
|
||||||
|
|
||||||
|
#ifdef CR_BETA
|
||||||
|
# undef CR_BETA /* this is not a beta release */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CR_MAJORVER 2
|
||||||
|
#define CR_MINORVER 11
|
||||||
|
#ifdef CR_BETA
|
||||||
|
# define CR_BETA_VER "c BETA"
|
||||||
|
# define CR_VERSION_DATE "05 Jan 2007" /* last real code change */
|
||||||
|
#else
|
||||||
|
# define CR_BETA_VER ""
|
||||||
|
# define CR_VERSION_DATE "05 Jan 2007" /* last public release date */
|
||||||
|
# define CR_RELEASE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __G /* UnZip only, for now (DLL stuff) */
|
||||||
|
# define __G
|
||||||
|
# define __G__
|
||||||
|
# define __GDEF
|
||||||
|
# define __GPRO void
|
||||||
|
# define __GPRO__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MSDOS) || defined(OS2) || defined(WIN32)
|
||||||
|
# ifndef DOS_OS2_W32
|
||||||
|
# define DOS_OS2_W32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(DOS_OS2_W32) || defined(__human68k__)
|
||||||
|
# ifndef DOS_H68_OS2_W32
|
||||||
|
# define DOS_H68_OS2_W32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(VM_CMS) || defined(MVS)
|
||||||
|
# ifndef CMS_MVS
|
||||||
|
# define CMS_MVS
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* To allow combining of Zip and UnZip static libraries in a single binary,
|
||||||
|
* the Zip and UnZip versions of the crypt core functions have to be named
|
||||||
|
* differently.
|
||||||
|
*/
|
||||||
|
#ifdef ZIP
|
||||||
|
# ifdef REALLY_SHORT_SYMS
|
||||||
|
# define decrypt_byte zdcrby
|
||||||
|
# else
|
||||||
|
# define decrypt_byte zp_decrypt_byte
|
||||||
|
# endif
|
||||||
|
# define update_keys zp_update_keys
|
||||||
|
# define init_keys zp_init_keys
|
||||||
|
#else /* !ZIP */
|
||||||
|
# ifdef REALLY_SHORT_SYMS
|
||||||
|
# define decrypt_byte dcrbyt
|
||||||
|
# endif
|
||||||
|
#endif /* ?ZIP */
|
||||||
|
|
||||||
|
#define IZ_PWLEN 80 /* input buffer size for reading encryption key */
|
||||||
|
#ifndef PWLEN /* for compatibility with previous zcrypt release... */
|
||||||
|
# define PWLEN IZ_PWLEN
|
||||||
|
#endif
|
||||||
|
#define RAND_HEAD_LEN 12 /* length of encryption random header */
|
||||||
|
|
||||||
|
/* the crc_32_tab array has to be provided externally for the crypt calculus */
|
||||||
|
|
||||||
|
/* encode byte c, using temp t. Warning: c must not have side effects. */
|
||||||
|
#define zencode(c,t) (t=decrypt_byte(__G), update_keys(c), t^(c))
|
||||||
|
|
||||||
|
/* decode byte c in place */
|
||||||
|
#define zdecode(c) update_keys(__G__ c ^= decrypt_byte(__G))
|
||||||
|
|
||||||
|
int decrypt_byte OF((__GPRO));
|
||||||
|
int update_keys OF((__GPRO__ int c));
|
||||||
|
void init_keys OF((__GPRO__ ZCONST char *passwd));
|
||||||
|
|
||||||
|
#ifdef ZIP
|
||||||
|
void crypthead OF((ZCONST char *, ulg, FILE *));
|
||||||
|
# ifdef UTIL
|
||||||
|
int zipcloak OF((struct zlist far *, FILE *, FILE *, ZCONST char *));
|
||||||
|
int zipbare OF((struct zlist far *, FILE *, FILE *, ZCONST char *));
|
||||||
|
# else
|
||||||
|
unsigned zfwrite OF((zvoid *, extent, extent, FILE *));
|
||||||
|
extern char *key;
|
||||||
|
# endif
|
||||||
|
#endif /* ZIP */
|
||||||
|
|
||||||
|
#if (defined(UNZIP) && !defined(FUNZIP))
|
||||||
|
int decrypt OF((__GPRO__ ZCONST char *passwrd));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FUNZIP
|
||||||
|
extern int encrypted;
|
||||||
|
# ifdef NEXTBYTE
|
||||||
|
# undef NEXTBYTE
|
||||||
|
# endif
|
||||||
|
# define NEXTBYTE \
|
||||||
|
(encrypted? update_keys(__G__ getc(G.in)^decrypt_byte(__G)) : getc(G.in))
|
||||||
|
#endif /* FUNZIP */
|
||||||
|
|
||||||
|
#else /* !CRYPT */
|
||||||
|
/* dummy version */
|
||||||
|
|
||||||
|
#define zencode
|
||||||
|
#define zdecode
|
||||||
|
|
||||||
|
#define zfwrite fwrite
|
||||||
|
|
||||||
|
#endif /* ?CRYPT */
|
||||||
|
#endif /* !__crypt_h */
|
298
third_party/unzip/ebcdic.h
vendored
Normal file
298
third_party/unzip/ebcdic.h
vendored
Normal file
|
@ -0,0 +1,298 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2008 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ebcdic.h
|
||||||
|
|
||||||
|
The CECP 1047 (Extended de-facto EBCDIC) <-> ISO 8859-1 conversion tables,
|
||||||
|
from ftp://aix1.segi.ulg.ac.be/pub/docs/iso8859/iso8859.networking
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
<Paul_von_Behren@stortek.com> (OS/390 port 12/97)
|
||||||
|
These table no longer represent the standard mappings (for example in the
|
||||||
|
OS/390 iconv utility). In order to follow current standards I remapped
|
||||||
|
ebcdic x0a to ascii x15 and
|
||||||
|
ebcdic x85 to ascii x25 (and vice-versa)
|
||||||
|
Without these changes, newlines in auto-convert text files appeared
|
||||||
|
as literal \045.
|
||||||
|
I'm not sure what effect this remap would have on the MVS and CMS ports, so
|
||||||
|
I ifdef'd these changes. Hopefully these ifdef's can be removed when the
|
||||||
|
MVS/CMS folks test the new mappings.
|
||||||
|
|
||||||
|
Christian Spieler <spieler@ikp.tu-darmstadt.de>, 27-Apr-1998
|
||||||
|
The problem mentioned by Paul von Behren was already observed previously
|
||||||
|
on VM/CMS, during the preparation of the CMS&MVS port of UnZip 5.20 in
|
||||||
|
1996. At that point, the ebcdic tables were not changed since they seemed
|
||||||
|
to be an adopted standard (to my knowledge, these tables are still used
|
||||||
|
as presented in mainfraime KERMIT). Instead, the "end-of-line" conversion
|
||||||
|
feature of Zip's and UnZip's "text-translation" mode was used to force
|
||||||
|
correct mappings between ASCII and EBCDIC newline markers.
|
||||||
|
Before interchanging the ASCII mappings of the EBCDIC control characters
|
||||||
|
"NL" 0x25 and "LF" 0x15 according to the OS/390 setting, we have to
|
||||||
|
make sure that EBCDIC 0x15 is never used as line termination.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __ebcdic_h /* prevent multiple inclusions */
|
||||||
|
#define __ebcdic_h
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ZCONST
|
||||||
|
# define ZCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef EBCDIC
|
||||||
|
#ifndef MTS /* MTS uses a slightly "special" EBCDIC code page */
|
||||||
|
|
||||||
|
ZCONST uch ebcdic[] = {
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, /* 00 - 07 */
|
||||||
|
#ifdef OS390
|
||||||
|
0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */
|
||||||
|
#else
|
||||||
|
0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */
|
||||||
|
#endif
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, /* 10 - 17 */
|
||||||
|
0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */
|
||||||
|
0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, /* 20 - 27 */
|
||||||
|
0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, /* 28 - 2F */
|
||||||
|
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 30 - 37 */
|
||||||
|
0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, /* 38 - 3F */
|
||||||
|
0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 40 - 47 */
|
||||||
|
0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, /* 48 - 4F */
|
||||||
|
0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, /* 50 - 57 */
|
||||||
|
0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D, /* 58 - 5F */
|
||||||
|
0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 60 - 67 */
|
||||||
|
0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /* 68 - 6F */
|
||||||
|
0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, /* 70 - 77 */
|
||||||
|
0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, /* 78 - 7F */
|
||||||
|
#ifdef OS390
|
||||||
|
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, /* 80 - 87 */
|
||||||
|
#else
|
||||||
|
0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, /* 80 - 87 */
|
||||||
|
#endif
|
||||||
|
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B, /* 88 - 8F */
|
||||||
|
0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, /* 90 - 97 */
|
||||||
|
0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF, /* 98 - 9F */
|
||||||
|
0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, /* A0 - A7 */
|
||||||
|
0xBB, 0xB4, 0x9A, 0x8A, 0xB0, 0xCA, 0xAF, 0xBC, /* A8 - AF */
|
||||||
|
0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, /* B0 - B7 */
|
||||||
|
0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB, /* B8 - BF */
|
||||||
|
0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, /* C0 - C7 */
|
||||||
|
0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /* C8 - CF */
|
||||||
|
0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, /* D0 - D7 */
|
||||||
|
0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xBA, 0xAE, 0x59, /* D8 - DF */
|
||||||
|
0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, /* E0 - E7 */
|
||||||
|
0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /* E8 - EF */
|
||||||
|
0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, /* F0 - F7 */
|
||||||
|
0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF /* F8 - FF */
|
||||||
|
};
|
||||||
|
|
||||||
|
#if (defined(ZIP) || CRYPT)
|
||||||
|
ZCONST uch ascii[] = {
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, /* 00 - 07 */
|
||||||
|
0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */
|
||||||
|
#ifdef OS390
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, /* 10 - 17 */
|
||||||
|
#else
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, /* 10 - 17 */
|
||||||
|
#endif
|
||||||
|
0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */
|
||||||
|
#ifdef OS390
|
||||||
|
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, /* 20 - 27 */
|
||||||
|
#else
|
||||||
|
0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, /* 20 - 27 */
|
||||||
|
#endif
|
||||||
|
0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, /* 28 - 2F */
|
||||||
|
0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, /* 30 - 37 */
|
||||||
|
0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A, /* 38 - 3F */
|
||||||
|
0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, /* 40 - 47 */
|
||||||
|
0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, /* 48 - 4F */
|
||||||
|
0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, /* 50 - 57 */
|
||||||
|
0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E, /* 58 - 5F */
|
||||||
|
0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, /* 60 - 67 */
|
||||||
|
0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, /* 68 - 6F */
|
||||||
|
0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, /* 70 - 77 */
|
||||||
|
0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, /* 78 - 7F */
|
||||||
|
0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 80 - 87 */
|
||||||
|
0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1, /* 88 - 8F */
|
||||||
|
0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, /* 90 - 97 */
|
||||||
|
0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4, /* 98 - 9F */
|
||||||
|
0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /* A0 - A7 */
|
||||||
|
0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0x5B, 0xDE, 0xAE, /* A8 - AF */
|
||||||
|
0xAC, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, /* B0 - B7 */
|
||||||
|
0xBD, 0xBE, 0xDD, 0xA8, 0xAF, 0x5D, 0xB4, 0xD7, /* B8 - BF */
|
||||||
|
0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* C0 - C7 */
|
||||||
|
0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5, /* C8 - CF */
|
||||||
|
0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, /* D0 - D7 */
|
||||||
|
0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF, /* D8 - DF */
|
||||||
|
0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* E0 - E7 */
|
||||||
|
0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5, /* E8 - EF */
|
||||||
|
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* F0 - F7 */
|
||||||
|
0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F /* F8 - FF */
|
||||||
|
};
|
||||||
|
#endif /* ZIP || CRYPT */
|
||||||
|
|
||||||
|
#else /* MTS */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the MTS ASCII->EBCDIC translation table. It provides a 1-1
|
||||||
|
* translation from ISO 8859/1 8-bit ASCII to IBM Code Page 37 EBCDIC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZCONST uch ebcdic[] = {
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, /* 00 - 07 */
|
||||||
|
0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, /* 10 - 17 */
|
||||||
|
0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */
|
||||||
|
0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, /* 20 - 27 */
|
||||||
|
0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, /* 28 - 2F */
|
||||||
|
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 30 - 37 */
|
||||||
|
0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, /* 38 - 3F */
|
||||||
|
0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 40 - 47 */
|
||||||
|
0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, /* 48 - 4F */
|
||||||
|
0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, /* 50 - 57 */
|
||||||
|
0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D, /* 58 - 5F */
|
||||||
|
0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 60 - 67 */
|
||||||
|
0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /* 68 - 6F */
|
||||||
|
0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, /* 70 - 77 */
|
||||||
|
0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, /* 78 - 7F */
|
||||||
|
0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, /* 80 - 87 */
|
||||||
|
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B, /* 88 - 8F */
|
||||||
|
0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, /* 90 - 97 */
|
||||||
|
0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF, /* 98 - 9F */
|
||||||
|
0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, /* A0 - A7 */
|
||||||
|
0xBD, 0xB4, 0x9A, 0x8A, 0x5F, 0xCA, 0xAF, 0xBC, /* A8 - AF */
|
||||||
|
0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, /* B0 - B7 */
|
||||||
|
0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB, /* B8 - BF */
|
||||||
|
0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, /* C0 - C7 */
|
||||||
|
0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /* C8 - CF */
|
||||||
|
0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, /* D0 - D7 */
|
||||||
|
0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xAD, 0xAE, 0x59, /* D8 - DF */
|
||||||
|
0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, /* E0 - E7 */
|
||||||
|
0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /* E8 - EF */
|
||||||
|
0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, /* F0 - F7 */
|
||||||
|
0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF /* F8 - FF */
|
||||||
|
};
|
||||||
|
|
||||||
|
#if (defined(ZIP) || CRYPT)
|
||||||
|
ZCONST uch ascii[] = {
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, /* 00 - 07 */
|
||||||
|
0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 08 - 0F */
|
||||||
|
0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, /* 10 - 17 */
|
||||||
|
0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, /* 18 - 1F */
|
||||||
|
0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, /* 20 - 27 */
|
||||||
|
0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, /* 28 - 2F */
|
||||||
|
0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, /* 30 - 37 */
|
||||||
|
0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A, /* 38 - 3F */
|
||||||
|
0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, /* 40 - 47 */
|
||||||
|
0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, /* 48 - 4F */
|
||||||
|
0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, /* 50 - 57 */
|
||||||
|
0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAC, /* 58 - 5F */
|
||||||
|
0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, /* 60 - 67 */
|
||||||
|
0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, /* 68 - 6F */
|
||||||
|
0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, /* 70 - 77 */
|
||||||
|
0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, /* 78 - 7F */
|
||||||
|
0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 80 - 87 */
|
||||||
|
0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1, /* 88 - 8F */
|
||||||
|
0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, /* 90 - 97 */
|
||||||
|
0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4, /* 98 - 9F */
|
||||||
|
0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /* A0 - A7 */
|
||||||
|
0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0xDD, 0xDE, 0xAE, /* A8 - AF */
|
||||||
|
0x5E, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, /* B0 - B7 */
|
||||||
|
0xBD, 0xBE, 0x5B, 0x5D, 0xAF, 0xA8, 0xB4, 0xD7, /* B8 - BF */
|
||||||
|
0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* C0 - C7 */
|
||||||
|
0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5, /* C8 - CF */
|
||||||
|
0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, /* D0 - D7 */
|
||||||
|
0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF, /* D8 - DF */
|
||||||
|
0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* E0 - E7 */
|
||||||
|
0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5, /* E8 - EF */
|
||||||
|
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* F0 - F7 */
|
||||||
|
0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F /* F8 - FF */
|
||||||
|
};
|
||||||
|
#endif /* ZIP || CRYPT */
|
||||||
|
|
||||||
|
#endif /* ?MTS */
|
||||||
|
#endif /* EBCDIC */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
The following conversion tables translate between IBM PC CP 850
|
||||||
|
(OEM codepage) and the "Western Europe & America" Windows codepage 1252.
|
||||||
|
The Windows codepage 1252 contains the ISO 8859-1 "Latin 1" codepage,
|
||||||
|
with some additional printable characters in the range (0x80 - 0x9F),
|
||||||
|
that is reserved to control codes in the ISO 8859-1 character table.
|
||||||
|
|
||||||
|
The ISO <--> OEM conversion tables were constructed with the help
|
||||||
|
of the WIN32 (Win16?) API's OemToAnsi() and AnsiToOem() conversion
|
||||||
|
functions and have been checked against the CP850 and LATIN1 tables
|
||||||
|
provided in the MS-Kermit 3.14 distribution.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef IZ_ISO2OEM_ARRAY
|
||||||
|
ZCONST uch Far iso2oem_850[] = {
|
||||||
|
0x3F, 0x3F, 0x27, 0x9F, 0x22, 0x2E, 0xC5, 0xCE, /* 80 - 87 */
|
||||||
|
0x5E, 0x25, 0x53, 0x3C, 0x4F, 0x3F, 0x3F, 0x3F, /* 88 - 8F */
|
||||||
|
0x3F, 0x27, 0x27, 0x22, 0x22, 0x07, 0x2D, 0x2D, /* 90 - 97 */
|
||||||
|
0x7E, 0x54, 0x73, 0x3E, 0x6F, 0x3F, 0x3F, 0x59, /* 98 - 9F */
|
||||||
|
0xFF, 0xAD, 0xBD, 0x9C, 0xCF, 0xBE, 0xDD, 0xF5, /* A0 - A7 */
|
||||||
|
0xF9, 0xB8, 0xA6, 0xAE, 0xAA, 0xF0, 0xA9, 0xEE, /* A8 - AF */
|
||||||
|
0xF8, 0xF1, 0xFD, 0xFC, 0xEF, 0xE6, 0xF4, 0xFA, /* B0 - B7 */
|
||||||
|
0xF7, 0xFB, 0xA7, 0xAF, 0xAC, 0xAB, 0xF3, 0xA8, /* B8 - BF */
|
||||||
|
0xB7, 0xB5, 0xB6, 0xC7, 0x8E, 0x8F, 0x92, 0x80, /* C0 - C7 */
|
||||||
|
0xD4, 0x90, 0xD2, 0xD3, 0xDE, 0xD6, 0xD7, 0xD8, /* C8 - CF */
|
||||||
|
0xD1, 0xA5, 0xE3, 0xE0, 0xE2, 0xE5, 0x99, 0x9E, /* D0 - D7 */
|
||||||
|
0x9D, 0xEB, 0xE9, 0xEA, 0x9A, 0xED, 0xE8, 0xE1, /* D8 - DF */
|
||||||
|
0x85, 0xA0, 0x83, 0xC6, 0x84, 0x86, 0x91, 0x87, /* E0 - E7 */
|
||||||
|
0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, /* E8 - EF */
|
||||||
|
0xD0, 0xA4, 0x95, 0xA2, 0x93, 0xE4, 0x94, 0xF6, /* F0 - F7 */
|
||||||
|
0x9B, 0x97, 0xA3, 0x96, 0x81, 0xEC, 0xE7, 0x98 /* F8 - FF */
|
||||||
|
};
|
||||||
|
#endif /* IZ_ISO2OEM_ARRAY */
|
||||||
|
|
||||||
|
#ifdef IZ_OEM2ISO_ARRAY
|
||||||
|
ZCONST uch Far oem2iso_850[] = {
|
||||||
|
0xC7, 0xFC, 0xE9, 0xE2, 0xE4, 0xE0, 0xE5, 0xE7, /* 80 - 87 */
|
||||||
|
0xEA, 0xEB, 0xE8, 0xEF, 0xEE, 0xEC, 0xC4, 0xC5, /* 88 - 8F */
|
||||||
|
0xC9, 0xE6, 0xC6, 0xF4, 0xF6, 0xF2, 0xFB, 0xF9, /* 90 - 97 */
|
||||||
|
0xFF, 0xD6, 0xDC, 0xF8, 0xA3, 0xD8, 0xD7, 0x83, /* 98 - 9F */
|
||||||
|
0xE1, 0xED, 0xF3, 0xFA, 0xF1, 0xD1, 0xAA, 0xBA, /* A0 - A7 */
|
||||||
|
0xBF, 0xAE, 0xAC, 0xBD, 0xBC, 0xA1, 0xAB, 0xBB, /* A8 - AF */
|
||||||
|
0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xC1, 0xC2, 0xC0, /* B0 - B7 */
|
||||||
|
0xA9, 0xA6, 0xA6, 0x2B, 0x2B, 0xA2, 0xA5, 0x2B, /* B8 - BF */
|
||||||
|
0x2B, 0x2D, 0x2D, 0x2B, 0x2D, 0x2B, 0xE3, 0xC3, /* C0 - C7 */
|
||||||
|
0x2B, 0x2B, 0x2D, 0x2D, 0xA6, 0x2D, 0x2B, 0xA4, /* C8 - CF */
|
||||||
|
0xF0, 0xD0, 0xCA, 0xCB, 0xC8, 0x69, 0xCD, 0xCE, /* D0 - D7 */
|
||||||
|
0xCF, 0x2B, 0x2B, 0xA6, 0x5F, 0xA6, 0xCC, 0xAF, /* D8 - DF */
|
||||||
|
0xD3, 0xDF, 0xD4, 0xD2, 0xF5, 0xD5, 0xB5, 0xFE, /* E0 - E7 */
|
||||||
|
0xDE, 0xDA, 0xDB, 0xD9, 0xFD, 0xDD, 0xAF, 0xB4, /* E8 - EF */
|
||||||
|
0xAD, 0xB1, 0x3D, 0xBE, 0xB6, 0xA7, 0xF7, 0xB8, /* F0 - F7 */
|
||||||
|
0xB0, 0xA8, 0xB7, 0xB9, 0xB3, 0xB2, 0xA6, 0xA0 /* F8 - FF */
|
||||||
|
};
|
||||||
|
#endif /* IZ_OEM2ISO_ARRAY */
|
||||||
|
|
||||||
|
/* The following pointers to the OEM<-->ISO translation tables are used
|
||||||
|
by the translation code portions. They may get initialized at program
|
||||||
|
startup to point to the matching static translation tables, or to NULL
|
||||||
|
to disable OEM-ISO translation.
|
||||||
|
The compile-time initialization used here provides the backward compatible
|
||||||
|
setting, as can be found in UnZip 5.52 and earlier.
|
||||||
|
In case this mechanism will ever get used on a multithreading system that
|
||||||
|
allows different codepage setups for concurrently running threads, these
|
||||||
|
pointers should get moved into UnZip's thread-safe global data structure.
|
||||||
|
*/
|
||||||
|
#ifdef IZ_ISO2OEM_ARRAY
|
||||||
|
ZCONST uch Far *iso2oem = iso2oem_850; /* backward compatibility default */
|
||||||
|
#endif /* IZ_ISO2OEM_ARRAY */
|
||||||
|
#ifdef IZ_OEM2ISO_ARRAY
|
||||||
|
ZCONST uch Far *oem2iso = oem2iso_850; /* backward compatibility default */
|
||||||
|
#endif /* IZ_OEM2ISO_ARRAY */
|
||||||
|
|
||||||
|
#endif /* __ebcdic_h */
|
318
third_party/unzip/envargs.c
vendored
Normal file
318
third_party/unzip/envargs.c
vendored
Normal file
|
@ -0,0 +1,318 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2005 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*----------------------------------------------------------------*
|
||||||
|
| envargs - add default options from environment to command line
|
||||||
|
|----------------------------------------------------------------
|
||||||
|
| Author: Bill Davidsen, original 10/13/91, revised 23 Oct 1991.
|
||||||
|
| This program is in the public domain.
|
||||||
|
|----------------------------------------------------------------
|
||||||
|
| Minor program notes:
|
||||||
|
| 1. Yes, the indirection is a tad complex
|
||||||
|
| 2. Parentheses were added where not needed in some cases
|
||||||
|
| to make the action of the code less obscure.
|
||||||
|
|----------------------------------------------------------------
|
||||||
|
| UnZip notes: 24 May 92 ("v1.4"):
|
||||||
|
| 1. #include "third_party/unzip/unzip.h" for prototypes (24 May 92)
|
||||||
|
| 2. changed ch to type char (24 May 92)
|
||||||
|
| 3. added an ifdef to avoid Borland warnings (24 May 92)
|
||||||
|
| 4. included Rich Wales' mksargs() routine (for MS-DOS, maybe
|
||||||
|
| OS/2? NT?) (4 Dec 93)
|
||||||
|
| 5. added alternate-variable string envstr2 (21 Apr 94)
|
||||||
|
| 6. added support for quoted arguments (6 Jul 96)
|
||||||
|
*----------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define __ENVARGS_C /* identifies this source module */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
|
||||||
|
#ifdef __EMX__ /* emx isspace() returns TRUE on extended ASCII !! */
|
||||||
|
# define ISspace(c) ((c) & 0x80 ? 0 : isspace((unsigned)c))
|
||||||
|
#else
|
||||||
|
# define ISspace(c) isspace((unsigned)c)
|
||||||
|
#endif /* ?__EMX__ */
|
||||||
|
|
||||||
|
#if (!defined(RISCOS) && (!defined(MODERN) || defined(NO_STDLIB_H)))
|
||||||
|
extern char *getenv();
|
||||||
|
#endif
|
||||||
|
static int count_args OF((ZCONST char *));
|
||||||
|
|
||||||
|
|
||||||
|
/* envargs() returns PK-style error code */
|
||||||
|
|
||||||
|
int envargs(Pargc, Pargv, envstr, envstr2)
|
||||||
|
int *Pargc;
|
||||||
|
char ***Pargv;
|
||||||
|
ZCONST char *envstr, *envstr2;
|
||||||
|
{
|
||||||
|
char *envptr; /* value returned by getenv */
|
||||||
|
char *bufptr; /* copy of env info */
|
||||||
|
int argc = 0; /* internal arg count */
|
||||||
|
register int ch; /* spare temp value */
|
||||||
|
char **argv; /* internal arg vector */
|
||||||
|
char **argvect; /* copy of vector address */
|
||||||
|
|
||||||
|
/* see if anything in the environment */
|
||||||
|
if ((envptr = getenv(envstr)) != (char *)NULL) /* usual var */
|
||||||
|
while (ISspace(*envptr)) /* must discard leading spaces */
|
||||||
|
envptr++;
|
||||||
|
if (envptr == (char *)NULL || *envptr == '\0')
|
||||||
|
if ((envptr = getenv(envstr2)) != (char *)NULL) /* alternate var */
|
||||||
|
while (ISspace(*envptr))
|
||||||
|
envptr++;
|
||||||
|
if (envptr == (char *)NULL || *envptr == '\0')
|
||||||
|
return PK_OK;
|
||||||
|
|
||||||
|
bufptr = malloc(1 + strlen(envptr));
|
||||||
|
if (bufptr == (char *)NULL)
|
||||||
|
return PK_MEM;
|
||||||
|
#if ((defined(WIN32) || defined(WINDLL)) && !defined(_WIN32_WCE))
|
||||||
|
# ifdef WIN32
|
||||||
|
if (IsWinNT()) {
|
||||||
|
/* SPC: don't know codepage of 'real' WinNT console */
|
||||||
|
strcpy(bufptr, envptr);
|
||||||
|
} else {
|
||||||
|
/* Win95 environment is DOS and uses OEM character coding */
|
||||||
|
OEM_TO_INTERN(envptr, bufptr);
|
||||||
|
}
|
||||||
|
# else /* !WIN32 */
|
||||||
|
/* DOS (Win 3.x) environment uses OEM codepage */
|
||||||
|
OEM_TO_INTERN(envptr, bufptr);
|
||||||
|
# endif
|
||||||
|
#else /* !((WIN32 || WINDLL) && !_WIN32_WCE) */
|
||||||
|
strcpy(bufptr, envptr);
|
||||||
|
#endif /* ?((WIN32 || WINDLL) && !_WIN32_WCE) */
|
||||||
|
|
||||||
|
/* count the args so we can allocate room for them */
|
||||||
|
argc = count_args(bufptr);
|
||||||
|
/* allocate a vector large enough for all args */
|
||||||
|
argv = (char **)malloc((argc + *Pargc + 1) * sizeof(char *));
|
||||||
|
if (argv == (char **)NULL) {
|
||||||
|
free(bufptr);
|
||||||
|
return PK_MEM;
|
||||||
|
}
|
||||||
|
argvect = argv;
|
||||||
|
|
||||||
|
/* copy the program name first, that's always true */
|
||||||
|
*(argv++) = *((*Pargv)++);
|
||||||
|
|
||||||
|
/* copy the environment args next, may be changed */
|
||||||
|
do {
|
||||||
|
#if defined(AMIGA) || defined(UNIX)
|
||||||
|
if (*bufptr == '"') {
|
||||||
|
char *argstart = ++bufptr;
|
||||||
|
|
||||||
|
*(argv++) = argstart;
|
||||||
|
for (ch = *bufptr; ch != '\0' && ch != '\"';
|
||||||
|
ch = *PREINCSTR(bufptr))
|
||||||
|
if (ch == '\\' && bufptr[1] != '\0')
|
||||||
|
++bufptr; /* advance to char after backslash */
|
||||||
|
if (ch != '\0')
|
||||||
|
*(bufptr++) = '\0'; /* overwrite trailing " */
|
||||||
|
|
||||||
|
/* remove escape characters */
|
||||||
|
while ((argstart = MBSCHR(argstart, '\\')) != (char *)NULL) {
|
||||||
|
strcpy(argstart, argstart + 1);
|
||||||
|
if (*argstart)
|
||||||
|
++argstart;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*(argv++) = bufptr;
|
||||||
|
while ((ch = *bufptr) != '\0' && !ISspace(ch))
|
||||||
|
INCSTR(bufptr);
|
||||||
|
if (ch != '\0')
|
||||||
|
*(bufptr++) = '\0';
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#ifdef DOS_FLX_NLM_OS2_W32
|
||||||
|
/* we do not support backslash-quoting of quotes in quoted
|
||||||
|
* strings under DOS_FLX_NLM_OS2_W32, because backslashes are
|
||||||
|
* directory separators and double quotes are illegal in filenames */
|
||||||
|
if (*bufptr == '"') {
|
||||||
|
*(argv++) = ++bufptr;
|
||||||
|
while ((ch = *bufptr) != '\0' && ch != '\"')
|
||||||
|
INCSTR(bufptr);
|
||||||
|
if (ch != '\0')
|
||||||
|
*(bufptr++) = '\0';
|
||||||
|
} else {
|
||||||
|
*(argv++) = bufptr;
|
||||||
|
while ((ch = *bufptr) != '\0' && !ISspace(ch))
|
||||||
|
INCSTR(bufptr);
|
||||||
|
if (ch != '\0')
|
||||||
|
*(bufptr++) = '\0';
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
*(argv++) = bufptr;
|
||||||
|
while ((ch = *bufptr) != '\0' && !ISspace(ch))
|
||||||
|
INCSTR(bufptr);
|
||||||
|
if (ch != '\0')
|
||||||
|
*(bufptr++) = '\0';
|
||||||
|
#endif /* ?DOS_FLX_NLM_OS2_W32 */
|
||||||
|
#endif /* ?(AMIGA || UNIX) */
|
||||||
|
while ((ch = *bufptr) != '\0' && ISspace(ch))
|
||||||
|
INCSTR(bufptr);
|
||||||
|
} while (ch);
|
||||||
|
|
||||||
|
/* now save old argc and copy in the old args */
|
||||||
|
argc += *Pargc;
|
||||||
|
while (--(*Pargc))
|
||||||
|
*(argv++) = *((*Pargv)++);
|
||||||
|
|
||||||
|
/* finally, add a NULL after the last arg, like Unix */
|
||||||
|
*argv = (char *)NULL;
|
||||||
|
|
||||||
|
/* save the values and return, indicating succes */
|
||||||
|
*Pargv = argvect;
|
||||||
|
*Pargc = argc;
|
||||||
|
|
||||||
|
return PK_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int count_args(s)
|
||||||
|
ZCONST char *s;
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
do {
|
||||||
|
/* count and skip args */
|
||||||
|
++count;
|
||||||
|
#if defined(AMIGA) || defined(UNIX)
|
||||||
|
if (*s == '\"') {
|
||||||
|
for (ch = *PREINCSTR(s); ch != '\0' && ch != '\"';
|
||||||
|
ch = *PREINCSTR(s))
|
||||||
|
if (ch == '\\' && s[1] != '\0')
|
||||||
|
++s;
|
||||||
|
if (*s)
|
||||||
|
++s; /* trailing quote */
|
||||||
|
} else
|
||||||
|
#else
|
||||||
|
#ifdef DOS_FLX_NLM_OS2_W32
|
||||||
|
if (*s == '\"') {
|
||||||
|
++s; /* leading quote */
|
||||||
|
while ((ch = *s) != '\0' && ch != '\"')
|
||||||
|
INCSTR(s);
|
||||||
|
if (*s)
|
||||||
|
++s; /* trailing quote */
|
||||||
|
} else
|
||||||
|
#endif /* DOS_FLX_NLM_OS2_W32 */
|
||||||
|
#endif /* ?(AMIGA || UNIX) */
|
||||||
|
while ((ch = *s) != '\0' && !ISspace(ch)) /* note else-clauses above */
|
||||||
|
INCSTR(s);
|
||||||
|
while ((ch = *s) != '\0' && ISspace(ch))
|
||||||
|
INCSTR(s);
|
||||||
|
} while (ch);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
|
||||||
|
int main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
printf("Orig argv: %p\n", argv);
|
||||||
|
dump_args(argc, argv);
|
||||||
|
if ((err = envargs(&argc, &argv, "ENVTEST")) != PK_OK) {
|
||||||
|
perror("envargs: cannot get memory for arguments");
|
||||||
|
EXIT(err);
|
||||||
|
}
|
||||||
|
printf(" New argv: %p\n", argv);
|
||||||
|
dump_args(argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void dump_args(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf("\nDump %d args:\n", argc);
|
||||||
|
for (i = 0; i < argc; ++i)
|
||||||
|
printf("%3d %s\n", i, argv[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* TEST */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef MSDOS /* DOS_OS2? DOS_OS2_W32? */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* void mksargs(int *argcp, char ***argvp)
|
||||||
|
*
|
||||||
|
* Substitutes the extended command line argument list produced by
|
||||||
|
* the MKS Korn Shell in place of the command line info from DOS.
|
||||||
|
*
|
||||||
|
* The MKS shell gets around DOS's 128-byte limit on the length of
|
||||||
|
* a command line by passing the "real" command line in the envi-
|
||||||
|
* ronment. The "real" arguments are flagged by prepending a tilde
|
||||||
|
* (~) to each one.
|
||||||
|
*
|
||||||
|
* This "mksargs" routine creates a new argument list by scanning
|
||||||
|
* the environment from the beginning, looking for strings begin-
|
||||||
|
* ning with a tilde character. The new list replaces the original
|
||||||
|
* "argv" (pointed to by "argvp"), and the number of arguments
|
||||||
|
* in the new list replaces the original "argc" (pointed to by
|
||||||
|
* "argcp").
|
||||||
|
*
|
||||||
|
* Rich Wales
|
||||||
|
*/
|
||||||
|
void mksargs(argcp, argvp)
|
||||||
|
int *argcp;
|
||||||
|
char ***argvp;
|
||||||
|
{
|
||||||
|
#ifndef MSC /* declared differently in MSC 7.0 headers, at least */
|
||||||
|
#ifndef __WATCOMC__
|
||||||
|
extern char **environ; /* environment */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
char **envp; /* pointer into environment */
|
||||||
|
char **newargv; /* new argument list */
|
||||||
|
char **argp; /* pointer into new arg list */
|
||||||
|
int newargc; /* new argument count */
|
||||||
|
|
||||||
|
/* sanity check */
|
||||||
|
if (environ == NULL || argcp == NULL || argvp == NULL || *argvp == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* find out how many environment arguments there are */
|
||||||
|
for (envp = environ, newargc = 0;
|
||||||
|
*envp != NULL && (*envp)[0] == '~';
|
||||||
|
envp++, newargc++)
|
||||||
|
;
|
||||||
|
if (newargc == 0)
|
||||||
|
return; /* no environment arguments */
|
||||||
|
|
||||||
|
/* set up new argument list */
|
||||||
|
newargv = (char **) malloc(sizeof(char **) * (newargc+1));
|
||||||
|
if (newargv == NULL)
|
||||||
|
return; /* malloc failed */
|
||||||
|
|
||||||
|
for (argp = newargv, envp = environ; *envp != NULL && (*envp)[0] == '~';
|
||||||
|
*argp++ = &(*envp++)[1])
|
||||||
|
;
|
||||||
|
*argp = NULL; /* null-terminate the list */
|
||||||
|
|
||||||
|
/* substitute new argument list in place of old one */
|
||||||
|
*argcp = newargc;
|
||||||
|
*argvp = newargv;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MSDOS */
|
618
third_party/unzip/explode.c
vendored
Normal file
618
third_party/unzip/explode.c
vendored
Normal file
|
@ -0,0 +1,618 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2007 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2007-Mar-04 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/* explode.c -- by Mark Adler
|
||||||
|
version c17d, 01 December 2007 */
|
||||||
|
|
||||||
|
|
||||||
|
/* Copyright history:
|
||||||
|
- Starting with UnZip 5.41 of 16-April-2000, this source file
|
||||||
|
is covered by the Info-Zip LICENSE cited above.
|
||||||
|
- Prior versions of this source file, found in UnZip source packages
|
||||||
|
up to UnZip 5.40, were put in the public domain.
|
||||||
|
The original copyright note by Mark Adler was:
|
||||||
|
"You can do whatever you like with this source file,
|
||||||
|
though I would prefer that if you modify it and
|
||||||
|
redistribute it that you include comments to that effect
|
||||||
|
with your name and the date. Thank you."
|
||||||
|
|
||||||
|
History:
|
||||||
|
vers date who what
|
||||||
|
---- --------- -------------- ------------------------------------
|
||||||
|
c1 30 Mar 92 M. Adler explode that uses huft_build from inflate
|
||||||
|
(this gives over a 70% speed improvement
|
||||||
|
over the original unimplode.c, which
|
||||||
|
decoded a bit at a time)
|
||||||
|
c2 4 Apr 92 M. Adler fixed bug for file sizes a multiple of 32k.
|
||||||
|
c3 10 Apr 92 M. Adler added a little memory tracking if DEBUG
|
||||||
|
c4 11 Apr 92 M. Adler added NOMEMCPY do kill use of memcpy()
|
||||||
|
c5 21 Apr 92 M. Adler added the WSIZE #define to allow reducing
|
||||||
|
the 32K window size for specialized
|
||||||
|
applications.
|
||||||
|
c6 31 May 92 M. Adler added typecasts to eliminate some warnings
|
||||||
|
c7 27 Jun 92 G. Roelofs added more typecasts.
|
||||||
|
c8 17 Oct 92 G. Roelofs changed ULONG/UWORD/byte to ulg/ush/uch.
|
||||||
|
c9 19 Jul 93 J. Bush added more typecasts (to return values);
|
||||||
|
made l[256] array static for Amiga.
|
||||||
|
c10 8 Oct 93 G. Roelofs added used_csize for diagnostics; added
|
||||||
|
buf and unshrink arguments to flush();
|
||||||
|
undef'd various macros at end for Turbo C;
|
||||||
|
removed NEXTBYTE macro (now in unzip.h)
|
||||||
|
and bytebuf variable (not used); changed
|
||||||
|
memset() to memzero().
|
||||||
|
c11 9 Jan 94 M. Adler fixed incorrect used_csize calculation.
|
||||||
|
c12 9 Apr 94 G. Roelofs fixed split comments on preprocessor lines
|
||||||
|
to avoid bug in Encore compiler.
|
||||||
|
c13 25 Aug 94 M. Adler fixed distance-length comment (orig c9 fix)
|
||||||
|
c14 22 Nov 95 S. Maxwell removed unnecessary "static" on auto array
|
||||||
|
c15 6 Jul 96 W. Haidinger added ulg typecasts to flush() calls.
|
||||||
|
c16 8 Feb 98 C. Spieler added ZCONST modifiers to const tables
|
||||||
|
and #ifdef DEBUG around debugging code.
|
||||||
|
c16b 25 Mar 98 C. Spieler modified DLL code for slide redirection.
|
||||||
|
c16d 05 Jul 99 C. Spieler take care of flush() return values and
|
||||||
|
stop processing in case of errors
|
||||||
|
c17 04 Feb 01 C. Spieler reorganized code to reduce repetitions
|
||||||
|
of large code parts; adapted huft decoding
|
||||||
|
to the changes in inflate's huft_build()
|
||||||
|
due to support of deflate64; fixed memory
|
||||||
|
leaks (huft tables were not free'd when
|
||||||
|
get_tree() failed).
|
||||||
|
c17b 16 Feb 02 C. Spieler changed type of the "extra lengths" array
|
||||||
|
"extra" from ush into uch (to save space)
|
||||||
|
c17c 10 Aug 04 NN file sizes use zoff_t.
|
||||||
|
c17d 01 Dec 07 C. Spieler type for file sizes changed from zoff_t
|
||||||
|
into zusz_t.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Explode imploded (PKZIP method 6 compressed) data. This compression
|
||||||
|
method searches for as much of the current string of bytes (up to a length
|
||||||
|
of ~320) in the previous 4K or 8K bytes. If it doesn't find any matches
|
||||||
|
(of at least length 2 or 3), it codes the next byte. Otherwise, it codes
|
||||||
|
the length of the matched string and its distance backwards from the
|
||||||
|
current position. Single bytes ("literals") are preceded by a one (a
|
||||||
|
single bit) and are either uncoded (the eight bits go directly into the
|
||||||
|
compressed stream for a total of nine bits) or Huffman coded with a
|
||||||
|
supplied literal code tree. If literals are coded, then the minimum match
|
||||||
|
length is three, otherwise it is two.
|
||||||
|
|
||||||
|
There are therefore four kinds of imploded streams: 8K search with coded
|
||||||
|
literals (min match = 3), 4K search with coded literals (min match = 3),
|
||||||
|
8K with uncoded literals (min match = 2), and 4K with uncoded literals
|
||||||
|
(min match = 2). The kind of stream is identified in two bits of a
|
||||||
|
general purpose bit flag that is outside of the compressed stream.
|
||||||
|
|
||||||
|
Distance-length pairs for matched strings are preceded by a zero bit (to
|
||||||
|
distinguish them from literals) and are always coded. The distance comes
|
||||||
|
first and is either the low six (4K) or low seven (8K) bits of the
|
||||||
|
distance (uncoded), followed by the high six bits of the distance coded.
|
||||||
|
Then the length is six bits coded (0..63 + min match length), and if the
|
||||||
|
maximum such length is coded, then it's followed by another eight bits
|
||||||
|
(uncoded) to be added to the coded length. This gives a match length
|
||||||
|
range of 2..320 or 3..321 bytes.
|
||||||
|
|
||||||
|
The literal, length, and distance codes are all represented in a slightly
|
||||||
|
compressed form themselves. What is sent are the lengths of the codes for
|
||||||
|
each value, which is sufficient to construct the codes. Each byte of the
|
||||||
|
code representation is the code length (the low four bits representing
|
||||||
|
1..16), and the number of values sequentially with that length (the high
|
||||||
|
four bits also representing 1..16). There are 256 literal code values (if
|
||||||
|
literals are coded), 64 length code values, and 64 distance code values,
|
||||||
|
in that order at the beginning of the compressed stream. Each set of code
|
||||||
|
values is preceded (redundantly) with a byte indicating how many bytes are
|
||||||
|
in the code description that follows, in the range 1..256.
|
||||||
|
|
||||||
|
The codes themselves are decoded using tables made by huft_build() from
|
||||||
|
the bit lengths. That routine and its comments are in the inflate.c
|
||||||
|
module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __EXPLODE_C /* identifies this source module */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h" /* must supply slide[] (uch) array and NEXTBYTE macro */
|
||||||
|
|
||||||
|
#ifndef WSIZE
|
||||||
|
# define WSIZE 0x8000 /* window size--must be a power of two, and */
|
||||||
|
#endif /* at least 8K for zip's implode method */
|
||||||
|
|
||||||
|
#if (defined(DLL) && !defined(NO_SLIDE_REDIR))
|
||||||
|
# define wszimpl (unsigned)(G._wsize)
|
||||||
|
#else
|
||||||
|
# if defined(USE_DEFLATE64) && defined(INT_16BIT)
|
||||||
|
# define wszimpl (unsigned)(WSIZE>>1)
|
||||||
|
# else /* !(USE_DEFLATE64 && INT_16BIT) */
|
||||||
|
# define wszimpl WSIZE
|
||||||
|
# endif /* !(USE_DEFLATE64 && INT_16BIT) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* routines here */
|
||||||
|
static int get_tree OF((__GPRO__ unsigned *l, unsigned n));
|
||||||
|
static int explode_lit OF((__GPRO__ struct huft *tb, struct huft *tl,
|
||||||
|
struct huft *td, unsigned bb, unsigned bl,
|
||||||
|
unsigned bd, unsigned bdl));
|
||||||
|
static int explode_nolit OF((__GPRO__ struct huft *tl, struct huft *td,
|
||||||
|
unsigned bl, unsigned bd, unsigned bdl));
|
||||||
|
|
||||||
|
|
||||||
|
/* The implode algorithm uses a sliding 4K or 8K byte window on the
|
||||||
|
uncompressed stream to find repeated byte strings. This is implemented
|
||||||
|
here as a circular buffer. The index is updated simply by incrementing
|
||||||
|
and then and'ing with 0x0fff (4K-1) or 0x1fff (8K-1). Here, the 32K
|
||||||
|
buffer of inflate is used, and it works just as well to always have
|
||||||
|
a 32K circular buffer, so the index is anded with 0x7fff. This is
|
||||||
|
done to allow the window to also be used as the output buffer. */
|
||||||
|
/* This must be supplied in an external module useable like "uch slide[8192];"
|
||||||
|
or "uch *slide;", where the latter would be malloc'ed. In unzip, slide[]
|
||||||
|
is actually a 32K area for use by inflate, which uses a 32K sliding window.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define INVALID_CODE 99
|
||||||
|
#define IS_INVALID_CODE(c) ((c) == INVALID_CODE)
|
||||||
|
|
||||||
|
/* Tables for length and distance */
|
||||||
|
static ZCONST ush cplen2[] =
|
||||||
|
{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||||
|
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
|
||||||
|
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
|
||||||
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65};
|
||||||
|
static ZCONST ush cplen3[] =
|
||||||
|
{3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||||
|
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
|
||||||
|
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
|
||||||
|
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66};
|
||||||
|
static ZCONST uch extra[] =
|
||||||
|
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
8};
|
||||||
|
static ZCONST ush cpdist4[] =
|
||||||
|
{1, 65, 129, 193, 257, 321, 385, 449, 513, 577, 641, 705,
|
||||||
|
769, 833, 897, 961, 1025, 1089, 1153, 1217, 1281, 1345, 1409, 1473,
|
||||||
|
1537, 1601, 1665, 1729, 1793, 1857, 1921, 1985, 2049, 2113, 2177,
|
||||||
|
2241, 2305, 2369, 2433, 2497, 2561, 2625, 2689, 2753, 2817, 2881,
|
||||||
|
2945, 3009, 3073, 3137, 3201, 3265, 3329, 3393, 3457, 3521, 3585,
|
||||||
|
3649, 3713, 3777, 3841, 3905, 3969, 4033};
|
||||||
|
static ZCONST ush cpdist8[] =
|
||||||
|
{1, 129, 257, 385, 513, 641, 769, 897, 1025, 1153, 1281,
|
||||||
|
1409, 1537, 1665, 1793, 1921, 2049, 2177, 2305, 2433, 2561, 2689,
|
||||||
|
2817, 2945, 3073, 3201, 3329, 3457, 3585, 3713, 3841, 3969, 4097,
|
||||||
|
4225, 4353, 4481, 4609, 4737, 4865, 4993, 5121, 5249, 5377, 5505,
|
||||||
|
5633, 5761, 5889, 6017, 6145, 6273, 6401, 6529, 6657, 6785, 6913,
|
||||||
|
7041, 7169, 7297, 7425, 7553, 7681, 7809, 7937, 8065};
|
||||||
|
|
||||||
|
|
||||||
|
/* Macros for inflate() bit peeking and grabbing.
|
||||||
|
The usage is:
|
||||||
|
|
||||||
|
NEEDBITS(j)
|
||||||
|
x = b & mask_bits[j];
|
||||||
|
DUMPBITS(j)
|
||||||
|
|
||||||
|
where NEEDBITS makes sure that b has at least j bits in it, and
|
||||||
|
DUMPBITS removes the bits from b. The macros use the variable k
|
||||||
|
for the number of bits in b. Normally, b and k are register
|
||||||
|
variables for speed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<<k;k+=8;}}
|
||||||
|
#define DUMPBITS(n) {b>>=(n);k-=(n);}
|
||||||
|
|
||||||
|
#define DECODEHUFT(htab, bits, mask) {\
|
||||||
|
NEEDBITS((unsigned)(bits))\
|
||||||
|
t = (htab) + ((~(unsigned)b)&(mask));\
|
||||||
|
while (1) {\
|
||||||
|
DUMPBITS(t->b)\
|
||||||
|
if ((e=t->e) <= 32) break;\
|
||||||
|
if (IS_INVALID_CODE(e)) return 1;\
|
||||||
|
e &= 31;\
|
||||||
|
NEEDBITS(e)\
|
||||||
|
t = t->v.t + ((~(unsigned)b)&mask_bits[e]);\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int get_tree(__G__ l, n)
|
||||||
|
__GDEF
|
||||||
|
unsigned *l; /* bit lengths */
|
||||||
|
unsigned n; /* number expected */
|
||||||
|
/* Get the bit lengths for a code representation from the compressed
|
||||||
|
stream. If get_tree() returns 4, then there is an error in the data.
|
||||||
|
Otherwise zero is returned. */
|
||||||
|
{
|
||||||
|
unsigned i; /* bytes remaining in list */
|
||||||
|
unsigned k; /* lengths entered */
|
||||||
|
unsigned j; /* number of codes */
|
||||||
|
unsigned b; /* bit length for those codes */
|
||||||
|
|
||||||
|
|
||||||
|
/* get bit lengths */
|
||||||
|
i = NEXTBYTE + 1; /* length/count pairs to read */
|
||||||
|
k = 0; /* next code */
|
||||||
|
do {
|
||||||
|
b = ((j = NEXTBYTE) & 0xf) + 1; /* bits in code (1..16) */
|
||||||
|
j = ((j & 0xf0) >> 4) + 1; /* codes with those bits (1..16) */
|
||||||
|
if (k + j > n)
|
||||||
|
return 4; /* don't overflow l[] */
|
||||||
|
do {
|
||||||
|
l[k++] = b;
|
||||||
|
} while (--j);
|
||||||
|
} while (--i);
|
||||||
|
return k != n ? 4 : 0; /* should have read n of them */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int explode_lit(__G__ tb, tl, td, bb, bl, bd, bdl)
|
||||||
|
__GDEF
|
||||||
|
struct huft *tb, *tl, *td; /* literal, length, and distance tables */
|
||||||
|
unsigned bb, bl, bd; /* number of bits decoded by those */
|
||||||
|
unsigned bdl; /* number of distance low bits */
|
||||||
|
/* Decompress the imploded data using coded literals and a sliding
|
||||||
|
window (of size 2^(6+bdl) bytes). */
|
||||||
|
{
|
||||||
|
zusz_t s; /* bytes to decompress */
|
||||||
|
register unsigned e; /* table entry flag/number of extra bits */
|
||||||
|
unsigned n, d; /* length and index for copy */
|
||||||
|
unsigned w; /* current window position */
|
||||||
|
struct huft *t; /* pointer to table entry */
|
||||||
|
unsigned mb, ml, md; /* masks for bb, bl, and bd bits */
|
||||||
|
unsigned mdl; /* mask for bdl (distance lower) bits */
|
||||||
|
register ulg b; /* bit buffer */
|
||||||
|
register unsigned k; /* number of bits in bit buffer */
|
||||||
|
unsigned u; /* true if unflushed */
|
||||||
|
int retval = 0; /* error code returned: initialized to "no error" */
|
||||||
|
|
||||||
|
|
||||||
|
/* explode the coded data */
|
||||||
|
b = k = w = 0; /* initialize bit buffer, window */
|
||||||
|
u = 1; /* buffer unflushed */
|
||||||
|
mb = mask_bits[bb]; /* precompute masks for speed */
|
||||||
|
ml = mask_bits[bl];
|
||||||
|
md = mask_bits[bd];
|
||||||
|
mdl = mask_bits[bdl];
|
||||||
|
s = G.lrec.ucsize;
|
||||||
|
while (s > 0) /* do until ucsize bytes uncompressed */
|
||||||
|
{
|
||||||
|
NEEDBITS(1)
|
||||||
|
if (b & 1) /* then literal--decode it */
|
||||||
|
{
|
||||||
|
DUMPBITS(1)
|
||||||
|
s--;
|
||||||
|
DECODEHUFT(tb, bb, mb) /* get coded literal */
|
||||||
|
redirSlide[w++] = (uch)t->v.n;
|
||||||
|
if (w == wszimpl)
|
||||||
|
{
|
||||||
|
if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0)
|
||||||
|
return retval;
|
||||||
|
w = u = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* else distance/length */
|
||||||
|
{
|
||||||
|
DUMPBITS(1)
|
||||||
|
NEEDBITS(bdl) /* get distance low bits */
|
||||||
|
d = (unsigned)b & mdl;
|
||||||
|
DUMPBITS(bdl)
|
||||||
|
DECODEHUFT(td, bd, md) /* get coded distance high bits */
|
||||||
|
d = w - d - t->v.n; /* construct offset */
|
||||||
|
DECODEHUFT(tl, bl, ml) /* get coded length */
|
||||||
|
n = t->v.n;
|
||||||
|
if (e) /* get length extra bits */
|
||||||
|
{
|
||||||
|
NEEDBITS(8)
|
||||||
|
n += (unsigned)b & 0xff;
|
||||||
|
DUMPBITS(8)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do the copy */
|
||||||
|
s = (s > (zusz_t)n ? s - (zusz_t)n : 0);
|
||||||
|
do {
|
||||||
|
#if (defined(DLL) && !defined(NO_SLIDE_REDIR))
|
||||||
|
if (G.redirect_slide) {
|
||||||
|
/* &= w/ wszimpl not needed and wrong if redirect */
|
||||||
|
if (d >= wszimpl)
|
||||||
|
return 1;
|
||||||
|
e = wszimpl - (d > w ? d : w);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
e = wszimpl - ((d &= wszimpl-1) > w ? d : w);
|
||||||
|
if (e > n) e = n;
|
||||||
|
n -= e;
|
||||||
|
if (u && w <= d)
|
||||||
|
{
|
||||||
|
memzero(redirSlide + w, e);
|
||||||
|
w += e;
|
||||||
|
d += e;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#ifndef NOMEMCPY
|
||||||
|
if (w - d >= e) /* (this test assumes unsigned comparison) */
|
||||||
|
{
|
||||||
|
memcpy(redirSlide + w, redirSlide + d, e);
|
||||||
|
w += e;
|
||||||
|
d += e;
|
||||||
|
}
|
||||||
|
else /* do it slow to avoid memcpy() overlap */
|
||||||
|
#endif /* !NOMEMCPY */
|
||||||
|
do {
|
||||||
|
redirSlide[w++] = redirSlide[d++];
|
||||||
|
} while (--e);
|
||||||
|
if (w == wszimpl)
|
||||||
|
{
|
||||||
|
if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0)
|
||||||
|
return retval;
|
||||||
|
w = u = 0;
|
||||||
|
}
|
||||||
|
} while (n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* flush out redirSlide */
|
||||||
|
if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0)
|
||||||
|
return retval;
|
||||||
|
if (G.csize + G.incnt + (k >> 3)) /* should have read csize bytes, but */
|
||||||
|
{ /* sometimes read one too many: k>>3 compensates */
|
||||||
|
G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3);
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int explode_nolit(__G__ tl, td, bl, bd, bdl)
|
||||||
|
__GDEF
|
||||||
|
struct huft *tl, *td; /* length and distance decoder tables */
|
||||||
|
unsigned bl, bd; /* number of bits decoded by tl[] and td[] */
|
||||||
|
unsigned bdl; /* number of distance low bits */
|
||||||
|
/* Decompress the imploded data using uncoded literals and a sliding
|
||||||
|
window (of size 2^(6+bdl) bytes). */
|
||||||
|
{
|
||||||
|
zusz_t s; /* bytes to decompress */
|
||||||
|
register unsigned e; /* table entry flag/number of extra bits */
|
||||||
|
unsigned n, d; /* length and index for copy */
|
||||||
|
unsigned w; /* current window position */
|
||||||
|
struct huft *t; /* pointer to table entry */
|
||||||
|
unsigned ml, md; /* masks for bl and bd bits */
|
||||||
|
unsigned mdl; /* mask for bdl (distance lower) bits */
|
||||||
|
register ulg b; /* bit buffer */
|
||||||
|
register unsigned k; /* number of bits in bit buffer */
|
||||||
|
unsigned u; /* true if unflushed */
|
||||||
|
int retval = 0; /* error code returned: initialized to "no error" */
|
||||||
|
|
||||||
|
|
||||||
|
/* explode the coded data */
|
||||||
|
b = k = w = 0; /* initialize bit buffer, window */
|
||||||
|
u = 1; /* buffer unflushed */
|
||||||
|
ml = mask_bits[bl]; /* precompute masks for speed */
|
||||||
|
md = mask_bits[bd];
|
||||||
|
mdl = mask_bits[bdl];
|
||||||
|
s = G.lrec.ucsize;
|
||||||
|
while (s > 0) /* do until ucsize bytes uncompressed */
|
||||||
|
{
|
||||||
|
NEEDBITS(1)
|
||||||
|
if (b & 1) /* then literal--get eight bits */
|
||||||
|
{
|
||||||
|
DUMPBITS(1)
|
||||||
|
s--;
|
||||||
|
NEEDBITS(8)
|
||||||
|
redirSlide[w++] = (uch)b;
|
||||||
|
if (w == wszimpl)
|
||||||
|
{
|
||||||
|
if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0)
|
||||||
|
return retval;
|
||||||
|
w = u = 0;
|
||||||
|
}
|
||||||
|
DUMPBITS(8)
|
||||||
|
}
|
||||||
|
else /* else distance/length */
|
||||||
|
{
|
||||||
|
DUMPBITS(1)
|
||||||
|
NEEDBITS(bdl) /* get distance low bits */
|
||||||
|
d = (unsigned)b & mdl;
|
||||||
|
DUMPBITS(bdl)
|
||||||
|
DECODEHUFT(td, bd, md) /* get coded distance high bits */
|
||||||
|
d = w - d - t->v.n; /* construct offset */
|
||||||
|
DECODEHUFT(tl, bl, ml) /* get coded length */
|
||||||
|
n = t->v.n;
|
||||||
|
if (e) /* get length extra bits */
|
||||||
|
{
|
||||||
|
NEEDBITS(8)
|
||||||
|
n += (unsigned)b & 0xff;
|
||||||
|
DUMPBITS(8)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do the copy */
|
||||||
|
s = (s > (zusz_t)n ? s - (zusz_t)n : 0);
|
||||||
|
do {
|
||||||
|
#if (defined(DLL) && !defined(NO_SLIDE_REDIR))
|
||||||
|
if (G.redirect_slide) {
|
||||||
|
/* &= w/ wszimpl not needed and wrong if redirect */
|
||||||
|
if (d >= wszimpl)
|
||||||
|
return 1;
|
||||||
|
e = wszimpl - (d > w ? d : w);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
e = wszimpl - ((d &= wszimpl-1) > w ? d : w);
|
||||||
|
if (e > n) e = n;
|
||||||
|
n -= e;
|
||||||
|
if (u && w <= d)
|
||||||
|
{
|
||||||
|
memzero(redirSlide + w, e);
|
||||||
|
w += e;
|
||||||
|
d += e;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#ifndef NOMEMCPY
|
||||||
|
if (w - d >= e) /* (this test assumes unsigned comparison) */
|
||||||
|
{
|
||||||
|
memcpy(redirSlide + w, redirSlide + d, e);
|
||||||
|
w += e;
|
||||||
|
d += e;
|
||||||
|
}
|
||||||
|
else /* do it slow to avoid memcpy() overlap */
|
||||||
|
#endif /* !NOMEMCPY */
|
||||||
|
do {
|
||||||
|
redirSlide[w++] = redirSlide[d++];
|
||||||
|
} while (--e);
|
||||||
|
if (w == wszimpl)
|
||||||
|
{
|
||||||
|
if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0)
|
||||||
|
return retval;
|
||||||
|
w = u = 0;
|
||||||
|
}
|
||||||
|
} while (n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* flush out redirSlide */
|
||||||
|
if ((retval = flush(__G__ redirSlide, (ulg)w, 0)) != 0)
|
||||||
|
return retval;
|
||||||
|
if (G.csize + G.incnt + (k >> 3)) /* should have read csize bytes, but */
|
||||||
|
{ /* sometimes read one too many: k>>3 compensates */
|
||||||
|
G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3);
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int explode(__G)
|
||||||
|
__GDEF
|
||||||
|
/* Explode an imploded compressed stream. Based on the general purpose
|
||||||
|
bit flag, decide on coded or uncoded literals, and an 8K or 4K sliding
|
||||||
|
window. Construct the literal (if any), length, and distance codes and
|
||||||
|
the tables needed to decode them (using huft_build() from inflate.c),
|
||||||
|
and call the appropriate routine for the type of data in the remainder
|
||||||
|
of the stream. The four routines are nearly identical, differing only
|
||||||
|
in whether the literal is decoded or simply read in, and in how many
|
||||||
|
bits are read in, uncoded, for the low distance bits. */
|
||||||
|
{
|
||||||
|
unsigned r; /* return codes */
|
||||||
|
struct huft *tb; /* literal code table */
|
||||||
|
struct huft *tl; /* length code table */
|
||||||
|
struct huft *td; /* distance code table */
|
||||||
|
unsigned bb; /* bits for tb */
|
||||||
|
unsigned bl; /* bits for tl */
|
||||||
|
unsigned bd; /* bits for td */
|
||||||
|
unsigned bdl; /* number of uncoded lower distance bits */
|
||||||
|
unsigned l[256]; /* bit lengths for codes */
|
||||||
|
|
||||||
|
#if (defined(DLL) && !defined(NO_SLIDE_REDIR))
|
||||||
|
if (G.redirect_slide)
|
||||||
|
/* For 16-bit systems, it has already been checked at DLL entrance that
|
||||||
|
* the buffer size in G.redirect_size does not exceed unsigned range.
|
||||||
|
*/
|
||||||
|
G._wsize = G.redirect_size, redirSlide = G.redirect_buffer;
|
||||||
|
else
|
||||||
|
#if defined(USE_DEFLATE64) && defined(INT_16BIT)
|
||||||
|
/* For systems using 16-bit ints, reduce the used buffer size below
|
||||||
|
* the limit of "unsigned int" numbers range.
|
||||||
|
*/
|
||||||
|
G._wsize = WSIZE>>1, redirSlide = slide;
|
||||||
|
#else /* !(USE_DEFLATE64 && INT_16BIT) */
|
||||||
|
G._wsize = WSIZE, redirSlide = slide;
|
||||||
|
#endif /* !(USE_DEFLATE64 && INT_16BIT) */
|
||||||
|
#endif /* DLL && !NO_SLIDE_REDIR */
|
||||||
|
|
||||||
|
/* Tune base table sizes. Note: I thought that to truly optimize speed,
|
||||||
|
I would have to select different bl, bd, and bb values for different
|
||||||
|
compressed file sizes. I was surprised to find out that the values of
|
||||||
|
7, 7, and 9 worked best over a very wide range of sizes, except that
|
||||||
|
bd = 8 worked marginally better for large compressed sizes. */
|
||||||
|
bl = 7;
|
||||||
|
bd = (G.csize + G.incnt) > 200000L ? 8 : 7;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
G.hufts = 0; /* initialize huft's malloc'ed */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (G.lrec.general_purpose_bit_flag & 4)
|
||||||
|
/* With literal tree--minimum match length is 3 */
|
||||||
|
{
|
||||||
|
bb = 9; /* base table size for literals */
|
||||||
|
if ((r = get_tree(__G__ l, 256)) != 0)
|
||||||
|
return (int)r;
|
||||||
|
if ((r = huft_build(__G__ l, 256, 256, NULL, NULL, &tb, &bb)) != 0)
|
||||||
|
{
|
||||||
|
if (r == 1)
|
||||||
|
huft_free(tb);
|
||||||
|
return (int)r;
|
||||||
|
}
|
||||||
|
if ((r = get_tree(__G__ l, 64)) != 0) {
|
||||||
|
huft_free(tb);
|
||||||
|
return (int)r;
|
||||||
|
}
|
||||||
|
if ((r = huft_build(__G__ l, 64, 0, cplen3, extra, &tl, &bl)) != 0)
|
||||||
|
{
|
||||||
|
if (r == 1)
|
||||||
|
huft_free(tl);
|
||||||
|
huft_free(tb);
|
||||||
|
return (int)r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* No literal tree--minimum match length is 2 */
|
||||||
|
{
|
||||||
|
tb = (struct huft *)NULL;
|
||||||
|
if ((r = get_tree(__G__ l, 64)) != 0)
|
||||||
|
return (int)r;
|
||||||
|
if ((r = huft_build(__G__ l, 64, 0, cplen2, extra, &tl, &bl)) != 0)
|
||||||
|
{
|
||||||
|
if (r == 1)
|
||||||
|
huft_free(tl);
|
||||||
|
return (int)r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((r = get_tree(__G__ l, 64)) != 0) {
|
||||||
|
huft_free(tl);
|
||||||
|
if (tb != (struct huft *)NULL) huft_free(tb);
|
||||||
|
return (int)r;
|
||||||
|
}
|
||||||
|
if (G.lrec.general_purpose_bit_flag & 2) /* true if 8K */
|
||||||
|
{
|
||||||
|
bdl = 7;
|
||||||
|
r = huft_build(__G__ l, 64, 0, cpdist8, extra, &td, &bd);
|
||||||
|
}
|
||||||
|
else /* else 4K */
|
||||||
|
{
|
||||||
|
bdl = 6;
|
||||||
|
r = huft_build(__G__ l, 64, 0, cpdist4, extra, &td, &bd);
|
||||||
|
}
|
||||||
|
if (r != 0)
|
||||||
|
{
|
||||||
|
if (r == 1)
|
||||||
|
huft_free(td);
|
||||||
|
huft_free(tl);
|
||||||
|
if (tb != (struct huft *)NULL) huft_free(tb);
|
||||||
|
return (int)r;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tb != NULL) {
|
||||||
|
r = explode_lit(__G__ tb, tl, td, bb, bl, bd, bdl);
|
||||||
|
huft_free(tb);
|
||||||
|
} else {
|
||||||
|
r = explode_nolit(__G__ tl, td, bl, bd, bdl);
|
||||||
|
}
|
||||||
|
|
||||||
|
huft_free(td);
|
||||||
|
huft_free(tl);
|
||||||
|
Trace((stderr, "<%u > ", G.hufts));
|
||||||
|
return (int)r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* so explode.c and inflate.c can be compiled together into one object: */
|
||||||
|
#undef DECODEHUFT
|
||||||
|
#undef NEEDBITS
|
||||||
|
#undef DUMPBITS
|
||||||
|
#undef wszimpl
|
3615
third_party/unzip/extract.c
vendored
Normal file
3615
third_party/unzip/extract.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
3123
third_party/unzip/fileio.c
vendored
Normal file
3123
third_party/unzip/fileio.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
223
third_party/unzip/globals.c
vendored
Normal file
223
third_party/unzip/globals.c
vendored
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2007 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2003-May-08 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
globals.c
|
||||||
|
|
||||||
|
Routines to allocate and initialize globals, with or without threads.
|
||||||
|
|
||||||
|
Contents: registerGlobalPointer()
|
||||||
|
deregisterGlobalPointer()
|
||||||
|
getGlobalPointer()
|
||||||
|
globalsCtor()
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
|
||||||
|
#ifndef FUNZIP
|
||||||
|
/* initialization of sigs is completed at runtime so unzip(sfx) executable
|
||||||
|
* won't look like a zipfile
|
||||||
|
*/
|
||||||
|
char central_hdr_sig[4] = {0, 0, 0x01, 0x02};
|
||||||
|
char local_hdr_sig[4] = {0, 0, 0x03, 0x04};
|
||||||
|
char end_central_sig[4] = {0, 0, 0x05, 0x06};
|
||||||
|
char end_central64_sig[4] = {0, 0, 0x06, 0x06};
|
||||||
|
char end_centloc64_sig[4] = {0, 0, 0x06, 0x07};
|
||||||
|
/* extern char extd_local_sig[4] = {0, 0, 0x07, 0x08}; NOT USED YET */
|
||||||
|
|
||||||
|
ZCONST char *fnames[2] = {"*", NULL}; /* default filenames vector */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef REENTRANT
|
||||||
|
Uz_Globs G;
|
||||||
|
#else /* REENTRANT */
|
||||||
|
|
||||||
|
# ifndef USETHREADID
|
||||||
|
Uz_Globs *GG;
|
||||||
|
# else /* USETHREADID */
|
||||||
|
# define THREADID_ENTRIES 0x40
|
||||||
|
|
||||||
|
int lastScan;
|
||||||
|
Uz_Globs *threadPtrTable[THREADID_ENTRIES];
|
||||||
|
ulg threadIdTable [THREADID_ENTRIES] = {
|
||||||
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||||
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* Make sure there are */
|
||||||
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* THREADID_ENTRIES 0s */
|
||||||
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
|
||||||
|
};
|
||||||
|
|
||||||
|
static ZCONST char Far TooManyThreads[] =
|
||||||
|
"error: more than %d simultaneous threads.\n\
|
||||||
|
Some threads are probably not calling DESTROYTHREAD()\n";
|
||||||
|
static ZCONST char Far EntryNotFound[] =
|
||||||
|
"error: couldn't find global pointer in table.\n\
|
||||||
|
Maybe somebody accidentally called DESTROYTHREAD() twice.\n";
|
||||||
|
static ZCONST char Far GlobalPointerMismatch[] =
|
||||||
|
"error: global pointer in table does not match pointer passed as\
|
||||||
|
parameter\n";
|
||||||
|
|
||||||
|
static void registerGlobalPointer OF((__GPRO));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void registerGlobalPointer(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
int scan=0;
|
||||||
|
ulg tid = GetThreadId();
|
||||||
|
|
||||||
|
while (threadIdTable[scan] && scan < THREADID_ENTRIES)
|
||||||
|
scan++;
|
||||||
|
|
||||||
|
if (scan == THREADID_ENTRIES) {
|
||||||
|
ZCONST char *tooMany = LoadFarString(TooManyThreads);
|
||||||
|
Info(slide, 0x421, ((char *)slide, tooMany, THREADID_ENTRIES));
|
||||||
|
free(pG);
|
||||||
|
EXIT(PK_MEM); /* essentially memory error before we've started */
|
||||||
|
}
|
||||||
|
|
||||||
|
threadIdTable [scan] = tid;
|
||||||
|
threadPtrTable[scan] = pG;
|
||||||
|
lastScan = scan;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void deregisterGlobalPointer(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
int scan=0;
|
||||||
|
ulg tid = GetThreadId();
|
||||||
|
|
||||||
|
|
||||||
|
while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES)
|
||||||
|
scan++;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
There are two things we can do if we can't find the entry: ignore it or
|
||||||
|
scream. The most likely reason for it not to be here is the user calling
|
||||||
|
this routine twice. Since this could cause BIG problems if any globals
|
||||||
|
are accessed after the first call, we'd better scream.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (scan == THREADID_ENTRIES || threadPtrTable[scan] != pG) {
|
||||||
|
ZCONST char *noEntry;
|
||||||
|
if (scan == THREADID_ENTRIES)
|
||||||
|
noEntry = LoadFarString(EntryNotFound);
|
||||||
|
else
|
||||||
|
noEntry = LoadFarString(GlobalPointerMismatch);
|
||||||
|
Info(slide, 0x421, ((char *)slide, noEntry));
|
||||||
|
EXIT(PK_WARN); /* programming error, but after we're all done */
|
||||||
|
}
|
||||||
|
|
||||||
|
threadIdTable [scan] = 0;
|
||||||
|
lastScan = scan;
|
||||||
|
free(threadPtrTable[scan]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Uz_Globs *getGlobalPointer()
|
||||||
|
{
|
||||||
|
int scan=0;
|
||||||
|
ulg tid = GetThreadId();
|
||||||
|
|
||||||
|
while (threadIdTable[scan] != tid && scan < THREADID_ENTRIES)
|
||||||
|
scan++;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
There are two things we can do if we can't find the entry: ignore it or
|
||||||
|
scream. The most likely reason for it not to be here is the user calling
|
||||||
|
this routine twice. Since this could cause BIG problems if any globals
|
||||||
|
are accessed after the first call, we'd better scream.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (scan == THREADID_ENTRIES) {
|
||||||
|
ZCONST char *noEntry = LoadFarString(EntryNotFound);
|
||||||
|
fprintf(stderr, noEntry); /* can't use Info w/o a global pointer */
|
||||||
|
EXIT(PK_ERR); /* programming error while still working */
|
||||||
|
}
|
||||||
|
|
||||||
|
return threadPtrTable[scan];
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif /* ?USETHREADID */
|
||||||
|
#endif /* ?REENTRANT */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Uz_Globs *globalsCtor()
|
||||||
|
{
|
||||||
|
#ifdef REENTRANT
|
||||||
|
Uz_Globs *pG = (Uz_Globs *)malloc(sizeof(Uz_Globs));
|
||||||
|
|
||||||
|
if (!pG)
|
||||||
|
return (Uz_Globs *)NULL;
|
||||||
|
#endif /* REENTRANT */
|
||||||
|
|
||||||
|
/* for REENTRANT version, G is defined as (*pG) */
|
||||||
|
|
||||||
|
memzero(&G, sizeof(Uz_Globs));
|
||||||
|
|
||||||
|
#ifndef FUNZIP
|
||||||
|
#ifdef CMS_MVS
|
||||||
|
uO.aflag=1;
|
||||||
|
uO.C_flag=1;
|
||||||
|
#endif
|
||||||
|
#ifdef TANDEM
|
||||||
|
uO.aflag=1; /* default to '-a' auto create Text Files as type 101 */
|
||||||
|
#endif
|
||||||
|
#ifdef VMS
|
||||||
|
# if (!defined(NO_TIMESTAMPS))
|
||||||
|
uO.D_flag=1; /* default to '-D', no restoration of dir timestamps */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uO.lflag=(-1);
|
||||||
|
G.wildzipfn = "";
|
||||||
|
G.pfnames = (char **)fnames;
|
||||||
|
G.pxnames = (char **)&fnames[1];
|
||||||
|
G.pInfo = G.info;
|
||||||
|
G.sol = TRUE; /* at start of line */
|
||||||
|
|
||||||
|
G.message = UzpMessagePrnt;
|
||||||
|
G.input = UzpInput; /* not used by anyone at the moment... */
|
||||||
|
#if defined(WINDLL) || defined(MACOS)
|
||||||
|
G.mpause = NULL; /* has scrollbars: no need for pausing */
|
||||||
|
#else
|
||||||
|
G.mpause = UzpMorePause;
|
||||||
|
#endif
|
||||||
|
G.decr_passwd = UzpPassword;
|
||||||
|
#endif /* !FUNZIP */
|
||||||
|
|
||||||
|
#if (!defined(DOS_FLX_H68_NLM_OS2_W32) && !defined(AMIGA) && !defined(RISCOS))
|
||||||
|
#if (!defined(MACOS) && !defined(ATARI) && !defined(VMS))
|
||||||
|
G.echofd = -1;
|
||||||
|
#endif /* !(MACOS || ATARI || VMS) */
|
||||||
|
#endif /* !(DOS_FLX_H68_NLM_OS2_W32 || AMIGA || RISCOS) */
|
||||||
|
|
||||||
|
#ifdef SYSTEM_SPECIFIC_CTOR
|
||||||
|
SYSTEM_SPECIFIC_CTOR(__G);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef REENTRANT
|
||||||
|
#ifdef USETHREADID
|
||||||
|
registerGlobalPointer(__G);
|
||||||
|
#else
|
||||||
|
GG = &G;
|
||||||
|
#endif /* ?USETHREADID */
|
||||||
|
#endif /* REENTRANT */
|
||||||
|
|
||||||
|
return &G;
|
||||||
|
}
|
468
third_party/unzip/globals.h
vendored
Normal file
468
third_party/unzip/globals.h
vendored
Normal file
|
@ -0,0 +1,468 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2010 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
globals.h
|
||||||
|
|
||||||
|
There is usually no need to include this file since unzip.h includes it.
|
||||||
|
|
||||||
|
This header file is used by all of the UnZip source files. It contains
|
||||||
|
a struct definition that is used to "house" all of the global variables.
|
||||||
|
This is done to allow for multithreaded environments (OS/2, NT, Win95,
|
||||||
|
Unix) to call UnZip through an API without a semaphore. REENTRANT should
|
||||||
|
be defined for all platforms that require this.
|
||||||
|
|
||||||
|
GLOBAL CONSTRUCTOR AND DESTRUCTOR (API WRITERS READ THIS!!!)
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
No, it's not C++, but it's as close as we can get with K&R.
|
||||||
|
|
||||||
|
The main() of each process that uses these globals must include the
|
||||||
|
CONSTRUCTGLOBALS; statement. This will malloc enough memory for the
|
||||||
|
structure and initialize any variables that require it. This must
|
||||||
|
also be done by any API function that jumps into the middle of the
|
||||||
|
code.
|
||||||
|
|
||||||
|
The DESTROYGLOBALS(); statement should be inserted before EVERY "EXIT(n)".
|
||||||
|
Naturally, it also needs to be put before any API returns as well.
|
||||||
|
In fact, it's much more important in API functions since the process
|
||||||
|
will NOT end, and therefore the memory WON'T automatically be freed
|
||||||
|
by the operating system.
|
||||||
|
|
||||||
|
USING VARIABLES FROM THE STRUCTURE
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
All global variables must now be prefixed with `G.' which is either a
|
||||||
|
global struct (in which case it should be the only global variable) or
|
||||||
|
a macro for the value of a local pointer variable that is passed from
|
||||||
|
function to function. Yes, this is a pain. But it's the only way to
|
||||||
|
allow full reentrancy.
|
||||||
|
|
||||||
|
ADDING VARIABLES TO THE STRUCTURE
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
If you make the inclusion of any variables conditional, be sure to only
|
||||||
|
check macros that are GUARANTEED to be included in every module.
|
||||||
|
For instance, newzip and pwdarg are needed only if CRYPT is TRUE,
|
||||||
|
but this is defined after unzip.h has been read. If you are not careful,
|
||||||
|
some modules will expect your variable to be part of this struct while
|
||||||
|
others won't. This will cause BIG problems. (Inexplicable crashes at
|
||||||
|
strange times, car fires, etc.) When in doubt, always include it!
|
||||||
|
|
||||||
|
Note also that UnZipSFX needs a few variables that UnZip doesn't. However,
|
||||||
|
it also includes some object files from UnZip. If we were to conditionally
|
||||||
|
include the extra variables that UnZipSFX needs, the object files from
|
||||||
|
UnZip would not mesh with the UnZipSFX object files. Result: we just
|
||||||
|
include the UnZipSFX variables every time. (It's only an extra 4 bytes
|
||||||
|
so who cares!)
|
||||||
|
|
||||||
|
ADDING FUNCTIONS
|
||||||
|
----------------
|
||||||
|
|
||||||
|
To support this new global struct, all functions must now conditionally
|
||||||
|
pass the globals pointer (pG) to each other. This is supported by 5 macros:
|
||||||
|
__GPRO, __GPRO__, __G, __G__ and __GDEF. A function that needs no other
|
||||||
|
parameters would look like this:
|
||||||
|
|
||||||
|
int extract_or_test_files(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
... stuff ...
|
||||||
|
}
|
||||||
|
|
||||||
|
A function with other parameters would look like:
|
||||||
|
|
||||||
|
int memextract(__G__ tgt, tgtsize, src, srcsize)
|
||||||
|
__GDEF
|
||||||
|
uch *tgt, *src;
|
||||||
|
ulg tgtsize, srcsize;
|
||||||
|
{
|
||||||
|
... stuff ...
|
||||||
|
}
|
||||||
|
|
||||||
|
In the Function Prototypes section of unzpriv.h, you should use __GPRO and
|
||||||
|
__GPRO__ instead:
|
||||||
|
|
||||||
|
int uz_opts OF((__GPRO__ int *pargc, char ***pargv));
|
||||||
|
int process_zipfiles OF((__GPRO));
|
||||||
|
|
||||||
|
Note that there is NO comma after __G__ or __GPRO__ and no semi-colon after
|
||||||
|
__GDEF. I wish there was another way but I don't think there is.
|
||||||
|
|
||||||
|
|
||||||
|
TESTING THE CODE
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Whether your platform requires reentrancy or not, you should always try
|
||||||
|
building with REENTRANT defined if any functions have been added. It is
|
||||||
|
pretty easy to forget a __G__ or a __GDEF and this mistake will only show
|
||||||
|
up if REENTRANT is defined. All platforms should run with REENTRANT
|
||||||
|
defined. Platforms that can't take advantage of it will just be paying
|
||||||
|
a performance penalty needlessly.
|
||||||
|
|
||||||
|
SIGNAL MADNESS
|
||||||
|
--------------
|
||||||
|
|
||||||
|
This whole pointer passing scheme falls apart when it comes to SIGNALs.
|
||||||
|
I handle this situation 2 ways right now. If you define USETHREADID,
|
||||||
|
UnZip will include a 64-entry table. Each entry can hold a global
|
||||||
|
pointer and thread ID for one thread. This should allow up to 64
|
||||||
|
threads to access UnZip simultaneously. Calling DESTROYGLOBALS()
|
||||||
|
will free the global struct and zero the table entry. If somebody
|
||||||
|
forgets to call DESTROYGLOBALS(), this table will eventually fill up
|
||||||
|
and UnZip will exit with an error message. A good way to test your
|
||||||
|
code to make sure you didn't forget a DESTROYGLOBALS() is to change
|
||||||
|
THREADID_ENTRIES to 3 or 4 in globals.c, making the table real small.
|
||||||
|
Then make a small test program that calls your API a dozen times.
|
||||||
|
|
||||||
|
Those platforms that don't have threads still need to be able to compile
|
||||||
|
with REENTRANT defined to test and see if new code is correctly written
|
||||||
|
to work either way. For these platforms, I simply keep a global pointer
|
||||||
|
called GG that points to the Globals structure. Good enough for testing.
|
||||||
|
|
||||||
|
I believe that NT has thread level storage. This could probably be used
|
||||||
|
to store a global pointer for the sake of the signal handler more cleanly
|
||||||
|
than my table approach.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __globals_h
|
||||||
|
#define __globals_h
|
||||||
|
|
||||||
|
#include "third_party/unzip/unxcfg.h"
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
#include "third_party/unzip/unzpriv.h"
|
||||||
|
#include "libc/stdio/stdio.h"
|
||||||
|
|
||||||
|
#ifdef USE_ZLIB
|
||||||
|
#include "third_party/zlib/zlib.h"
|
||||||
|
# ifdef zlib_version /* This name is used internally in unzip */
|
||||||
|
# undef zlib_version /* and must not be defined as a macro. */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_BZIP2
|
||||||
|
#include "third_party/bzip2/bzlib.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( UNIX) && defined( __APPLE__)
|
||||||
|
#include "third_party/unzip/unix/macosx.h"
|
||||||
|
#endif /* defined( UNIX) && defined( __APPLE__) */
|
||||||
|
|
||||||
|
|
||||||
|
/*************/
|
||||||
|
/* Globals */
|
||||||
|
/*************/
|
||||||
|
|
||||||
|
typedef struct Globals {
|
||||||
|
#ifdef DLL
|
||||||
|
zvoid *callerglobs; /* pointer to structure of pass-through global vars */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* command options of general use */
|
||||||
|
UzpOpts UzO; /* command options of general use */
|
||||||
|
|
||||||
|
#ifndef FUNZIP
|
||||||
|
/* command options specific to the high level command line interface */
|
||||||
|
#ifdef MORE
|
||||||
|
int M_flag; /* -M: built-in "more" function */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* internal flags and general globals */
|
||||||
|
#ifdef MORE
|
||||||
|
int height; /* check for SIGWINCH, etc., eventually... */
|
||||||
|
int lines; /* count of lines displayed on current screen */
|
||||||
|
# if (defined(SCREENWIDTH) && defined(SCREENLWRAP))
|
||||||
|
int width;
|
||||||
|
int chars; /* count of screen characters in current line */
|
||||||
|
# endif
|
||||||
|
#endif /* MORE */
|
||||||
|
#if (defined(IZ_CHECK_TZ) && defined(USE_EF_UT_TIME))
|
||||||
|
int tz_is_valid; /* indicates that timezone info can be used */
|
||||||
|
#endif
|
||||||
|
int noargs; /* did true command line have *any* arguments? */
|
||||||
|
unsigned filespecs; /* number of real file specifications to be matched */
|
||||||
|
unsigned xfilespecs; /* number of excluded filespecs to be matched */
|
||||||
|
int process_all_files;
|
||||||
|
int overwrite_mode; /* 0 - query, 1 - always, 2 - never */
|
||||||
|
int create_dirs; /* used by main(), mapname(), checkdir() */
|
||||||
|
int extract_flag;
|
||||||
|
int newzip; /* reset in extract.c; used in crypt.c */
|
||||||
|
zoff_t real_ecrec_offset;
|
||||||
|
zoff_t expect_ecrec_offset;
|
||||||
|
zoff_t csize; /* used by decompr. (NEXTBYTE): must be signed */
|
||||||
|
zoff_t used_csize; /* used by extract_or_test_member(), explode() */
|
||||||
|
|
||||||
|
#if defined( UNIX) && defined( __APPLE__)
|
||||||
|
int apple_double; /* True for an AppleDouble file ("._name"). */
|
||||||
|
int apl_dbl_hdr_bytes;/* Non-zero for AplDbl until Finder info is set. */
|
||||||
|
int apl_dbl_hdr_len; /* Bytes in apl_dbl_hdr. */
|
||||||
|
int exdir_attr_ok; /* True if destination supports setattrlist(). */
|
||||||
|
char apl_dbl_hdr[ APL_DBL_HDR_SIZE]; /* AppleDouble header buffer. */
|
||||||
|
char ad_filename[ FILNAMSIZ]; /* AppleDouble "/rsrc" file name. */
|
||||||
|
char pq_filename[ FILNAMSIZ]; /* Previous query file name. */
|
||||||
|
char pr_filename[ FILNAMSIZ]; /* Previous rename file name. */
|
||||||
|
#endif /* defined( UNIX) && defined( __APPLE__) */
|
||||||
|
|
||||||
|
#ifdef DLL
|
||||||
|
int fValidate; /* true if only validating an archive */
|
||||||
|
int filenotfound;
|
||||||
|
int redirect_data; /* redirect data to memory buffer */
|
||||||
|
int redirect_text; /* redirect text output to buffer */
|
||||||
|
# ifndef NO_SLIDE_REDIR
|
||||||
|
int redirect_slide; /* redirect decompression area to mem buffer */
|
||||||
|
# if (defined(USE_DEFLATE64) && defined(INT_16BIT))
|
||||||
|
ulg _wsize; /* size of sliding window exceeds "unsigned" range */
|
||||||
|
# else
|
||||||
|
unsigned _wsize; /* sliding window size can be hold in unsigned */
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
ulg redirect_size; /* size of redirected output buffer */
|
||||||
|
uch *redirect_buffer; /* pointer to head of allocated buffer */
|
||||||
|
uch *redirect_pointer; /* pointer past end of written data */
|
||||||
|
# ifndef NO_SLIDE_REDIR
|
||||||
|
uch *redirect_sldptr; /* head of decompression slide buffer */
|
||||||
|
# endif
|
||||||
|
# ifdef OS2DLL
|
||||||
|
cbList(processExternally); /* call-back list */
|
||||||
|
# endif
|
||||||
|
#endif /* DLL */
|
||||||
|
|
||||||
|
char **pfnames;
|
||||||
|
char **pxnames;
|
||||||
|
char sig[4];
|
||||||
|
char answerbuf[10];
|
||||||
|
min_info info[DIR_BLKSIZ];
|
||||||
|
min_info *pInfo;
|
||||||
|
#endif /* !FUNZIP */
|
||||||
|
union work area; /* see unzpriv.h for definition of work */
|
||||||
|
|
||||||
|
#if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
|
||||||
|
ZCONST ulg near *crc_32_tab;
|
||||||
|
#else
|
||||||
|
ZCONST ulg Far *crc_32_tab;
|
||||||
|
#endif
|
||||||
|
ulg crc32val; /* CRC shift reg. (was static in funzip) */
|
||||||
|
|
||||||
|
#ifdef FUNZIP
|
||||||
|
FILE *in; /* file descriptor of compressed stream */
|
||||||
|
#endif
|
||||||
|
uch *inbuf; /* input buffer (any size is OK) */
|
||||||
|
uch *inptr; /* pointer into input buffer */
|
||||||
|
int incnt;
|
||||||
|
|
||||||
|
#ifndef FUNZIP
|
||||||
|
ulg bitbuf;
|
||||||
|
int bits_left; /* unreduce and unshrink only */
|
||||||
|
int zipeof;
|
||||||
|
char *argv0; /* used for NT and EXE_EXTENSION */
|
||||||
|
char *wildzipfn;
|
||||||
|
char *zipfn; /* GRR: WINDLL: must nuke any malloc'd zipfn... */
|
||||||
|
#ifdef USE_STRM_INPUT
|
||||||
|
FILE *zipfd; /* zipfile file descriptor */
|
||||||
|
#else
|
||||||
|
int zipfd; /* zipfile file handle */
|
||||||
|
#endif
|
||||||
|
zoff_t ziplen;
|
||||||
|
zoff_t cur_zipfile_bufstart; /* extract_or_test, readbuf, ReadByte */
|
||||||
|
zoff_t extra_bytes; /* used in unzip.c, misc.c */
|
||||||
|
uch *extra_field; /* Unix, VMS, Mac, OS/2, Acorn, ... */
|
||||||
|
uch *hold;
|
||||||
|
|
||||||
|
local_file_hdr lrec; /* used in unzip.c, extract.c */
|
||||||
|
cdir_file_hdr crec; /* used in unzip.c, extract.c, misc.c */
|
||||||
|
ecdir_rec ecrec; /* used in unzip.c, extract.c */
|
||||||
|
z_stat statbuf; /* used by main, mapname, check_for_newer */
|
||||||
|
|
||||||
|
int mem_mode;
|
||||||
|
uch *outbufptr; /* extract.c static */
|
||||||
|
ulg outsize; /* extract.c static */
|
||||||
|
int reported_backslash; /* extract.c static */
|
||||||
|
int disk_full;
|
||||||
|
int newfile;
|
||||||
|
|
||||||
|
int didCRlast; /* fileio static */
|
||||||
|
ulg numlines; /* fileio static: number of lines printed */
|
||||||
|
int sol; /* fileio static: at start of line */
|
||||||
|
int no_ecrec; /* process static */
|
||||||
|
#ifdef SYMLINKS
|
||||||
|
int symlnk;
|
||||||
|
slinkentry *slink_head; /* pointer to head of symlinks list */
|
||||||
|
slinkentry *slink_last; /* pointer to last entry in symlinks list */
|
||||||
|
#endif
|
||||||
|
#ifdef NOVELL_BUG_FAILSAFE
|
||||||
|
int dne; /* true if stat() says file doesn't exist */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FILE *outfile;
|
||||||
|
uch *outbuf;
|
||||||
|
uch *realbuf;
|
||||||
|
|
||||||
|
#ifndef VMS /* if SMALL_MEM, outbuf2 is initialized in */
|
||||||
|
uch *outbuf2; /* process_zipfiles() (never changes); */
|
||||||
|
#endif /* else malloc'd ONLY if unshrink and -a */
|
||||||
|
#endif /* !FUNZIP */
|
||||||
|
uch *outptr;
|
||||||
|
ulg outcnt; /* number of chars stored in outbuf */
|
||||||
|
#ifndef FUNZIP
|
||||||
|
char filename[FILNAMSIZ]; /* also used by NT for temporary SFX path */
|
||||||
|
#ifdef UNICODE_SUPPORT
|
||||||
|
char *filename_full; /* the full path so Unicode checks work */
|
||||||
|
extent fnfull_bufsize; /* size of allocated filename buffer */
|
||||||
|
int unicode_escape_all;
|
||||||
|
int unicode_mismatch;
|
||||||
|
#ifdef UTF8_MAYBE_NATIVE
|
||||||
|
int native_is_utf8; /* bool, TRUE => native charset == UTF-8 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int unipath_version; /* version of Unicode field */
|
||||||
|
ulg unipath_checksum; /* Unicode field checksum */
|
||||||
|
char *unipath_filename; /* UTF-8 path */
|
||||||
|
# ifdef WIN32_WIDE
|
||||||
|
wchar_t *unipath_widefilename; /* wide character filename */
|
||||||
|
int has_win32_wide; /* true if Win32 W calls work */
|
||||||
|
# endif
|
||||||
|
#endif /* UNICODE_SUPPORT */
|
||||||
|
|
||||||
|
#ifdef CMS_MVS
|
||||||
|
char *tempfn; /* temp file used; erase on close */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *key; /* crypt static: decryption password or NULL */
|
||||||
|
int nopwd; /* crypt static */
|
||||||
|
#endif /* !FUNZIP */
|
||||||
|
z_uint4 keys[3]; /* crypt static: keys defining pseudo-random sequence */
|
||||||
|
|
||||||
|
#if (!defined(DOS_FLX_H68_NLM_OS2_W32) && !defined(AMIGA) && !defined(RISCOS))
|
||||||
|
#if (!defined(MACOS) && !defined(ATARI) && !defined(VMS))
|
||||||
|
int echofd; /* ttyio static: file descriptor whose echo is off */
|
||||||
|
#endif /* !(MACOS || ATARI || VMS) */
|
||||||
|
#endif /* !(DOS_FLX_H68_NLM_OS2_W32 || AMIGA || RISCOS) */
|
||||||
|
|
||||||
|
unsigned hufts; /* track memory usage */
|
||||||
|
|
||||||
|
#ifdef USE_ZLIB
|
||||||
|
int inflInit; /* inflate static: zlib inflate() initialized */
|
||||||
|
z_stream dstrm; /* inflate global: decompression stream */
|
||||||
|
#else
|
||||||
|
struct huft *fixed_tl; /* inflate static */
|
||||||
|
struct huft *fixed_td; /* inflate static */
|
||||||
|
unsigned fixed_bl, fixed_bd; /* inflate static */
|
||||||
|
#ifdef USE_DEFLATE64
|
||||||
|
struct huft *fixed_tl64; /* inflate static */
|
||||||
|
struct huft *fixed_td64; /* inflate static */
|
||||||
|
unsigned fixed_bl64, fixed_bd64; /* inflate static */
|
||||||
|
struct huft *fixed_tl32; /* inflate static */
|
||||||
|
struct huft *fixed_td32; /* inflate static */
|
||||||
|
unsigned fixed_bl32, fixed_bd32; /* inflate static */
|
||||||
|
ZCONST ush *cplens; /* inflate static */
|
||||||
|
ZCONST uch *cplext; /* inflate static */
|
||||||
|
ZCONST uch *cpdext; /* inflate static */
|
||||||
|
#endif
|
||||||
|
unsigned wp; /* inflate static: current position in slide */
|
||||||
|
ulg bb; /* inflate static: bit buffer */
|
||||||
|
unsigned bk; /* inflate static: bits count in bit buffer */
|
||||||
|
#endif /* ?USE_ZLIB */
|
||||||
|
|
||||||
|
#ifndef FUNZIP
|
||||||
|
/* cylindric buffer space for formatting zoff_t values (fileio static) */
|
||||||
|
char fzofft_buf[FZOFFT_NUM][FZOFFT_LEN];
|
||||||
|
int fzofft_index;
|
||||||
|
|
||||||
|
#ifdef SMALL_MEM
|
||||||
|
char rgchBigBuffer[512];
|
||||||
|
char rgchSmallBuffer[96];
|
||||||
|
char rgchSmallBuffer2[160]; /* boosted to 160 for local3[] in unzip.c */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MsgFn *message;
|
||||||
|
InputFn *input;
|
||||||
|
PauseFn *mpause;
|
||||||
|
PasswdFn *decr_passwd;
|
||||||
|
StatCBFn *statreportcb;
|
||||||
|
#ifdef WINDLL
|
||||||
|
LPUSERFUNCTIONS lpUserFunctions;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int incnt_leftover; /* so improved NEXTBYTE does not waste input */
|
||||||
|
uch *inptr_leftover;
|
||||||
|
|
||||||
|
#ifdef VMS_TEXT_CONV
|
||||||
|
unsigned VMS_line_length; /* so native VMS variable-length text files */
|
||||||
|
int VMS_line_state; /* are readable on other platforms */
|
||||||
|
int VMS_line_pad;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SFX) && defined(CHEAP_SFX_AUTORUN))
|
||||||
|
char autorun_command[FILNAMSIZ];
|
||||||
|
#endif
|
||||||
|
#endif /* !FUNZIP */
|
||||||
|
|
||||||
|
#ifdef SYSTEM_SPECIFIC_GLOBALS
|
||||||
|
SYSTEM_SPECIFIC_GLOBALS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} Uz_Globs; /* end of struct Globals */
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#define CRC_32_TAB G.crc_32_tab
|
||||||
|
|
||||||
|
|
||||||
|
Uz_Globs *globalsCtor OF((void));
|
||||||
|
|
||||||
|
/* pseudo constant sigs; they are initialized at runtime so unzip executable
|
||||||
|
* won't look like a zipfile
|
||||||
|
*/
|
||||||
|
extern char local_hdr_sig[4];
|
||||||
|
extern char central_hdr_sig[4];
|
||||||
|
extern char end_central_sig[4];
|
||||||
|
extern char end_central32_sig[4];
|
||||||
|
extern char end_central64_sig[4];
|
||||||
|
extern char end_centloc64_sig[4];
|
||||||
|
/* extern char extd_local_sig[4]; NOT USED YET */
|
||||||
|
|
||||||
|
#ifdef REENTRANT
|
||||||
|
# define G (*(Uz_Globs *)pG)
|
||||||
|
# define __G pG
|
||||||
|
# define __G__ pG,
|
||||||
|
# define __GPRO Uz_Globs *pG
|
||||||
|
# define __GPRO__ Uz_Globs *pG,
|
||||||
|
# define __GDEF Uz_Globs *pG;
|
||||||
|
# ifdef USETHREADID
|
||||||
|
extern int lastScan;
|
||||||
|
void deregisterGlobalPointer OF((__GPRO));
|
||||||
|
Uz_Globs *getGlobalPointer OF((void));
|
||||||
|
# define GETGLOBALS() Uz_Globs *pG = getGlobalPointer()
|
||||||
|
# define DESTROYGLOBALS() do {free_G_buffers(pG); \
|
||||||
|
deregisterGlobalPointer(pG);} while (0)
|
||||||
|
# else
|
||||||
|
extern Uz_Globs *GG;
|
||||||
|
# define GETGLOBALS() Uz_Globs *pG = GG
|
||||||
|
# define DESTROYGLOBALS() do {free_G_buffers(pG); free(pG);} while (0)
|
||||||
|
# endif /* ?USETHREADID */
|
||||||
|
# define CONSTRUCTGLOBALS() Uz_Globs *pG = globalsCtor()
|
||||||
|
#else /* !REENTRANT */
|
||||||
|
extern Uz_Globs G;
|
||||||
|
# define __G
|
||||||
|
# define __G__
|
||||||
|
# define __GPRO void
|
||||||
|
# define __GPRO__
|
||||||
|
# define __GDEF
|
||||||
|
# define GETGLOBALS()
|
||||||
|
# define CONSTRUCTGLOBALS() globalsCtor()
|
||||||
|
# define DESTROYGLOBALS()
|
||||||
|
#endif /* ?REENTRANT */
|
||||||
|
|
||||||
|
#define uO G.UzO
|
||||||
|
|
||||||
|
#endif /* __globals_h */
|
1785
third_party/unzip/inflate.c
vendored
Normal file
1785
third_party/unzip/inflate.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
40
third_party/unzip/inflate.h
vendored
Normal file
40
third_party/unzip/inflate.h
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/* inflate.h for UnZip -- by Mark Adler
|
||||||
|
version c14f, 23 November 1995 */
|
||||||
|
|
||||||
|
|
||||||
|
/* Copyright history:
|
||||||
|
- Starting with UnZip 5.41 of 16-April-2000, this source file
|
||||||
|
is covered by the Info-Zip LICENSE cited above.
|
||||||
|
- Prior versions of this source file, found in UnZip source packages
|
||||||
|
up to UnZip 5.40, were put in the public domain.
|
||||||
|
The original copyright note by Mark Adler was:
|
||||||
|
"You can do whatever you like with this source file,
|
||||||
|
though I would prefer that if you modify it and
|
||||||
|
redistribute it that you include comments to that effect
|
||||||
|
with your name and the date. Thank you."
|
||||||
|
|
||||||
|
History:
|
||||||
|
vers date who what
|
||||||
|
---- --------- -------------- ------------------------------------
|
||||||
|
c14 12 Mar 93 M. Adler made inflate.c standalone with the
|
||||||
|
introduction of inflate.h.
|
||||||
|
c14d 28 Aug 93 G. Roelofs replaced flush/FlushOutput with new version
|
||||||
|
c14e 29 Sep 93 G. Roelofs moved everything into unzip.h; added crypt.h
|
||||||
|
c14f 23 Nov 95 G. Roelofs added UNZIP_INTERNAL to accommodate newly
|
||||||
|
split unzip.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h" /* provides slide[], typedefs and macros */
|
||||||
|
#ifdef FUNZIP
|
||||||
|
#include "third_party/unzip/crypt.h" /* provides NEXTBYTE macro for crypt version of funzip */
|
||||||
|
#endif
|
728
third_party/unzip/list.c
vendored
Normal file
728
third_party/unzip/list.c
vendored
Normal file
|
@ -0,0 +1,728 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
list.c
|
||||||
|
|
||||||
|
This file contains the non-ZipInfo-specific listing routines for UnZip.
|
||||||
|
|
||||||
|
Contains: list_files()
|
||||||
|
get_time_stamp() [optional feature]
|
||||||
|
ratio()
|
||||||
|
fnprint()
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TIMESTAMP
|
||||||
|
static int fn_is_dir OF((__GPRO));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WINDLL
|
||||||
|
static ZCONST char Far CompFactorStr[] = "%c%d%%";
|
||||||
|
static ZCONST char Far CompFactor100[] = "100%%";
|
||||||
|
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
static ZCONST char Far HeadersS[] =
|
||||||
|
" Length EAs ACLs Date Time Name";
|
||||||
|
static ZCONST char Far HeadersS1[] =
|
||||||
|
"--------- --- ---- ---------- ----- ----";
|
||||||
|
#else
|
||||||
|
static ZCONST char Far HeadersS[] =
|
||||||
|
" Length Date Time Name";
|
||||||
|
static ZCONST char Far HeadersS1[] =
|
||||||
|
"--------- ---------- ----- ----";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static ZCONST char Far HeadersL[] =
|
||||||
|
" Length Method Size Cmpr Date Time CRC-32 Name";
|
||||||
|
static ZCONST char Far HeadersL1[] =
|
||||||
|
"-------- ------ ------- ---- ---------- ----- -------- ----";
|
||||||
|
static ZCONST char Far *Headers[][2] =
|
||||||
|
{ {HeadersS, HeadersS1}, {HeadersL, HeadersL1} };
|
||||||
|
|
||||||
|
static ZCONST char Far CaseConversion[] =
|
||||||
|
"%s (\"^\" ==> case\n%s conversion)\n";
|
||||||
|
static ZCONST char Far LongHdrStats[] =
|
||||||
|
"%s %-7s%s %4s %02u%c%02u%c%02u %02u:%02u %08lx %c";
|
||||||
|
static ZCONST char Far LongFileTrailer[] =
|
||||||
|
"-------- ------- --- \
|
||||||
|
-------\n%s %s %4s %lu file%s\n";
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
static ZCONST char Far ShortHdrStats[] =
|
||||||
|
"%s %6lu %6lu %02u%c%02u%c%02u %02u:%02u %c";
|
||||||
|
static ZCONST char Far ShortFileTrailer[] =
|
||||||
|
"--------- ----- ----- \
|
||||||
|
-------\n%s %6lu %6lu %lu file%s\n";
|
||||||
|
static ZCONST char Far OS2ExtAttrTrailer[] =
|
||||||
|
"%lu file%s %lu bytes of OS/2 extended attributes attached.\n";
|
||||||
|
static ZCONST char Far OS2ACLTrailer[] =
|
||||||
|
"%lu file%s %lu bytes of access control lists attached.\n";
|
||||||
|
#else
|
||||||
|
static ZCONST char Far ShortHdrStats[] =
|
||||||
|
"%s %02u%c%02u%c%02u %02u:%02u %c";
|
||||||
|
static ZCONST char Far ShortFileTrailer[] =
|
||||||
|
"--------- -------\n%s\
|
||||||
|
%lu file%s\n";
|
||||||
|
#endif /* ?OS2_EAS */
|
||||||
|
#endif /* !WINDLL */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************/
|
||||||
|
/* Function list_files() */
|
||||||
|
/*************************/
|
||||||
|
|
||||||
|
int list_files(__G) /* return PK-type error code */
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
int do_this_file=FALSE, cfactor, error, error_in_archive=PK_COOL;
|
||||||
|
#ifndef WINDLL
|
||||||
|
char sgn, cfactorstr[16]; /* [jart] increased buffer size */
|
||||||
|
int longhdr=(uO.vflag>1);
|
||||||
|
#endif
|
||||||
|
int date_format;
|
||||||
|
char dt_sepchar;
|
||||||
|
ulg members=0L;
|
||||||
|
zusz_t j;
|
||||||
|
unsigned methnum;
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
iztimes z_utime;
|
||||||
|
struct tm *t;
|
||||||
|
#endif
|
||||||
|
unsigned yr, mo, dy, hh, mm;
|
||||||
|
zusz_t csiz, tot_csize=0L, tot_ucsize=0L;
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
ulg ea_size, tot_easize=0L, tot_eafiles=0L;
|
||||||
|
ulg acl_size, tot_aclsize=0L, tot_aclfiles=0L;
|
||||||
|
#endif
|
||||||
|
min_info info;
|
||||||
|
char methbuf[8];
|
||||||
|
static ZCONST char dtype[]="NXFS"; /* see zi_short() */
|
||||||
|
static ZCONST char Far method[NUM_METHODS+1][8] =
|
||||||
|
{"Stored", "Shrunk", "Reduce1", "Reduce2", "Reduce3", "Reduce4",
|
||||||
|
"Implode", "Token", "Defl:#", "Def64#", "ImplDCL", "BZip2",
|
||||||
|
"LZMA", "Terse", "IBMLZ77", "WavPack", "PPMd", "Unk:###"};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Unlike extract_or_test_files(), this routine confines itself to the cen-
|
||||||
|
tral directory. Thus its structure is somewhat simpler, since we can do
|
||||||
|
just a single loop through the entire directory, listing files as we go.
|
||||||
|
|
||||||
|
So to start off, print the heading line and then begin main loop through
|
||||||
|
the central directory. The results will look vaguely like the following:
|
||||||
|
|
||||||
|
Length Method Size Ratio Date Time CRC-32 Name ("^" ==> case
|
||||||
|
-------- ------ ------- ----- ---- ---- ------ ---- conversion)
|
||||||
|
44004 Implode 13041 71% 11-02-89 19:34 8b4207f7 Makefile.UNIX
|
||||||
|
3438 Shrunk 2209 36% 09-15-90 14:07 a2394fd8 ^dos-file.ext
|
||||||
|
16717 Defl:X 5252 69% 11-03-97 06:40 1ce0f189 WHERE
|
||||||
|
-------- ------- --- -------
|
||||||
|
64159 20502 68% 3 files
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
G.pInfo = &info;
|
||||||
|
date_format = DATE_FORMAT;
|
||||||
|
dt_sepchar = DATE_SEPCHAR;
|
||||||
|
|
||||||
|
#ifndef WINDLL
|
||||||
|
if (uO.qflag < 2) {
|
||||||
|
if (uO.L_flag)
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(CaseConversion),
|
||||||
|
LoadFarStringSmall(Headers[longhdr][0]),
|
||||||
|
LoadFarStringSmall2(Headers[longhdr][1])));
|
||||||
|
else
|
||||||
|
Info(slide, 0, ((char *)slide, "%s\n%s\n",
|
||||||
|
LoadFarString(Headers[longhdr][0]),
|
||||||
|
LoadFarStringSmall(Headers[longhdr][1])));
|
||||||
|
}
|
||||||
|
#endif /* !WINDLL */
|
||||||
|
|
||||||
|
for (j = 1L;;j++) {
|
||||||
|
|
||||||
|
if (readbuf(__G__ G.sig, 4) == 0)
|
||||||
|
return PK_EOF;
|
||||||
|
if (memcmp(G.sig, central_hdr_sig, 4)) { /* is it a CentDir entry? */
|
||||||
|
/* no new central directory entry
|
||||||
|
* -> is the number of processed entries compatible with the
|
||||||
|
* number of entries as stored in the end_central record?
|
||||||
|
*/
|
||||||
|
if (((j - 1) &
|
||||||
|
(ulg)(G.ecrec.have_ecr64 ? MASK_ZUCN64 : MASK_ZUCN16))
|
||||||
|
== (ulg)G.ecrec.total_entries_central_dir)
|
||||||
|
{
|
||||||
|
/* "j modulus 4T/64k" matches the reported 64/16-bit-unsigned
|
||||||
|
* number of directory entries -> probably, the regular
|
||||||
|
* end of the central directory has been reached
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
Info(slide, 0x401,
|
||||||
|
((char *)slide, LoadFarString(CentSigMsg), j));
|
||||||
|
Info(slide, 0x401,
|
||||||
|
((char *)slide, LoadFarString(ReportMsg)));
|
||||||
|
return PK_BADERR; /* sig not found */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* process_cdir_file_hdr() sets pInfo->hostnum, pInfo->lcflag, ...: */
|
||||||
|
if ((error = process_cdir_file_hdr(__G)) != PK_COOL)
|
||||||
|
return error; /* only PK_EOF defined */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We could DISPLAY the filename instead of storing (and possibly trun-
|
||||||
|
* cating, in the case of a very long name) and printing it, but that
|
||||||
|
* has the disadvantage of not allowing case conversion--and it's nice
|
||||||
|
* to be able to see in the listing precisely how you have to type each
|
||||||
|
* filename in order for unzip to consider it a match. Speaking of
|
||||||
|
* which, if member names were specified on the command line, check in
|
||||||
|
* with match() to see if the current file is one of them, and make a
|
||||||
|
* note of it if it is.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((error = do_string(__G__ G.crec.filename_length, DS_FN)) !=
|
||||||
|
PK_COOL) /* ^--(uses pInfo->lcflag) */
|
||||||
|
{
|
||||||
|
error_in_archive = error;
|
||||||
|
if (error > PK_WARN) /* fatal: can't continue */
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
if (G.extra_field != (uch *)NULL) {
|
||||||
|
free(G.extra_field);
|
||||||
|
G.extra_field = (uch *)NULL;
|
||||||
|
}
|
||||||
|
if ((error = do_string(__G__ G.crec.extra_field_length, EXTRA_FIELD))
|
||||||
|
!= 0)
|
||||||
|
{
|
||||||
|
error_in_archive = error;
|
||||||
|
if (error > PK_WARN) /* fatal */
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
if (!G.process_all_files) { /* check if specified on command line */
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
if (G.filespecs == 0)
|
||||||
|
do_this_file = TRUE;
|
||||||
|
else { /* check if this entry matches an `include' argument */
|
||||||
|
do_this_file = FALSE;
|
||||||
|
for (i = 0; i < G.filespecs; i++)
|
||||||
|
if (match(G.filename, G.pfnames[i], uO.C_flag WISEP)) {
|
||||||
|
do_this_file = TRUE;
|
||||||
|
break; /* found match, so stop looping */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (do_this_file) { /* check if this is an excluded file */
|
||||||
|
for (i = 0; i < G.xfilespecs; i++)
|
||||||
|
if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) {
|
||||||
|
do_this_file = FALSE; /* ^-- ignore case in match */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* If current file was specified on command line, or if no names were
|
||||||
|
* specified, do the listing for this file. Otherwise, get rid of the
|
||||||
|
* file comment and go back for the next file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (G.process_all_files || do_this_file) {
|
||||||
|
|
||||||
|
#ifdef OS2DLL
|
||||||
|
/* this is used by UzpFileTree() to allow easy processing of lists
|
||||||
|
* of zip directory contents */
|
||||||
|
if (G.processExternally) {
|
||||||
|
if ((G.processExternally)(G.filename, &G.crec))
|
||||||
|
break;
|
||||||
|
++members;
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
{
|
||||||
|
uch *ef_ptr = G.extra_field;
|
||||||
|
int ef_size, ef_len = G.crec.extra_field_length;
|
||||||
|
ea_size = acl_size = 0;
|
||||||
|
|
||||||
|
while (ef_len >= EB_HEADSIZE) {
|
||||||
|
ef_size = makeword(&ef_ptr[EB_LEN]);
|
||||||
|
switch (makeword(&ef_ptr[EB_ID])) {
|
||||||
|
case EF_OS2:
|
||||||
|
ea_size = makelong(&ef_ptr[EB_HEADSIZE]);
|
||||||
|
break;
|
||||||
|
case EF_ACL:
|
||||||
|
acl_size = makelong(&ef_ptr[EB_HEADSIZE]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ef_ptr += (ef_size + EB_HEADSIZE);
|
||||||
|
ef_len -= (ef_size + EB_HEADSIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
if (G.extra_field &&
|
||||||
|
#ifdef IZ_CHECK_TZ
|
||||||
|
G.tz_is_valid &&
|
||||||
|
#endif
|
||||||
|
(ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1,
|
||||||
|
G.crec.last_mod_dos_datetime, &z_utime, NULL)
|
||||||
|
& EB_UT_FL_MTIME))
|
||||||
|
{
|
||||||
|
TIMET_TO_NATIVE(z_utime.mtime) /* NOP unless MSC 7.0, Mac */
|
||||||
|
t = localtime(&(z_utime.mtime));
|
||||||
|
} else
|
||||||
|
t = (struct tm *)NULL;
|
||||||
|
if (t != (struct tm *)NULL) {
|
||||||
|
mo = (unsigned)(t->tm_mon + 1);
|
||||||
|
dy = (unsigned)(t->tm_mday);
|
||||||
|
yr = (unsigned)(t->tm_year + 1900);
|
||||||
|
hh = (unsigned)(t->tm_hour);
|
||||||
|
mm = (unsigned)(t->tm_min);
|
||||||
|
} else
|
||||||
|
#endif /* USE_EF_UT_TIME */
|
||||||
|
{
|
||||||
|
yr = ((((unsigned)(G.crec.last_mod_dos_datetime >> 25) & 0x7f)
|
||||||
|
+ 1980));
|
||||||
|
mo = ((unsigned)(G.crec.last_mod_dos_datetime >> 21) & 0x0f);
|
||||||
|
dy = ((unsigned)(G.crec.last_mod_dos_datetime >> 16) & 0x1f);
|
||||||
|
hh = (((unsigned)G.crec.last_mod_dos_datetime >> 11) & 0x1f);
|
||||||
|
mm = (((unsigned)G.crec.last_mod_dos_datetime >> 5) & 0x3f);
|
||||||
|
}
|
||||||
|
/* permute date so it displays according to nat'l convention
|
||||||
|
* ('methnum' is not yet set, it is used as temporary buffer) */
|
||||||
|
switch (date_format) {
|
||||||
|
case DF_YMD:
|
||||||
|
methnum = mo;
|
||||||
|
mo = yr; yr = dy; dy = methnum;
|
||||||
|
break;
|
||||||
|
case DF_DMY:
|
||||||
|
methnum = mo;
|
||||||
|
mo = dy; dy = methnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
csiz = G.crec.csize;
|
||||||
|
if (G.crec.general_purpose_bit_flag & 1)
|
||||||
|
csiz -= 12; /* if encrypted, don't count encryption header */
|
||||||
|
if ((cfactor = ratio(G.crec.ucsize, csiz)) < 0) {
|
||||||
|
#ifndef WINDLL
|
||||||
|
sgn = '-';
|
||||||
|
#endif
|
||||||
|
cfactor = (-cfactor + 5) / 10;
|
||||||
|
} else {
|
||||||
|
#ifndef WINDLL
|
||||||
|
sgn = ' ';
|
||||||
|
#endif
|
||||||
|
cfactor = (cfactor + 5) / 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
methnum = find_compr_idx(G.crec.compression_method);
|
||||||
|
zfstrcpy(methbuf, method[methnum]);
|
||||||
|
if (G.crec.compression_method == DEFLATED ||
|
||||||
|
G.crec.compression_method == ENHDEFLATED) {
|
||||||
|
methbuf[5] = dtype[(G.crec.general_purpose_bit_flag>>1) & 3];
|
||||||
|
} else if (methnum >= NUM_METHODS) {
|
||||||
|
/* [jart] fix problematic use of sprintf */
|
||||||
|
sprintf(&methbuf[4], "%03u", G.crec.compression_method & 127);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 /* GRR/Euro: add this? */
|
||||||
|
#if defined(DOS_FLX_NLM_OS2_W32) || defined(THEOS) || defined(UNIX)
|
||||||
|
for (p = G.filename; *p; ++p)
|
||||||
|
if (!isprint(*p))
|
||||||
|
*p = '?'; /* change non-printable chars to '?' */
|
||||||
|
#endif /* DOS_FLX_NLM_OS2_W32 || THEOS || UNIX */
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
#ifdef WINDLL
|
||||||
|
/* send data to application for formatting and printing */
|
||||||
|
if (G.lpUserFunctions->SendApplicationMessage != NULL)
|
||||||
|
(*G.lpUserFunctions->SendApplicationMessage)(G.crec.ucsize,
|
||||||
|
csiz, (unsigned)cfactor, mo, dy, yr, hh, mm,
|
||||||
|
(char)(G.pInfo->lcflag ? '^' : ' '),
|
||||||
|
(LPCSTR)fnfilter(G.filename, slide, (WSIZE>>1)),
|
||||||
|
(LPCSTR)methbuf, G.crec.crc32,
|
||||||
|
(char)((G.crec.general_purpose_bit_flag & 1) ? 'E' : ' '));
|
||||||
|
else if (G.lpUserFunctions->SendApplicationMessage_i32 != NULL) {
|
||||||
|
unsigned long ucsize_lo, csiz_lo;
|
||||||
|
unsigned long ucsize_hi=0L, csiz_hi=0L;
|
||||||
|
ucsize_lo = (unsigned long)(G.crec.ucsize);
|
||||||
|
csiz_lo = (unsigned long)(csiz);
|
||||||
|
#ifdef ZIP64_SUPPORT
|
||||||
|
ucsize_hi = (unsigned long)(G.crec.ucsize >> 32);
|
||||||
|
csiz_hi = (unsigned long)(csiz >> 32);
|
||||||
|
#endif /* ZIP64_SUPPORT */
|
||||||
|
(*G.lpUserFunctions->SendApplicationMessage_i32)(ucsize_lo,
|
||||||
|
ucsize_hi, csiz_lo, csiz_hi, (unsigned)cfactor,
|
||||||
|
mo, dy, yr, hh, mm,
|
||||||
|
(char)(G.pInfo->lcflag ? '^' : ' '),
|
||||||
|
(LPCSTR)fnfilter(G.filename, slide, (WSIZE>>1)),
|
||||||
|
(LPCSTR)methbuf, G.crec.crc32,
|
||||||
|
(char)((G.crec.general_purpose_bit_flag & 1) ? 'E' : ' '));
|
||||||
|
}
|
||||||
|
#else /* !WINDLL */
|
||||||
|
if (cfactor == 100)
|
||||||
|
(sprintf)(cfactorstr, LoadFarString(CompFactor100));
|
||||||
|
else
|
||||||
|
(sprintf)(cfactorstr, LoadFarString(CompFactorStr), sgn, cfactor);
|
||||||
|
if (longhdr)
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(LongHdrStats),
|
||||||
|
FmZofft(G.crec.ucsize, "8", "u"), methbuf,
|
||||||
|
FmZofft(csiz, "8", "u"), cfactorstr,
|
||||||
|
mo, dt_sepchar, dy, dt_sepchar, yr, hh, mm,
|
||||||
|
G.crec.crc32, (G.pInfo->lcflag? '^':' ')));
|
||||||
|
else
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(ShortHdrStats),
|
||||||
|
FmZofft(G.crec.ucsize, "9", "u"), ea_size, acl_size,
|
||||||
|
mo, dt_sepchar, dy, dt_sepchar, yr, hh, mm,
|
||||||
|
(G.pInfo->lcflag? '^':' ')));
|
||||||
|
#else
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(ShortHdrStats),
|
||||||
|
FmZofft(G.crec.ucsize, "9", "u"),
|
||||||
|
mo, dt_sepchar, dy, dt_sepchar, yr, hh, mm,
|
||||||
|
(G.pInfo->lcflag? '^':' ')));
|
||||||
|
#endif
|
||||||
|
fnprint(__G);
|
||||||
|
#endif /* ?WINDLL */
|
||||||
|
|
||||||
|
if ((error = do_string(__G__ G.crec.file_comment_length,
|
||||||
|
QCOND? DISPL_8 : SKIP)) != 0)
|
||||||
|
{
|
||||||
|
error_in_archive = error; /* might be just warning */
|
||||||
|
if (error > PK_WARN) /* fatal */
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
tot_ucsize += G.crec.ucsize;
|
||||||
|
tot_csize += csiz;
|
||||||
|
++members;
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
if (ea_size) {
|
||||||
|
tot_easize += ea_size;
|
||||||
|
++tot_eafiles;
|
||||||
|
}
|
||||||
|
if (acl_size) {
|
||||||
|
tot_aclsize += acl_size;
|
||||||
|
++tot_aclfiles;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef OS2DLL
|
||||||
|
} /* end of "if (G.processExternally) {...} else {..." */
|
||||||
|
#endif
|
||||||
|
} else { /* not listing this file */
|
||||||
|
SKIP_(G.crec.file_comment_length)
|
||||||
|
}
|
||||||
|
} /* end for-loop (j: files in central directory) */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Print footer line and totals (compressed size, uncompressed size, number
|
||||||
|
of members in zipfile).
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (uO.qflag < 2
|
||||||
|
#ifdef OS2DLL
|
||||||
|
&& !G.processExternally
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
if ((cfactor = ratio(tot_ucsize, tot_csize)) < 0) {
|
||||||
|
#ifndef WINDLL
|
||||||
|
sgn = '-';
|
||||||
|
#endif
|
||||||
|
cfactor = (-cfactor + 5) / 10;
|
||||||
|
} else {
|
||||||
|
#ifndef WINDLL
|
||||||
|
sgn = ' ';
|
||||||
|
#endif
|
||||||
|
cfactor = (cfactor + 5) / 10;
|
||||||
|
}
|
||||||
|
#ifdef WINDLL
|
||||||
|
/* pass the totals back to the calling application */
|
||||||
|
G.lpUserFunctions->TotalSizeComp = tot_csize;
|
||||||
|
G.lpUserFunctions->TotalSize = tot_ucsize;
|
||||||
|
G.lpUserFunctions->CompFactor = (ulg)cfactor;
|
||||||
|
G.lpUserFunctions->NumMembers = members;
|
||||||
|
|
||||||
|
#else /* !WINDLL */
|
||||||
|
if (cfactor == 100)
|
||||||
|
sprintf(cfactorstr, LoadFarString(CompFactor100));
|
||||||
|
else
|
||||||
|
sprintf(cfactorstr, LoadFarString(CompFactorStr), sgn, cfactor);
|
||||||
|
if (longhdr) {
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(LongFileTrailer),
|
||||||
|
FmZofft(tot_ucsize, "8", "u"), FmZofft(tot_csize, "8", "u"),
|
||||||
|
cfactorstr, members, members==1? "":"s"));
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
if (tot_easize || tot_aclsize)
|
||||||
|
Info(slide, 0, ((char *)slide, "\n"));
|
||||||
|
if (tot_eafiles && tot_easize)
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(OS2ExtAttrTrailer),
|
||||||
|
tot_eafiles, tot_eafiles == 1? " has" : "s have a total of",
|
||||||
|
tot_easize));
|
||||||
|
if (tot_aclfiles && tot_aclsize)
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(OS2ACLTrailer),
|
||||||
|
tot_aclfiles,
|
||||||
|
tot_aclfiles == 1 ? " has" : "s have a total of",
|
||||||
|
tot_aclsize));
|
||||||
|
#endif /* OS2_EAS */
|
||||||
|
} else
|
||||||
|
#ifdef OS2_EAS
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(ShortFileTrailer),
|
||||||
|
FmZofft(tot_ucsize, "9", "u"), tot_easize, tot_aclsize,
|
||||||
|
members, members == 1 ? "" : "s"));
|
||||||
|
#else
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(ShortFileTrailer),
|
||||||
|
FmZofft(tot_ucsize, "9", "u"),
|
||||||
|
members, members == 1 ? "" : "s"));
|
||||||
|
#endif /* OS2_EAS */
|
||||||
|
#endif /* ?WINDLL */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip the following checks in case of a premature listing break. */
|
||||||
|
if (error_in_archive <= PK_WARN) {
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Double check that we're back at the end-of-central-directory record.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if ( (memcmp(G.sig,
|
||||||
|
(G.ecrec.have_ecr64 ?
|
||||||
|
end_central64_sig : end_central_sig),
|
||||||
|
4) != 0)
|
||||||
|
&& (!G.ecrec.is_zip64_archive)
|
||||||
|
&& (memcmp(G.sig, end_central_sig, 4) != 0)
|
||||||
|
) { /* just to make sure again */
|
||||||
|
Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg)));
|
||||||
|
error_in_archive = PK_WARN; /* didn't find sig */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set specific return code when no files have been found. */
|
||||||
|
if (members == 0L && error_in_archive <= PK_WARN)
|
||||||
|
error_in_archive = PK_FIND;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return error_in_archive;
|
||||||
|
|
||||||
|
} /* end function list_files() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TIMESTAMP
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function fn_is_dir() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
static int fn_is_dir(__G) /* returns TRUE if G.filename is directory */
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
extent fn_len = strlen(G.filename);
|
||||||
|
register char endc;
|
||||||
|
|
||||||
|
return fn_len > 0 &&
|
||||||
|
((endc = lastchar(G.filename, fn_len)) == '/' ||
|
||||||
|
(G.pInfo->hostnum == FS_FAT_ && !MBSCHR(G.filename, '/') &&
|
||||||
|
endc == '\\'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************/
|
||||||
|
/* Function get_time_stamp() */
|
||||||
|
/*****************************/
|
||||||
|
|
||||||
|
int get_time_stamp(__G__ last_modtime, nmember) /* return PK-type error code */
|
||||||
|
__GDEF
|
||||||
|
time_t *last_modtime;
|
||||||
|
ulg *nmember;
|
||||||
|
{
|
||||||
|
int do_this_file=FALSE, error, error_in_archive=PK_COOL;
|
||||||
|
ulg j;
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
iztimes z_utime;
|
||||||
|
#endif
|
||||||
|
min_info info;
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Unlike extract_or_test_files() but like list_files(), this function works
|
||||||
|
on information in the central directory alone. Thus we have a single,
|
||||||
|
large loop through the entire directory, searching for the latest time
|
||||||
|
stamp.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
*last_modtime = 0L; /* assuming no zipfile data older than 1970 */
|
||||||
|
*nmember = 0L;
|
||||||
|
G.pInfo = &info;
|
||||||
|
|
||||||
|
for (j = 1L;; j++) {
|
||||||
|
|
||||||
|
if (readbuf(__G__ G.sig, 4) == 0)
|
||||||
|
return PK_EOF;
|
||||||
|
if (memcmp(G.sig, central_hdr_sig, 4)) { /* is it a CentDir entry? */
|
||||||
|
if (((unsigned)(j - 1) & (unsigned)0xFFFF) ==
|
||||||
|
(unsigned)G.ecrec.total_entries_central_dir) {
|
||||||
|
/* "j modulus 64k" matches the reported 16-bit-unsigned
|
||||||
|
* number of directory entries -> probably, the regular
|
||||||
|
* end of the central directory has been reached
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
Info(slide, 0x401,
|
||||||
|
((char *)slide, LoadFarString(CentSigMsg), j));
|
||||||
|
Info(slide, 0x401,
|
||||||
|
((char *)slide, LoadFarString(ReportMsg)));
|
||||||
|
return PK_BADERR; /* sig not found */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* process_cdir_file_hdr() sets pInfo->lcflag: */
|
||||||
|
if ((error = process_cdir_file_hdr(__G)) != PK_COOL)
|
||||||
|
return error; /* only PK_EOF defined */
|
||||||
|
if ((error = do_string(__G__ G.crec.filename_length, DS_FN)) != PK_OK)
|
||||||
|
{ /* ^-- (uses pInfo->lcflag) */
|
||||||
|
error_in_archive = error;
|
||||||
|
if (error > PK_WARN) /* fatal: can't continue */
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
if (G.extra_field != (uch *)NULL) {
|
||||||
|
free(G.extra_field);
|
||||||
|
G.extra_field = (uch *)NULL;
|
||||||
|
}
|
||||||
|
if ((error = do_string(__G__ G.crec.extra_field_length, EXTRA_FIELD))
|
||||||
|
!= 0)
|
||||||
|
{
|
||||||
|
error_in_archive = error;
|
||||||
|
if (error > PK_WARN) /* fatal */
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
if (!G.process_all_files) { /* check if specified on command line */
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
if (G.filespecs == 0)
|
||||||
|
do_this_file = TRUE;
|
||||||
|
else { /* check if this entry matches an `include' argument */
|
||||||
|
do_this_file = FALSE;
|
||||||
|
for (i = 0; i < G.filespecs; i++)
|
||||||
|
if (match(G.filename, G.pfnames[i], uO.C_flag WISEP)) {
|
||||||
|
do_this_file = TRUE;
|
||||||
|
break; /* found match, so stop looping */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (do_this_file) { /* check if this is an excluded file */
|
||||||
|
for (i = 0; i < G.xfilespecs; i++)
|
||||||
|
if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) {
|
||||||
|
do_this_file = FALSE; /* ^-- ignore case in match */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If current file was specified on command line, or if no names were
|
||||||
|
* specified, check the time for this file. Either way, get rid of the
|
||||||
|
* file comment and go back for the next file.
|
||||||
|
* Directory entries are always ignored, to stay compatible with both
|
||||||
|
* Zip and PKZIP.
|
||||||
|
*/
|
||||||
|
if ((G.process_all_files || do_this_file) && !fn_is_dir(__G)) {
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
if (G.extra_field &&
|
||||||
|
#ifdef IZ_CHECK_TZ
|
||||||
|
G.tz_is_valid &&
|
||||||
|
#endif
|
||||||
|
(ef_scan_for_izux(G.extra_field, G.crec.extra_field_length, 1,
|
||||||
|
G.crec.last_mod_dos_datetime, &z_utime, NULL)
|
||||||
|
& EB_UT_FL_MTIME))
|
||||||
|
{
|
||||||
|
if (*last_modtime < z_utime.mtime)
|
||||||
|
*last_modtime = z_utime.mtime;
|
||||||
|
} else
|
||||||
|
#endif /* USE_EF_UT_TIME */
|
||||||
|
{
|
||||||
|
time_t modtime = dos_to_unix_time(G.crec.last_mod_dos_datetime);
|
||||||
|
|
||||||
|
if (*last_modtime < modtime)
|
||||||
|
*last_modtime = modtime;
|
||||||
|
}
|
||||||
|
++*nmember;
|
||||||
|
}
|
||||||
|
SKIP_(G.crec.file_comment_length)
|
||||||
|
|
||||||
|
} /* end for-loop (j: files in central directory) */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Double check that we're back at the end-of-central-directory record.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (memcmp(G.sig, end_central_sig, 4)) { /* just to make sure again */
|
||||||
|
Info(slide, 0x401, ((char *)slide, LoadFarString(EndSigMsg)));
|
||||||
|
error_in_archive = PK_WARN;
|
||||||
|
}
|
||||||
|
if (*nmember == 0L && error_in_archive <= PK_WARN)
|
||||||
|
error_in_archive = PK_FIND;
|
||||||
|
|
||||||
|
return error_in_archive;
|
||||||
|
|
||||||
|
} /* end function get_time_stamp() */
|
||||||
|
|
||||||
|
#endif /* TIMESTAMP */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/********************/
|
||||||
|
/* Function ratio() */ /* also used by ZipInfo routines */
|
||||||
|
/********************/
|
||||||
|
|
||||||
|
int ratio(uc, c)
|
||||||
|
zusz_t uc, c;
|
||||||
|
{
|
||||||
|
zusz_t denom;
|
||||||
|
|
||||||
|
if (uc == 0)
|
||||||
|
return 0;
|
||||||
|
if (uc > 2000000L) { /* risk signed overflow if multiply numerator */
|
||||||
|
denom = uc / 1000L;
|
||||||
|
return ((uc >= c) ?
|
||||||
|
(int) ((uc-c + (denom>>1)) / denom) :
|
||||||
|
-((int) ((c-uc + (denom>>1)) / denom)));
|
||||||
|
} else { /* ^^^^^^^^ rounding */
|
||||||
|
denom = uc;
|
||||||
|
return ((uc >= c) ?
|
||||||
|
(int) ((1000L*(uc-c) + (denom>>1)) / denom) :
|
||||||
|
-((int) ((1000L*(c-uc) + (denom>>1)) / denom)));
|
||||||
|
} /* ^^^^^^^^ rounding */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function fnprint() */ /* also used by ZipInfo routines */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
void fnprint(__G) /* print filename (after filtering) and newline */
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
char *name = fnfilter(G.filename, slide, (extent)(WSIZE>>1));
|
||||||
|
|
||||||
|
(*G.message)((zvoid *)&G, (uch *)name, (ulg)strlen(name), 0);
|
||||||
|
(*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0);
|
||||||
|
|
||||||
|
} /* end function fnprint() */
|
456
third_party/unzip/match.c
vendored
Normal file
456
third_party/unzip/match.c
vendored
Normal file
|
@ -0,0 +1,456 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2010 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
match.c
|
||||||
|
|
||||||
|
The match() routine recursively compares a string to a "pattern" (regular
|
||||||
|
expression), returning TRUE if a match is found or FALSE if not. This
|
||||||
|
version is specifically for use with unzip.c: as did the previous match()
|
||||||
|
routines from SEA and J. Kercheval, it leaves the case (upper, lower, or
|
||||||
|
mixed) of the string alone, but converts any uppercase characters in the
|
||||||
|
pattern to lowercase if indicated by the global var pInfo->lcflag (which
|
||||||
|
is to say, string is assumed to have been converted to lowercase already,
|
||||||
|
if such was necessary).
|
||||||
|
|
||||||
|
GRR: reversed order of text, pattern in matche() (now same as match());
|
||||||
|
added ignore_case/ic flags, Case() macro.
|
||||||
|
|
||||||
|
PaulK: replaced matche() with recmatch() from Zip, modified to have an
|
||||||
|
ignore_case argument; replaced test frame with simpler one.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright on recmatch() from Zip's util.c (although recmatch() was almost
|
||||||
|
certainly written by Mark Adler...ask me how I can tell :-) ):
|
||||||
|
|
||||||
|
Copyright (C) 1990-1992 Mark Adler, Richard B. Wales, Jean-loup Gailly,
|
||||||
|
Kai Uwe Rommel and Igor Mandrichenko.
|
||||||
|
|
||||||
|
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 unmodified, that it is not sold for profit, and that this copy-
|
||||||
|
right notice is retained.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Match the pattern (wildcard) against the string (fixed):
|
||||||
|
|
||||||
|
match(string, pattern, ignore_case, sepc);
|
||||||
|
|
||||||
|
returns TRUE if string matches pattern, FALSE otherwise. In the pattern:
|
||||||
|
|
||||||
|
`*' matches any sequence of characters (zero or more)
|
||||||
|
`?' matches any single character
|
||||||
|
[SET] matches any character in the specified set,
|
||||||
|
[!SET] or [^SET] matches any character not in the specified set.
|
||||||
|
|
||||||
|
A set is composed of characters or ranges; a range looks like ``character
|
||||||
|
hyphen character'' (as in 0-9 or A-Z). [0-9a-zA-Z_] is the minimal set of
|
||||||
|
characters allowed in the [..] pattern construct. Other characters are
|
||||||
|
allowed (i.e., 8-bit characters) if your system will support them.
|
||||||
|
|
||||||
|
To suppress the special syntactic significance of any of ``[]*?!^-\'', in-
|
||||||
|
side or outside a [..] construct, and match the character exactly, precede
|
||||||
|
it with a ``\'' (backslash).
|
||||||
|
|
||||||
|
Note that "*.*" and "*." are treated specially under MS-DOS if DOSWILD is
|
||||||
|
defined. See the DOSWILD section below for an explanation. Note also
|
||||||
|
that with VMSWILD defined, '%' is used instead of '?', and sets (ranges)
|
||||||
|
are delimited by () instead of [].
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define __MATCH_C /* identifies this source module */
|
||||||
|
|
||||||
|
/* define ToLower() in here (for Unix, define ToLower to be macro (using
|
||||||
|
* isupper()); otherwise just use tolower() */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
|
||||||
|
#ifndef THEOS /* the Theos port defines its own variant of match() */
|
||||||
|
|
||||||
|
#if 0 /* this is not useful until it matches Amiga names insensitively */
|
||||||
|
#ifdef AMIGA /* some other platforms might also want to use this */
|
||||||
|
# define ANSI_CHARSET /* MOVE INTO UNZIP.H EVENTUALLY */
|
||||||
|
#endif
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
#ifdef ANSI_CHARSET
|
||||||
|
# ifdef ToLower
|
||||||
|
# undef ToLower
|
||||||
|
# endif
|
||||||
|
/* uppercase letters are values 41 thru 5A, C0 thru D6, and D8 thru DE */
|
||||||
|
# define IsUpper(c) (c>=0xC0 ? c<=0xDE && c!=0xD7 : c>=0x41 && c<=0x5A)
|
||||||
|
# define ToLower(c) (IsUpper((uch) c) ? (unsigned) c | 0x20 : (unsigned) c)
|
||||||
|
#endif
|
||||||
|
#define Case(x) (ic? ToLower(x) : (x))
|
||||||
|
|
||||||
|
#ifdef VMSWILD
|
||||||
|
# define WILDCHAR '%'
|
||||||
|
# define BEG_RANGE '('
|
||||||
|
# define END_RANGE ')'
|
||||||
|
#else
|
||||||
|
# define WILDCHAR '?'
|
||||||
|
# define BEG_RANGE '['
|
||||||
|
# define END_RANGE ']'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0 /* GRR: add this to unzip.h someday... */
|
||||||
|
#if !(defined(MSDOS) && defined(DOSWILD))
|
||||||
|
#ifdef WILD_STOP_AT_DIR
|
||||||
|
#define match(s,p,ic,sc) (recmatch((ZCONST uch *)p,(ZCONST uch *)s,ic,sc) == 1)
|
||||||
|
#else
|
||||||
|
#define match(s,p,ic) (recmatch((ZCONST uch *)p,(ZCONST uch *)s,ic) == 1)
|
||||||
|
#endif
|
||||||
|
int recmatch OF((ZCONST uch *pattern, ZCONST uch *string,
|
||||||
|
int ignore_case __WDLPRO));
|
||||||
|
#endif
|
||||||
|
#endif /* 0 */
|
||||||
|
static int recmatch OF((ZCONST uch *pattern, ZCONST uch *string,
|
||||||
|
int ignore_case __WDLPRO));
|
||||||
|
static char *isshexp OF((ZCONST char *p));
|
||||||
|
static int namecmp OF((ZCONST char *s1, ZCONST char *s2));
|
||||||
|
|
||||||
|
|
||||||
|
/* match() is a shell to recmatch() to return only Boolean values. */
|
||||||
|
|
||||||
|
int match(string, pattern, ignore_case __WDL)
|
||||||
|
ZCONST char *string, *pattern;
|
||||||
|
int ignore_case;
|
||||||
|
__WDLDEF
|
||||||
|
{
|
||||||
|
#if (defined(MSDOS) && defined(DOSWILD))
|
||||||
|
char *dospattern;
|
||||||
|
int j = strlen(pattern);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Optional MS-DOS preprocessing section: compare last three chars of the
|
||||||
|
wildcard to "*.*" and translate to "*" if found; else compare the last
|
||||||
|
two characters to "*." and, if found, scan the non-wild string for dots.
|
||||||
|
If in the latter case a dot is found, return failure; else translate the
|
||||||
|
"*." to "*". In either case, continue with the normal (Unix-like) match
|
||||||
|
procedure after translation. (If not enough memory, default to normal
|
||||||
|
match.) This causes "a*.*" and "a*." to behave as MS-DOS users expect.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if ((dospattern = (char *)malloc(j+1)) != NULL) {
|
||||||
|
strcpy(dospattern, pattern);
|
||||||
|
if (!strcmp(dospattern+j-3, "*.*")) {
|
||||||
|
dospattern[j-2] = '\0'; /* nuke the ".*" */
|
||||||
|
} else if (!strcmp(dospattern+j-2, "*.")) {
|
||||||
|
char *p = MBSCHR(string, '.');
|
||||||
|
|
||||||
|
if (p) { /* found a dot: match fails */
|
||||||
|
free(dospattern);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
dospattern[j-1] = '\0'; /* nuke the end "." */
|
||||||
|
}
|
||||||
|
j = recmatch((uch *)dospattern, (uch *)string, ignore_case __WDL);
|
||||||
|
free(dospattern);
|
||||||
|
return j == 1;
|
||||||
|
} else
|
||||||
|
#endif /* MSDOS && DOSWILD */
|
||||||
|
return recmatch((uch *)pattern, (uch *)string, ignore_case __WDL) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int recmatch(p, s, ic __WDL)
|
||||||
|
ZCONST uch *p; /* sh pattern to match */
|
||||||
|
ZCONST uch *s; /* string to which to match it */
|
||||||
|
int ic; /* true for case insensitivity */
|
||||||
|
__WDLDEF /* directory sepchar for WildStopAtDir mode, or 0 */
|
||||||
|
/* Recursively compare the sh pattern p with the string s and return 1 if
|
||||||
|
* they match, and 0 or 2 if they don't or if there is a syntax error in the
|
||||||
|
* pattern. This routine recurses on itself no more deeply than the number
|
||||||
|
* of characters in the pattern. */
|
||||||
|
{
|
||||||
|
unsigned int c; /* pattern char or start of range in [-] loop */
|
||||||
|
|
||||||
|
/* Get first character, the pattern for new recmatch calls follows */
|
||||||
|
c = *p; INCSTR(p);
|
||||||
|
|
||||||
|
/* If that was the end of the pattern, match if string empty too */
|
||||||
|
if (c == 0)
|
||||||
|
return *s == 0;
|
||||||
|
|
||||||
|
/* '?' (or '%') matches any character (but not an empty string). */
|
||||||
|
if (c == WILDCHAR)
|
||||||
|
#ifdef WILD_STOP_AT_DIR
|
||||||
|
/* If uO.W_flag is non-zero, it won't match '/' */
|
||||||
|
return (*s && (!sepc || *s != (uch)sepc))
|
||||||
|
? recmatch(p, s + CLEN(s), ic, sepc) : 0;
|
||||||
|
#else
|
||||||
|
return *s ? recmatch(p, s + CLEN(s), ic) : 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* '*' matches any number of characters, including zero */
|
||||||
|
#ifdef AMIGA
|
||||||
|
if (c == '#' && *p == '?') /* "#?" is Amiga-ese for "*" */
|
||||||
|
c = '*', p++;
|
||||||
|
#endif /* AMIGA */
|
||||||
|
if (c == '*') {
|
||||||
|
#ifdef WILD_STOP_AT_DIR
|
||||||
|
if (sepc) {
|
||||||
|
/* check for single "*" or double "**" */
|
||||||
|
# ifdef AMIGA
|
||||||
|
if ((c = p[0]) == '#' && p[1] == '?') /* "#?" is Amiga-ese for "*" */
|
||||||
|
c = '*', p++;
|
||||||
|
if (c != '*') {
|
||||||
|
# else /* !AMIGA */
|
||||||
|
if (*p != '*') {
|
||||||
|
# endif /* ?AMIGA */
|
||||||
|
/* single "*": this doesn't match the dirsep character */
|
||||||
|
for (; *s && *s != (uch)sepc; INCSTR(s))
|
||||||
|
if ((c = recmatch(p, s, ic, sepc)) != 0)
|
||||||
|
return (int)c;
|
||||||
|
/* end of pattern: matched if at end of string, else continue */
|
||||||
|
if (*p == '\0')
|
||||||
|
return (*s == 0);
|
||||||
|
/* continue to match if at sepc in pattern, else give up */
|
||||||
|
return (*p == (uch)sepc || (*p == '\\' && p[1] == (uch)sepc))
|
||||||
|
? recmatch(p, s, ic, sepc) : 2;
|
||||||
|
}
|
||||||
|
/* "**": this matches slashes */
|
||||||
|
++p; /* move p behind the second '*' */
|
||||||
|
/* and continue with the non-W_flag code variant */
|
||||||
|
}
|
||||||
|
#endif /* WILD_STOP_AT_DIR */
|
||||||
|
if (*p == 0)
|
||||||
|
return 1;
|
||||||
|
if (isshexp((ZCONST char *)p) == NULL) {
|
||||||
|
/* Optimization for rest of pattern being a literal string:
|
||||||
|
* If there are no other shell expression chars in the rest
|
||||||
|
* of the pattern behind the multi-char wildcard, then just
|
||||||
|
* compare the literal string tail.
|
||||||
|
*/
|
||||||
|
ZCONST uch *srest;
|
||||||
|
|
||||||
|
srest = s + (strlen((ZCONST char *)s) - strlen((ZCONST char *)p));
|
||||||
|
if (srest - s < 0)
|
||||||
|
/* remaining literal string from pattern is longer than rest
|
||||||
|
* of test string, there can't be a match
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
/* compare the remaining literal pattern string with the last
|
||||||
|
* bytes of the test string to check for a match
|
||||||
|
*/
|
||||||
|
#ifdef _MBCS
|
||||||
|
{
|
||||||
|
ZCONST uch *q = s;
|
||||||
|
|
||||||
|
/* MBCS-aware code must not scan backwards into a string from
|
||||||
|
* the end.
|
||||||
|
* So, we have to move forward by character from our well-known
|
||||||
|
* character position s in the test string until we have
|
||||||
|
* advanced to the srest position.
|
||||||
|
*/
|
||||||
|
while (q < srest)
|
||||||
|
INCSTR(q);
|
||||||
|
/* In case the byte *srest is a trailing byte of a multibyte
|
||||||
|
* character in the test string s, we have actually advanced
|
||||||
|
* past the position (srest).
|
||||||
|
* For this case, the match has failed!
|
||||||
|
*/
|
||||||
|
if (q != srest)
|
||||||
|
return 0;
|
||||||
|
return ((ic
|
||||||
|
? namecmp((ZCONST char *)p, (ZCONST char *)q)
|
||||||
|
: strcmp((ZCONST char *)p, (ZCONST char *)q)
|
||||||
|
) == 0);
|
||||||
|
}
|
||||||
|
#else /* !_MBCS */
|
||||||
|
return ((ic
|
||||||
|
? namecmp((ZCONST char *)p, (ZCONST char *)srest)
|
||||||
|
: strcmp((ZCONST char *)p, (ZCONST char *)srest)
|
||||||
|
) == 0);
|
||||||
|
#endif /* ?_MBCS */
|
||||||
|
} else {
|
||||||
|
/* pattern contains more wildcards, continue with recursion... */
|
||||||
|
for (; *s; INCSTR(s))
|
||||||
|
if ((c = recmatch(p, s, ic __WDL)) != 0)
|
||||||
|
return (int)c;
|
||||||
|
return 2; /* 2 means give up--match will return false */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse and process the list of characters and ranges in brackets */
|
||||||
|
if (c == BEG_RANGE) {
|
||||||
|
int e; /* flag true if next char to be taken literally */
|
||||||
|
ZCONST uch *q; /* pointer to end of [-] group */
|
||||||
|
int r; /* flag true to match anything but the range */
|
||||||
|
|
||||||
|
if (*s == 0) /* need a character to match */
|
||||||
|
return 0;
|
||||||
|
p += (r = (*p == '!' || *p == '^')); /* see if reverse */
|
||||||
|
for (q = p, e = 0; *q; INCSTR(q)) /* find closing bracket */
|
||||||
|
if (e)
|
||||||
|
e = 0;
|
||||||
|
else
|
||||||
|
if (*q == '\\') /* GRR: change to ^ for MS-DOS, OS/2? */
|
||||||
|
e = 1;
|
||||||
|
else if (*q == END_RANGE)
|
||||||
|
break;
|
||||||
|
if (*q != END_RANGE) /* nothing matches if bad syntax */
|
||||||
|
return 0;
|
||||||
|
for (c = 0, e = (*p == '-'); p < q; INCSTR(p)) {
|
||||||
|
/* go through the list */
|
||||||
|
if (!e && *p == '\\') /* set escape flag if \ */
|
||||||
|
e = 1;
|
||||||
|
else if (!e && *p == '-') /* set start of range if - */
|
||||||
|
c = *(p-1);
|
||||||
|
else {
|
||||||
|
unsigned int cc = Case(*s);
|
||||||
|
|
||||||
|
if (*(p+1) != '-')
|
||||||
|
for (c = c ? c : *p; c <= *p; c++) /* compare range */
|
||||||
|
if ((unsigned)Case(c) == cc) /* typecast for MSC bug */
|
||||||
|
return r ? 0 : recmatch(q + 1, s + 1, ic __WDL);
|
||||||
|
c = e = 0; /* clear range, escape flags */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r ? recmatch(q + CLEN(q), s + CLEN(s), ic __WDL) : 0;
|
||||||
|
/* bracket match failed */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if escape ('\\'), just compare next character */
|
||||||
|
if (c == '\\' && (c = *p++) == 0) /* if \ at end, then syntax error */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* just a character--compare it */
|
||||||
|
#ifdef QDOS
|
||||||
|
return QMatch(Case((uch)c), Case(*s)) ?
|
||||||
|
recmatch(p, s + CLEN(s), ic __WDL) : 0;
|
||||||
|
#else
|
||||||
|
return Case((uch)c) == Case(*s) ?
|
||||||
|
recmatch(p, s + CLEN(s), ic __WDL) : 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} /* end function recmatch() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static char *isshexp(p)
|
||||||
|
ZCONST char *p;
|
||||||
|
/* If p is a sh expression, a pointer to the first special character is
|
||||||
|
returned. Otherwise, NULL is returned. */
|
||||||
|
{
|
||||||
|
for (; *p; INCSTR(p))
|
||||||
|
if (*p == '\\' && *(p+1))
|
||||||
|
p++;
|
||||||
|
else if (*p == WILDCHAR || *p == '*' || *p == BEG_RANGE)
|
||||||
|
return (char *)p;
|
||||||
|
return NULL;
|
||||||
|
} /* end function isshexp() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int namecmp(s1, s2)
|
||||||
|
ZCONST char *s1, *s2;
|
||||||
|
{
|
||||||
|
int d;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
d = (int)ToLower((uch)*s1)
|
||||||
|
- (int)ToLower((uch)*s2);
|
||||||
|
|
||||||
|
if (d || *s1 == 0 || *s2 == 0)
|
||||||
|
return d;
|
||||||
|
|
||||||
|
s1++;
|
||||||
|
s2++;
|
||||||
|
}
|
||||||
|
} /* end function namecmp() */
|
||||||
|
|
||||||
|
#endif /* !THEOS */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int iswild(p) /* originally only used for stat()-bug workaround in */
|
||||||
|
ZCONST char *p; /* VAX C, Turbo/Borland C, Watcom C, Atari MiNT libs; */
|
||||||
|
{ /* now used in process_zipfiles() as well */
|
||||||
|
for (; *p; INCSTR(p))
|
||||||
|
if (*p == '\\' && *(p+1))
|
||||||
|
++p;
|
||||||
|
#ifdef THEOS
|
||||||
|
else if (*p == '?' || *p == '*' || *p=='#'|| *p == '@')
|
||||||
|
#else /* !THEOS */
|
||||||
|
#ifdef VMS
|
||||||
|
else if (*p == '%' || *p == '*')
|
||||||
|
#else /* !VMS */
|
||||||
|
#ifdef AMIGA
|
||||||
|
else if (*p == '?' || *p == '*' || (*p=='#' && p[1]=='?') || *p == '[')
|
||||||
|
#else /* !AMIGA */
|
||||||
|
else if (*p == '?' || *p == '*' || *p == '[')
|
||||||
|
#endif /* ?AMIGA */
|
||||||
|
#endif /* ?VMS */
|
||||||
|
#endif /* ?THEOS */
|
||||||
|
#ifdef QDOS
|
||||||
|
return (int)p;
|
||||||
|
#else
|
||||||
|
return TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
} /* end function iswild() */
|
||||||
|
|
||||||
|
#if defined(UNICODE_SUPPORT) && defined(WIN32_WIDE)
|
||||||
|
int iswildw(pw) /* originally only used for stat()-bug workaround in */
|
||||||
|
ZCONST wchar_t *pw; /* VAX C, Turbo/Borland C, Watcom C, Atari MiNT libs; */
|
||||||
|
{ /* now used in process_zipfiles() as well */
|
||||||
|
for (; *pw; pw++)
|
||||||
|
if (*pw == '\\' && *(pw+1))
|
||||||
|
++pw;
|
||||||
|
else if (*pw == '?' || *pw == '*' || *pw == '[')
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
} /* end function iswildw() */
|
||||||
|
#endif /* defined(UNICODE_SUPPORT) && defined(WIN32_WIDE) */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TEST_MATCH
|
||||||
|
|
||||||
|
#define put(s) {fputs(s,stdout); fflush(stdout);}
|
||||||
|
#ifdef main
|
||||||
|
# undef main
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char pat[256], str[256];
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
put("Pattern (return to exit): ");
|
||||||
|
gets(pat);
|
||||||
|
if (!pat[0])
|
||||||
|
break;
|
||||||
|
for (;;) {
|
||||||
|
put("String (return for new pattern): ");
|
||||||
|
gets(str);
|
||||||
|
if (!str[0])
|
||||||
|
break;
|
||||||
|
printf("Case sensitive: %s insensitive: %s\n",
|
||||||
|
match(str, pat, 0) ? "YES" : "NO",
|
||||||
|
match(str, pat, 1) ? "YES" : "NO");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXIT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* TEST_MATCH */
|
3178
third_party/unzip/process.c
vendored
Normal file
3178
third_party/unzip/process.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
813
third_party/unzip/timezone.c
vendored
Normal file
813
third_party/unzip/timezone.c
vendored
Normal file
|
@ -0,0 +1,813 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2001 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/* Replacement time library functions, based on platform independent public
|
||||||
|
* domain timezone code from ftp://elsie.nci.nih.gov/pub, with mktime and
|
||||||
|
* mkgmtime from our own mktime.c in Zip.
|
||||||
|
*
|
||||||
|
* Contains: tzset()
|
||||||
|
* __tzset()
|
||||||
|
* gmtime()
|
||||||
|
* localtime()
|
||||||
|
* mktime()
|
||||||
|
* mkgmtime()
|
||||||
|
* GetPlatformLocalTimezone() [different versions]
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* HISTORY/CHANGES
|
||||||
|
* 17 Jun 00, Paul Kienitz, added the PD-based tzset(), localtime(), and so on
|
||||||
|
* to amiga/filedate.c, replacing GNU-based functions which had
|
||||||
|
* replaced time_lib.c, both having been rejected for licensing
|
||||||
|
* reasons. Support for timezone files and leap seconds was removed.
|
||||||
|
*
|
||||||
|
* 23 Aug 00, Paul Kienitz, split into separate timezone.c file, made platform
|
||||||
|
* independent, copied in mktime() and mkgmtime() from Zip, renamed
|
||||||
|
* locale_TZ as GetPlatformLocalTimezone(), for use as a generic
|
||||||
|
* hook by other platforms.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __timezone_c
|
||||||
|
#define __timezone_c
|
||||||
|
|
||||||
|
|
||||||
|
#include "third_party/unzip/zip.h"
|
||||||
|
#include "libc/time/struct/tm.h"
|
||||||
|
#include "third_party/unzip/timezone.h"
|
||||||
|
|
||||||
|
#ifdef IZTZ_DEFINESTDGLOBALS
|
||||||
|
long timezone = 0;
|
||||||
|
int daylight = 0;
|
||||||
|
char *tzname[2];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef IZTZ_GETLOCALETZINFO
|
||||||
|
# define IZTZ_GETLOCALETZINFO(ptzstruct, pgenrulefunct) (FALSE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int real_timezone_is_set = FALSE; /* set by tzset() */
|
||||||
|
|
||||||
|
|
||||||
|
#define TZDEFRULESTRING ",M4.1.0,M10.5.0"
|
||||||
|
#define TZDEFAULT "EST5EDT"
|
||||||
|
|
||||||
|
#define SECSPERMIN 60
|
||||||
|
#define MINSPERHOUR 60
|
||||||
|
#define HOURSPERDAY 24
|
||||||
|
#define DAYSPERWEEK 7
|
||||||
|
#define DAYSPERNYEAR 365
|
||||||
|
#define DAYSPERLYEAR 366
|
||||||
|
#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
|
||||||
|
#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
|
||||||
|
#define MONSPERYEAR 12
|
||||||
|
|
||||||
|
#define EPOCH_WDAY 4 /* Jan 1, 1970 was thursday */
|
||||||
|
#define EPOCH_YEAR 1970
|
||||||
|
#define TM_YEAR_BASE 1900
|
||||||
|
#define FIRST_GOOD_YEAR ((time_t) -1 < (time_t) 1 ? EPOCH_YEAR-68 : EPOCH_YEAR)
|
||||||
|
#define LAST_GOOD_YEAR (EPOCH_YEAR + ((time_t) -1 < (time_t) 1 ? 67 : 135))
|
||||||
|
|
||||||
|
#define YDAYS(month, year) yr_days[leap(year)][month]
|
||||||
|
|
||||||
|
/* Nonzero if `y' is a leap year, else zero. */
|
||||||
|
#define leap(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0)
|
||||||
|
|
||||||
|
/* Number of leap years from EPOCH_YEAR to `y' (not including `y' itself). */
|
||||||
|
#define _P4 ((EPOCH_YEAR / 4) * 4 + 1)
|
||||||
|
#define _P100 ((EPOCH_YEAR / 100) * 100 + 1)
|
||||||
|
#define _P400 ((EPOCH_YEAR / 400) * 400 + 1)
|
||||||
|
#define nleap(y) (((y) - _P4) / 4 - ((y) - _P100) / 100 + ((y) - _P400) / 400)
|
||||||
|
|
||||||
|
/* Length of month `m' (0 .. 11) */
|
||||||
|
#define monthlen(m, y) (yr_days[0][(m)+1] - yr_days[0][m] + \
|
||||||
|
((m) == 1 && leap(y)))
|
||||||
|
|
||||||
|
/* internal module-level constants */
|
||||||
|
#ifndef IZ_MKTIME_ONLY
|
||||||
|
static ZCONST char gmt[] = "GMT";
|
||||||
|
static ZCONST int mon_lengths[2][MONSPERYEAR] = {
|
||||||
|
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
|
||||||
|
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
|
||||||
|
};
|
||||||
|
#endif /* !IZ_MKTIME_ONLY */
|
||||||
|
static ZCONST int yr_days[2][MONSPERYEAR+1] = {
|
||||||
|
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
|
||||||
|
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
|
||||||
|
};
|
||||||
|
#ifndef IZ_MKTIME_ONLY
|
||||||
|
static ZCONST int year_lengths[2] = {
|
||||||
|
DAYSPERNYEAR, DAYSPERLYEAR
|
||||||
|
};
|
||||||
|
|
||||||
|
/* internal variables */
|
||||||
|
static struct state statism;
|
||||||
|
|
||||||
|
|
||||||
|
/* prototypes of static functions */
|
||||||
|
static time_t transtime OF((ZCONST time_t janfirst, ZCONST int year,
|
||||||
|
ZCONST struct rule * ZCONST rulep,
|
||||||
|
ZCONST long offset));
|
||||||
|
static void generate_transitions OF((register struct state * ZCONST sp,
|
||||||
|
ZCONST struct rule * ZCONST start,
|
||||||
|
ZCONST struct rule * ZCONST end));
|
||||||
|
static ZCONST char *getzname OF((ZCONST char *strp));
|
||||||
|
static ZCONST char *getnum OF((ZCONST char *strp, int * ZCONST nump,
|
||||||
|
ZCONST int min, ZCONST int max));
|
||||||
|
static ZCONST char *getsecs OF((ZCONST char *strp, long * ZCONST secsp));
|
||||||
|
static ZCONST char *getoffset OF((ZCONST char *strp, long * ZCONST offsetp));
|
||||||
|
static ZCONST char *getrule OF((ZCONST char *strp, struct rule * ZCONST rulep));
|
||||||
|
static int Parse_TZ OF((ZCONST char *name, register struct state * ZCONST sp));
|
||||||
|
|
||||||
|
|
||||||
|
static time_t transtime(janfirst, year, rulep, offset)
|
||||||
|
ZCONST time_t janfirst;
|
||||||
|
ZCONST int year;
|
||||||
|
ZCONST struct rule * ZCONST rulep;
|
||||||
|
ZCONST long offset;
|
||||||
|
{
|
||||||
|
register int leapyear;
|
||||||
|
register time_t value;
|
||||||
|
register int i;
|
||||||
|
int d, m1, yy0, yy1, yy2, dow;
|
||||||
|
|
||||||
|
value = 0;
|
||||||
|
leapyear = leap(year);
|
||||||
|
switch (rulep->r_type) {
|
||||||
|
|
||||||
|
case JULIAN_DAY:
|
||||||
|
/*
|
||||||
|
** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap
|
||||||
|
** years.
|
||||||
|
** In non-leap years, or if the day number is 59 or less, just
|
||||||
|
** add SECSPERDAY times the day number-1 to the time of
|
||||||
|
** January 1, midnight, to get the day.
|
||||||
|
*/
|
||||||
|
value = janfirst + (rulep->r_day - 1) * SECSPERDAY;
|
||||||
|
if (leapyear && rulep->r_day >= 60)
|
||||||
|
value += SECSPERDAY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DAY_OF_YEAR:
|
||||||
|
/*
|
||||||
|
** n - day of year.
|
||||||
|
** Just add SECSPERDAY times the day number to the time of
|
||||||
|
** January 1, midnight, to get the day.
|
||||||
|
*/
|
||||||
|
value = janfirst + rulep->r_day * SECSPERDAY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MONTH_NTH_DAY_OF_WEEK:
|
||||||
|
/*
|
||||||
|
** Mm.n.d - nth "dth day" of month m.
|
||||||
|
*/
|
||||||
|
value = janfirst;
|
||||||
|
/*
|
||||||
|
for (i = 0; i < rulep->r_mon - 1; ++i)
|
||||||
|
value += mon_lengths[leapyear][i] * SECSPERDAY;
|
||||||
|
*/
|
||||||
|
value += yr_days[leapyear][rulep->r_mon - 1] * SECSPERDAY;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Use Zeller's Congruence to get day-of-week of first day of
|
||||||
|
** month.
|
||||||
|
*/
|
||||||
|
m1 = (rulep->r_mon + 9) % 12 + 1;
|
||||||
|
yy0 = (rulep->r_mon <= 2) ? (year - 1) : year;
|
||||||
|
yy1 = yy0 / 100;
|
||||||
|
yy2 = yy0 % 100;
|
||||||
|
dow = ((26 * m1 - 2) / 10 +
|
||||||
|
1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7;
|
||||||
|
if (dow < 0)
|
||||||
|
dow += DAYSPERWEEK;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** "dow" is the day-of-week of the first day of the month. Get
|
||||||
|
** the day-of-month (zero-origin) of the first "dow" day of the
|
||||||
|
** month.
|
||||||
|
*/
|
||||||
|
d = rulep->r_day - dow;
|
||||||
|
if (d < 0)
|
||||||
|
d += DAYSPERWEEK;
|
||||||
|
for (i = 1; i < rulep->r_week; ++i) {
|
||||||
|
if (d + DAYSPERWEEK >= mon_lengths[leapyear][rulep->r_mon - 1])
|
||||||
|
break;
|
||||||
|
d += DAYSPERWEEK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** "d" is the day-of-month (zero-origin) of the day we want.
|
||||||
|
*/
|
||||||
|
value += d * SECSPERDAY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** "value" is the Epoch-relative time of 00:00:00 UTC on the day in
|
||||||
|
** question. To get the Epoch-relative time of the specified local
|
||||||
|
** time on that day, add the transition time and the current offset
|
||||||
|
** from UTC.
|
||||||
|
*/
|
||||||
|
return value + rulep->r_time + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void generate_transitions(sp, start, end)
|
||||||
|
register struct state * ZCONST sp;
|
||||||
|
ZCONST struct rule * ZCONST start;
|
||||||
|
ZCONST struct rule * ZCONST end;
|
||||||
|
{
|
||||||
|
register int year;
|
||||||
|
register time_t janfirst;
|
||||||
|
time_t starttime;
|
||||||
|
time_t endtime;
|
||||||
|
long stdoffset = -sp->ttis[0].tt_gmtoff;
|
||||||
|
long dstoffset = -sp->ttis[1].tt_gmtoff;
|
||||||
|
register time_t * atp;
|
||||||
|
register unsigned char * typep;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Two transitions per year, from EPOCH_YEAR to LAST_GOOD_YEAR.
|
||||||
|
*/
|
||||||
|
sp->timecnt = 2 * (LAST_GOOD_YEAR - EPOCH_YEAR + 1);
|
||||||
|
atp = sp->ats;
|
||||||
|
typep = sp->types;
|
||||||
|
janfirst = 0;
|
||||||
|
for (year = EPOCH_YEAR; year <= LAST_GOOD_YEAR; ++year) {
|
||||||
|
starttime = transtime(janfirst, year, start, stdoffset);
|
||||||
|
endtime = transtime(janfirst, year, end, dstoffset);
|
||||||
|
if (starttime > endtime) {
|
||||||
|
*atp++ = endtime;
|
||||||
|
*typep++ = 0; /* DST ends */
|
||||||
|
*atp++ = starttime;
|
||||||
|
*typep++ = 1; /* DST begins */
|
||||||
|
} else {
|
||||||
|
*atp++ = starttime;
|
||||||
|
*typep++ = 1; /* DST begins */
|
||||||
|
*atp++ = endtime;
|
||||||
|
*typep++ = 0; /* DST ends */
|
||||||
|
}
|
||||||
|
janfirst += year_lengths[leap(year)] * SECSPERDAY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ZCONST char *getzname(strp)
|
||||||
|
ZCONST char *strp;
|
||||||
|
{
|
||||||
|
register char c;
|
||||||
|
|
||||||
|
while ((c = *strp) != '\0' && !isdigit(c) && c != ',' && c != '-' &&
|
||||||
|
c != '+')
|
||||||
|
++strp;
|
||||||
|
return strp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ZCONST char *getnum(strp, nump, min, max)
|
||||||
|
ZCONST char *strp;
|
||||||
|
int * ZCONST nump;
|
||||||
|
ZCONST int min;
|
||||||
|
ZCONST int max;
|
||||||
|
{
|
||||||
|
register char c;
|
||||||
|
register int num;
|
||||||
|
|
||||||
|
if (strp == NULL || !isdigit(c = *strp))
|
||||||
|
return NULL;
|
||||||
|
num = 0;
|
||||||
|
do {
|
||||||
|
num = num * 10 + (c - '0');
|
||||||
|
if (num > max)
|
||||||
|
return NULL; /* illegal value */
|
||||||
|
c = *++strp;
|
||||||
|
} while (isdigit(c));
|
||||||
|
if (num < min)
|
||||||
|
return NULL; /* illegal value */
|
||||||
|
*nump = num;
|
||||||
|
return strp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ZCONST char *getsecs(strp, secsp)
|
||||||
|
ZCONST char *strp;
|
||||||
|
long * ZCONST secsp;
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like
|
||||||
|
** "M10.4.6/26", which does not conform to Posix,
|
||||||
|
** but which specifies the equivalent of
|
||||||
|
** ``02:00 on the first Sunday on or after 23 Oct''.
|
||||||
|
*/
|
||||||
|
strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1);
|
||||||
|
if (strp == NULL)
|
||||||
|
return NULL;
|
||||||
|
*secsp = num * (long) SECSPERHOUR;
|
||||||
|
if (*strp == ':') {
|
||||||
|
++strp;
|
||||||
|
strp = getnum(strp, &num, 0, MINSPERHOUR - 1);
|
||||||
|
if (strp == NULL)
|
||||||
|
return NULL;
|
||||||
|
*secsp += num * SECSPERMIN;
|
||||||
|
if (*strp == ':') {
|
||||||
|
++strp;
|
||||||
|
/* `SECSPERMIN' allows for leap seconds. */
|
||||||
|
strp = getnum(strp, &num, 0, SECSPERMIN);
|
||||||
|
if (strp == NULL)
|
||||||
|
return NULL;
|
||||||
|
*secsp += num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ZCONST char *getoffset(strp, offsetp)
|
||||||
|
ZCONST char *strp;
|
||||||
|
long * ZCONST offsetp;
|
||||||
|
{
|
||||||
|
register int neg = 0;
|
||||||
|
|
||||||
|
if (*strp == '-') {
|
||||||
|
neg = 1;
|
||||||
|
++strp;
|
||||||
|
} else if (*strp == '+')
|
||||||
|
++strp;
|
||||||
|
strp = getsecs(strp, offsetp);
|
||||||
|
if (strp == NULL)
|
||||||
|
return NULL; /* illegal time */
|
||||||
|
if (neg)
|
||||||
|
*offsetp = -*offsetp;
|
||||||
|
return strp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ZCONST char *getrule(strp, rulep)
|
||||||
|
ZCONST char *strp;
|
||||||
|
struct rule * ZCONST rulep;
|
||||||
|
{
|
||||||
|
if (*strp == 'J') {
|
||||||
|
/*
|
||||||
|
** Julian day.
|
||||||
|
*/
|
||||||
|
rulep->r_type = JULIAN_DAY;
|
||||||
|
++strp;
|
||||||
|
strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);
|
||||||
|
} else if (*strp == 'M') {
|
||||||
|
/*
|
||||||
|
** Month, week, day.
|
||||||
|
*/
|
||||||
|
rulep->r_type = MONTH_NTH_DAY_OF_WEEK;
|
||||||
|
++strp;
|
||||||
|
strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);
|
||||||
|
if (strp == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (*strp++ != '.')
|
||||||
|
return NULL;
|
||||||
|
strp = getnum(strp, &rulep->r_week, 1, 5);
|
||||||
|
if (strp == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (*strp++ != '.')
|
||||||
|
return NULL;
|
||||||
|
strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);
|
||||||
|
} else if (isdigit(*strp)) {
|
||||||
|
/*
|
||||||
|
** Day of year.
|
||||||
|
*/
|
||||||
|
rulep->r_type = DAY_OF_YEAR;
|
||||||
|
strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);
|
||||||
|
} else return NULL; /* invalid format */
|
||||||
|
if (strp == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (*strp == '/') {
|
||||||
|
/*
|
||||||
|
** Time specified.
|
||||||
|
*/
|
||||||
|
++strp;
|
||||||
|
strp = getsecs(strp, &rulep->r_time);
|
||||||
|
} else
|
||||||
|
rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */
|
||||||
|
return strp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Parse_TZ(name, sp)
|
||||||
|
ZCONST char *name;
|
||||||
|
register struct state * ZCONST sp;
|
||||||
|
{
|
||||||
|
ZCONST char * stdname;
|
||||||
|
ZCONST char * dstname;
|
||||||
|
size_t stdlen;
|
||||||
|
size_t dstlen;
|
||||||
|
long stdoffset;
|
||||||
|
long dstoffset;
|
||||||
|
register char * cp;
|
||||||
|
|
||||||
|
dstname = NULL;
|
||||||
|
stdname = name;
|
||||||
|
name = getzname(name);
|
||||||
|
stdlen = name - stdname;
|
||||||
|
if (stdlen < 3)
|
||||||
|
return -1;
|
||||||
|
if (*name == '\0')
|
||||||
|
return -1;
|
||||||
|
name = getoffset(name, &stdoffset);
|
||||||
|
if (name == NULL)
|
||||||
|
return -1;
|
||||||
|
if (*name != '\0') {
|
||||||
|
dstname = name;
|
||||||
|
name = getzname(name);
|
||||||
|
dstlen = name - dstname; /* length of DST zone name */
|
||||||
|
if (dstlen < 3)
|
||||||
|
return -1;
|
||||||
|
if (*name != '\0' && *name != ',' && *name != ';') {
|
||||||
|
name = getoffset(name, &dstoffset);
|
||||||
|
if (name == NULL)
|
||||||
|
return -1;
|
||||||
|
} else
|
||||||
|
dstoffset = stdoffset - SECSPERHOUR;
|
||||||
|
if (*name == '\0')
|
||||||
|
name = TZDEFRULESTRING;
|
||||||
|
if (*name == ',' || *name == ';') {
|
||||||
|
struct rule start;
|
||||||
|
struct rule end;
|
||||||
|
|
||||||
|
++name;
|
||||||
|
if ((name = getrule(name, &start)) == NULL)
|
||||||
|
return -1;
|
||||||
|
if (*name++ != ',')
|
||||||
|
return -1;
|
||||||
|
if ((name = getrule(name, &end)) == NULL)
|
||||||
|
return -1;
|
||||||
|
if (*name != '\0')
|
||||||
|
return -1;
|
||||||
|
sp->typecnt = 2; /* standard time and DST */
|
||||||
|
sp->ttis[0].tt_gmtoff = -stdoffset;
|
||||||
|
sp->ttis[0].tt_isdst = 0;
|
||||||
|
sp->ttis[0].tt_abbrind = 0;
|
||||||
|
sp->ttis[1].tt_gmtoff = -dstoffset;
|
||||||
|
sp->ttis[1].tt_isdst = 1;
|
||||||
|
sp->ttis[1].tt_abbrind = stdlen + 1;
|
||||||
|
generate_transitions(sp, &start, &end);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dstlen = 0;
|
||||||
|
sp->typecnt = 1; /* only standard time */
|
||||||
|
sp->timecnt = 0;
|
||||||
|
sp->ttis[0].tt_gmtoff = -stdoffset;
|
||||||
|
sp->ttis[0].tt_isdst = 0;
|
||||||
|
sp->ttis[0].tt_abbrind = 0;
|
||||||
|
}
|
||||||
|
sp->charcnt = stdlen + 1;
|
||||||
|
if (dstlen != 0)
|
||||||
|
sp->charcnt += dstlen + 1;
|
||||||
|
if ((size_t) sp->charcnt > sizeof(sp->chars))
|
||||||
|
return -1;
|
||||||
|
cp = sp->chars;
|
||||||
|
(void) strncpy(cp, stdname, stdlen);
|
||||||
|
cp += stdlen;
|
||||||
|
*cp++ = '\0';
|
||||||
|
if (dstlen != 0) {
|
||||||
|
(void) strncpy(cp, dstname, dstlen);
|
||||||
|
*(cp + dstlen) = '\0';
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tzset()
|
||||||
|
{
|
||||||
|
char *TZstring;
|
||||||
|
int dstfirst;
|
||||||
|
static char *old_TZstring = NULL;
|
||||||
|
|
||||||
|
TZstring = getenv("TZ"); /* read TZ envvar */
|
||||||
|
if (old_TZstring && TZstring && !strcmp(old_TZstring, TZstring))
|
||||||
|
/* do not repeatedly parse an unchanged TZ specification */
|
||||||
|
return;
|
||||||
|
if ((TZstring && TZstring[0] && Parse_TZ(TZstring, &statism) == 0)
|
||||||
|
|| IZTZ_GETLOCALETZINFO(&statism, generate_transitions)
|
||||||
|
|| Parse_TZ(gmt, &statism) == 0) {
|
||||||
|
daylight = statism.typecnt > 1;
|
||||||
|
dstfirst = daylight && statism.ttis[0].tt_isdst && !statism.ttis[1].tt_isdst;
|
||||||
|
timezone = -statism.ttis[dstfirst].tt_gmtoff;
|
||||||
|
tzname[0] = statism.chars + statism.ttis[dstfirst].tt_abbrind;
|
||||||
|
tzname[1] = statism.chars + statism.ttis[!dstfirst].tt_abbrind;
|
||||||
|
real_timezone_is_set = TRUE;
|
||||||
|
if (TZstring) {
|
||||||
|
if (old_TZstring)
|
||||||
|
old_TZstring = realloc(old_TZstring, strlen(TZstring) + 1);
|
||||||
|
else
|
||||||
|
old_TZstring = malloc(strlen(TZstring) + 1);
|
||||||
|
if (old_TZstring)
|
||||||
|
strcpy(old_TZstring, TZstring);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
timezone = 0; /* default is GMT0 which means no offsets */
|
||||||
|
daylight = 0; /* from local system time */
|
||||||
|
real_timezone_is_set = FALSE;
|
||||||
|
if (old_TZstring) {
|
||||||
|
free(old_TZstring);
|
||||||
|
old_TZstring = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef IZTZ_SETLOCALTZINFO
|
||||||
|
/* Some SAS/C library functions, e.g. stat(), call library */
|
||||||
|
/* __tzset() themselves. So envvar TZ *must* exist in order to */
|
||||||
|
/* to get the right offset from GMT. XXX TRY HARD to fix this! */
|
||||||
|
set_TZ(timezone, daylight);
|
||||||
|
#endif /* IZTZ_SETLOCALTZINFO */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX Does this also help SAS/C library work? */
|
||||||
|
void __tzset()
|
||||||
|
{
|
||||||
|
if (!real_timezone_is_set) tzset();
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct tm _tmbuf;
|
||||||
|
|
||||||
|
struct tm *gmtime(when)
|
||||||
|
ZCONST time_t *when;
|
||||||
|
{
|
||||||
|
long days = *when / SECSPERDAY;
|
||||||
|
long secs = *when % SECSPERDAY;
|
||||||
|
int isleap;
|
||||||
|
|
||||||
|
memset(&_tmbuf, 0, sizeof(_tmbuf)); /* get any nonstandard fields */
|
||||||
|
_tmbuf.tm_wday = (days + EPOCH_WDAY) % 7;
|
||||||
|
_tmbuf.tm_year = EPOCH_YEAR - TM_YEAR_BASE;
|
||||||
|
isleap = leap(_tmbuf.tm_year + TM_YEAR_BASE);
|
||||||
|
while (days >= year_lengths[isleap]) {
|
||||||
|
days -= year_lengths[isleap];
|
||||||
|
_tmbuf.tm_year++;
|
||||||
|
isleap = leap(_tmbuf.tm_year + TM_YEAR_BASE);
|
||||||
|
}
|
||||||
|
_tmbuf.tm_mon = 0;
|
||||||
|
_tmbuf.tm_yday = days;
|
||||||
|
while (days >= mon_lengths[isleap][_tmbuf.tm_mon])
|
||||||
|
days -= mon_lengths[isleap][_tmbuf.tm_mon++];
|
||||||
|
_tmbuf.tm_mday = days + 1;
|
||||||
|
_tmbuf.tm_isdst = 0;
|
||||||
|
_tmbuf.tm_sec = secs % SECSPERMIN;
|
||||||
|
_tmbuf.tm_min = (secs / SECSPERMIN) % SECSPERMIN;
|
||||||
|
_tmbuf.tm_hour = secs / SECSPERHOUR;
|
||||||
|
return &_tmbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm *localtime(when)
|
||||||
|
ZCONST time_t *when;
|
||||||
|
{
|
||||||
|
time_t localwhen = *when;
|
||||||
|
int timetype;
|
||||||
|
struct tm *ret;
|
||||||
|
|
||||||
|
__tzset();
|
||||||
|
if (statism.timecnt == 0 || localwhen < statism.ats[0])
|
||||||
|
timetype = statism.ttis[0].tt_isdst && statism.typecnt > 1 &&
|
||||||
|
!statism.ttis[1].tt_isdst;
|
||||||
|
else {
|
||||||
|
for (timetype = 1; timetype < statism.timecnt; ++timetype)
|
||||||
|
if (localwhen < statism.ats[timetype])
|
||||||
|
break;
|
||||||
|
timetype = statism.types[timetype - 1];
|
||||||
|
}
|
||||||
|
localwhen += statism.ttis[timetype].tt_gmtoff;
|
||||||
|
ret = gmtime(&localwhen);
|
||||||
|
ret->tm_isdst = statism.ttis[timetype].tt_isdst;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NEED__ISINDST
|
||||||
|
int _isindst(tb)
|
||||||
|
struct tm *tb;
|
||||||
|
{
|
||||||
|
time_t localt; /* time_t equivalent of given tm struct */
|
||||||
|
time_t univt; /* assumed UTC value of given time */
|
||||||
|
long tzoffset_adj; /* timezone-adjustment `remainder' */
|
||||||
|
int bailout_cnt; /* counter of tries for tz correction */
|
||||||
|
int timetype;
|
||||||
|
|
||||||
|
__tzset();
|
||||||
|
|
||||||
|
/* when DST is unsupported in current timezone, DST is always off */
|
||||||
|
if (statism.typecnt <= 1) return FALSE;
|
||||||
|
|
||||||
|
localt = mkgmtime(tb);
|
||||||
|
if (localt == (time_t)-1)
|
||||||
|
/* specified time is out-of-range, default to FALSE */
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
univt = localt - statism.ttis[0].tt_gmtoff;
|
||||||
|
bailout_cnt = 3;
|
||||||
|
do {
|
||||||
|
if (statism.timecnt == 0 || univt < statism.ats[0])
|
||||||
|
timetype = statism.ttis[0].tt_isdst && statism.typecnt > 1 &&
|
||||||
|
!statism.ttis[1].tt_isdst;
|
||||||
|
else {
|
||||||
|
for (timetype = 1; timetype < statism.timecnt; ++timetype)
|
||||||
|
if (univt < statism.ats[timetype])
|
||||||
|
break;
|
||||||
|
timetype = statism.types[timetype - 1];
|
||||||
|
}
|
||||||
|
if ((tzoffset_adj = localt - univt - statism.ttis[timetype].tt_gmtoff)
|
||||||
|
== 0L)
|
||||||
|
break;
|
||||||
|
univt += tzoffset_adj;
|
||||||
|
} while (--bailout_cnt > 0);
|
||||||
|
|
||||||
|
/* return TRUE when DST is active at given time */
|
||||||
|
return (statism.ttis[timetype].tt_isdst);
|
||||||
|
}
|
||||||
|
#endif /* NEED__ISINDST */
|
||||||
|
#endif /* !IZ_MKTIME_ONLY */
|
||||||
|
|
||||||
|
/* Return the equivalent in seconds past 12:00:00 a.m. Jan 1, 1970 GMT
|
||||||
|
of the local time and date in the exploded time structure `tm',
|
||||||
|
adjust out of range fields in `tm' and set `tm->tm_yday', `tm->tm_wday'.
|
||||||
|
If `tm->tm_isdst < 0' was passed to mktime(), the correct setting of
|
||||||
|
tm_isdst is determined and returned. Otherwise, mktime() assumes this
|
||||||
|
field as valid; its information is used when converting local time
|
||||||
|
to UTC.
|
||||||
|
Return -1 if time in `tm' cannot be represented as time_t value. */
|
||||||
|
|
||||||
|
time_t mktime(tm)
|
||||||
|
struct tm *tm;
|
||||||
|
{
|
||||||
|
struct tm *ltm; /* Local time. */
|
||||||
|
time_t loctime; /* The time_t value of local time. */
|
||||||
|
time_t then; /* The time to return. */
|
||||||
|
long tzoffset_adj = 0; /* timezone-adjustment `remainder' */
|
||||||
|
int bailout_cnt; /* counter of tries for tz correction */
|
||||||
|
int save_isdst; /* Copy of the tm->isdst input value */
|
||||||
|
|
||||||
|
save_isdst = tm->tm_isdst;
|
||||||
|
loctime = mkgmtime(tm);
|
||||||
|
if (loctime == -1) {
|
||||||
|
tm->tm_isdst = save_isdst;
|
||||||
|
return (time_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Correct for the timezone and any daylight savings time.
|
||||||
|
The correction is verified and repeated when not correct, to
|
||||||
|
take into account the rare case that a change to or from daylight
|
||||||
|
savings time occurs between when it is the time in `tm' locally
|
||||||
|
and when it is that time in Greenwich. After the second correction,
|
||||||
|
the "timezone & daylight" offset should be correct in all cases. To
|
||||||
|
be sure, we allow a third try, but then the loop is stopped. */
|
||||||
|
bailout_cnt = 3;
|
||||||
|
then = loctime;
|
||||||
|
do {
|
||||||
|
ltm = localtime(&then);
|
||||||
|
if (ltm == (struct tm *)NULL ||
|
||||||
|
(tzoffset_adj = loctime - mkgmtime(ltm)) == 0L)
|
||||||
|
break;
|
||||||
|
then += tzoffset_adj;
|
||||||
|
} while (--bailout_cnt > 0);
|
||||||
|
|
||||||
|
if (ltm == (struct tm *)NULL || tzoffset_adj != 0L) {
|
||||||
|
/* Signal failure if timezone adjustment did not converge. */
|
||||||
|
tm->tm_isdst = save_isdst;
|
||||||
|
return (time_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (save_isdst >= 0) {
|
||||||
|
if (ltm->tm_isdst && !save_isdst)
|
||||||
|
{
|
||||||
|
if (then + 3600 < then)
|
||||||
|
then = (time_t)-1;
|
||||||
|
else
|
||||||
|
then += 3600;
|
||||||
|
}
|
||||||
|
else if (!ltm->tm_isdst && save_isdst)
|
||||||
|
{
|
||||||
|
if (then - 3600 > then)
|
||||||
|
then = (time_t)-1;
|
||||||
|
else
|
||||||
|
then -= 3600;
|
||||||
|
}
|
||||||
|
ltm->tm_isdst = save_isdst;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tm != ltm) /* `tm' may already point to localtime's internal storage */
|
||||||
|
*tm = *ltm;
|
||||||
|
|
||||||
|
return then;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NO_TIME_T_MAX
|
||||||
|
/* Provide default values for the upper limit of the time_t range.
|
||||||
|
These are the result of the decomposition into a `struct tm' for
|
||||||
|
the time value 0xFFFFFFFEL ( = (time_t)-2 ).
|
||||||
|
Note: `(time_t)-1' is reserved for "invalid time"! */
|
||||||
|
# ifndef TM_YEAR_MAX
|
||||||
|
# define TM_YEAR_MAX 2106
|
||||||
|
# endif
|
||||||
|
# ifndef TM_MON_MAX
|
||||||
|
# define TM_MON_MAX 1 /* February */
|
||||||
|
# endif
|
||||||
|
# ifndef TM_MDAY_MAX
|
||||||
|
# define TM_MDAY_MAX 7
|
||||||
|
# endif
|
||||||
|
# ifndef TM_HOUR_MAX
|
||||||
|
# define TM_HOUR_MAX 6
|
||||||
|
# endif
|
||||||
|
# ifndef TM_MIN_MAX
|
||||||
|
# define TM_MIN_MAX 28
|
||||||
|
# endif
|
||||||
|
# ifndef TM_SEC_MAX
|
||||||
|
# define TM_SEC_MAX 14
|
||||||
|
# endif
|
||||||
|
#endif /* NO_TIME_T_MAX */
|
||||||
|
|
||||||
|
/* Adjusts out-of-range values for `tm' field `tm_member'. */
|
||||||
|
#define ADJUST_TM(tm_member, tm_carry, modulus) \
|
||||||
|
if ((tm_member) < 0) { \
|
||||||
|
tm_carry -= (1 - ((tm_member)+1) / (modulus)); \
|
||||||
|
tm_member = (modulus-1) + (((tm_member)+1) % (modulus)); \
|
||||||
|
} else if ((tm_member) >= (modulus)) { \
|
||||||
|
tm_carry += (tm_member) / (modulus); \
|
||||||
|
tm_member = (tm_member) % (modulus); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the equivalent in seconds past 12:00:00 a.m. Jan 1, 1970 GMT
|
||||||
|
of the Greenwich Mean time and date in the exploded time structure `tm'.
|
||||||
|
This function does always put back normalized values into the `tm' struct,
|
||||||
|
parameter, including the calculated numbers for `tm->tm_yday',
|
||||||
|
`tm->tm_wday', and `tm->tm_isdst'.
|
||||||
|
Returns -1 if the time in the `tm' parameter cannot be represented
|
||||||
|
as valid `time_t' number. */
|
||||||
|
|
||||||
|
time_t mkgmtime(tm)
|
||||||
|
struct tm *tm;
|
||||||
|
{
|
||||||
|
int years, months, days, hours, minutes, seconds;
|
||||||
|
|
||||||
|
years = tm->tm_year + TM_YEAR_BASE; /* year - 1900 -> year */
|
||||||
|
months = tm->tm_mon; /* 0..11 */
|
||||||
|
days = tm->tm_mday - 1; /* 1..31 -> 0..30 */
|
||||||
|
hours = tm->tm_hour; /* 0..23 */
|
||||||
|
minutes = tm->tm_min; /* 0..59 */
|
||||||
|
seconds = tm->tm_sec; /* 0..61 in ANSI C. */
|
||||||
|
|
||||||
|
ADJUST_TM(seconds, minutes, 60)
|
||||||
|
ADJUST_TM(minutes, hours, 60)
|
||||||
|
ADJUST_TM(hours, days, 24)
|
||||||
|
ADJUST_TM(months, years, 12)
|
||||||
|
if (days < 0)
|
||||||
|
do {
|
||||||
|
if (--months < 0) {
|
||||||
|
--years;
|
||||||
|
months = 11;
|
||||||
|
}
|
||||||
|
days += monthlen(months, years);
|
||||||
|
} while (days < 0);
|
||||||
|
else
|
||||||
|
while (days >= monthlen(months, years)) {
|
||||||
|
days -= monthlen(months, years);
|
||||||
|
if (++months >= 12) {
|
||||||
|
++years;
|
||||||
|
months = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore adjusted values in tm structure */
|
||||||
|
tm->tm_year = years - TM_YEAR_BASE;
|
||||||
|
tm->tm_mon = months;
|
||||||
|
tm->tm_mday = days + 1;
|
||||||
|
tm->tm_hour = hours;
|
||||||
|
tm->tm_min = minutes;
|
||||||
|
tm->tm_sec = seconds;
|
||||||
|
|
||||||
|
/* Set `days' to the number of days into the year. */
|
||||||
|
days += YDAYS(months, years);
|
||||||
|
tm->tm_yday = days;
|
||||||
|
|
||||||
|
/* Now calculate `days' to the number of days since Jan 1, 1970. */
|
||||||
|
days = (unsigned)days + 365 * (unsigned)(years - EPOCH_YEAR) +
|
||||||
|
(unsigned)(nleap (years));
|
||||||
|
tm->tm_wday = ((unsigned)days + EPOCH_WDAY) % 7;
|
||||||
|
tm->tm_isdst = 0;
|
||||||
|
|
||||||
|
if (years < EPOCH_YEAR)
|
||||||
|
return (time_t)-1;
|
||||||
|
|
||||||
|
#if (defined(TM_YEAR_MAX) && defined(TM_MON_MAX) && defined(TM_MDAY_MAX))
|
||||||
|
#if (defined(TM_HOUR_MAX) && defined(TM_MIN_MAX) && defined(TM_SEC_MAX))
|
||||||
|
if (years > TM_YEAR_MAX ||
|
||||||
|
(years == TM_YEAR_MAX &&
|
||||||
|
(tm->tm_yday > (YDAYS(TM_MON_MAX, TM_YEAR_MAX) + (TM_MDAY_MAX - 1)) ||
|
||||||
|
(tm->tm_yday == (YDAYS(TM_MON_MAX, TM_YEAR_MAX) + (TM_MDAY_MAX - 1)) &&
|
||||||
|
(hours > TM_HOUR_MAX ||
|
||||||
|
(hours == TM_HOUR_MAX &&
|
||||||
|
(minutes > TM_MIN_MAX ||
|
||||||
|
(minutes == TM_MIN_MAX && seconds > TM_SEC_MAX) )))))))
|
||||||
|
return (time_t)-1;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (time_t)(SECSPERDAY * (unsigned long)(unsigned)days +
|
||||||
|
SECSPERHOUR * (unsigned long)hours +
|
||||||
|
(unsigned long)(SECSPERMIN * minutes + seconds));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __timezone_c */
|
84
third_party/unzip/timezone.h
vendored
Normal file
84
third_party/unzip/timezone.h
vendored
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2001 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
#ifndef __timezone_h
|
||||||
|
#define __timezone_h
|
||||||
|
#include "third_party/unzip/crc32.h"
|
||||||
|
#include "libc/calls/weirdtypes.h"
|
||||||
|
|
||||||
|
#ifndef IZ_MKTIME_ONLY
|
||||||
|
|
||||||
|
/* limits for our timezone info data:
|
||||||
|
* we support only basic standard and daylight time, with max 2 transitions
|
||||||
|
* per year, but for the maximum range of years a 32-bit second counter
|
||||||
|
* can cover (these are 136 years plus a bit more than one month)
|
||||||
|
*/
|
||||||
|
#define TZ_MAX_TIMES 272 /* (=2*(LastGoodYr + 1 - FirstGoodYr) */
|
||||||
|
#define TZ_MAX_TYPES 2 /* We only support basic standard and daylight */
|
||||||
|
#ifdef WIN32 /* Win32 tzinfo supplies at max (2 * 32) chars of tz names */
|
||||||
|
#define TZ_MAX_CHARS 64 /* Maximum number of abbreviation characters */
|
||||||
|
#else
|
||||||
|
#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* supported types of transition rules */
|
||||||
|
#define JULIAN_DAY 0 /* Jn - Julian day */
|
||||||
|
#define DAY_OF_YEAR 1 /* n - day of year */
|
||||||
|
#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */
|
||||||
|
|
||||||
|
|
||||||
|
struct ttinfo {
|
||||||
|
long tt_gmtoff; /* UTC offset in seconds */
|
||||||
|
int tt_isdst; /* used to set tm_isdst */
|
||||||
|
int tt_abbrind; /* abbreviation list index */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct state {
|
||||||
|
int timecnt;
|
||||||
|
int typecnt;
|
||||||
|
int charcnt;
|
||||||
|
time_t ats[TZ_MAX_TIMES];
|
||||||
|
unsigned char types[TZ_MAX_TIMES];
|
||||||
|
struct ttinfo ttis[TZ_MAX_TYPES];
|
||||||
|
char chars[TZ_MAX_CHARS];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rule {
|
||||||
|
int r_type; /* type of rule--JULIAN_DAY etc */
|
||||||
|
int r_day; /* day number of rule */
|
||||||
|
int r_week; /* week number of rule */
|
||||||
|
int r_mon; /* month number of rule */
|
||||||
|
long r_time; /* transition time of rule */
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int real_timezone_is_set; /* set by tzset() */
|
||||||
|
|
||||||
|
|
||||||
|
/* prototypes of functions not in time.h */
|
||||||
|
|
||||||
|
void __tzset OF((void));
|
||||||
|
|
||||||
|
#ifdef NEED__ISINDST
|
||||||
|
int _isindst OF((struct tm *tb));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* callback function to be supplied by the program that uses this library */
|
||||||
|
int GetPlatformLocalTimezone OF((register struct state * ZCONST sp,
|
||||||
|
void (*fill_tzstate_from_rules)(struct state * ZCONST sp_res,
|
||||||
|
ZCONST struct rule * ZCONST start,
|
||||||
|
ZCONST struct rule * ZCONST end)));
|
||||||
|
#ifdef IZTZ_SETLOCALTZINFO
|
||||||
|
void set_TZ OF((long time_zone, int day_light));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !IZ_MKTIME_ONLY */
|
||||||
|
|
||||||
|
time_t mkgmtime OF((struct tm *tm));
|
||||||
|
|
||||||
|
#endif
|
694
third_party/unzip/ttyio.c
vendored
Normal file
694
third_party/unzip/ttyio.c
vendored
Normal file
|
@ -0,0 +1,694 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2008 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ttyio.c
|
||||||
|
|
||||||
|
This file contains routines for doing console input/output, including code
|
||||||
|
for non-echoing input. It is used by the encryption/decryption code but
|
||||||
|
does not contain any restricted code itself. This file is shared between
|
||||||
|
Info-ZIP's Zip and UnZip.
|
||||||
|
|
||||||
|
Contains: echo() (VMS only)
|
||||||
|
Echon() (Unix only)
|
||||||
|
Echoff() (Unix only)
|
||||||
|
screensize() (Unix only)
|
||||||
|
zgetch() (Unix, VMS, and non-Unix/VMS versions)
|
||||||
|
getp() ("PC," Unix/Atari/Be, VMS/VMCMS/MVS)
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define __TTYIO_C /* identifies this source module */
|
||||||
|
|
||||||
|
#include "third_party/unzip/zip.h"
|
||||||
|
#include "libc/calls/calls.h"
|
||||||
|
#include "libc/calls/struct/termios.h"
|
||||||
|
#include "libc/calls/termios.h"
|
||||||
|
#include "third_party/unzip/crypt.h"
|
||||||
|
|
||||||
|
#if (CRYPT || (defined(UNZIP) && !defined(FUNZIP)))
|
||||||
|
/* Non-echo console/keyboard input is needed for (en/de)cryption's password
|
||||||
|
* entry, and for UnZip(SFX)'s MORE and Pause features.
|
||||||
|
* (The corresponding #endif is found at the end of this module.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "third_party/unzip/ttyio.h"
|
||||||
|
|
||||||
|
#ifndef PUTC
|
||||||
|
# define PUTC putc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ZIP
|
||||||
|
# ifdef GLOBAL /* used in Amiga system headers, maybe others too */
|
||||||
|
# undef GLOBAL
|
||||||
|
# endif
|
||||||
|
# define GLOBAL(g) g
|
||||||
|
#else
|
||||||
|
# define GLOBAL(g) G.g
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__ATHEOS__) || defined(__BEOS__)) /* why yes, we do */
|
||||||
|
# define HAVE_TERMIOS_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _POSIX_VERSION
|
||||||
|
# ifndef USE_POSIX_TERMIOS
|
||||||
|
# define USE_POSIX_TERMIOS /* use POSIX style termio (termios) */
|
||||||
|
# endif
|
||||||
|
# ifndef HAVE_TERMIOS_H
|
||||||
|
# define HAVE_TERMIOS_H /* POSIX termios.h */
|
||||||
|
# endif
|
||||||
|
#endif /* _POSIX_VERSION */
|
||||||
|
|
||||||
|
#ifdef UNZIP /* Zip handles this with the unix/configure script */
|
||||||
|
# ifndef _POSIX_VERSION
|
||||||
|
# if (defined(SYSV) || defined(CRAY)) && !defined(__MINT__)
|
||||||
|
# ifndef USE_SYSV_TERMIO
|
||||||
|
# define USE_SYSV_TERMIO
|
||||||
|
# endif
|
||||||
|
# ifdef COHERENT
|
||||||
|
# ifndef HAVE_TERMIO_H
|
||||||
|
# define HAVE_TERMIO_H
|
||||||
|
# endif
|
||||||
|
# ifdef HAVE_SYS_TERMIO_H
|
||||||
|
# undef HAVE_SYS_TERMIO_H
|
||||||
|
# endif
|
||||||
|
# else /* !COHERENT */
|
||||||
|
# ifdef HAVE_TERMIO_H
|
||||||
|
# undef HAVE_TERMIO_H
|
||||||
|
# endif
|
||||||
|
# ifndef HAVE_SYS_TERMIO_H
|
||||||
|
# define HAVE_SYS_TERMIO_H
|
||||||
|
# endif
|
||||||
|
# endif /* ?COHERENT */
|
||||||
|
# endif /* (SYSV || CRAY) && !__MINT__ */
|
||||||
|
# endif /* !_POSIX_VERSION */
|
||||||
|
# if !(defined(BSD4_4) || defined(SYSV) || defined(__convexc__))
|
||||||
|
# ifndef NO_FCNTL_H
|
||||||
|
# define NO_FCNTL_H
|
||||||
|
# endif
|
||||||
|
# endif /* !(BSD4_4 || SYSV || __convexc__) */
|
||||||
|
#endif /* UNZIP */
|
||||||
|
|
||||||
|
#ifdef HAVE_TERMIOS_H
|
||||||
|
# ifndef USE_POSIX_TERMIOS
|
||||||
|
# define USE_POSIX_TERMIOS
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(HAVE_TERMIO_H) || defined(HAVE_SYS_TERMIO_H))
|
||||||
|
# ifndef USE_SYSV_TERMIO
|
||||||
|
# define USE_SYSV_TERMIO
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(UNZIP) && !defined(FUNZIP) && defined(UNIX) && defined(MORE))
|
||||||
|
# define GOT_IOCTL_H
|
||||||
|
/* int ioctl OF((int, int, zvoid *)); GRR: may need for some systems */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_WORKING_GETCH
|
||||||
|
/* include system support for switching of console echo */
|
||||||
|
# ifdef VMS
|
||||||
|
/* Workaround for broken header files of older DECC distributions
|
||||||
|
* that are incompatible with the /NAMES=AS_IS qualifier. */
|
||||||
|
# define sys$assign SYS$ASSIGN
|
||||||
|
# define sys$dassgn SYS$DASSGN
|
||||||
|
# define sys$qiow SYS$QIOW
|
||||||
|
# else /* !VMS */
|
||||||
|
# ifdef HAVE_TERMIOS_H
|
||||||
|
# define sgttyb termios
|
||||||
|
# define sg_flags c_lflag
|
||||||
|
# define GTTY(f, s) tcgetattr(f, (zvoid *) s)
|
||||||
|
# define STTY(f, s) tcsetattr(f, TCSAFLUSH, (zvoid *) s)
|
||||||
|
# else /* !HAVE_TERMIOS_H */
|
||||||
|
# ifdef USE_SYSV_TERMIO /* Amdahl, Cray, all SysV? */
|
||||||
|
# ifdef HAVE_TERMIO_H
|
||||||
|
# endif
|
||||||
|
# ifdef HAVE_SYS_TERMIO_H
|
||||||
|
# endif
|
||||||
|
# ifdef NEED_PTEM
|
||||||
|
# endif
|
||||||
|
# define sgttyb termio
|
||||||
|
# define sg_flags c_lflag
|
||||||
|
# define GTTY(f,s) ioctl(f,TCGETA,(zvoid *)s)
|
||||||
|
# define STTY(f,s) ioctl(f,TCSETAW,(zvoid *)s)
|
||||||
|
# else /* !USE_SYSV_TERMIO */
|
||||||
|
# ifndef CMS_MVS
|
||||||
|
# if (!defined(MINIX) && !defined(GOT_IOCTL_H))
|
||||||
|
# endif
|
||||||
|
# define GTTY gtty
|
||||||
|
# define STTY stty
|
||||||
|
# ifdef UNZIP
|
||||||
|
/*
|
||||||
|
* XXX : Are these declarations needed at all ????
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* GRR: let's find out... Hmmm, appears not...
|
||||||
|
int gtty OF((int, struct sgttyb *));
|
||||||
|
int stty OF((int, struct sgttyb *));
|
||||||
|
*/
|
||||||
|
# endif
|
||||||
|
# endif /* !CMS_MVS */
|
||||||
|
# endif /* ?USE_SYSV_TERMIO */
|
||||||
|
# endif /* ?HAVE_TERMIOS_H */
|
||||||
|
# ifndef NO_FCNTL_H
|
||||||
|
# ifndef UNZIP
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# endif
|
||||||
|
# endif /* ?VMS */
|
||||||
|
#endif /* !HAVE_WORKING_GETCH */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HAVE_WORKING_GETCH
|
||||||
|
#ifdef VMS
|
||||||
|
|
||||||
|
static struct dsc$descriptor_s DevDesc =
|
||||||
|
{11, DSC$K_DTYPE_T, DSC$K_CLASS_S, "SYS$COMMAND"};
|
||||||
|
/* {dsc$w_length, dsc$b_dtype, dsc$b_class, dsc$a_pointer}; */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Turn keyboard echoing on or off (VMS). Loosely based on VMSmunch.c
|
||||||
|
* and hence on Joe Meadows' file.c code.
|
||||||
|
*/
|
||||||
|
int echo(opt)
|
||||||
|
int opt;
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* For VMS v5.x:
|
||||||
|
* IO$_SENSEMODE/SETMODE info: Programming, Vol. 7A, System Programming,
|
||||||
|
* I/O User's: Part I, sec. 8.4.1.1, 8.4.3, 8.4.5, 8.6
|
||||||
|
* sys$assign(), sys$qio() info: Programming, Vol. 4B, System Services,
|
||||||
|
* System Services Reference Manual, pp. sys-23, sys-379
|
||||||
|
* fixed-length descriptor info: Programming, Vol. 3, System Services,
|
||||||
|
* Intro to System Routines, sec. 2.9.2
|
||||||
|
* Greg Roelofs, 15 Aug 91
|
||||||
|
*/
|
||||||
|
|
||||||
|
short DevChan, iosb[4];
|
||||||
|
long status;
|
||||||
|
unsigned long ttmode[2]; /* space for 8 bytes */
|
||||||
|
|
||||||
|
|
||||||
|
/* assign a channel to standard input */
|
||||||
|
status = sys$assign(&DevDesc, &DevChan, 0, 0);
|
||||||
|
if (!(status & 1))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
/* use sys$qio and the IO$_SENSEMODE function to determine the current
|
||||||
|
* tty status (for password reading, could use IO$_READVBLK function
|
||||||
|
* instead, but echo on/off will be more general)
|
||||||
|
*/
|
||||||
|
status = sys$qiow(0, DevChan, IO$_SENSEMODE, &iosb, 0, 0,
|
||||||
|
ttmode, 8, 0, 0, 0, 0);
|
||||||
|
if (!(status & 1))
|
||||||
|
return status;
|
||||||
|
status = iosb[0];
|
||||||
|
if (!(status & 1))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
/* modify mode buffer to be either NOECHO or ECHO
|
||||||
|
* (depending on function argument opt)
|
||||||
|
*/
|
||||||
|
if (opt == 0) /* off */
|
||||||
|
ttmode[1] |= TT$M_NOECHO; /* set NOECHO bit */
|
||||||
|
else
|
||||||
|
ttmode[1] &= ~((unsigned long) TT$M_NOECHO); /* clear NOECHO bit */
|
||||||
|
|
||||||
|
/* use the IO$_SETMODE function to change the tty status */
|
||||||
|
status = sys$qiow(0, DevChan, IO$_SETMODE, &iosb, 0, 0,
|
||||||
|
ttmode, 8, 0, 0, 0, 0);
|
||||||
|
if (!(status & 1))
|
||||||
|
return status;
|
||||||
|
status = iosb[0];
|
||||||
|
if (!(status & 1))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
/* deassign the sys$input channel by way of clean-up */
|
||||||
|
status = sys$dassgn(DevChan);
|
||||||
|
if (!(status & 1))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
return SS$_NORMAL; /* we be happy */
|
||||||
|
|
||||||
|
} /* end function echo() */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read a single character from keyboard in non-echoing mode (VMS).
|
||||||
|
* (returns EOF in case of errors)
|
||||||
|
*/
|
||||||
|
int tt_getch()
|
||||||
|
{
|
||||||
|
short DevChan, iosb[4];
|
||||||
|
long status;
|
||||||
|
char kbbuf[16]; /* input buffer with - some - excess length */
|
||||||
|
|
||||||
|
/* assign a channel to standard input */
|
||||||
|
status = sys$assign(&DevDesc, &DevChan, 0, 0);
|
||||||
|
if (!(status & 1))
|
||||||
|
return EOF;
|
||||||
|
|
||||||
|
/* read a single character from SYS$COMMAND (no-echo) and
|
||||||
|
* wait for completion
|
||||||
|
*/
|
||||||
|
status = sys$qiow(0,DevChan,
|
||||||
|
IO$_READVBLK|IO$M_NOECHO|IO$M_NOFILTR,
|
||||||
|
&iosb, 0, 0,
|
||||||
|
&kbbuf, 1, 0, 0, 0, 0);
|
||||||
|
if ((status&1) == 1)
|
||||||
|
status = iosb[0];
|
||||||
|
|
||||||
|
/* deassign the sys$input channel by way of clean-up
|
||||||
|
* (for this step, we do not need to check the completion status)
|
||||||
|
*/
|
||||||
|
sys$dassgn(DevChan);
|
||||||
|
|
||||||
|
/* return the first char read, or EOF in case the read request failed */
|
||||||
|
return (int)(((status&1) == 1) ? (uch)kbbuf[0] : EOF);
|
||||||
|
|
||||||
|
} /* end function tt_getch() */
|
||||||
|
|
||||||
|
|
||||||
|
#else /* !VMS: basically Unix */
|
||||||
|
|
||||||
|
|
||||||
|
/* For VM/CMS and MVS, non-echo terminal input is not (yet?) supported. */
|
||||||
|
#ifndef CMS_MVS
|
||||||
|
|
||||||
|
#ifdef ZIP /* moved to globals.h for UnZip */
|
||||||
|
static int echofd=(-1); /* file descriptor whose echo is off */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Turn echo off for file descriptor f. Assumes that f is a tty device.
|
||||||
|
*/
|
||||||
|
void Echoff(__G__ f)
|
||||||
|
__GDEF
|
||||||
|
int f; /* file descriptor for which to turn echo off */
|
||||||
|
{
|
||||||
|
struct sgttyb sg; /* tty device structure */
|
||||||
|
|
||||||
|
GLOBAL(echofd) = f;
|
||||||
|
GTTY(f, &sg); /* get settings */
|
||||||
|
sg.sg_flags &= ~ECHO; /* turn echo off */
|
||||||
|
STTY(f, &sg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Turn echo back on for file descriptor echofd.
|
||||||
|
*/
|
||||||
|
void Echon(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
struct sgttyb sg; /* tty device structure */
|
||||||
|
|
||||||
|
if (GLOBAL(echofd) != -1) {
|
||||||
|
GTTY(GLOBAL(echofd), &sg); /* get settings */
|
||||||
|
sg.sg_flags |= ECHO; /* turn echo on */
|
||||||
|
STTY(GLOBAL(echofd), &sg);
|
||||||
|
GLOBAL(echofd) = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !CMS_MVS */
|
||||||
|
#endif /* ?VMS */
|
||||||
|
|
||||||
|
|
||||||
|
#if (defined(UNZIP) && !defined(FUNZIP))
|
||||||
|
|
||||||
|
#ifdef ATH_BEO_UNX
|
||||||
|
#ifdef MORE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the number of lines on the output terminal. SCO Unix apparently
|
||||||
|
* defines TIOCGWINSZ but doesn't support it (!M_UNIX).
|
||||||
|
*
|
||||||
|
* GRR: will need to know width of terminal someday, too, to account for
|
||||||
|
* line-wrapping.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (defined(TIOCGWINSZ) && !defined(M_UNIX))
|
||||||
|
|
||||||
|
int screensize(tt_rows, tt_cols)
|
||||||
|
int *tt_rows;
|
||||||
|
int *tt_cols;
|
||||||
|
{
|
||||||
|
struct winsize wsz;
|
||||||
|
#ifdef DEBUG_WINSZ
|
||||||
|
static int firsttime = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* see termio(4) under, e.g., SunOS */
|
||||||
|
if (ioctl(1, TIOCGWINSZ, &wsz) == 0) {
|
||||||
|
#ifdef DEBUG_WINSZ
|
||||||
|
if (firsttime) {
|
||||||
|
firsttime = FALSE;
|
||||||
|
fprintf(stderr, "ttyio.c screensize(): ws_row = %d\n",
|
||||||
|
wsz.ws_row);
|
||||||
|
fprintf(stderr, "ttyio.c screensize(): ws_col = %d\n",
|
||||||
|
wsz.ws_col);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* number of rows */
|
||||||
|
if (tt_rows != NULL)
|
||||||
|
*tt_rows = (int)((wsz.ws_row > 0) ? wsz.ws_row : 24);
|
||||||
|
/* number of columns */
|
||||||
|
if (tt_cols != NULL)
|
||||||
|
*tt_cols = (int)((wsz.ws_col > 0) ? wsz.ws_col : 80);
|
||||||
|
return 0; /* signal success */
|
||||||
|
} else { /* this happens when piping to more(1), for example */
|
||||||
|
#ifdef DEBUG_WINSZ
|
||||||
|
if (firsttime) {
|
||||||
|
firsttime = FALSE;
|
||||||
|
fprintf(stderr,
|
||||||
|
"ttyio.c screensize(): ioctl(TIOCGWINSZ) failed\n"));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* VT-100 assumed to be minimal hardware */
|
||||||
|
if (tt_rows != NULL)
|
||||||
|
*tt_rows = 24;
|
||||||
|
if (tt_cols != NULL)
|
||||||
|
*tt_cols = 80;
|
||||||
|
return 1; /* signal failure */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !TIOCGWINSZ: service not available, fall back to semi-bogus method */
|
||||||
|
|
||||||
|
int screensize(tt_rows, tt_cols)
|
||||||
|
int *tt_rows;
|
||||||
|
int *tt_cols;
|
||||||
|
{
|
||||||
|
char *envptr, *getenv();
|
||||||
|
int n;
|
||||||
|
int errstat = 0;
|
||||||
|
|
||||||
|
/* GRR: this is overly simplistic, but don't have access to stty/gtty
|
||||||
|
* system anymore
|
||||||
|
*/
|
||||||
|
if (tt_rows != NULL) {
|
||||||
|
envptr = getenv("LINES");
|
||||||
|
if (envptr == (char *)NULL || (n = atoi(envptr)) < 5) {
|
||||||
|
/* VT-100 assumed to be minimal hardware */
|
||||||
|
*tt_rows = 24;
|
||||||
|
errstat = 1; /* signal failure */
|
||||||
|
} else {
|
||||||
|
*tt_rows = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tt_cols != NULL) {
|
||||||
|
envptr = getenv("COLUMNS");
|
||||||
|
if (envptr == (char *)NULL || (n = atoi(envptr)) < 5) {
|
||||||
|
*tt_cols = 80;
|
||||||
|
errstat = 1; /* signal failure */
|
||||||
|
} else {
|
||||||
|
*tt_cols = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return errstat;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ?(TIOCGWINSZ && !M_UNIX) */
|
||||||
|
#endif /* MORE */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a character from the given file descriptor without echo or newline.
|
||||||
|
*/
|
||||||
|
int zgetch(__G__ f)
|
||||||
|
__GDEF
|
||||||
|
int f; /* file descriptor from which to read */
|
||||||
|
{
|
||||||
|
#if (defined(USE_SYSV_TERMIO) || defined(USE_POSIX_TERMIOS))
|
||||||
|
char oldmin, oldtim;
|
||||||
|
#endif
|
||||||
|
char c;
|
||||||
|
struct sgttyb sg; /* tty device structure */
|
||||||
|
|
||||||
|
GTTY(f, &sg); /* get settings */
|
||||||
|
#if (defined(USE_SYSV_TERMIO) || defined(USE_POSIX_TERMIOS))
|
||||||
|
oldmin = sg.c_cc[VMIN]; /* save old values */
|
||||||
|
oldtim = sg.c_cc[VTIME];
|
||||||
|
sg.c_cc[VMIN] = 1; /* need only one char to return read() */
|
||||||
|
sg.c_cc[VTIME] = 0; /* no timeout */
|
||||||
|
sg.sg_flags &= ~ICANON; /* canonical mode off */
|
||||||
|
#else
|
||||||
|
sg.sg_flags |= CBREAK; /* cbreak mode on */
|
||||||
|
#endif
|
||||||
|
sg.sg_flags &= ~ECHO; /* turn echo off, too */
|
||||||
|
STTY(f, &sg); /* set cbreak mode */
|
||||||
|
GLOBAL(echofd) = f; /* in case ^C hit (not perfect: still CBREAK) */
|
||||||
|
|
||||||
|
read(f, &c, 1); /* read our character */
|
||||||
|
|
||||||
|
#if (defined(USE_SYSV_TERMIO) || defined(USE_POSIX_TERMIOS))
|
||||||
|
sg.c_cc[VMIN] = oldmin; /* restore old values */
|
||||||
|
sg.c_cc[VTIME] = oldtim;
|
||||||
|
sg.sg_flags |= ICANON; /* canonical mode on */
|
||||||
|
#else
|
||||||
|
sg.sg_flags &= ~CBREAK; /* cbreak mode off */
|
||||||
|
#endif
|
||||||
|
sg.sg_flags |= ECHO; /* turn echo on */
|
||||||
|
STTY(f, &sg); /* restore canonical mode */
|
||||||
|
GLOBAL(echofd) = -1;
|
||||||
|
|
||||||
|
return (int)(uch)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else /* !ATH_BEO_UNX */
|
||||||
|
#ifndef VMS /* VMS supplies its own variant of getch() */
|
||||||
|
|
||||||
|
|
||||||
|
int zgetch(__G__ f)
|
||||||
|
__GDEF
|
||||||
|
int f; /* file descriptor from which to read (must be open already) */
|
||||||
|
{
|
||||||
|
char c, c2;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Get a character from the given file descriptor without echo; can't fake
|
||||||
|
CBREAK mode (i.e., newline required), but can get rid of all chars up to
|
||||||
|
and including newline.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
echoff(f);
|
||||||
|
read(f, &c, 1);
|
||||||
|
if (c != '\n')
|
||||||
|
do {
|
||||||
|
read(f, &c2, 1); /* throw away all other chars up thru newline */
|
||||||
|
} while (c2 != '\n');
|
||||||
|
echon();
|
||||||
|
return (int)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !VMS */
|
||||||
|
#endif /* ?ATH_BEO_UNX */
|
||||||
|
|
||||||
|
#endif /* UNZIP && !FUNZIP */
|
||||||
|
#endif /* !HAVE_WORKING_GETCH */
|
||||||
|
|
||||||
|
|
||||||
|
#if CRYPT /* getp() is only used with full encryption */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple compile-time check for source compatibility between
|
||||||
|
* zcrypt and ttyio:
|
||||||
|
*/
|
||||||
|
#if (!defined(CR_MAJORVER) || (CR_MAJORVER < 2) || (CR_MINORVER < 7))
|
||||||
|
error: This Info-ZIP tool requires zcrypt 2.7 or later.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a password of length n-1 or less into *p using the prompt *m.
|
||||||
|
* The entered password is not echoed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_WORKING_GETCH
|
||||||
|
/*
|
||||||
|
* For the AMIGA, getch() is defined as Agetch(), which is in
|
||||||
|
* amiga/filedate.c; SAS/C 6.x provides a getch(), but since Agetch()
|
||||||
|
* uses the infrastructure that is already in place in filedate.c, it is
|
||||||
|
* smaller. With this function, echoff() and echon() are not needed.
|
||||||
|
*
|
||||||
|
* For the MAC, a non-echo macgetch() function is defined in the MacOS
|
||||||
|
* specific sources which uses the event handling mechanism of the
|
||||||
|
* desktop window manager to get a character from the keyboard.
|
||||||
|
*
|
||||||
|
* For the other systems in this section, a non-echo getch() function
|
||||||
|
* is either contained the C runtime library (conio package), or getch()
|
||||||
|
* is defined as an alias for a similar system specific RTL function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WINDLL /* WINDLL does not support a console interface */
|
||||||
|
#ifndef QDOS /* QDOS supplies a variant of this function */
|
||||||
|
|
||||||
|
/* This is the getp() function for all systems (with TTY type user interface)
|
||||||
|
* that supply a working `non-echo' getch() function for "raw" console input.
|
||||||
|
*/
|
||||||
|
char *getp(__G__ m, p, n)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *m; /* prompt for password */
|
||||||
|
char *p; /* return value: line input */
|
||||||
|
int n; /* bytes available in p[] */
|
||||||
|
{
|
||||||
|
char c; /* one-byte buffer for read() to use */
|
||||||
|
int i; /* number of characters input */
|
||||||
|
char *w; /* warning on retry */
|
||||||
|
|
||||||
|
/* get password */
|
||||||
|
w = "";
|
||||||
|
do {
|
||||||
|
fputs(w, stderr); /* warning if back again */
|
||||||
|
fputs(m, stderr); /* display prompt and flush */
|
||||||
|
fflush(stderr);
|
||||||
|
i = 0;
|
||||||
|
do { /* read line, keeping first n characters */
|
||||||
|
if ((c = (char)getch()) == '\r')
|
||||||
|
c = '\n'; /* until user hits CR */
|
||||||
|
if (c == 8 || c == 127) {
|
||||||
|
if (i > 0) i--; /* the `backspace' and `del' keys works */
|
||||||
|
}
|
||||||
|
else if (i < n)
|
||||||
|
p[i++] = c; /* truncate past n */
|
||||||
|
} while (c != '\n');
|
||||||
|
PUTC('\n', stderr); fflush(stderr);
|
||||||
|
w = "(line too long--try again)\n";
|
||||||
|
} while (p[i-1] != '\n');
|
||||||
|
p[i-1] = 0; /* terminate at newline */
|
||||||
|
|
||||||
|
return p; /* return pointer to password */
|
||||||
|
|
||||||
|
} /* end function getp() */
|
||||||
|
|
||||||
|
#endif /* !QDOS */
|
||||||
|
#endif /* !WINDLL */
|
||||||
|
|
||||||
|
|
||||||
|
#else /* !HAVE_WORKING_GETCH */
|
||||||
|
|
||||||
|
|
||||||
|
#if (defined(ATH_BEO_UNX) || defined(__MINT__))
|
||||||
|
|
||||||
|
#ifndef _PATH_TTY
|
||||||
|
# ifdef __MINT__
|
||||||
|
# define _PATH_TTY ttyname(2)
|
||||||
|
# else
|
||||||
|
# define _PATH_TTY "/dev/tty"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *getp(__G__ m, p, n)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *m; /* prompt for password */
|
||||||
|
char *p; /* return value: line input */
|
||||||
|
int n; /* bytes available in p[] */
|
||||||
|
{
|
||||||
|
char c; /* one-byte buffer for read() to use */
|
||||||
|
int i; /* number of characters input */
|
||||||
|
char *w; /* warning on retry */
|
||||||
|
int f; /* file descriptor for tty device */
|
||||||
|
|
||||||
|
#ifdef PASSWD_FROM_STDIN
|
||||||
|
/* Read from stdin. This is unsafe if the password is stored on disk. */
|
||||||
|
f = 0;
|
||||||
|
#else
|
||||||
|
/* turn off echo on tty */
|
||||||
|
|
||||||
|
if ((f = open(_PATH_TTY, 0)) == -1)
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
/* get password */
|
||||||
|
w = "";
|
||||||
|
do {
|
||||||
|
fputs(w, stderr); /* warning if back again */
|
||||||
|
fputs(m, stderr); /* prompt */
|
||||||
|
fflush(stderr);
|
||||||
|
i = 0;
|
||||||
|
echoff(f);
|
||||||
|
do { /* read line, keeping n */
|
||||||
|
read(f, &c, 1);
|
||||||
|
if (i < n)
|
||||||
|
p[i++] = c;
|
||||||
|
} while (c != '\n');
|
||||||
|
echon();
|
||||||
|
PUTC('\n', stderr); fflush(stderr);
|
||||||
|
w = "(line too long--try again)\n";
|
||||||
|
} while (p[i-1] != '\n');
|
||||||
|
p[i-1] = 0; /* terminate at newline */
|
||||||
|
|
||||||
|
#ifndef PASSWD_FROM_STDIN
|
||||||
|
close(f);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return p; /* return pointer to password */
|
||||||
|
|
||||||
|
} /* end function getp() */
|
||||||
|
|
||||||
|
#endif /* ATH_BEO_UNX || __MINT__ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if (defined(VMS) || defined(CMS_MVS))
|
||||||
|
|
||||||
|
char *getp(__G__ m, p, n)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *m; /* prompt for password */
|
||||||
|
char *p; /* return value: line input */
|
||||||
|
int n; /* bytes available in p[] */
|
||||||
|
{
|
||||||
|
char c; /* one-byte buffer for read() to use */
|
||||||
|
int i; /* number of characters input */
|
||||||
|
char *w; /* warning on retry */
|
||||||
|
FILE *f; /* file structure for SYS$COMMAND device */
|
||||||
|
|
||||||
|
#ifdef PASSWD_FROM_STDIN
|
||||||
|
f = stdin;
|
||||||
|
#else
|
||||||
|
if ((f = fopen(ctermid(NULL), "r")) == NULL)
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* get password */
|
||||||
|
fflush(stdout);
|
||||||
|
w = "";
|
||||||
|
do {
|
||||||
|
if (*w) /* bug: VMS apparently adds \n to NULL fputs */
|
||||||
|
fputs(w, stderr); /* warning if back again */
|
||||||
|
fputs(m, stderr); /* prompt */
|
||||||
|
fflush(stderr);
|
||||||
|
i = 0;
|
||||||
|
echoff(f);
|
||||||
|
do { /* read line, keeping n */
|
||||||
|
if ((c = (char)getc(f)) == '\r')
|
||||||
|
c = '\n';
|
||||||
|
if (i < n)
|
||||||
|
p[i++] = c;
|
||||||
|
} while (c != '\n');
|
||||||
|
echon();
|
||||||
|
PUTC('\n', stderr); fflush(stderr);
|
||||||
|
w = "(line too long--try again)\n";
|
||||||
|
} while (p[i-1] != '\n');
|
||||||
|
p[i-1] = 0; /* terminate at newline */
|
||||||
|
#ifndef PASSWD_FROM_STDIN
|
||||||
|
fclose(f);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return p; /* return pointer to password */
|
||||||
|
|
||||||
|
} /* end function getp() */
|
||||||
|
|
||||||
|
#endif /* VMS || CMS_MVS */
|
||||||
|
#endif /* ?HAVE_WORKING_GETCH */
|
||||||
|
#endif /* CRYPT */
|
||||||
|
#endif /* CRYPT || (UNZIP && !FUNZIP) */
|
225
third_party/unzip/ttyio.h
vendored
Normal file
225
third_party/unzip/ttyio.h
vendored
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2004 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
ttyio.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ttyio_h /* don't include more than once */
|
||||||
|
#define __ttyio_h
|
||||||
|
|
||||||
|
#ifndef __crypt_h
|
||||||
|
#include "third_party/unzip/crypt.h" /* ensure that encryption header file has been seen */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (CRYPT || (defined(UNZIP) && !defined(FUNZIP)))
|
||||||
|
/*
|
||||||
|
* Non-echo keyboard/console input support is needed and enabled.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __G /* UnZip only, for now (DLL stuff) */
|
||||||
|
# define __G
|
||||||
|
# define __G__
|
||||||
|
# define __GDEF
|
||||||
|
# define __GPRO void
|
||||||
|
# define __GPRO__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZCONST /* UnZip only (until have configure script like Zip) */
|
||||||
|
# define ZCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(MSDOS) || defined(OS2) || defined(WIN32))
|
||||||
|
# ifndef DOS_OS2_W32
|
||||||
|
# define DOS_OS2_W32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(DOS_OS2_W32) || defined(__human68k__))
|
||||||
|
# ifndef DOS_H68_OS2_W32
|
||||||
|
# define DOS_H68_OS2_W32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(DOS_OS2_W32) || defined(FLEXOS))
|
||||||
|
# ifndef DOS_FLX_OS2_W32
|
||||||
|
# define DOS_FLX_OS2_W32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(DOS_H68_OS2_W32) || defined(FLEXOS))
|
||||||
|
# ifndef DOS_FLX_H68_OS2_W32
|
||||||
|
# define DOS_FLX_H68_OS2_W32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__ATHEOS__) || defined(__BEOS__) || defined(UNIX))
|
||||||
|
# ifndef ATH_BEO_UNX
|
||||||
|
# define ATH_BEO_UNX
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(VM_CMS) || defined(MVS))
|
||||||
|
# ifndef CMS_MVS
|
||||||
|
# define CMS_MVS
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Function prototypes */
|
||||||
|
|
||||||
|
/* The following systems supply a `non-echo' character input function "getch()"
|
||||||
|
* (or an alias) and do not need the echoff() / echon() function pair.
|
||||||
|
*/
|
||||||
|
#ifdef AMIGA
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define getch() Agetch()
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif /* AMIGA */
|
||||||
|
|
||||||
|
#ifdef ATARI
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define getch() (Cnecin() & 0x000000ff)
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MACOS
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define getch() macgetch()
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NLM
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef QDOS
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RISCOS
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define getch() SWI_OS_ReadC()
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DOS_H68_OS2_W32
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# ifdef WIN32
|
||||||
|
# ifndef getch
|
||||||
|
# define getch() getch_win32()
|
||||||
|
# endif
|
||||||
|
# else /* !WIN32 */
|
||||||
|
# ifdef __EMX__
|
||||||
|
# ifndef getch
|
||||||
|
# define getch() _read_kbd(0, 1, 0)
|
||||||
|
# endif
|
||||||
|
# else /* !__EMX__ */
|
||||||
|
# ifdef __GO32__
|
||||||
|
# define getch() getkey()
|
||||||
|
# else /* !__GO32__ */
|
||||||
|
# endif /* ?__GO32__ */
|
||||||
|
# endif /* ?__EMX__ */
|
||||||
|
# endif /* ?WIN32 */
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif /* DOS_H68_OS2_W32 */
|
||||||
|
|
||||||
|
#ifdef FLEXOS
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define getch() getchar() /* not correct, but may not be on a console */
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For VM/CMS and MVS, we do not (yet) have any support to switch terminal
|
||||||
|
* input echo on and off. The following "fake" definitions allow inclusion
|
||||||
|
* of crypt support and UnZip's "pause prompting" features, but without
|
||||||
|
* any echo suppression.
|
||||||
|
*/
|
||||||
|
#ifdef CMS_MVS
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TANDEM
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define getch() zgetch() /* defined in TANDEMC */
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The THEOS C runtime library supplies the function conmask() to toggle
|
||||||
|
* terminal input echo on (conmask("e")) and off (conmask("n")). But,
|
||||||
|
* since THEOS C RTL also contains a working non-echo getch() function,
|
||||||
|
* the echo toggles are not needed.
|
||||||
|
*/
|
||||||
|
#ifdef THEOS
|
||||||
|
# define echoff(f)
|
||||||
|
# define echon()
|
||||||
|
# define HAVE_WORKING_GETCH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* VMS has a single echo() function in ttyio.c to toggle terminal
|
||||||
|
* input echo on and off.
|
||||||
|
*/
|
||||||
|
#ifdef VMS
|
||||||
|
# define echoff(f) echo(0)
|
||||||
|
# define echon() echo(1)
|
||||||
|
# define getch() tt_getch()
|
||||||
|
# define FGETCH(f) tt_getch()
|
||||||
|
int echo OF((int));
|
||||||
|
int tt_getch OF((void));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For all other systems, ttyio.c supplies the two functions Echoff() and
|
||||||
|
* Echon() for suppressing and (re)enabling console input echo.
|
||||||
|
*/
|
||||||
|
#ifndef echoff
|
||||||
|
# define echoff(f) Echoff(__G__ f)
|
||||||
|
# define echon() Echon(__G)
|
||||||
|
void Echoff OF((__GPRO__ int f));
|
||||||
|
void Echon OF((__GPRO));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* this stuff is used by MORE and also now by the ctrl-S code; fileio.c only */
|
||||||
|
#if (defined(UNZIP) && !defined(FUNZIP))
|
||||||
|
# ifdef HAVE_WORKING_GETCH
|
||||||
|
# define FGETCH(f) getch()
|
||||||
|
# endif
|
||||||
|
# ifndef FGETCH
|
||||||
|
/* default for all systems where no getch()-like function is available */
|
||||||
|
int zgetch OF((__GPRO__ int f));
|
||||||
|
# define FGETCH(f) zgetch(__G__ f)
|
||||||
|
# endif
|
||||||
|
#endif /* UNZIP && !FUNZIP */
|
||||||
|
|
||||||
|
#if (CRYPT && !defined(WINDLL))
|
||||||
|
char *getp OF((__GPRO__ ZCONST char *m, char *p, int n));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* !(CRYPT || (UNZIP && !FUNZIP)) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No need for non-echo keyboard/console input; provide dummy definitions.
|
||||||
|
*/
|
||||||
|
#define echoff(f)
|
||||||
|
#define echon()
|
||||||
|
|
||||||
|
#endif /* ?(CRYPT || (UNZIP && !FUNZIP)) */
|
||||||
|
|
||||||
|
#endif /* !__ttyio_h */
|
57
third_party/unzip/ubz2err.c
vendored
Normal file
57
third_party/unzip/ubz2err.c
vendored
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2008 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2007-Mar-04 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ubz2err.c
|
||||||
|
|
||||||
|
This file contains the "fatal error" callback routine required by the
|
||||||
|
"minimal" (silent, non-stdio) setup of the bzip2 compression library.
|
||||||
|
|
||||||
|
The fatal bzip2 error bail-out routine is provided in a separate code
|
||||||
|
module, so that it can be easily overridden when the UnZip package is
|
||||||
|
used as a static link library. One example is the WinDLL static library
|
||||||
|
usage for building a monolythic binary of the Windows application "WiZ"
|
||||||
|
that supports bzip2 both in compression and decompression operations.
|
||||||
|
|
||||||
|
Contains: bz_internal_error() (USE_BZIP2 only)
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define __UBZ2ERR_C /* identifies this source module */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
|
||||||
|
#ifdef USE_BZIP2
|
||||||
|
|
||||||
|
/**********************************/
|
||||||
|
/* Function bz_internal_error() */
|
||||||
|
/**********************************/
|
||||||
|
|
||||||
|
/* Call-back function for the bzip2 decompression code (compiled with
|
||||||
|
* BZ_NO_STDIO), required to handle fatal internal bug-type errors of
|
||||||
|
* the bzip2 library.
|
||||||
|
*/
|
||||||
|
void bz_internal_error(bzerrcode)
|
||||||
|
int bzerrcode;
|
||||||
|
{
|
||||||
|
GETGLOBALS();
|
||||||
|
|
||||||
|
Info(slide, 0x421, ((char *)slide,
|
||||||
|
"error: internal fatal libbzip2 error number %d\n", bzerrcode));
|
||||||
|
#ifdef WINDLL
|
||||||
|
longjmp(dll_error_return, 1);
|
||||||
|
#else
|
||||||
|
DESTROYGLOBALS();
|
||||||
|
EXIT(PK_BADERR);
|
||||||
|
#endif
|
||||||
|
} /* end function bz_internal_error() */
|
||||||
|
|
||||||
|
#endif /* USE_BZIP2 */
|
2125
third_party/unzip/unix.c
vendored
Normal file
2125
third_party/unzip/unix.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
14
third_party/unzip/unix/Contents
vendored
Normal file
14
third_party/unzip/unix/Contents
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
Contents of the "unix" subdirectory for UnZip 6.0 and later:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
Makefile makefile for UnZip for various architectures and OS's
|
||||||
|
configure automatic build configuration script
|
||||||
|
unix.c Unix-specific support routines
|
||||||
|
unxcfg.h Unix-specific configuration settings
|
||||||
|
zipgrep script to scan zip archive entries for lines matching a pattern
|
||||||
|
Packaging/ subdirectory containing SysV.4 (e.g., Solaris 2.x) package info
|
||||||
|
|
||||||
|
Type "make" or "make help" to get general compile instructions (beyond
|
||||||
|
those in the INSTALL file), or "make list" for a list of makefile targets.
|
||||||
|
Note that there are some MS-DOS and cross-compilation targets thrown in
|
||||||
|
just to make things more exciting.
|
1038
third_party/unzip/unix/Makefile
vendored
Normal file
1038
third_party/unzip/unix/Makefile
vendored
Normal file
File diff suppressed because it is too large
Load diff
44
third_party/unzip/unix/Packaging/README
vendored
Normal file
44
third_party/unzip/unix/Packaging/README
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
Solaris packaging
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
To generate a Solaris package for Info-ZIP UnZip utilities,
|
||||||
|
first see the top level INSTALL and README files. Do a
|
||||||
|
"make solaris", which will automatically build two Solaris
|
||||||
|
installable package files for the package, IZunzip.
|
||||||
|
|
||||||
|
IZunzip -- Solaris installable package in directory format.
|
||||||
|
IZunzip_$(arch).pkg -- Solaris installable package in "stream" format.
|
||||||
|
|
||||||
|
Where: $(arch) := system architecture, currently i386, sparc, or ppc.
|
||||||
|
(use "uname -p" to determine)
|
||||||
|
|
||||||
|
The ".pkg" file is a single file datastream that can be compressed
|
||||||
|
and/or ftp'd. This is the recommended form, because all required
|
||||||
|
files are resident in the archive, and it is easily distributed.
|
||||||
|
|
||||||
|
To install, simply:
|
||||||
|
|
||||||
|
1) copy the package to the target system's /tmp directory.
|
||||||
|
2) login or su to root
|
||||||
|
3) pkgadd -d /tmp/IZunzip_$(arch).pkg
|
||||||
|
4) add /opt/Info-ZIP/IZunzip/bin to PATH
|
||||||
|
5) add /opt/Info-ZIP/IZunzip/man to MANPATH
|
||||||
|
|
||||||
|
This works for both SPARC and x86.
|
||||||
|
|
||||||
|
Ongoing maintenance:
|
||||||
|
|
||||||
|
Keep the files, "prototype" and "pkginfo.in" up to date.
|
||||||
|
Observe variable substitutions made by "Makefile".
|
||||||
|
See manpages for pkginfo(1), pkginfo(4), pkgmk(1), pkgproto(1)
|
||||||
|
|
||||||
|
Variations:
|
||||||
|
|
||||||
|
If you wish the base directory to be set to something other than
|
||||||
|
/opt/Info-ZIP, change the setting BASEDIR in pkginfo.in and
|
||||||
|
re-run the make.
|
||||||
|
|
||||||
|
|
||||||
|
-John Bush (John.Bush@East.Sun.COM)
|
||||||
|
July 20, 1996
|
||||||
|
|
13
third_party/unzip/unix/Packaging/pkginfo.in
vendored
Normal file
13
third_party/unzip/unix/Packaging/pkginfo.in
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
PKG=IZunzip
|
||||||
|
NAME=Info-ZIP UnZip Utilities
|
||||||
|
CATEGORY=application
|
||||||
|
VENDOR=Info-ZIP
|
||||||
|
EMAIL=Zip-Bugs@lists.wku.edu
|
||||||
|
HOTLINE=Zip-Bugs@lists.wku.edu
|
||||||
|
DESC=Copyrighted FREEWARE. See README, WHERE, and LICENSE docs in pkg's doc dir.
|
||||||
|
CLASSES=none
|
||||||
|
BASEDIR=/opt/Info-ZIP
|
||||||
|
#BASEDIR=/usr/local
|
||||||
|
VERSION=".VERSION."
|
||||||
|
PSTAMP=".PSTAMP."
|
||||||
|
ARCH=".ARCH."
|
22
third_party/unzip/unix/Packaging/postinstall
vendored
Normal file
22
third_party/unzip/unix/Packaging/postinstall
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Post installation script (simply inform installer about PATH etc)
|
||||||
|
#
|
||||||
|
echo " "
|
||||||
|
echo " "
|
||||||
|
echo "Installation is complete. Now, you should add the following"
|
||||||
|
echo "(or equivalnet) commands to the appropriate initial user shell"
|
||||||
|
echo "scripts (such as .profile, .login, etc) -- "
|
||||||
|
echo " "
|
||||||
|
echo " For korn or bourne shell:"
|
||||||
|
echo " PATH=\${PATH}:${BASEDIR}/${PKG}/bin"
|
||||||
|
echo " MANPATH=\${MANPATH}:${BASEDIR}/${PKG}/man"
|
||||||
|
echo " export PATH MANPATH"
|
||||||
|
echo " "
|
||||||
|
echo " For C shell:"
|
||||||
|
echo " set path=(\$path ${BASEDIR}/${PKG}/bin)"
|
||||||
|
echo " setenv MANPATH \$MANPATH:${BASEDIR}/${PKG}/man"
|
||||||
|
echo " "
|
||||||
|
echo " See the files under ${BASEDIR}/${PKG}/doc for more information."
|
||||||
|
echo " "
|
||||||
|
exit 0
|
26
third_party/unzip/unix/Packaging/preinstall.in
vendored
Normal file
26
third_party/unzip/unix/Packaging/preinstall.in
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/sh
|
||||||
|
echo " "
|
||||||
|
echo "REPORT ALL BUGS, PROBLEMS, AND ACCOLADES TO:"
|
||||||
|
echo " "
|
||||||
|
echo " Zip-Bugs@lists.wku.edu"
|
||||||
|
echo " "
|
||||||
|
echo "Checking architecture platform for .ARCH. ..."
|
||||||
|
arch=`uname -p`
|
||||||
|
if [ "arch_${arch}" != "arch_.ARCH." ]; then
|
||||||
|
echo " "
|
||||||
|
echo "This product MUST be installed on a Solaris .ARCH. platform."
|
||||||
|
echo "Your machine looks like it is a ${arch} platform."
|
||||||
|
echo "Please install the version for the .ARCH. architecture."
|
||||||
|
echo "Aborting the installation because of this. "
|
||||||
|
echo " "
|
||||||
|
returncode=1
|
||||||
|
else
|
||||||
|
echo " "
|
||||||
|
echo "This product works on .ARCH., which you happen to have!"
|
||||||
|
echo " "
|
||||||
|
returncode=0
|
||||||
|
fi
|
||||||
|
echo " "
|
||||||
|
/usr/bin/sleep 4
|
||||||
|
exit ${returncode:-1}
|
||||||
|
#
|
33
third_party/unzip/unix/Packaging/prototype
vendored
Normal file
33
third_party/unzip/unix/Packaging/prototype
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
d none $BASEDIR 0755 root bin
|
||||||
|
d none $BASEDIR/$PKG 0755 root bin
|
||||||
|
d none $PKG/bin 0755 root bin
|
||||||
|
f none $PKG/bin/unzip=unzip 0755 root bin
|
||||||
|
f none $PKG/bin/funzip=funzip 0755 root bin
|
||||||
|
f none $PKG/bin/unzipsfx=unzipsfx 0755 root bin
|
||||||
|
f none $PKG/bin/zipgrep=unix/zipgrep 0755 root bin
|
||||||
|
s none $PKG/bin/zipinfo=unzip
|
||||||
|
d none $PKG/doc 0755 root bin
|
||||||
|
f none $PKG/doc/ZipPorts=proginfo/ZipPorts 0644 root bin
|
||||||
|
f none $PKG/doc/CONTRIBS=proginfo/CONTRIBS 0644 root bin
|
||||||
|
f none $PKG/doc/COPYING.OLD=COPYING.OLD 0644 root bin
|
||||||
|
f none $PKG/doc/LICENSE=LICENSE 0644 root bin
|
||||||
|
f none $PKG/doc/README=README 0644 root bin
|
||||||
|
f none $PKG/doc/WHERE=WHERE 0644 root bin
|
||||||
|
f none $PKG/doc/INSTALL=INSTALL 0644 root bin
|
||||||
|
f none $PKG/doc/funzip.txt=funzip.txt 0644 root bin
|
||||||
|
f none $PKG/doc/unzip.txt=unzip.txt 0644 root bin
|
||||||
|
f none $PKG/doc/unzipsfx.txt=unzipsfx.txt 0644 root bin
|
||||||
|
f none $PKG/doc/zipgrep.txt=zipgrep.txt 0644 root bin
|
||||||
|
f none $PKG/doc/zipinfo.txt=zipinfo.txt 0644 root bin
|
||||||
|
d none $PKG/man 0755 root bin
|
||||||
|
d none $PKG/man/man1 0755 root bin
|
||||||
|
f none $PKG/man/man1/funzip.1=man/funzip.1 0644 root bin
|
||||||
|
f none $PKG/man/man1/unzip.1=man/unzip.1 0644 root bin
|
||||||
|
f none $PKG/man/man1/unzipsfx.1=man/unzipsfx.1 0644 root bin
|
||||||
|
f none $PKG/man/man1/zipgrep.1=man/zipgrep.1 0644 root bin
|
||||||
|
f none $PKG/man/man1/zipinfo.1=man/zipinfo.1 0644 root bin
|
||||||
|
i pkginfo
|
||||||
|
i prototype
|
||||||
|
i README
|
||||||
|
i preinstall
|
||||||
|
i postinstall
|
725
third_party/unzip/unix/configure
vendored
Normal file
725
third_party/unzip/unix/configure
vendored
Normal file
|
@ -0,0 +1,725 @@
|
||||||
|
:
|
||||||
|
#!/bin/sh -x
|
||||||
|
# The above ":" is necessary on some buggy systems.
|
||||||
|
|
||||||
|
# configure: Test to determine values for system-dependent variables.
|
||||||
|
# Output the flag definitions to the file "flags".
|
||||||
|
# Parameters: $1 = $CC, $2 = $CFLAGS, $3 = $IZ_BZIP2, $4 = $IZ_ZLIB
|
||||||
|
#
|
||||||
|
# This file is typically called from Makefile rather than executed
|
||||||
|
# from the command line.
|
||||||
|
#
|
||||||
|
# To construct unzip automatically using this file, type
|
||||||
|
# "make -f unix/Makefile generic".
|
||||||
|
# If this fails, then type "make list" to get a list of special targets.
|
||||||
|
|
||||||
|
trap "rm -f conftest* core a.out; exit 1" 1 2 3 15
|
||||||
|
|
||||||
|
CC=${1:-cc}
|
||||||
|
CFLAGS=${2}
|
||||||
|
CFLAGSR=${CFLAGS}
|
||||||
|
CFLAGS="${CFLAGS} -I. -DUNIX"
|
||||||
|
LFLAGS1=""
|
||||||
|
LFLAGS2="-s"
|
||||||
|
LN="ln -s"
|
||||||
|
|
||||||
|
# bzip2
|
||||||
|
IZ_BZIP2=${3-}
|
||||||
|
CFLAGS_BZ=''
|
||||||
|
|
||||||
|
# zlib
|
||||||
|
IZ_ZLIB=${4-}
|
||||||
|
|
||||||
|
CFLAGS_OPT=''
|
||||||
|
BZLF=''
|
||||||
|
|
||||||
|
echo "Check C compiler operation"
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c
|
||||||
|
status=$?
|
||||||
|
if test $status -ne 0; then
|
||||||
|
echo ''
|
||||||
|
echo "C compiler \"${CC}\" does not work as expected."
|
||||||
|
echo "Failing command was: $CC $CFLAGS -c conftest.c"
|
||||||
|
exit $status
|
||||||
|
else
|
||||||
|
echo ' Ok'
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo 'Check C compiler type (optimization options)'
|
||||||
|
# Sun C?
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#ifndef __SUNPRO_C
|
||||||
|
bad code
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
CFLAGS_OPT='-xO3'
|
||||||
|
echo " Sun C ($CFLAGS_OPT)"
|
||||||
|
else
|
||||||
|
# Tru64 DEC/Compaq/HP C?
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#ifndef __DECC
|
||||||
|
bad code
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
CFLAGS_OPT='-O3'
|
||||||
|
echo " DEC C ($CFLAGS_OPT)"
|
||||||
|
else
|
||||||
|
# HP-UX HP C?
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#ifdef __GNUC__
|
||||||
|
bad code
|
||||||
|
#endif
|
||||||
|
#ifndef __hpux
|
||||||
|
bad code
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
# HP-UX, not GCC. Lame bundled or real ANSI compiler?
|
||||||
|
CFLAGS_OPT_TRY="+O3 +Onolimit"
|
||||||
|
$CC $CFLAGS $CFLAGS_OPT_TRY -c conftest.c 2>&1 | \
|
||||||
|
grep '(Bundled)' > /dev/null
|
||||||
|
if test $? -ne 0; then
|
||||||
|
CFLAGS_OPT="$CFLAGS_OPT_TRY"
|
||||||
|
echo " HP-UX ANSI C ($CFLAGS_OPT)"
|
||||||
|
else
|
||||||
|
echo ' HP-UX Bundled C (no opt)'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# GNU C?
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#ifndef __GNUC__
|
||||||
|
bad code
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
CFLAGS_OPT='-O3'
|
||||||
|
echo " GNU C ($CFLAGS_OPT)"
|
||||||
|
# Special Mac OS X shared library "ld" option?
|
||||||
|
if test ` uname -s 2> /dev/null ` = 'Darwin'; then
|
||||||
|
lf='-Wl,-search_paths_first'
|
||||||
|
$CC $CFLAGS $lf conftest.c > /dev/null 2>/dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
BZLF=${lf}
|
||||||
|
fi
|
||||||
|
rm -f conftest
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
CFLAGS_OPT='-O'
|
||||||
|
echo " Other-unknown C ($CFLAGS_OPT)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# optimization flags
|
||||||
|
if test -n "${CFLAGS_OPT}"; then
|
||||||
|
CFLAGSR="${CFLAGSR} ${CFLAGS_OPT}"
|
||||||
|
CFLAGS_BZ="${CFLAGS_BZ} ${CFLAGS_OPT}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo Check for the C preprocessor
|
||||||
|
# on SVR4, cc -E does not produce correct assembler files. Need /lib/cpp.
|
||||||
|
CPP="${CC} -E"
|
||||||
|
# solaris as(1) needs -P, maybe others as well ?
|
||||||
|
[ -f /usr/ccs/lib/cpp ] && CPP="/usr/ccs/lib/cpp -P"
|
||||||
|
[ -f /usr/lib/cpp ] && CPP=/usr/lib/cpp
|
||||||
|
[ -f /lib/cpp ] && CPP=/lib/cpp
|
||||||
|
[ -f /usr/bin/cpp ] && CPP=/usr/bin/cpp
|
||||||
|
[ -f /xenix ] && CPP="${CC} -E"
|
||||||
|
[ -f /lynx.os ] && CPP="${CC} -E"
|
||||||
|
|
||||||
|
echo "#include <stdio.h>" > conftest.c
|
||||||
|
$CPP conftest.c >/dev/null 2>/dev/null || CPP="${CC} -E"
|
||||||
|
|
||||||
|
echo Check if we can use asm code
|
||||||
|
CRC32OA=""
|
||||||
|
if eval "$CPP crc_i386.S > _crc_i386.s 2>/dev/null"; then
|
||||||
|
if test ! -s _crc_i386.s || grep error < _crc_i386.s > /dev/null; then
|
||||||
|
:
|
||||||
|
elif eval "$CC -c _crc_i386.s >/dev/null 2>/dev/null" && [ -f _crc_i386.o ]; then
|
||||||
|
CFLAGSR="${CFLAGSR} -DASM_CRC"
|
||||||
|
CRC32OA="crc_gcc.o"
|
||||||
|
echo "int foo() { return 0;}" > conftest.c
|
||||||
|
$CC -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
echo Check if compiler generates underlines
|
||||||
|
nm conftest.o | grep "(^|[^_])foo" >/dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && CPP="${CPP} -DNO_UNDERLINE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f _crc_i386.s _crc_i386.o
|
||||||
|
|
||||||
|
# ANSI options for compilers that don't have __STDC__ defined by default
|
||||||
|
# Currently HPUX, pyramid, Dynix, AIX, OSF/1 and ultrix
|
||||||
|
|
||||||
|
echo Check for ANSI options
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#ifndef __STDC__
|
||||||
|
forget it
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
for OPT in "-Aa -D_HPUX_SOURCE" -Xa -qlanglvl=ansi -std1 -std
|
||||||
|
do
|
||||||
|
$CC $CFLAGS $OPT -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && CFLAGSR="${CFLAGSR} ${OPT}" && break
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo Check for prototypes
|
||||||
|
echo "int main(int argc, char *argv[]) { return 0; }" > conftest.c
|
||||||
|
$CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_PROTO"
|
||||||
|
|
||||||
|
# const check currently handles mips cc and non ANSI compilers.
|
||||||
|
# does it need more ?
|
||||||
|
echo Check the handling of const
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
typedef int charset[2];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
const charset x;
|
||||||
|
const char *foo;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_CONST"
|
||||||
|
|
||||||
|
echo Check for time_t
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
time_t t;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_TIME_T"
|
||||||
|
|
||||||
|
echo Check for size_t
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <sys/types.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
size_t s;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_SIZE_T"
|
||||||
|
|
||||||
|
echo Check for off_t
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <sys/types.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
off_t s;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_OFF_T"
|
||||||
|
|
||||||
|
# Added 11/4/2003 EG
|
||||||
|
# Revised 8/12/04 EG
|
||||||
|
# Now we set the 64-bit file environment and check the size of off_t
|
||||||
|
echo Check for Large File Support
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
# define _LARGEFILE_SOURCE /* some OSes need this for fseeko */
|
||||||
|
# define _LARGEFILE64_SOURCE
|
||||||
|
# define _FILE_OFFSET_BITS 64 /* select default interface as 64 bit */
|
||||||
|
# define _LARGE_FILES /* some OSes need this for 64-bit off_t */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
off_t offset;
|
||||||
|
struct stat s;
|
||||||
|
/* see if have 64-bit off_t */
|
||||||
|
if (sizeof(offset) < 8)
|
||||||
|
return 1;
|
||||||
|
printf(" off_t is %d bytes\n", sizeof(off_t));
|
||||||
|
/* see if have 64-bit stat */
|
||||||
|
if (sizeof(s.st_size) < 8) {
|
||||||
|
printf(" s.st_size is %d bytes\n", sizeof(s.st_size));
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
# compile it
|
||||||
|
$CC -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -- no Large File Support
|
||||||
|
else
|
||||||
|
# run it
|
||||||
|
./conftest
|
||||||
|
r=$?
|
||||||
|
if [ $r -eq 1 ]; then
|
||||||
|
echo -- no Large File Support - no 64-bit off_t
|
||||||
|
elif [ $r -eq 2 ]; then
|
||||||
|
echo -- no Large File Support - no 64-bit stat
|
||||||
|
elif [ $r -eq 3 ]; then
|
||||||
|
echo -- yes we have Large File Support!
|
||||||
|
CFLAGSR="${CFLAGSR} -DLARGE_FILE_SUPPORT"
|
||||||
|
else
|
||||||
|
echo -- no Large File Support - conftest returned $r
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Added 11/24/2005 EG
|
||||||
|
# Check for wide char for Unicode support
|
||||||
|
echo Check for wide char support
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
size_t wsize;
|
||||||
|
wchar_t *wide_string;
|
||||||
|
|
||||||
|
if ((wide_string = (wchar_t *)malloc(4 * sizeof(wchar_t))) == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* get wide string */
|
||||||
|
wsize = mbstowcs(wide_string, "foo", 3);
|
||||||
|
wide_string[wsize] = (wchar_t) NULL;
|
||||||
|
#ifndef __STDC_ISO_10646__
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
|
printf(" __STDC_ISO_10646__ = %d\n", __STDC_ISO_10646__);
|
||||||
|
return 2;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
# compile it
|
||||||
|
$CC -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "-- no Unicode (wchar_t) support"
|
||||||
|
else
|
||||||
|
# have wide char support
|
||||||
|
# run it
|
||||||
|
./conftest
|
||||||
|
r=$?
|
||||||
|
if [ $r -eq 0 ]; then
|
||||||
|
echo -- no Unicode wchar_t support - wchar_t allocation error
|
||||||
|
elif [ $r -eq 1 ]; then
|
||||||
|
echo -- no Unicode support - wchar_t encoding unspecified
|
||||||
|
elif [ $r -eq 2 ]; then
|
||||||
|
echo -- have wchar_t with known UCS encoding - enabling Unicode support!
|
||||||
|
CFLAGSR="${CFLAGSR} -DUNICODE_SUPPORT -DUNICODE_WCHAR"
|
||||||
|
else
|
||||||
|
echo "-- no Unicode (wchar_t) support - conftest returned $r"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Check for setlocale support (needed for UNICODE Native check)"
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <locale.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char *loc = setlocale(LC_CTYPE, "");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "-- have setlocale, can check for charset type"
|
||||||
|
echo "-- - enabling UTF8-native support!"
|
||||||
|
CFLAGSR="${CFLAGSR} -DUNICODE_SUPPORT -DUTF8_MAYBE_NATIVE"
|
||||||
|
else
|
||||||
|
echo "-- no Unicode (UTF-8 native) support!"
|
||||||
|
CFLAGSR="${CFLAGSR} -DNO_SETLOCALE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# from configure 2.4i (Onno) 12/5/04
|
||||||
|
echo Check for gcc no-builtin flag
|
||||||
|
# -fno-builtin since version 2
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#if __GNUC__ >= 2
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
forget it
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && BFLAG="-fno-builtin"
|
||||||
|
|
||||||
|
# Check for missing functions
|
||||||
|
# add NO_'function_name' to flags if missing
|
||||||
|
for func in fchmod fchown lchown nl_langinfo
|
||||||
|
do
|
||||||
|
echo Check for $func
|
||||||
|
echo "int main(){ $func(); return 0; }" > conftest.c
|
||||||
|
$CC $BFLAG -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_`echo $func | tr '[a-z]' '[A-Z]'`"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check (seriously) for a working lchmod.
|
||||||
|
echo 'Check for lchmod'
|
||||||
|
temp_file="/tmp/unzip_test_$$"
|
||||||
|
temp_link="link_$$"
|
||||||
|
( echo '#include <unistd.h>' ; \
|
||||||
|
echo "int main() { lchmod(\"${temp_file}\", 0666); }" \
|
||||||
|
) > conftest.c
|
||||||
|
ln -s "${temp_link}" "${temp_file}" && \
|
||||||
|
$CC $BFLAG -o conftest conftest.c >/dev/null 2>/dev/null && \
|
||||||
|
./conftest
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_LCHMOD"
|
||||||
|
rm -f "${temp_file}"
|
||||||
|
|
||||||
|
echo Check for memset
|
||||||
|
echo "int main(){ char k; memset(&k,0,0); return 0; }" > conftest.c
|
||||||
|
$CC -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DZMEM"
|
||||||
|
|
||||||
|
echo Check for errno declaration
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <errno.h>
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_ERRNO"
|
||||||
|
|
||||||
|
echo Check for strerror
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <string.h>
|
||||||
|
int main() { strerror( 0); return 0; }
|
||||||
|
_EOF_
|
||||||
|
$CC $CFLAGS -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNEED_STRERROR"
|
||||||
|
|
||||||
|
echo Check for directory libraries
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
int main() { return closedir(opendir(".")); }
|
||||||
|
_EOF_
|
||||||
|
|
||||||
|
$CC -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
OPT=""
|
||||||
|
for lib in ndir dir ucb bsd BSD PW x dirent
|
||||||
|
do
|
||||||
|
$CC -o conftest conftest.c -l$lib >/dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && OPT=-l$lib && break
|
||||||
|
done
|
||||||
|
if [ ${OPT} ]; then
|
||||||
|
LFLAGS2="${LFLAGS2} ${OPT}"
|
||||||
|
else
|
||||||
|
CFLAGSR="${CFLAGSR} -DNO_DIR"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dynix/ptx 1.3 needed this
|
||||||
|
echo Check for readlink
|
||||||
|
echo "int main(){ return readlink(); }" > conftest.c
|
||||||
|
$CC -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
$CC -o conftest conftest.c -lseq >/dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && LFLAGS2="${LFLAGS2} -lseq"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo Check for directory include file
|
||||||
|
OPT=""
|
||||||
|
for inc in dirent.h sys/ndir.h ndir.h sys/dir.h
|
||||||
|
do
|
||||||
|
echo "#include <$inc>" > conftest.c
|
||||||
|
$CPP conftest.c > /dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break
|
||||||
|
done
|
||||||
|
CFLAGSR="${CFLAGSR} ${OPT}"
|
||||||
|
|
||||||
|
echo Check for non existent include files
|
||||||
|
for inc in stdlib.h stddef.h unistd.h fcntl.h string.h langinfo.h
|
||||||
|
do
|
||||||
|
echo "#include <$inc>" > conftest.c
|
||||||
|
$CPP conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_`echo $inc | tr '[a-z]./' '[A-Z]__'`"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo Check for term I/O include file
|
||||||
|
OPT=""
|
||||||
|
for inc in termios.h termio.h sgtty.h
|
||||||
|
do
|
||||||
|
echo "#include <$inc>" > conftest.c
|
||||||
|
$CPP conftest.c > /dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break
|
||||||
|
done
|
||||||
|
CFLAGSR="${CFLAGSR} ${OPT}"
|
||||||
|
|
||||||
|
echo Check for MBCS include files
|
||||||
|
OPT=""
|
||||||
|
for inc in mbstr.h mbstring.h mbctype.h
|
||||||
|
do
|
||||||
|
echo "#include <$inc>" > conftest.c
|
||||||
|
$CPP conftest.c > /dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break
|
||||||
|
done
|
||||||
|
CFLAGSR="${CFLAGSR} ${OPT}"
|
||||||
|
|
||||||
|
# Check for MBCS support
|
||||||
|
echo Check for MBCS support
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#ifdef HAVE_MBSTRING_H
|
||||||
|
# include <mbstring.h>
|
||||||
|
#endif
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char *tst;
|
||||||
|
tst = "Hallo";
|
||||||
|
return mblen(tst, MB_CUR_MAX);
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
# compile it
|
||||||
|
$CC ${CFLAGS} ${CFLAGSR} -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "-- no MBCS support"
|
||||||
|
CFLAGSR="${CFLAGSR} -DNO_MBCS"
|
||||||
|
else
|
||||||
|
#
|
||||||
|
echo "-- have MBCS support"
|
||||||
|
CFLAGSR="${CFLAGSR} -D_MBCS"
|
||||||
|
# Realistic check for working MBCS library functions.
|
||||||
|
# Add FUNCTION_NAME='function_name' to flags if found.
|
||||||
|
for func in mbschr mbsrchr
|
||||||
|
do
|
||||||
|
echo Check for MBCS $func
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifdef HAVE_MBSTR_H
|
||||||
|
# include <mbstr.h>
|
||||||
|
#endif
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char *tst;
|
||||||
|
tst = $func( "abc", 'b');
|
||||||
|
printf( " tst: >%s<.\n", tst);
|
||||||
|
return (tst == NULL);
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC ${CFLAGS} ${CFLAGSR} -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && ./conftest > /dev/null
|
||||||
|
[ $? -eq 0 ] && CFLAGSR="${CFLAGSR} -D`echo $func | tr '[a-z]' '[A-Z]'`=$func"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# needed for AIX (and others ?) when mmap is used
|
||||||
|
echo Check for valloc
|
||||||
|
cat > conftest.c << _EOF_
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
#ifdef MMAP
|
||||||
|
valloc();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
_EOF_
|
||||||
|
$CC ${CFLAGS} -c conftest.c > /dev/null 2>/dev/null
|
||||||
|
[ $? -ne 0 ] && CFLAGSR="${CFLAGSR} -DNO_VALLOC"
|
||||||
|
|
||||||
|
echo Check for /usr/local/bin and /usr/local/man
|
||||||
|
BINDIR=$HOME/bin
|
||||||
|
[ -d /usr/local/bin ] && BINDIR=/usr/local/bin
|
||||||
|
|
||||||
|
MANDIR=manl
|
||||||
|
[ -d /usr/man/manl ] && MANDIR=/usr/man/manl
|
||||||
|
[ -d /usr/local/man/manl ] && MANDIR=/usr/local/man/manl
|
||||||
|
[ -d /usr/local/man/man1 ] && MANDIR=/usr/local/man/man1
|
||||||
|
|
||||||
|
echo Checking for OS specialties
|
||||||
|
if [ -f /usr/bin/hostinfo ]; then
|
||||||
|
if /usr/bin/hostinfo | grep NeXT > /dev/null; then
|
||||||
|
CFLAGSR="${CFLAGSR} -posix"
|
||||||
|
LFLAGS1="${LFLAGS1} -posix -object"
|
||||||
|
fi
|
||||||
|
# XXX ATT6300, Cray
|
||||||
|
elif [ -f /xenix ]; then
|
||||||
|
if uname -p | grep 286 > /dev/null; then
|
||||||
|
CFLAGSR="${CFLAGSR} -LARGE -Mel2 -DMEDIUM_MEM -DWSIZE=16384 -DNO_VOID"
|
||||||
|
LFLAGS1="${LFLAGS1} -LARGE -Mel2"
|
||||||
|
fi
|
||||||
|
elif uname -X >/dev/null 2>/dev/null; then
|
||||||
|
# SCO shared library check
|
||||||
|
echo "int main() { return 0;}" > conftest.c
|
||||||
|
$CC -o conftest conftest.c -lc_s -nointl >/dev/null 2> /dev/null
|
||||||
|
[ $? -eq 0 ] && LFLAGS2="-lc_s -nointl"
|
||||||
|
else
|
||||||
|
SYSTEM=`uname -s 2>/dev/null` || SYSTEM="unknown"
|
||||||
|
echo "int main() { return 0;}" > conftest.c
|
||||||
|
case $SYSTEM in
|
||||||
|
OSF1|ULTRIX)
|
||||||
|
echo Check for -Olimit option
|
||||||
|
$CC ${CFLAGS} -Olimit 1000 -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
[ $? -eq 0 ] && CFLAGSR="${CFLAGSR} -Olimit 1000"
|
||||||
|
;;
|
||||||
|
### HP-UX)
|
||||||
|
### echo Check for +Onolimit option
|
||||||
|
### $CC ${CFLAGS} +Onolimit -o conftest conftest.c >/dev/null 2>/dev/null
|
||||||
|
### [ $? -eq 0 ] && CFLAGSR="${CFLAGSR} +Onolimit"
|
||||||
|
### ;;
|
||||||
|
### SunOS)
|
||||||
|
### CFLAGSR="${CFLAGSR} -D_FILE_OFFSET_BITS=64"
|
||||||
|
### ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo Check for symbolic links
|
||||||
|
ln -s /dev/null null > /dev/null 2>/dev/null || LN=ln
|
||||||
|
|
||||||
|
rm -f a.out conftest.c conftest.o conftest null
|
||||||
|
|
||||||
|
|
||||||
|
# bzip2
|
||||||
|
|
||||||
|
echo "Check bzip2 support"
|
||||||
|
LIBBZ2=""
|
||||||
|
CC_BZ="${CC}"
|
||||||
|
|
||||||
|
if test -n "${IZ_BZIP2}" -a "${IZ_BZIP2}" != "bzip2" ; then
|
||||||
|
echo " Check for bzip2 compiled library in IZ_BZIP2 (${IZ_BZIP2})"
|
||||||
|
if test -f "${IZ_BZIP2}/libbz2.a"; then
|
||||||
|
#
|
||||||
|
# A bzip2 library built with BZ_NO_STDIO should have an
|
||||||
|
# unresolved external, "bz_internal_error". The default,
|
||||||
|
# full-function library will not mention it.
|
||||||
|
#
|
||||||
|
nm ${IZ_BZIP2}/libbz2.a | grep bz_internal_error > /dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
echo " Found bzip2 BZ_NO_STDIO library, ${IZ_BZIP2}/libbz2.a"
|
||||||
|
if test -f "${IZ_BZIP2}/bzlib.h"; then
|
||||||
|
LIBBZ2="${IZ_BZIP2}/libbz2.a"
|
||||||
|
echo "-- Found bzip2 library - linking in bzip2"
|
||||||
|
else
|
||||||
|
echo " ${IZ_BZIP2}/bzlib.h not found"
|
||||||
|
echo "-- Since IZ_BZIP2 defined (!= \"bzip2\"),"
|
||||||
|
echo "-- => skipping OS and bzip2 dir checks."
|
||||||
|
echo "-- NO bzip2 support !"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " Found bzip2 library, ${IZ_BZIP2}/libbz2.a,"
|
||||||
|
echo " but library not compiled with BZ_NO_STDIO."
|
||||||
|
echo " ERROR: This (default) variant of bzip2 library is NOT"
|
||||||
|
echo " supported with UnZip because of its incompatible"
|
||||||
|
echo " error handling!"
|
||||||
|
echo " Please see the UnZip installation instructions in"
|
||||||
|
echo " the INSTALL text file."
|
||||||
|
echo " Skipping bzip2 support..."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " ${IZ_BZIP2}/libbz2.a not found"
|
||||||
|
echo "-- Since IZ_BZIP2 defined (!= \"bzip2\"),"
|
||||||
|
echo "-- => skipping OS and bzip2 dir checks."
|
||||||
|
echo "-- NO bzip2 support !"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " Check for bzip2 sources in unzip's bzip2 subdirectory"
|
||||||
|
if test -f "${IZ_BZIP2}/bzlib.c" -a -f "${IZ_BZIP2}/bzlib.h"; then
|
||||||
|
echo "-- Found bzip2 source in ${IZ_BZIP2}/ directory"
|
||||||
|
echo "-- Will try to build bzip2 library from source and link in"
|
||||||
|
LIBBZ2="${IZ_BZIP2}/libbz2.a"
|
||||||
|
else
|
||||||
|
echo "-- bzip2 sources not found - no bzip2 support"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "${LIBBZ2}" ; then
|
||||||
|
CFLAGSR="${CFLAGSR} -DUSE_BZIP2 -I${IZ_BZIP2}"
|
||||||
|
LFLAGS1="${LFLAGS1} -L${IZ_BZIP2}"
|
||||||
|
LFLAGS2="${LFLAGS2} ${BZLF} -lbz2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# zlib
|
||||||
|
|
||||||
|
if test -n "${IZ_ZLIB}"; then
|
||||||
|
echo "Using (expecting) zlib in IZ_ZLIB (${IZ_ZLIB})"
|
||||||
|
CFLAGSR="${CFLAGSR} -DUSE_ZLIB -I${IZ_ZLIB}"
|
||||||
|
LFLAGS1="${LFLAGS1} -L${IZ_ZLIB}"
|
||||||
|
LFLAGS2="${LFLAGS2} ${BZLF} -lz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# System identification
|
||||||
|
UNAME_M=''
|
||||||
|
uname_m=` uname -m 2> /dev/null ` && \
|
||||||
|
UNAME_M=" -DUNAME_M='\\\"${uname_m}\\\"'"
|
||||||
|
UNAME_O=''
|
||||||
|
uname_o=` uname -o 2> /dev/null ` && \
|
||||||
|
UNAME_O=" -DUNAME_O='\\\"${uname_o}\\\"'"
|
||||||
|
UNAME_P=''
|
||||||
|
uname_p=` uname -p 2> /dev/null ` && \
|
||||||
|
UNAME_P=" -DUNAME_P='\\\"${uname_p}\\\"'"
|
||||||
|
UNAME_R=''
|
||||||
|
uname_r=` uname -r 2> /dev/null ` && \
|
||||||
|
UNAME_R=" -DUNAME_R='\\\"${uname_r}\\\"'"
|
||||||
|
UNAME_S=''
|
||||||
|
uname_s=` uname -s 2> /dev/null ` && \
|
||||||
|
UNAME_S=" -DUNAME_S='\\\"${uname_s}\\\"'"
|
||||||
|
UNAME_V=''
|
||||||
|
uname_v=` uname -v 2> /dev/null ` && \
|
||||||
|
UNAME_V=" -DUNAME_V='\\\"${uname_v}\\\"'"
|
||||||
|
|
||||||
|
if [ -f /usr/sbin/sizer ]; then
|
||||||
|
SIZER_V=''
|
||||||
|
sizer_v=` /usr/sbin/sizer -v 2> /dev/null | \
|
||||||
|
sed -e 's/^[^ ]* [^ ]* [^ ]* \([^ ]*\) .*/\1/' ` && \
|
||||||
|
SIZER_V=" -DSIZER_V='\\\"${sizer_v}\\\"'"
|
||||||
|
|
||||||
|
CFLAGSR="${CFLAGSR} ${SIZER_V}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CFLAGSR="${CFLAGSR} ${UNAME_M} ${UNAME_O} ${UNAME_P} ${UNAME_R}"
|
||||||
|
CFLAGSR="${CFLAGSR} ${UNAME_S} ${UNAME_V}"
|
||||||
|
|
||||||
|
echo CC=\"${CC}\" CF=\"${CFLAGSR}\" CRCA_O=\"${CRC32OA}\" \
|
||||||
|
AS=\"${CC} -c\" LFLAGS1=\"${LFLAGS1}\" LF2=\"${LFLAGS2}\" \
|
||||||
|
CC_BZ=\"${CC_BZ}\" CFLAGS_BZ=\"${CFLAGS_BZ}\" \
|
||||||
|
IZ_BZIP2=\"${IZ_BZIP2}\" LIBBZ2=\"${LIBBZ2}\" \
|
||||||
|
IZ_ZLIB=\"${IZ_ZLIB}\" > flags
|
||||||
|
|
49
third_party/unzip/unix/macosx.h
vendored
Normal file
49
third_party/unzip/unix/macosx.h
vendored
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
macosx.h - UnZip 6
|
||||||
|
|
||||||
|
Copyright (c) 2008 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2007-Mar-4 or later
|
||||||
|
(the contents of which are also included in zip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MACOSX_H
|
||||||
|
# define __MACOSX_H
|
||||||
|
|
||||||
|
# if defined( UNIX) && defined( __APPLE__)
|
||||||
|
|
||||||
|
# include <sys/attr.h>
|
||||||
|
# include <sys/vnode.h>
|
||||||
|
|
||||||
|
# define APL_DBL_PFX "._"
|
||||||
|
# define APL_DBL_PFX_SQR "__MACOSX/"
|
||||||
|
# define APL_DBL_SFX "/rsrc"
|
||||||
|
|
||||||
|
# define APL_DBL_HDR_SIZE 82
|
||||||
|
# define APL_DBL_HDR_RSRC_FORK_SIZE 46
|
||||||
|
# define APL_DBL_HDR_FNDR_INFO_OFFS 50
|
||||||
|
# define APL_DBL_OFS_MAGIC 0
|
||||||
|
# define APL_DBL_OFS_VERSION 4
|
||||||
|
# define APL_DBL_OFS_FILLER 8
|
||||||
|
# define APL_DBL_OFS_ENT_CNT 24
|
||||||
|
# define APL_DBL_OFS_ENT_DSCR 28
|
||||||
|
|
||||||
|
# define APL_FNDR_INFO_SIZE 32
|
||||||
|
|
||||||
|
/* Finder info attribute buffer structure for setattrlist(). */
|
||||||
|
typedef struct {
|
||||||
|
char fndr_info[ APL_FNDR_INFO_SIZE];
|
||||||
|
} attr_bufr_fndr_t;
|
||||||
|
|
||||||
|
/* Resource fork attribute buffer structure for getattrlist(). */
|
||||||
|
typedef struct {
|
||||||
|
unsigned int ret_length;
|
||||||
|
off_t size;
|
||||||
|
} attr_bufr_rsrc_t;
|
||||||
|
|
||||||
|
# endif /* defined( unix) && defined( __APPLE__) */
|
||||||
|
|
||||||
|
#endif /* ndef __MACOSX_H */
|
||||||
|
|
123
third_party/unzip/unix/zipgrep
vendored
Normal file
123
third_party/unzip/unix/zipgrep
vendored
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# zipgrep: Use unzip and egrep to search the specified members of a
|
||||||
|
# Zip archive for a string or pattern. Search all members if no members
|
||||||
|
# are specified explicitly. The script attempts to handle egrep's "-h"
|
||||||
|
# and "-l" options internally.
|
||||||
|
#
|
||||||
|
# This script assumes that the desired "unzip" and "egrep" (and "grep",
|
||||||
|
# "od", and "sed") programs are on the user's PATH. The user may specify
|
||||||
|
# a particular "unzip" path in the environment variable ZIPGREP_UNZIP.
|
||||||
|
#
|
||||||
|
|
||||||
|
# UnZip command.
|
||||||
|
unzip=${ZIPGREP_UNZIP:-unzip}
|
||||||
|
|
||||||
|
# UnZip command options. (Note: Shell quoting can cause problems with
|
||||||
|
# enbedded spaces in a single options variable.)
|
||||||
|
unzopts1='-L-'
|
||||||
|
unzopts2='-p'
|
||||||
|
unzopts3=''
|
||||||
|
|
||||||
|
# ASCII/EBCDIC test. (Note: Simple-looking test, if [[ "a" < "A" ]], is
|
||||||
|
# too modern for an old shell (like Solaris /bin/sh)).
|
||||||
|
echo A | od -x | grep -i "C115" > /dev/null
|
||||||
|
if test $? -eq 0; then
|
||||||
|
unzopts2='-cq'
|
||||||
|
unzopts3='-aa'
|
||||||
|
fi
|
||||||
|
|
||||||
|
pat=""
|
||||||
|
opt=""
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case "$1" in
|
||||||
|
-e | -f) opt="$opt $1"; shift; pat="$1";;
|
||||||
|
-*) opt="$opt $1";;
|
||||||
|
*) if test -z "$pat"; then
|
||||||
|
pat="$1"
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
fi;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test $# = 0; then
|
||||||
|
echo usage: `basename "$0"` "[egrep_options] pattern zipfile [members...]"
|
||||||
|
echo Uses unzip and egrep to search the zip members for a string or pattern.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
zipfile="$1"; shift
|
||||||
|
|
||||||
|
list=0
|
||||||
|
silent=0
|
||||||
|
opt=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
|
||||||
|
case "$opt" in
|
||||||
|
*l*) list=1; opt=`echo $opt | sed s/l//`
|
||||||
|
esac
|
||||||
|
case "$opt" in
|
||||||
|
*h*) silent=1
|
||||||
|
esac
|
||||||
|
if test -n "$opt"; then
|
||||||
|
opt="-$opt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
status_grep_global=1
|
||||||
|
IFS='
|
||||||
|
'
|
||||||
|
|
||||||
|
# Escape shell-special characters in "pat".
|
||||||
|
pat=` echo "$pat" | \
|
||||||
|
sed -e 's/\\\\/\\\\\\\\/g' -e 's/|/\\\|/g' -e 's/&/\\\&/g' `
|
||||||
|
|
||||||
|
# Use "unzip -Z1" to get a listing of the specified members from the
|
||||||
|
# specified archive. Escape any backslashes in a file name.
|
||||||
|
for i in `$unzip -Z1 "$zipfile" ${1+"$@"} | sed -e 's/\\\\/\\\\\\\\/g' `; do
|
||||||
|
if test $list -eq 1; then
|
||||||
|
# "-l": Show only the archive member name, not the matching line(s).
|
||||||
|
$unzip $unzopts1 $unzopts2 $unzopts3 "$zipfile" "$i" | \
|
||||||
|
egrep $opt "$pat" > /dev/null && echo "$i"
|
||||||
|
status_grep=$?
|
||||||
|
elif test $silent -eq 1; then
|
||||||
|
# "-h": Show only the matching line(s), not the archive member name.
|
||||||
|
# ("-s" in "opt" will silence "egrep", stopping all output.)
|
||||||
|
$unzip $unzopts1 $unzopts2 $unzopts3 "$zipfile" "$i" | \
|
||||||
|
egrep $opt "$pat"
|
||||||
|
status_grep=$?
|
||||||
|
else
|
||||||
|
# Escape (or re-escape) shell-special characters in the archive
|
||||||
|
# member name, "i".
|
||||||
|
i=` echo "$i" | \
|
||||||
|
sed -e 's/\\\\/\\\\\\\\/g' -e 's/|/\\\|/g' -e 's/&/\\\&/g' `
|
||||||
|
|
||||||
|
# Globally, send fd 4 to stdout. In the pipeline, send normal
|
||||||
|
# stdout to fd 4, and send grep status to fd 3. Collect fd 3
|
||||||
|
# with ``.
|
||||||
|
exec 4>&1
|
||||||
|
status_grep=` ( \
|
||||||
|
( $unzip $unzopts1 $unzopts2 $unzopts3 "$zipfile" "$i" | \
|
||||||
|
egrep $opt "$pat" 1>&4 ; echo $? >&3 ) 4>&1 | \
|
||||||
|
sed "s|^|${i}:|" 1>&4 \
|
||||||
|
) 3>&1 `
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Save the primary command status. (May be the grep status.)
|
||||||
|
sts=$?
|
||||||
|
# If this grep status was zero, set the global grep status to zero.
|
||||||
|
test "$status_grep" -eq 0 && status_grep_global=0
|
||||||
|
# If this grep status was not zero or one, exit now.
|
||||||
|
test "$status_grep" -gt 1 && exit "$status_grep"
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
# If "sts" is good (0), then exit with the global grep status.
|
||||||
|
# Else, when "sts" is bad, exit with the worst status we can find.
|
||||||
|
if test $sts -eq 0 ; then
|
||||||
|
exit $status_grep_global
|
||||||
|
else
|
||||||
|
if test "$status_grep" -gt 1 ; then
|
||||||
|
exit "$status_grep"
|
||||||
|
else
|
||||||
|
exit $sts
|
||||||
|
fi
|
||||||
|
fi
|
36
third_party/unzip/unreduce.c
vendored
Normal file
36
third_party/unzip/unreduce.c
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2002 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
unreduce.c
|
||||||
|
|
||||||
|
Copyright-clean dummy module, without any real code.
|
||||||
|
|
||||||
|
If you really need unreduce support, replace this module by the full
|
||||||
|
source code, available as add-on package from our distribution site.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define __UNREDUCE_C /* identifies this source module */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h" /* defines COPYRIGHT_CLEAN by default */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef COPYRIGHT_CLEAN
|
||||||
|
|
||||||
|
/* This line is indented to hide the #error directive from pure traditional
|
||||||
|
* K&R C preprocessors. These do not recognize the #error directive, but
|
||||||
|
* they also recognize only lines that start with a '#' in column 1 as
|
||||||
|
* preprocessor directives.
|
||||||
|
*/
|
||||||
|
#error This dummy-module does not support the unreduce method!
|
||||||
|
|
||||||
|
#endif /* !COPYRIGHT_CLEAN */
|
337
third_party/unzip/unshrink.c
vendored
Normal file
337
third_party/unzip/unshrink.c
vendored
Normal file
|
@ -0,0 +1,337 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2008 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2000-Apr-09 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
unshrink.c version 1.22 19 Mar 2008
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: This code may or may not infringe on the so-called "Welch
|
||||||
|
patent" owned by Unisys. (From reading the patent, it appears
|
||||||
|
that a pure LZW decompressor is *not* covered, but this claim has
|
||||||
|
not been tested in court, and Unisys is reported to believe other-
|
||||||
|
wise.) It is therefore the responsibility of the user to acquire
|
||||||
|
whatever license(s) may be required for legal use of this code.
|
||||||
|
|
||||||
|
THE INFO-ZIP GROUP DISCLAIMS ALL LIABILITY FOR USE OF THIS CODE
|
||||||
|
IN VIOLATION OF APPLICABLE PATENT LAW.
|
||||||
|
|
||||||
|
|
||||||
|
Shrinking is basically a dynamic LZW algorithm with allowed code sizes of
|
||||||
|
up to 13 bits; in addition, there is provision for partial clearing of
|
||||||
|
leaf nodes. PKWARE uses the special code 256 (decimal) to indicate a
|
||||||
|
change in code size or a partial clear of the code tree: 256,1 for the
|
||||||
|
former and 256,2 for the latter. [Note that partial clearing can "orphan"
|
||||||
|
nodes: the parent-to-be can be cleared before its new child is added,
|
||||||
|
but the child is added anyway (as an orphan, as though the parent still
|
||||||
|
existed). When the tree fills up to the point where the parent node is
|
||||||
|
reused, the orphan is effectively "adopted." Versions prior to 1.05 were
|
||||||
|
affected more due to greater use of pointers (to children and siblings
|
||||||
|
as well as parents).]
|
||||||
|
|
||||||
|
This replacement version of unshrink.c was written from scratch. It is
|
||||||
|
based only on the algorithms described in Mark Nelson's _The Data Compres-
|
||||||
|
sion Book_ and in Terry Welch's original paper in the June 1984 issue of
|
||||||
|
IEEE _Computer_; no existing source code, including any in Nelson's book,
|
||||||
|
was used.
|
||||||
|
|
||||||
|
Memory requirements have been reduced in this version and are now no more
|
||||||
|
than the original Sam Smith code. This is still larger than any of the
|
||||||
|
other algorithms: at a minimum, 8K+8K+16K (stack+values+parents) assuming
|
||||||
|
16-bit short ints, and this does not even include the output buffer (the
|
||||||
|
other algorithms leave the uncompressed data in the work area, typically
|
||||||
|
called slide[]). For machines with a 64KB data space this is a problem,
|
||||||
|
particularly when text conversion is required and line endings have more
|
||||||
|
than one character. UnZip's solution is to use two roughly equal halves
|
||||||
|
of outbuf for the ASCII conversion in such a case; the "unshrink" argument
|
||||||
|
to flush() signals that this is the case.
|
||||||
|
|
||||||
|
For large-memory machines, a second outbuf is allocated for translations,
|
||||||
|
but only if unshrinking and only if translations are required.
|
||||||
|
|
||||||
|
| binary mode | text mode
|
||||||
|
---------------------------------------------------
|
||||||
|
big mem | big outbuf | big outbuf + big outbuf2 <- malloc'd here
|
||||||
|
small mem | small outbuf | half + half small outbuf
|
||||||
|
|
||||||
|
Copyright 1994, 1995 Greg Roelofs. See the accompanying file "COPYING"
|
||||||
|
in UnZip 5.20 (or later) source or binary distributions.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define __UNSHRINK_C /* identifies this source module */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LZW_CLEAN
|
||||||
|
|
||||||
|
static void partial_clear OF((__GPRO__ int lastcodeused));
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
# define OUTDBG(c) \
|
||||||
|
if ((c)<32 || (c)>=127) fprintf(stderr,"\\x%02x",(c)); else putc((c),stderr);
|
||||||
|
#else
|
||||||
|
# define OUTDBG(c)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* HSIZE is defined as 2^13 (8192) in unzip.h (resp. unzpriv.h */
|
||||||
|
#define BOGUSCODE 256
|
||||||
|
#define FLAG_BITS parent /* upper bits of parent[] used as flag bits */
|
||||||
|
#define CODE_MASK (HSIZE - 1) /* 0x1fff (lower bits are parent's index) */
|
||||||
|
#define FREE_CODE HSIZE /* 0x2000 (code is unused or was cleared) */
|
||||||
|
#define HAS_CHILD (HSIZE << 1) /* 0x4000 (code has a child--do not clear) */
|
||||||
|
|
||||||
|
#define parent G.area.shrink.Parent
|
||||||
|
#define Value G.area.shrink.value /* "value" conflicts with Pyramid ioctl.h */
|
||||||
|
#define stack G.area.shrink.Stack
|
||||||
|
|
||||||
|
|
||||||
|
/***********************/
|
||||||
|
/* Function unshrink() */
|
||||||
|
/***********************/
|
||||||
|
|
||||||
|
int unshrink(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
uch *stacktop = stack + (HSIZE - 1);
|
||||||
|
register uch *newstr;
|
||||||
|
uch finalval;
|
||||||
|
int codesize=9, len, error;
|
||||||
|
shrint code, oldcode, curcode;
|
||||||
|
shrint lastfreecode;
|
||||||
|
unsigned int outbufsiz;
|
||||||
|
#if (defined(DLL) && !defined(NO_SLIDE_REDIR))
|
||||||
|
/* Normally realbuf and outbuf will be the same. However, if the data
|
||||||
|
* are redirected to a large memory buffer, realbuf will point to the
|
||||||
|
* new location while outbuf will remain pointing to the malloc'd
|
||||||
|
* memory buffer. */
|
||||||
|
uch *realbuf = G.outbuf;
|
||||||
|
#else
|
||||||
|
# define realbuf G.outbuf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Initialize various variables.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
lastfreecode = BOGUSCODE;
|
||||||
|
|
||||||
|
#ifndef VMS /* VMS uses its own buffer scheme for textmode flush(). */
|
||||||
|
#ifndef SMALL_MEM
|
||||||
|
/* non-memory-limited machines: allocate second (large) buffer for
|
||||||
|
* textmode conversion in flush(), but only if needed */
|
||||||
|
if (G.pInfo->textmode && !G.outbuf2 &&
|
||||||
|
(G.outbuf2 = (uch *)malloc(TRANSBUFSIZ)) == (uch *)NULL)
|
||||||
|
return PK_MEM3;
|
||||||
|
#endif
|
||||||
|
#endif /* !VMS */
|
||||||
|
|
||||||
|
for (code = 0; code < BOGUSCODE; ++code) {
|
||||||
|
Value[code] = (uch)code;
|
||||||
|
parent[code] = BOGUSCODE;
|
||||||
|
}
|
||||||
|
for (code = BOGUSCODE+1; code < HSIZE; ++code)
|
||||||
|
parent[code] = FREE_CODE;
|
||||||
|
|
||||||
|
#if (defined(DLL) && !defined(NO_SLIDE_REDIR))
|
||||||
|
if (G.redirect_slide) { /* use normal outbuf unless we're a DLL routine */
|
||||||
|
realbuf = G.redirect_buffer;
|
||||||
|
outbufsiz = (unsigned)G.redirect_size;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
#ifdef DLL
|
||||||
|
if (G.pInfo->textmode && !G.redirect_data)
|
||||||
|
#else
|
||||||
|
if (G.pInfo->textmode)
|
||||||
|
#endif
|
||||||
|
outbufsiz = RAWBUFSIZ;
|
||||||
|
else
|
||||||
|
outbufsiz = OUTBUFSIZ;
|
||||||
|
G.outptr = realbuf;
|
||||||
|
G.outcnt = 0L;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Get and output first code, then loop over remaining ones.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
READBITS(codesize, oldcode)
|
||||||
|
if (G.zipeof)
|
||||||
|
return PK_OK;
|
||||||
|
|
||||||
|
finalval = (uch)oldcode;
|
||||||
|
OUTDBG(finalval)
|
||||||
|
*G.outptr++ = finalval;
|
||||||
|
++G.outcnt;
|
||||||
|
|
||||||
|
while (TRUE) {
|
||||||
|
READBITS(codesize, code)
|
||||||
|
if (G.zipeof)
|
||||||
|
break;
|
||||||
|
if (code == BOGUSCODE) { /* possible to have consecutive escapes? */
|
||||||
|
READBITS(codesize, code)
|
||||||
|
if (G.zipeof)
|
||||||
|
break;
|
||||||
|
if (code == 1) {
|
||||||
|
++codesize;
|
||||||
|
Trace((stderr, " (codesize now %d bits)\n", codesize));
|
||||||
|
if (codesize > MAX_BITS) return PK_ERR;
|
||||||
|
} else if (code == 2) {
|
||||||
|
Trace((stderr, " (partial clear code)\n"));
|
||||||
|
/* clear leafs (nodes with no children) */
|
||||||
|
partial_clear(__G__ lastfreecode);
|
||||||
|
Trace((stderr, " (done with partial clear)\n"));
|
||||||
|
lastfreecode = BOGUSCODE; /* reset start of free-node search */
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Translate code: traverse tree from leaf back to root.
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
newstr = stacktop;
|
||||||
|
curcode = code;
|
||||||
|
|
||||||
|
if (parent[code] == FREE_CODE) {
|
||||||
|
/* or (FLAG_BITS[code] & FREE_CODE)? */
|
||||||
|
Trace((stderr, " (found a KwKwK code %d; oldcode = %d)\n", code,
|
||||||
|
oldcode));
|
||||||
|
*newstr-- = finalval;
|
||||||
|
code = oldcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (code != BOGUSCODE) {
|
||||||
|
if (newstr < stack) {
|
||||||
|
/* Bogus compression stream caused buffer underflow! */
|
||||||
|
Trace((stderr, "unshrink stack overflow!\n"));
|
||||||
|
return PK_ERR;
|
||||||
|
}
|
||||||
|
if (parent[code] == FREE_CODE) {
|
||||||
|
/* or (FLAG_BITS[code] & FREE_CODE)? */
|
||||||
|
Trace((stderr, " (found a KwKwK code %d; oldcode = %d)\n",
|
||||||
|
code, oldcode));
|
||||||
|
*newstr-- = finalval;
|
||||||
|
code = oldcode;
|
||||||
|
} else {
|
||||||
|
*newstr-- = Value[code];
|
||||||
|
code = (shrint)(parent[code] & CODE_MASK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
len = (int)(stacktop - newstr++);
|
||||||
|
finalval = *newstr;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Write expanded string in reverse order to output buffer.
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
Trace((stderr,
|
||||||
|
"code %4d; oldcode %4d; char %3d (%c); len %d; string [", curcode,
|
||||||
|
oldcode, (int)(*newstr), (*newstr<32 || *newstr>=127)? ' ':*newstr,
|
||||||
|
len));
|
||||||
|
|
||||||
|
{
|
||||||
|
register uch *p;
|
||||||
|
|
||||||
|
for (p = newstr; p < newstr+len; ++p) {
|
||||||
|
*G.outptr++ = *p;
|
||||||
|
OUTDBG(*p)
|
||||||
|
if (++G.outcnt == outbufsiz) {
|
||||||
|
Trace((stderr, "doing flush(), outcnt = %lu\n", G.outcnt));
|
||||||
|
if ((error = flush(__G__ realbuf, G.outcnt, TRUE)) != 0) {
|
||||||
|
Trace((stderr, "unshrink: flush() error (%d)\n",
|
||||||
|
error));
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
G.outptr = realbuf;
|
||||||
|
G.outcnt = 0L;
|
||||||
|
Trace((stderr, "done with flush()\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Add new leaf (first character of newstr) to tree as child of oldcode.
|
||||||
|
-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* search for freecode */
|
||||||
|
code = (shrint)(lastfreecode + 1);
|
||||||
|
/* add if-test before loop for speed? */
|
||||||
|
while ((code < HSIZE) && (parent[code] != FREE_CODE))
|
||||||
|
++code;
|
||||||
|
lastfreecode = code;
|
||||||
|
Trace((stderr, "]; newcode %d\n", code));
|
||||||
|
if (code >= HSIZE)
|
||||||
|
/* invalid compressed data caused max-code overflow! */
|
||||||
|
return PK_ERR;
|
||||||
|
|
||||||
|
Value[code] = finalval;
|
||||||
|
parent[code] = oldcode;
|
||||||
|
oldcode = curcode;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Flush any remaining data and return to sender...
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (G.outcnt > 0L) {
|
||||||
|
Trace((stderr, "doing final flush(), outcnt = %lu\n", G.outcnt));
|
||||||
|
if ((error = flush(__G__ realbuf, G.outcnt, TRUE)) != 0) {
|
||||||
|
Trace((stderr, "unshrink: flush() error (%d)\n", error));
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
Trace((stderr, "done with flush()\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return PK_OK;
|
||||||
|
|
||||||
|
} /* end function unshrink() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* Function partial_clear() */ /* no longer recursive... */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
|
static void partial_clear(__G__ lastcodeused)
|
||||||
|
__GDEF
|
||||||
|
int lastcodeused;
|
||||||
|
{
|
||||||
|
register shrint code;
|
||||||
|
|
||||||
|
/* clear all nodes which have no children (i.e., leaf nodes only) */
|
||||||
|
|
||||||
|
/* first loop: mark each parent as such */
|
||||||
|
for (code = BOGUSCODE+1; code <= lastcodeused; ++code) {
|
||||||
|
register shrint cparent = (shrint)(parent[code] & CODE_MASK);
|
||||||
|
|
||||||
|
if (cparent > BOGUSCODE)
|
||||||
|
FLAG_BITS[cparent] |= HAS_CHILD; /* set parent's child-bit */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* second loop: clear all nodes *not* marked as parents; reset flag bits */
|
||||||
|
for (code = BOGUSCODE+1; code <= lastcodeused; ++code) {
|
||||||
|
if (FLAG_BITS[code] & HAS_CHILD) /* just clear child-bit */
|
||||||
|
FLAG_BITS[code] &= ~HAS_CHILD;
|
||||||
|
else { /* leaf: lose it */
|
||||||
|
Trace((stderr, "%d\n", code));
|
||||||
|
parent[code] = FREE_CODE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !LZW_CLEAN */
|
238
third_party/unzip/unxcfg.h
vendored
Normal file
238
third_party/unzip/unxcfg.h
vendored
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2010 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Unix specific configuration section:
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __unxcfg_h
|
||||||
|
#define __unxcfg_h
|
||||||
|
#include "libc/calls/struct/stat.h"
|
||||||
|
#include "libc/sysv/consts/o.h"
|
||||||
|
#include "libc/str/str.h"
|
||||||
|
#include "libc/time/time.h"
|
||||||
|
#include "libc/calls/weirdtypes.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* LARGE FILE SUPPORT - 10/6/04 EG */
|
||||||
|
/* This needs to be set before the includes so they set the right sizes */
|
||||||
|
|
||||||
|
#if (defined(NO_LARGE_FILE_SUPPORT) && defined(LARGE_FILE_SUPPORT))
|
||||||
|
# undef LARGE_FILE_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Automatically set ZIP64_SUPPORT if LFS */
|
||||||
|
#ifdef LARGE_FILE_SUPPORT
|
||||||
|
# if (!defined(NO_ZIP64_SUPPORT) && !defined(ZIP64_SUPPORT))
|
||||||
|
# define ZIP64_SUPPORT
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* NO_ZIP64_SUPPORT takes preceedence over ZIP64_SUPPORT */
|
||||||
|
#if defined(NO_ZIP64_SUPPORT) && defined(ZIP64_SUPPORT)
|
||||||
|
# undef ZIP64_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LARGE_FILE_SUPPORT
|
||||||
|
/* 64-bit Large File Support */
|
||||||
|
|
||||||
|
/* The following Large File Summit (LFS) defines turn on large file support
|
||||||
|
on Linux (probably 2.4 or later kernel) and many other unixen */
|
||||||
|
|
||||||
|
/* These have to be before any include that sets types so the large file
|
||||||
|
versions of the types are set in the includes */
|
||||||
|
|
||||||
|
# define _LARGEFILE_SOURCE /* some OSes need this for fseeko */
|
||||||
|
# define _LARGEFILE64_SOURCE
|
||||||
|
# define _FILE_OFFSET_BITS 64 /* select default interface as 64 bit */
|
||||||
|
# define _LARGE_FILES /* some OSes need this for 64-bit off_t */
|
||||||
|
# define __USE_LARGEFILE64
|
||||||
|
#endif /* LARGE_FILE_SUPPORT */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef NO_OFF_T
|
||||||
|
typedef long zoff_t;
|
||||||
|
#else
|
||||||
|
typedef off_t zoff_t;
|
||||||
|
#endif
|
||||||
|
#define ZOFF_T_DEFINED
|
||||||
|
typedef struct stat z_stat;
|
||||||
|
#define Z_STAT_DEFINED
|
||||||
|
|
||||||
|
#ifndef COHERENT
|
||||||
|
#else /* COHERENT */
|
||||||
|
# ifdef _I386
|
||||||
|
# else
|
||||||
|
# endif
|
||||||
|
# define SHORT_SYMS
|
||||||
|
# ifndef __COHERENT__ /* Coherent 4.2 has tzset() */
|
||||||
|
# define tzset settz
|
||||||
|
# endif
|
||||||
|
#endif /* ?COHERENT */
|
||||||
|
|
||||||
|
#ifndef NO_PARAM_H
|
||||||
|
# ifdef NGROUPS_MAX
|
||||||
|
# undef NGROUPS_MAX /* SCO bug: defined again in <sys/param.h> */
|
||||||
|
# endif
|
||||||
|
# ifdef BSD
|
||||||
|
# define TEMP_BSD /* may be defined again in <sys/param.h> */
|
||||||
|
# undef BSD
|
||||||
|
# endif
|
||||||
|
# ifdef TEMP_BSD
|
||||||
|
# undef TEMP_BSD
|
||||||
|
# ifndef BSD
|
||||||
|
# define BSD
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif /* !NO_PARAM_H */
|
||||||
|
|
||||||
|
#ifdef __osf__
|
||||||
|
# define DIRENT
|
||||||
|
# ifdef BSD
|
||||||
|
# undef BSD
|
||||||
|
# endif
|
||||||
|
#endif /* __osf__ */
|
||||||
|
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
# define DIRENT
|
||||||
|
# define HAVE_TERMIOS_H
|
||||||
|
# ifndef timezone
|
||||||
|
# define timezone _timezone
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(BSD4_4) || (defined(SYSV) && defined(MODERN)))
|
||||||
|
# if (defined(BSD4_4) || defined(linux) || defined(__GLIBC__))
|
||||||
|
# define GOT_UTIMBUF
|
||||||
|
# endif
|
||||||
|
# if (!defined(GOT_UTIMBUF) && (defined(__hpux) || defined(__SUNPRO_C)))
|
||||||
|
# define GOT_UTIMBUF
|
||||||
|
# endif
|
||||||
|
# if (!defined(GOT_UTIMBUF) && defined(__GNU__))
|
||||||
|
# define GOT_UTIMBUF
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(__DGUX__) && !defined(GOT_UTIMBUF))
|
||||||
|
/* DG/UX requires this because of a non-standard struct utimebuf */
|
||||||
|
# define GOT_UTIMBUF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(V7) || defined(pyr_bsd))
|
||||||
|
# define strchr index
|
||||||
|
# define strrchr rindex
|
||||||
|
#endif
|
||||||
|
#ifdef V7
|
||||||
|
# define O_RDONLY 0
|
||||||
|
# define O_WRONLY 1
|
||||||
|
# define O_RDWR 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(NO_UNICODE_SUPPORT) && defined(UNICODE_SUPPORT)
|
||||||
|
/* disable Unicode (UTF-8) support when requested */
|
||||||
|
# undef UNICODE_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(_MBCS) && defined(NO_MBCS))
|
||||||
|
/* disable MBCS support when requested */
|
||||||
|
# undef _MBCS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!defined(NO_SETLOCALE) && !defined(_MBCS))
|
||||||
|
# if (!defined(UNICODE_SUPPORT) || !defined(UTF8_MAYBE_NATIVE))
|
||||||
|
/* enable setlocale here, unless this happens later for UTF-8 and/or
|
||||||
|
* MBCS support */
|
||||||
|
# ifndef SETLOCALE
|
||||||
|
# define SETLOCALE(category, locale) setlocale(category, locale)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#ifndef NO_SETLOCALE
|
||||||
|
# if (!defined(NO_WORKING_ISPRINT) && !defined(HAVE_WORKING_ISPRINT))
|
||||||
|
/* enable "enhanced" unprintable chars detection in fnfilter() */
|
||||||
|
# define HAVE_WORKING_ISPRINT
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MINIX
|
||||||
|
#endif
|
||||||
|
#if (!defined(HAVE_STRNICMP) & !defined(NO_STRNICMP))
|
||||||
|
# define NO_STRNICMP
|
||||||
|
#endif
|
||||||
|
#ifndef DATE_FORMAT
|
||||||
|
# define DATE_FORMAT DF_MDY /* GRR: customize with locale.h somehow? */
|
||||||
|
#endif
|
||||||
|
#define lenEOL 1
|
||||||
|
#ifdef EBCDIC
|
||||||
|
# define PutNativeEOL *q++ = '\n';
|
||||||
|
#else
|
||||||
|
# define PutNativeEOL *q++ = native(LF);
|
||||||
|
#endif
|
||||||
|
#define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols)
|
||||||
|
#define SCREENWIDTH 80
|
||||||
|
#define SCREENLWRAP 1
|
||||||
|
#define USE_EF_UT_TIME
|
||||||
|
#if (!defined(NO_LCHOWN) || !defined(NO_LCHMOD))
|
||||||
|
# define SET_SYMLINK_ATTRIBS
|
||||||
|
#endif
|
||||||
|
#ifdef MTS
|
||||||
|
# ifdef SET_DIR_ATTRIB
|
||||||
|
# undef SET_DIR_ATTRIB
|
||||||
|
# endif
|
||||||
|
#else /* !MTS */
|
||||||
|
# define SET_DIR_ATTRIB
|
||||||
|
# if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) /* GRR 970513 */
|
||||||
|
# define TIMESTAMP
|
||||||
|
# endif
|
||||||
|
# define RESTORE_UIDGID
|
||||||
|
#endif /* ?MTS */
|
||||||
|
|
||||||
|
/* Static variables that we have to add to Uz_Globs: */
|
||||||
|
#define SYSTEM_SPECIFIC_GLOBALS \
|
||||||
|
int created_dir, renamed_fullpath;\
|
||||||
|
char *rootpath, *buildpath, *end;\
|
||||||
|
ZCONST char *wildname;\
|
||||||
|
char *dirname, matchname[FILNAMSIZ];\
|
||||||
|
int rootlen, have_dirname, dirnamelen, notfirstcall;\
|
||||||
|
zvoid *wild_dir;
|
||||||
|
|
||||||
|
/* created_dir, and renamed_fullpath are used by both mapname() and */
|
||||||
|
/* checkdir(). */
|
||||||
|
/* rootlen, rootpath, buildpath and end are used by checkdir(). */
|
||||||
|
/* wild_dir, dirname, wildname, matchname[], dirnamelen, have_dirname, */
|
||||||
|
/* and notfirstcall are used by do_wild(). */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_ICONV_MAPPING
|
||||||
|
# define MAX_CP_NAME 25
|
||||||
|
|
||||||
|
# ifdef SETLOCALE
|
||||||
|
# undef SETLOCALE
|
||||||
|
# endif
|
||||||
|
# define SETLOCALE(category, locale) setlocale(category, locale)
|
||||||
|
|
||||||
|
# ifdef _ISO_INTERN
|
||||||
|
# undef _ISO_INTERN
|
||||||
|
# endif
|
||||||
|
# define _ISO_INTERN(str1) iso_intern(str1)
|
||||||
|
|
||||||
|
# ifdef _OEM_INTERN
|
||||||
|
# undef _OEM_INTERN
|
||||||
|
# endif
|
||||||
|
# ifndef IZ_OEM2ISO_ARRAY
|
||||||
|
# define IZ_OEM2ISO_ARRAY
|
||||||
|
# endif
|
||||||
|
# define _OEM_INTERN(str1) oem_intern(str1)
|
||||||
|
|
||||||
|
void iso_intern(char *);
|
||||||
|
void oem_intern(char *);
|
||||||
|
void init_conversion_charsets(void);
|
||||||
|
#endif /* USE_ICONV_MAPPING */
|
||||||
|
|
||||||
|
#endif /* !__unxcfg_h */
|
4869
third_party/unzip/unzip.c
vendored
Normal file
4869
third_party/unzip/unzip.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
715
third_party/unzip/unzip.h
vendored
Normal file
715
third_party/unzip/unzip.h
vendored
Normal file
|
@ -0,0 +1,715 @@
|
||||||
|
// clang-format off
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
unzip.h (new)
|
||||||
|
|
||||||
|
Copyright (c) 1990-2010 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
This header file contains the public macros and typedefs required by
|
||||||
|
both the UnZip sources and by any application using the UnZip API. If
|
||||||
|
UNZIP_INTERNAL is defined, it includes unzpriv.h (containing includes,
|
||||||
|
prototypes and extern variables used by the actual UnZip sources).
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
This is version 2009-Jan-02 of the Info-ZIP license.
|
||||||
|
The definitive version of this document should be available at
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely and
|
||||||
|
a copy at http://www.info-zip.org/pub/infozip/license.html.
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 1990-2010 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
For the purposes of this copyright and license, "Info-ZIP" is defined as
|
||||||
|
the following set of individuals:
|
||||||
|
|
||||||
|
Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois,
|
||||||
|
Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth,
|
||||||
|
Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz,
|
||||||
|
David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko,
|
||||||
|
Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs,
|
||||||
|
Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda,
|
||||||
|
Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren,
|
||||||
|
Rich Wales, Mike White.
|
||||||
|
|
||||||
|
This software is provided "as is," without warranty of any kind, express
|
||||||
|
or implied. In no event shall Info-ZIP or its contributors be held liable
|
||||||
|
for any direct, indirect, incidental, special or consequential damages
|
||||||
|
arising out of the use of or inability to use 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 above disclaimer and the following restrictions:
|
||||||
|
|
||||||
|
1. Redistributions of source code (in whole or in part) must retain
|
||||||
|
the above copyright notice, definition, disclaimer, and this list
|
||||||
|
of conditions.
|
||||||
|
|
||||||
|
2. Redistributions in binary form (compiled executables and libraries)
|
||||||
|
must reproduce the above copyright notice, definition, disclaimer,
|
||||||
|
and this list of conditions in documentation and/or other materials
|
||||||
|
provided with the distribution. Additional documentation is not needed
|
||||||
|
for executables where a command line license option provides these and
|
||||||
|
a note regarding this option is in the executable's startup banner. The
|
||||||
|
sole exception to this condition is redistribution of a standard
|
||||||
|
UnZipSFX binary (including SFXWiz) as part of a self-extracting archive;
|
||||||
|
that is permitted without inclusion of this license, as long as the
|
||||||
|
normal SFX banner has not been removed from the binary or disabled.
|
||||||
|
|
||||||
|
3. Altered versions--including, but not limited to, ports to new operating
|
||||||
|
systems, existing ports with new graphical interfaces, versions with
|
||||||
|
modified or added functionality, and dynamic, shared, or static library
|
||||||
|
versions not from Info-ZIP--must be plainly marked as such and must not
|
||||||
|
be misrepresented as being the original source or, if binaries,
|
||||||
|
compiled from the original source. Such altered versions also must not
|
||||||
|
be misrepresented as being Info-ZIP releases--including, but not
|
||||||
|
limited to, labeling of the altered versions with the names "Info-ZIP"
|
||||||
|
(or any variation thereof, including, but not limited to, different
|
||||||
|
capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the
|
||||||
|
explicit permission of Info-ZIP. Such altered versions are further
|
||||||
|
prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP
|
||||||
|
e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP
|
||||||
|
will provide support for the altered versions.
|
||||||
|
|
||||||
|
4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip,"
|
||||||
|
"UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its
|
||||||
|
own source and binary releases.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __unzip_h /* prevent multiple inclusions */
|
||||||
|
#define __unzip_h
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Predefined, machine-specific macros.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef __GO32__ /* MS-DOS extender: NOT Unix */
|
||||||
|
# ifdef unix
|
||||||
|
# undef unix
|
||||||
|
# endif
|
||||||
|
# ifdef _unix
|
||||||
|
# undef _unix
|
||||||
|
# endif
|
||||||
|
# ifdef __unix
|
||||||
|
# undef __unix
|
||||||
|
# endif
|
||||||
|
# ifdef __unix__
|
||||||
|
# undef __unix__
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ((defined(__convex__) || defined(__convexc__)) && !defined(CONVEX))
|
||||||
|
# define CONVEX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(unix) || defined(_unix) || defined(__unix) || defined(__unix__))
|
||||||
|
# ifndef UNIX
|
||||||
|
# define UNIX
|
||||||
|
# endif
|
||||||
|
#endif /* unix || _unix || __unix || __unix__ */
|
||||||
|
#if (defined(M_XENIX) || defined(COHERENT) || defined(__hpux))
|
||||||
|
# ifndef UNIX
|
||||||
|
# define UNIX
|
||||||
|
# endif
|
||||||
|
#endif /* M_XENIX || COHERENT || __hpux */
|
||||||
|
#if (defined(__NetBSD__) || defined(__FreeBSD__))
|
||||||
|
# ifndef UNIX
|
||||||
|
# define UNIX
|
||||||
|
# endif
|
||||||
|
#endif /* __NetBSD__ || __FreeBSD__ */
|
||||||
|
#if (defined(CONVEX) || defined(MINIX) || defined(_AIX) || defined(__QNX__))
|
||||||
|
# ifndef UNIX
|
||||||
|
# define UNIX
|
||||||
|
# endif
|
||||||
|
#endif /* CONVEX || MINIX || _AIX || __QNX__ */
|
||||||
|
|
||||||
|
#if (defined(VM_CMS) || defined(MVS))
|
||||||
|
# define CMS_MVS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__OS2__) && !defined(OS2))
|
||||||
|
# define OS2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__TANDEM) && !defined(TANDEM))
|
||||||
|
# define TANDEM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__VMS) && !defined(VMS))
|
||||||
|
# define VMS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ((defined(__WIN32__) || defined(_WIN32)) && !defined(WIN32))
|
||||||
|
# define WIN32
|
||||||
|
#endif
|
||||||
|
#if ((defined(__WINNT__) || defined(__WINNT)) && !defined(WIN32))
|
||||||
|
# define WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
# ifndef WIN32 /* WinCE is treated as a variant of the Win32 API */
|
||||||
|
# define WIN32
|
||||||
|
# endif
|
||||||
|
# ifndef UNICODE /* WinCE requires UNICODE wide character support */
|
||||||
|
# define UNICODE
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __COMPILER_KCC__
|
||||||
|
# ifdef SYS_T20
|
||||||
|
# define TOPS20
|
||||||
|
# endif
|
||||||
|
#endif /* __COMPILER_KCC__ */
|
||||||
|
|
||||||
|
/* Borland C does not define __TURBOC__ if compiling for a 32-bit platform */
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
# ifndef __TURBOC__
|
||||||
|
# define __TURBOC__
|
||||||
|
# endif
|
||||||
|
# if (!defined(__MSDOS__) && !defined(OS2) && !defined(WIN32))
|
||||||
|
# define __MSDOS__
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */
|
||||||
|
#ifdef __POWERC
|
||||||
|
# define __TURBOC__
|
||||||
|
# define MSDOS
|
||||||
|
#endif /* __POWERC */
|
||||||
|
|
||||||
|
#if (defined(__MSDOS__) && !defined(MSDOS)) /* just to make sure */
|
||||||
|
# define MSDOS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* RSXNTDJ (at least up to v1.3) compiles for WIN32 (RSXNT) using a derivate
|
||||||
|
of the EMX environment, but defines MSDOS and __GO32__. ARG !!! */
|
||||||
|
#if (defined(MSDOS) && defined(WIN32))
|
||||||
|
# undef MSDOS /* WIN32 is >>>not<<< MSDOS */
|
||||||
|
#endif
|
||||||
|
#if (defined(__GO32__) && defined(__EMX__) && defined(__RSXNT__))
|
||||||
|
# undef __GO32__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(linux) && !defined(LINUX))
|
||||||
|
# define LINUX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __riscos
|
||||||
|
# define RISCOS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(THINK_C) || defined(MPW))
|
||||||
|
# define MACOS
|
||||||
|
#endif
|
||||||
|
#if (defined(__MWERKS__) && defined(macintosh))
|
||||||
|
# define MACOS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* use prototypes and ANSI libraries if __STDC__, or MS-DOS, or OS/2, or Win32,
|
||||||
|
* or IBM C Set/2, or Borland C, or Watcom C, or GNU gcc (emx or Cygwin),
|
||||||
|
* or Macintosh, or Sequent, or Atari, or IBM RS/6000, or Silicon Graphics,
|
||||||
|
* or Convex?, or AtheOS, or BeOS.
|
||||||
|
*/
|
||||||
|
#if (defined(__STDC__) || defined(MSDOS) || defined(OS2) || defined(WIN32))
|
||||||
|
# ifndef PROTO
|
||||||
|
# define PROTO
|
||||||
|
# endif
|
||||||
|
# ifndef MODERN
|
||||||
|
# define MODERN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(__IBMC__) || defined(__BORLANDC__) || defined(__WATCOMC__))
|
||||||
|
# ifndef PROTO
|
||||||
|
# define PROTO
|
||||||
|
# endif
|
||||||
|
# ifndef MODERN
|
||||||
|
# define MODERN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(__EMX__) || defined(__CYGWIN__))
|
||||||
|
# ifndef PROTO
|
||||||
|
# define PROTO
|
||||||
|
# endif
|
||||||
|
# ifndef MODERN
|
||||||
|
# define MODERN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(MACOS) || defined(ATARI_ST) || defined(RISCOS) || defined(THEOS))
|
||||||
|
# ifndef PROTO
|
||||||
|
# define PROTO
|
||||||
|
# endif
|
||||||
|
# ifndef MODERN
|
||||||
|
# define MODERN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
/* Sequent running Dynix/ptx: non-modern compiler */
|
||||||
|
#if (defined(_AIX) || defined(sgi) || (defined(_SEQUENT_) && !defined(PTX)))
|
||||||
|
# ifndef PROTO
|
||||||
|
# define PROTO
|
||||||
|
# endif
|
||||||
|
# ifndef MODERN
|
||||||
|
# define MODERN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(CMS_MVS) || defined(__ATHEOS__) || defined(__BEOS__))
|
||||||
|
/* || defined(CONVEX) ? */
|
||||||
|
# ifndef PROTO
|
||||||
|
# define PROTO
|
||||||
|
# endif
|
||||||
|
# ifndef MODERN
|
||||||
|
# define MODERN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
/* Bundled C compiler on HP-UX needs this. Others shouldn't care. */
|
||||||
|
#if (defined(__hpux))
|
||||||
|
# ifndef MODERN
|
||||||
|
# define MODERN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* turn off prototypes if requested */
|
||||||
|
#if (defined(NOPROTO) && defined(PROTO))
|
||||||
|
# undef PROTO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* used to remove arguments in function prototypes for non-ANSI C */
|
||||||
|
#ifdef PROTO
|
||||||
|
# define OF(a) a
|
||||||
|
#else
|
||||||
|
# define OF(a) ()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* enable the "const" keyword only if MODERN and if not otherwise instructed */
|
||||||
|
#ifdef MODERN
|
||||||
|
# if (!defined(ZCONST) && (defined(USE_CONST) || !defined(NO_CONST)))
|
||||||
|
# define ZCONST const
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZCONST
|
||||||
|
# define ZCONST
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Tell Microsoft Visual C++ 2005 (and newer) to leave us alone
|
||||||
|
* and let us use standard C functions the way we're supposed to.
|
||||||
|
* (These preprocessor symbols must appear before the first system
|
||||||
|
* header include. They are located here, because for WINDLL the
|
||||||
|
* first system header includes follow just below.)
|
||||||
|
*/
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||||
|
# ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
# define _CRT_SECURE_NO_WARNINGS
|
||||||
|
# endif
|
||||||
|
# ifndef _CRT_NONSTDC_NO_WARNINGS
|
||||||
|
# define _CRT_NONSTDC_NO_WARNINGS
|
||||||
|
# endif
|
||||||
|
# if defined(POCKET_UNZIP) && !defined(_CRT_NON_CONFORMING_SWPRINTFS)
|
||||||
|
# define _CRT_NON_CONFORMING_SWPRINTFS
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* NO_UNIXBACKUP overrides UNIXBACKUP */
|
||||||
|
#if defined(NO_UNIXBACKUP) && defined(UNIXBACKUP)
|
||||||
|
# undef UNIXBACKUP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Grab system-dependent definition of EXPENTRY for prototypes below.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#if (defined(OS2) && !defined(FUNZIP))
|
||||||
|
# ifdef UNZIP_INTERNAL
|
||||||
|
# define INCL_NOPM
|
||||||
|
# define INCL_DOSNLS
|
||||||
|
# define INCL_DOSPROCESS
|
||||||
|
# define INCL_DOSDEVICES
|
||||||
|
# define INCL_DOSDEVIOCTL
|
||||||
|
# define INCL_DOSERRORS
|
||||||
|
# define INCL_DOSMISC
|
||||||
|
# ifdef OS2DLL
|
||||||
|
# define INCL_REXXSAA
|
||||||
|
# endif
|
||||||
|
# endif /* UNZIP_INTERNAL */
|
||||||
|
# define UZ_EXP EXPENTRY
|
||||||
|
#endif /* OS2 && !FUNZIP */
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
#if (defined(OS2) && !defined(FUNZIP))
|
||||||
|
# if (defined(__IBMC__) || defined(__WATCOMC__))
|
||||||
|
# define UZ_EXP _System /* compiler keyword */
|
||||||
|
# else
|
||||||
|
# define UZ_EXP
|
||||||
|
# endif
|
||||||
|
#endif /* OS2 && !FUNZIP */
|
||||||
|
|
||||||
|
#if (defined(WINDLL) || defined(USE_UNZIP_LIB))
|
||||||
|
# ifndef EXPENTRY
|
||||||
|
# define UZ_EXP WINAPI
|
||||||
|
# else
|
||||||
|
# define UZ_EXP EXPENTRY
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef UZ_EXP
|
||||||
|
# define UZ_EXP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Public typedefs.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef _IZ_TYPES_DEFINED
|
||||||
|
#ifdef MODERN
|
||||||
|
typedef void zvoid;
|
||||||
|
#else /* !MODERN */
|
||||||
|
# ifndef AOS_VS /* mostly modern? */
|
||||||
|
# ifndef VAXC /* not fully modern, but has knows 'void' */
|
||||||
|
# define void int
|
||||||
|
# endif /* !VAXC */
|
||||||
|
# endif /* !AOS_VS */
|
||||||
|
typedef char zvoid;
|
||||||
|
#endif /* ?MODERN */
|
||||||
|
typedef unsigned char uch; /* code assumes unsigned bytes; these type- */
|
||||||
|
typedef unsigned short ush; /* defs replace byte/UWORD/ULONG (which are */
|
||||||
|
typedef unsigned long ulg; /* predefined on some systems) & match zip */
|
||||||
|
#define _IZ_TYPES_DEFINED
|
||||||
|
#endif /* !_IZ_TYPES_DEFINED */
|
||||||
|
|
||||||
|
/* InputFn is not yet used and is likely to change: */
|
||||||
|
#ifdef PROTO
|
||||||
|
typedef int (UZ_EXP MsgFn) (zvoid *pG, uch *buf, ulg size, int flag);
|
||||||
|
typedef int (UZ_EXP InputFn) (zvoid *pG, uch *buf, int *size, int flag);
|
||||||
|
typedef void (UZ_EXP PauseFn) (zvoid *pG, ZCONST char *prompt, int flag);
|
||||||
|
typedef int (UZ_EXP PasswdFn) (zvoid *pG, int *rcnt, char *pwbuf,
|
||||||
|
int size, ZCONST char *zfn,
|
||||||
|
ZCONST char *efn);
|
||||||
|
typedef int (UZ_EXP StatCBFn) (zvoid *pG, int fnflag, ZCONST char *zfn,
|
||||||
|
ZCONST char *efn, ZCONST zvoid *details);
|
||||||
|
typedef void (UZ_EXP UsrIniFn) (void);
|
||||||
|
#else /* !PROTO */
|
||||||
|
typedef int (UZ_EXP MsgFn) ();
|
||||||
|
typedef int (UZ_EXP InputFn) ();
|
||||||
|
typedef void (UZ_EXP PauseFn) ();
|
||||||
|
typedef int (UZ_EXP PasswdFn) ();
|
||||||
|
typedef int (UZ_EXP StatCBFn) ();
|
||||||
|
typedef void (UZ_EXP UsrIniFn) ();
|
||||||
|
#endif /* ?PROTO */
|
||||||
|
|
||||||
|
typedef struct _UzpBuffer { /* rxstr */
|
||||||
|
ulg strlength; /* length of string */
|
||||||
|
char *strptr; /* pointer to string */
|
||||||
|
} UzpBuffer;
|
||||||
|
|
||||||
|
typedef struct _UzpInit {
|
||||||
|
ulg structlen; /* length of the struct being passed */
|
||||||
|
|
||||||
|
/* GRR: can we assume that each of these is a 32-bit pointer? if not,
|
||||||
|
* does it matter? add "far" keyword to make sure? */
|
||||||
|
MsgFn *msgfn;
|
||||||
|
InputFn *inputfn;
|
||||||
|
PauseFn *pausefn;
|
||||||
|
UsrIniFn *userfn; /* user init function to be called after */
|
||||||
|
/* globals constructed and initialized */
|
||||||
|
|
||||||
|
/* pointer to program's environment area or something? */
|
||||||
|
/* hooks for performance testing? */
|
||||||
|
/* hooks for extra unzip -v output? (detect CPU or other hardware?) */
|
||||||
|
/* anything else? let me (Greg) know... */
|
||||||
|
} UzpInit;
|
||||||
|
|
||||||
|
typedef struct _UzpCB {
|
||||||
|
ulg structlen; /* length of the struct being passed */
|
||||||
|
/* GRR: can we assume that each of these is a 32-bit pointer? if not,
|
||||||
|
* does it matter? add "far" keyword to make sure? */
|
||||||
|
MsgFn *msgfn;
|
||||||
|
InputFn *inputfn;
|
||||||
|
PauseFn *pausefn;
|
||||||
|
PasswdFn *passwdfn;
|
||||||
|
StatCBFn *statrepfn;
|
||||||
|
} UzpCB;
|
||||||
|
|
||||||
|
/* the collection of general UnZip option flags and option arguments */
|
||||||
|
typedef struct _UzpOpts {
|
||||||
|
#ifndef FUNZIP
|
||||||
|
char *exdir; /* pointer to extraction root directory (-d option) */
|
||||||
|
char *pwdarg; /* pointer to command-line password (-P option) */
|
||||||
|
int zipinfo_mode; /* behave like ZipInfo or like normal UnZip? */
|
||||||
|
int aflag; /* -a: do ASCII-EBCDIC and/or end-of-line translation */
|
||||||
|
#ifdef VMS
|
||||||
|
int bflag; /* -b: force fixed record format for binary files */
|
||||||
|
#endif
|
||||||
|
#ifdef TANDEM
|
||||||
|
int bflag; /* -b: create text files in 'C' format (180)*/
|
||||||
|
#endif
|
||||||
|
#if defined(UNIX) || defined(OS2) || defined(WIN32)
|
||||||
|
int B_flag; /* -B: back up existing files by renaming to *~##### */
|
||||||
|
#else
|
||||||
|
#ifdef UNIXBACKUP
|
||||||
|
int B_flag; /* -B: back up existing files by renaming to *~##### */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
int cflag; /* -c: output to stdout */
|
||||||
|
int C_flag; /* -C: match filenames case-insensitively */
|
||||||
|
int D_flag; /* -D: don't restore directory (-DD: any) timestamps */
|
||||||
|
#ifdef MACOS
|
||||||
|
int E_flag; /* -E: [MacOS] show Mac extra field during restoring */
|
||||||
|
#endif
|
||||||
|
int fflag; /* -f: "freshen" (extract only newer files) */
|
||||||
|
#if (defined(RISCOS) || defined(ACORN_FTYPE_NFS))
|
||||||
|
int acorn_nfs_ext; /* -F: RISC OS types & NFS filetype extensions */
|
||||||
|
#endif
|
||||||
|
int hflag; /* -h: header line (zipinfo) */
|
||||||
|
#ifdef MACOS
|
||||||
|
int i_flag; /* -i: [MacOS] ignore filenames stored in Mac e.f. */
|
||||||
|
#endif
|
||||||
|
#ifdef RISCOS
|
||||||
|
int scanimage; /* -I: scan image files */
|
||||||
|
#endif
|
||||||
|
int jflag; /* -j: junk pathnames (unzip) */
|
||||||
|
/*
|
||||||
|
* VAX C V3.1-051 loves "\" in #define, but hates it in #if.
|
||||||
|
* HP C V7.3-009 dislikes "defined" in macro in #if (%CC-I-EXPANDEDDEFINED).
|
||||||
|
* It seems safest to avoid any continuation lines in either.
|
||||||
|
*/
|
||||||
|
#if defined(__ATHEOS__) || defined(__BEOS__) || defined(MACOS)
|
||||||
|
# define J_FLAG 1
|
||||||
|
#else
|
||||||
|
# if defined( UNIX) && defined( __APPLE__)
|
||||||
|
# define J_FLAG 1
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#ifdef J_FLAG
|
||||||
|
int J_flag; /* -J: ignore AtheOS/BeOS/MacOS e. f. info (unzip) */
|
||||||
|
#endif
|
||||||
|
#if (defined(__ATHEOS__) || defined(__BEOS__) || defined(UNIX))
|
||||||
|
int K_flag; /* -K: keep setuid/setgid/tacky permissions */
|
||||||
|
#endif
|
||||||
|
int lflag; /* -12slmv: listing format (zipinfo) */
|
||||||
|
int L_flag; /* -L: convert filenames from some OSes to lowercase */
|
||||||
|
int overwrite_none; /* -n: never overwrite files (no prompting) */
|
||||||
|
#ifdef AMIGA
|
||||||
|
int N_flag; /* -N: restore comments as AmigaDOS filenotes */
|
||||||
|
#endif
|
||||||
|
int overwrite_all; /* -o: OK to overwrite files without prompting */
|
||||||
|
#endif /* !FUNZIP */
|
||||||
|
int qflag; /* -q: produce a lot less output */
|
||||||
|
#ifdef TANDEM
|
||||||
|
int rflag; /* -r: remove file extensions */
|
||||||
|
#endif
|
||||||
|
#ifndef FUNZIP
|
||||||
|
#if (defined(MSDOS) || defined(FLEXOS) || defined(OS2) || defined(WIN32))
|
||||||
|
int sflag; /* -s: convert spaces in filenames to underscores */
|
||||||
|
#endif
|
||||||
|
#if (defined(NLM))
|
||||||
|
int sflag; /* -s: convert spaces in filenames to underscores */
|
||||||
|
#endif
|
||||||
|
#ifdef VMS
|
||||||
|
int S_flag; /* -S: use Stream_LF for text files (-a[a]) */
|
||||||
|
#endif
|
||||||
|
#if (defined(MSDOS) || defined(__human68k__) || defined(OS2) || defined(WIN32))
|
||||||
|
int volflag; /* -$: extract volume labels */
|
||||||
|
#endif
|
||||||
|
int tflag; /* -t: test (unzip) or totals line (zipinfo) */
|
||||||
|
int T_flag; /* -T: timestamps (unzip) or dec. time fmt (zipinfo) */
|
||||||
|
int uflag; /* -u: "update" (extract only newer/brand-new files) */
|
||||||
|
#if defined(UNIX) || defined(VMS) || defined(WIN32)
|
||||||
|
int U_flag; /* -U: escape non-ASCII, -UU No Unicode paths */
|
||||||
|
#endif
|
||||||
|
int vflag; /* -v: (verbosely) list directory */
|
||||||
|
int V_flag; /* -V: don't strip VMS version numbers */
|
||||||
|
int W_flag; /* -W: wildcard '*' won't match '/' dir separator */
|
||||||
|
#if (defined (__ATHEOS__) || defined(__BEOS__) || defined(UNIX))
|
||||||
|
int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */
|
||||||
|
#else
|
||||||
|
#if (defined(TANDEM) || defined(THEOS))
|
||||||
|
int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */
|
||||||
|
#else
|
||||||
|
#if (defined(OS2) || defined(VMS) || defined(WIN32))
|
||||||
|
int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef VMS
|
||||||
|
int Y_flag; /* -Y: treat ".nnn" as ";nnn" version */
|
||||||
|
#endif
|
||||||
|
int zflag; /* -z: display the zipfile comment (only, for unzip) */
|
||||||
|
#ifdef VMS
|
||||||
|
int ods2_flag; /* -2: force names to conform to ODS2 */
|
||||||
|
#endif
|
||||||
|
#if (!defined(RISCOS) && !defined(CMS_MVS) && !defined(TANDEM))
|
||||||
|
int ddotflag; /* -:: don't skip over "../" path elements */
|
||||||
|
#endif
|
||||||
|
#ifdef UNIX
|
||||||
|
int cflxflag; /* -^: allow control chars in extracted filenames */
|
||||||
|
#endif
|
||||||
|
#endif /* !FUNZIP */
|
||||||
|
} UzpOpts;
|
||||||
|
|
||||||
|
/* intended to be a private struct: */
|
||||||
|
typedef struct _ver {
|
||||||
|
uch major; /* e.g., integer 5 */
|
||||||
|
uch minor; /* e.g., 2 */
|
||||||
|
uch patchlevel; /* e.g., 0 */
|
||||||
|
uch not_used;
|
||||||
|
} _version_type;
|
||||||
|
|
||||||
|
typedef struct _UzpVer {
|
||||||
|
ulg structlen; /* length of the struct being passed */
|
||||||
|
ulg flag; /* bit 0: is_beta bit 1: uses_zlib */
|
||||||
|
ZCONST char *betalevel; /* e.g. "g BETA" or "" */
|
||||||
|
ZCONST char *date; /* e.g. "9 Oct 08" (beta) or "9 October 2008" */
|
||||||
|
ZCONST char *zlib_version;/* e.g. "1.2.3" or NULL */
|
||||||
|
_version_type unzip; /* current UnZip version */
|
||||||
|
_version_type zipinfo; /* current ZipInfo version */
|
||||||
|
_version_type os2dll; /* OS2DLL version (retained for compatibility */
|
||||||
|
_version_type windll; /* WinDLL version (retained for compatibility */
|
||||||
|
_version_type dllapimin; /* last incompatible change of library API */
|
||||||
|
} UzpVer;
|
||||||
|
|
||||||
|
/* for Visual BASIC access to Windows DLLs: */
|
||||||
|
typedef struct _UzpVer2 {
|
||||||
|
ulg structlen; /* length of the struct being passed */
|
||||||
|
ulg flag; /* bit 0: is_beta bit 1: uses_zlib */
|
||||||
|
char betalevel[10]; /* e.g. "g BETA" or "" */
|
||||||
|
char date[20]; /* e.g. "9 Oct 08" (beta) or "9 October 2008" */
|
||||||
|
char zlib_version[10]; /* e.g. "1.2.3" or NULL */
|
||||||
|
_version_type unzip; /* current UnZip version */
|
||||||
|
_version_type zipinfo; /* current ZipInfo version */
|
||||||
|
_version_type os2dll; /* OS2DLL version (retained for compatibility */
|
||||||
|
_version_type windll; /* WinDLL version (retained for compatibility */
|
||||||
|
_version_type dllapimin; /* last incompatible change of library API */
|
||||||
|
} UzpVer2;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _Uzp_Siz64 {
|
||||||
|
unsigned long lo32;
|
||||||
|
unsigned long hi32;
|
||||||
|
} Uzp_Siz64;
|
||||||
|
|
||||||
|
typedef struct _Uzp_cdir_Rec {
|
||||||
|
uch version_made_by[2];
|
||||||
|
uch version_needed_to_extract[2];
|
||||||
|
ush general_purpose_bit_flag;
|
||||||
|
ush compression_method;
|
||||||
|
ulg last_mod_dos_datetime;
|
||||||
|
ulg crc32;
|
||||||
|
Uzp_Siz64 csize;
|
||||||
|
Uzp_Siz64 ucsize;
|
||||||
|
ush filename_length;
|
||||||
|
ush extra_field_length;
|
||||||
|
ush file_comment_length;
|
||||||
|
ush disk_number_start;
|
||||||
|
ush internal_file_attributes;
|
||||||
|
ulg external_file_attributes;
|
||||||
|
Uzp_Siz64 relative_offset_local_header;
|
||||||
|
} Uzp_cdir_Rec;
|
||||||
|
|
||||||
|
|
||||||
|
#define UZPINIT_LEN sizeof(UzpInit)
|
||||||
|
#define UZPVER_LEN sizeof(UzpVer)
|
||||||
|
#define cbList(func) int (* UZ_EXP func)(char *filename, Uzp_cdir_Rec *crec)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Return (and exit) values of the public UnZip API functions.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* external return codes */
|
||||||
|
#define PK_OK 0 /* no error */
|
||||||
|
#define PK_COOL 0 /* no error */
|
||||||
|
#define PK_WARN 1 /* warning error */
|
||||||
|
#define PK_ERR 2 /* error in zipfile */
|
||||||
|
#define PK_BADERR 3 /* severe error in zipfile */
|
||||||
|
#define PK_MEM 4 /* insufficient memory (during initialization) */
|
||||||
|
#define PK_MEM2 5 /* insufficient memory (password failure) */
|
||||||
|
#define PK_MEM3 6 /* insufficient memory (file decompression) */
|
||||||
|
#define PK_MEM4 7 /* insufficient memory (memory decompression) */
|
||||||
|
#define PK_MEM5 8 /* insufficient memory (not yet used) */
|
||||||
|
#define PK_NOZIP 9 /* zipfile not found */
|
||||||
|
#define PK_PARAM 10 /* bad or illegal parameters specified */
|
||||||
|
#define PK_FIND 11 /* no files found */
|
||||||
|
#define PK_DISK 50 /* disk full */
|
||||||
|
#define PK_EOF 51 /* unexpected EOF */
|
||||||
|
|
||||||
|
#define IZ_CTRLC 80 /* user hit ^C to terminate */
|
||||||
|
#define IZ_UNSUP 81 /* no files found: all unsup. compr/encrypt. */
|
||||||
|
#define IZ_BADPWD 82 /* no files found: all had bad password */
|
||||||
|
#define IZ_ERRBF 83 /* big-file archive, small-file program */
|
||||||
|
|
||||||
|
/* return codes of password fetches (negative = user abort; positive = error) */
|
||||||
|
#define IZ_PW_ENTERED 0 /* got some password string; use/try it */
|
||||||
|
#define IZ_PW_CANCEL -1 /* no password available (for this entry) */
|
||||||
|
#define IZ_PW_CANCELALL -2 /* no password, skip any further pwd. request */
|
||||||
|
#define IZ_PW_ERROR 5 /* = PK_MEM2 : failure (no mem, no tty, ...) */
|
||||||
|
|
||||||
|
/* flag values for status callback function */
|
||||||
|
#define UZ_ST_START_EXTRACT 1 /* no details */
|
||||||
|
#define UZ_ST_IN_PROGRESS 2 /* no details */
|
||||||
|
#define UZ_ST_FINISH_MEMBER 3 /* 'details': extracted size */
|
||||||
|
|
||||||
|
/* return values of status callback function */
|
||||||
|
#define UZ_ST_CONTINUE 0
|
||||||
|
#define UZ_ST_BREAK 1
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Prototypes for public UnZip API (DLL) functions.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define UzpMatch match
|
||||||
|
|
||||||
|
int UZ_EXP UzpMain OF((int argc, char **argv));
|
||||||
|
int UZ_EXP UzpAltMain OF((int argc, char **argv, UzpInit *init));
|
||||||
|
ZCONST UzpVer * UZ_EXP UzpVersion OF((void));
|
||||||
|
void UZ_EXP UzpFreeMemBuffer OF((UzpBuffer *retstr));
|
||||||
|
#ifndef WINDLL
|
||||||
|
int UZ_EXP UzpUnzipToMemory OF((char *zip, char *file, UzpOpts *optflgs,
|
||||||
|
UzpCB *UsrFunc, UzpBuffer *retstr));
|
||||||
|
int UZ_EXP UzpGrep OF((char *archive, char *file,
|
||||||
|
char *pattern, int cmd, int SkipBin,
|
||||||
|
UzpCB *UsrFunc));
|
||||||
|
#endif
|
||||||
|
#ifdef OS2
|
||||||
|
int UZ_EXP UzpFileTree OF((char *name, cbList(callBack),
|
||||||
|
char *cpInclude[], char *cpExclude[]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned UZ_EXP UzpVersion2 OF((UzpVer2 *version));
|
||||||
|
int UZ_EXP UzpValidate OF((char *archive, int AllCodes));
|
||||||
|
|
||||||
|
void show_commandline OF((char *args[]));
|
||||||
|
|
||||||
|
|
||||||
|
/* default I/O functions (can be swapped out via UzpAltMain() entry point): */
|
||||||
|
|
||||||
|
int UZ_EXP UzpMessagePrnt OF((zvoid *pG, uch *buf, ulg size, int flag));
|
||||||
|
int UZ_EXP UzpMessageNull OF((zvoid *pG, uch *buf, ulg size, int flag));
|
||||||
|
int UZ_EXP UzpInput OF((zvoid *pG, uch *buf, int *size, int flag));
|
||||||
|
void UZ_EXP UzpMorePause OF((zvoid *pG, ZCONST char *prompt, int flag));
|
||||||
|
int UZ_EXP UzpPassword OF((zvoid *pG, int *rcnt, char *pwbuf,
|
||||||
|
int size, ZCONST char *zfn,
|
||||||
|
ZCONST char *efn));
|
||||||
|
|
||||||
|
#define UTF8_BIT (1<<11)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Remaining private stuff for UnZip compilation.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzpriv.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !__unzip_h */
|
||||||
|
|
76
third_party/unzip/unzip.mk
vendored
Normal file
76
third_party/unzip/unzip.mk
vendored
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐
|
||||||
|
#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘
|
||||||
|
|
||||||
|
PKGS += THIRD_PARTY_UNZIP
|
||||||
|
|
||||||
|
THIRD_PARTY_UNZIP_ARTIFACTS += THIRD_PARTY_UNZIP_A
|
||||||
|
THIRD_PARTY_UNZIP = $(THIRD_PARTY_UNZIP_A_DEPS) $(THIRD_PARTY_UNZIP_A)
|
||||||
|
THIRD_PARTY_UNZIP_A = o/$(MODE)/third_party/unzip/unzip.a
|
||||||
|
THIRD_PARTY_UNZIP_A_FILES := $(wildcard third_party/unzip/*)
|
||||||
|
THIRD_PARTY_UNZIP_A_HDRS = $(filter %.h,$(THIRD_PARTY_UNZIP_A_FILES))
|
||||||
|
THIRD_PARTY_UNZIP_A_INCS = $(filter %.inc,$(THIRD_PARTY_UNZIP_A_FILES))
|
||||||
|
THIRD_PARTY_UNZIP_A_SRCS = $(filter %.c,$(THIRD_PARTY_UNZIP_A_FILES))
|
||||||
|
THIRD_PARTY_UNZIP_A_OBJS = $(THIRD_PARTY_UNZIP_A_SRCS:%.c=o/$(MODE)/%.o)
|
||||||
|
|
||||||
|
THIRD_PARTY_UNZIP_A_DIRECTDEPS = \
|
||||||
|
LIBC_CALLS \
|
||||||
|
LIBC_FMT \
|
||||||
|
LIBC_INTRIN \
|
||||||
|
LIBC_LOG \
|
||||||
|
LIBC_MEM \
|
||||||
|
LIBC_NEXGEN32E \
|
||||||
|
LIBC_RUNTIME \
|
||||||
|
LIBC_STDIO \
|
||||||
|
LIBC_STR \
|
||||||
|
LIBC_STUBS \
|
||||||
|
LIBC_SYSV \
|
||||||
|
LIBC_TIME \
|
||||||
|
LIBC_UNICODE \
|
||||||
|
LIBC_ZIPOS \
|
||||||
|
THIRD_PARTY_BZIP2
|
||||||
|
|
||||||
|
THIRD_PARTY_UNZIP_A_DEPS := \
|
||||||
|
$(call uniq,$(foreach x,$(THIRD_PARTY_UNZIP_A_DIRECTDEPS),$($(x))))
|
||||||
|
|
||||||
|
THIRD_PARTY_UNZIP_A_CHECKS = \
|
||||||
|
$(THIRD_PARTY_UNZIP_A).pkg
|
||||||
|
|
||||||
|
$(THIRD_PARTY_UNZIP_A): \
|
||||||
|
third_party/unzip/ \
|
||||||
|
$(THIRD_PARTY_UNZIP_A).pkg \
|
||||||
|
$(THIRD_PARTY_UNZIP_A_OBJS)
|
||||||
|
|
||||||
|
$(THIRD_PARTY_UNZIP_A).pkg: \
|
||||||
|
$(THIRD_PARTY_UNZIP_A_OBJS) \
|
||||||
|
$(foreach x,$(THIRD_PARTY_UNZIP_A_DIRECTDEPS),$($(x)_A).pkg)
|
||||||
|
|
||||||
|
o/$(MODE)/third_party/unzip/unzip.com.dbg: \
|
||||||
|
$(THIRD_PARTY_UNZIP) \
|
||||||
|
o/$(MODE)/third_party/unzip/unzip.o \
|
||||||
|
$(CRT) \
|
||||||
|
$(APE_NO_MODIFY_SELF)
|
||||||
|
@$(APELINK)
|
||||||
|
|
||||||
|
$(THIRD_PARTY_UNZIP_A_OBJS): \
|
||||||
|
OVERRIDE_CPPFLAGS += \
|
||||||
|
-DUSE_BZIP2 \
|
||||||
|
-DUNICODE_SUPPORT \
|
||||||
|
-DHAVE_UNLINK \
|
||||||
|
-DLARGE_FILE_SUPPORT \
|
||||||
|
-DHAVE_TERMIOS_H \
|
||||||
|
-DNO_LCHMOD
|
||||||
|
|
||||||
|
THIRD_PARTY_UNZIP_COMS = o/$(MODE)/third_party/unzip/unzip.com
|
||||||
|
THIRD_PARTY_UNZIP_BINS = $(THIRD_PARTY_UNZIP_COMS) $(THIRD_PARTY_UNZIP_COMS:%=%.dbg)
|
||||||
|
THIRD_PARTY_UNZIP_LIBS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)))
|
||||||
|
THIRD_PARTY_UNZIP_SRCS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)_SRCS))
|
||||||
|
THIRD_PARTY_UNZIP_HDRS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)_HDRS))
|
||||||
|
THIRD_PARTY_UNZIP_INCS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)_INCS))
|
||||||
|
THIRD_PARTY_UNZIP_CHECKS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)_CHECKS))
|
||||||
|
THIRD_PARTY_UNZIP_OBJS = $(foreach x,$(THIRD_PARTY_UNZIP_ARTIFACTS),$($(x)_OBJS))
|
||||||
|
$(THIRD_PARTY_UNZIP_OBJS): third_party/unzip/unzip.mk
|
||||||
|
|
||||||
|
.PHONY: o/$(MODE)/third_party/unzip
|
||||||
|
o/$(MODE)/third_party/unzip: \
|
||||||
|
$(THIRD_PARTY_UNZIP_BINS) \
|
||||||
|
$(THIRD_PARTY_UNZIP_CHECKS)
|
955
third_party/unzip/unzip.txt
vendored
Normal file
955
third_party/unzip/unzip.txt
vendored
Normal file
|
@ -0,0 +1,955 @@
|
||||||
|
UNZIP(1L) UNZIP(1L)
|
||||||
|
|
||||||
|
NAME
|
||||||
|
unzip - list, test and extract compressed files in a ZIP archive
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
unzip [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] file[.zip] [file(s) ...]
|
||||||
|
[-x xfile(s) ...] [-d exdir]
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
unzip will list, test, or extract files from a ZIP archive, commonly
|
||||||
|
found on MS-DOS systems. The default behavior (with no options) is to
|
||||||
|
extract into the current directory (and subdirectories below it) all
|
||||||
|
files from the specified ZIP archive. A companion program, zip(1L),
|
||||||
|
creates ZIP archives; both programs are compatible with archives cre-
|
||||||
|
ated by PKWARE's PKZIP and PKUNZIP for MS-DOS, but in many cases the
|
||||||
|
program options or default behaviors differ.
|
||||||
|
|
||||||
|
ARGUMENTS
|
||||||
|
file[.zip]
|
||||||
|
Path of the ZIP archive(s). If the file specification is a
|
||||||
|
wildcard, each matching file is processed in an order determined
|
||||||
|
by the operating system (or file system). Only the filename can
|
||||||
|
be a wildcard; the path itself cannot. Wildcard expressions are
|
||||||
|
similar to those supported in commonly used Unix shells (sh,
|
||||||
|
ksh, csh) and may contain:
|
||||||
|
|
||||||
|
* matches a sequence of 0 or more characters
|
||||||
|
|
||||||
|
? matches exactly 1 character
|
||||||
|
|
||||||
|
[...] matches any single character found inside the brackets;
|
||||||
|
ranges are specified by a beginning character, a hyphen,
|
||||||
|
and an ending character. If an exclamation point or a
|
||||||
|
caret (`!' or `^') follows the left bracket, then the
|
||||||
|
range of characters within the brackets is complemented
|
||||||
|
(that is, anything except the characters inside the
|
||||||
|
brackets is considered a match). To specify a verbatim
|
||||||
|
left bracket, the three-character sequence ``[[]'' has to
|
||||||
|
be used.
|
||||||
|
|
||||||
|
(Be sure to quote any character that might otherwise be inter-
|
||||||
|
preted or modified by the operating system, particularly under
|
||||||
|
Unix and VMS.) If no matches are found, the specification is
|
||||||
|
assumed to be a literal filename; and if that also fails, the
|
||||||
|
suffix .zip is appended. Note that self-extracting ZIP files
|
||||||
|
are supported, as with any other ZIP archive; just specify the
|
||||||
|
.exe suffix (if any) explicitly.
|
||||||
|
|
||||||
|
[file(s)]
|
||||||
|
An optional list of archive members to be processed, separated
|
||||||
|
by spaces. (VMS versions compiled with VMSCLI defined must
|
||||||
|
delimit files with commas instead. See -v in OPTIONS below.)
|
||||||
|
Regular expressions (wildcards) may be used to match multiple
|
||||||
|
members; see above. Again, be sure to quote expressions that
|
||||||
|
would otherwise be expanded or modified by the operating system.
|
||||||
|
|
||||||
|
[-x xfile(s)]
|
||||||
|
An optional list of archive members to be excluded from process-
|
||||||
|
ing. Since wildcard characters normally match (`/') directory
|
||||||
|
separators (for exceptions see the option -W), this option may
|
||||||
|
be used to exclude any files that are in subdirectories. For
|
||||||
|
example, ``unzip foo *.[ch] -x */*'' would extract all C source
|
||||||
|
files in the main directory, but none in any subdirectories.
|
||||||
|
Without the -x option, all C source files in all directories
|
||||||
|
within the zipfile would be extracted.
|
||||||
|
|
||||||
|
[-d exdir]
|
||||||
|
An optional directory to which to extract files. By default,
|
||||||
|
all files and subdirectories are recreated in the current direc-
|
||||||
|
tory; the -d option allows extraction in an arbitrary directory
|
||||||
|
(always assuming one has permission to write to the directory).
|
||||||
|
This option need not appear at the end of the command line; it
|
||||||
|
is also accepted before the zipfile specification (with the nor-
|
||||||
|
mal options), immediately after the zipfile specification, or
|
||||||
|
between the file(s) and the -x option. The option and directory
|
||||||
|
may be concatenated without any white space between them, but
|
||||||
|
note that this may cause normal shell behavior to be suppressed.
|
||||||
|
In particular, ``-d ~'' (tilde) is expanded by Unix C shells
|
||||||
|
into the name of the user's home directory, but ``-d~'' is
|
||||||
|
treated as a literal subdirectory ``~'' of the current direc-
|
||||||
|
tory.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
Note that, in order to support obsolescent hardware, unzip's usage
|
||||||
|
screen is limited to 22 or 23 lines and should therefore be considered
|
||||||
|
only a reminder of the basic unzip syntax rather than an exhaustive
|
||||||
|
list of all possible flags. The exhaustive list follows:
|
||||||
|
|
||||||
|
-Z zipinfo(1L) mode. If the first option on the command line is
|
||||||
|
-Z, the remaining options are taken to be zipinfo(1L) options.
|
||||||
|
See the appropriate manual page for a description of these
|
||||||
|
options.
|
||||||
|
|
||||||
|
-A [OS/2, Unix DLL] print extended help for the DLL's programming
|
||||||
|
interface (API).
|
||||||
|
|
||||||
|
-c extract files to stdout/screen (``CRT''). This option is simi-
|
||||||
|
lar to the -p option except that the name of each file is
|
||||||
|
printed as it is extracted, the -a option is allowed, and ASCII-
|
||||||
|
EBCDIC conversion is automatically performed if appropriate.
|
||||||
|
This option is not listed in the unzip usage screen.
|
||||||
|
|
||||||
|
-f freshen existing files, i.e., extract only those files that
|
||||||
|
already exist on disk and that are newer than the disk copies.
|
||||||
|
By default unzip queries before overwriting, but the -o option
|
||||||
|
may be used to suppress the queries. Note that under many oper-
|
||||||
|
ating systems, the TZ (timezone) environment variable must be
|
||||||
|
set correctly in order for -f and -u to work properly (under
|
||||||
|
Unix the variable is usually set automatically). The reasons
|
||||||
|
for this are somewhat subtle but have to do with the differences
|
||||||
|
between DOS-format file times (always local time) and Unix-for-
|
||||||
|
mat times (always in GMT/UTC) and the necessity to compare the
|
||||||
|
two. A typical TZ value is ``PST8PDT'' (US Pacific time with
|
||||||
|
automatic adjustment for Daylight Savings Time or ``summer
|
||||||
|
time'').
|
||||||
|
|
||||||
|
-l list archive files (short format). The names, uncompressed file
|
||||||
|
sizes and modification dates and times of the specified files
|
||||||
|
are printed, along with totals for all files specified. If
|
||||||
|
UnZip was compiled with OS2_EAS defined, the -l option also
|
||||||
|
lists columns for the sizes of stored OS/2 extended attributes
|
||||||
|
(EAs) and OS/2 access control lists (ACLs). In addition, the
|
||||||
|
zipfile comment and individual file comments (if any) are dis-
|
||||||
|
played. If a file was archived from a single-case file system
|
||||||
|
(for example, the old MS-DOS FAT file system) and the -L option
|
||||||
|
was given, the filename is converted to lowercase and is pre-
|
||||||
|
fixed with a caret (^).
|
||||||
|
|
||||||
|
-p extract files to pipe (stdout). Nothing but the file data is
|
||||||
|
sent to stdout, and the files are always extracted in binary
|
||||||
|
format, just as they are stored (no conversions).
|
||||||
|
|
||||||
|
-t test archive files. This option extracts each specified file in
|
||||||
|
memory and compares the CRC (cyclic redundancy check, an
|
||||||
|
enhanced checksum) of the expanded file with the original file's
|
||||||
|
stored CRC value.
|
||||||
|
|
||||||
|
-T [most OSes] set the timestamp on the archive(s) to that of the
|
||||||
|
newest file in each one. This corresponds to zip's -go option
|
||||||
|
except that it can be used on wildcard zipfiles (e.g., ``unzip
|
||||||
|
-T \*.zip'') and is much faster.
|
||||||
|
|
||||||
|
-u update existing files and create new ones if needed. This
|
||||||
|
option performs the same function as the -f option, extracting
|
||||||
|
(with query) files that are newer than those with the same name
|
||||||
|
on disk, and in addition it extracts those files that do not
|
||||||
|
already exist on disk. See -f above for information on setting
|
||||||
|
the timezone properly.
|
||||||
|
|
||||||
|
-v list archive files (verbose format) or show diagnostic version
|
||||||
|
info. This option has evolved and now behaves as both an option
|
||||||
|
and a modifier. As an option it has two purposes: when a zip-
|
||||||
|
file is specified with no other options, -v lists archive files
|
||||||
|
verbosely, adding to the basic -l info the compression method,
|
||||||
|
compressed size, compression ratio and 32-bit CRC. In contrast
|
||||||
|
to most of the competing utilities, unzip removes the 12 addi-
|
||||||
|
tional header bytes of encrypted entries from the compressed
|
||||||
|
size numbers. Therefore, compressed size and compression ratio
|
||||||
|
figures are independent of the entry's encryption status and
|
||||||
|
show the correct compression performance. (The complete size of
|
||||||
|
the encrypted compressed data stream for zipfile entries is
|
||||||
|
reported by the more verbose zipinfo(1L) reports, see the sepa-
|
||||||
|
rate manual.) When no zipfile is specified (that is, the com-
|
||||||
|
plete command is simply ``unzip -v''), a diagnostic screen is
|
||||||
|
printed. In addition to the normal header with release date and
|
||||||
|
version, unzip lists the home Info-ZIP ftp site and where to
|
||||||
|
find a list of other ftp and non-ftp sites; the target operating
|
||||||
|
system for which it was compiled, as well as (possibly) the
|
||||||
|
hardware on which it was compiled, the compiler and version
|
||||||
|
used, and the compilation date; any special compilation options
|
||||||
|
that might affect the program's operation (see also DECRYPTION
|
||||||
|
below); and any options stored in environment variables that
|
||||||
|
might do the same (see ENVIRONMENT OPTIONS below). As a modi-
|
||||||
|
fier it works in conjunction with other options (e.g., -t) to
|
||||||
|
produce more verbose or debugging output; this is not yet fully
|
||||||
|
implemented but will be in future releases.
|
||||||
|
|
||||||
|
-z display only the archive comment.
|
||||||
|
|
||||||
|
MODIFIERS
|
||||||
|
-a convert text files. Ordinarily all files are extracted exactly
|
||||||
|
as they are stored (as ``binary'' files). The -a option causes
|
||||||
|
files identified by zip as text files (those with the `t' label
|
||||||
|
in zipinfo listings, rather than `b') to be automatically
|
||||||
|
extracted as such, converting line endings, end-of-file charac-
|
||||||
|
ters and the character set itself as necessary. (For example,
|
||||||
|
Unix files use line feeds (LFs) for end-of-line (EOL) and have
|
||||||
|
no end-of-file (EOF) marker; Macintoshes use carriage returns
|
||||||
|
(CRs) for EOLs; and most PC operating systems use CR+LF for EOLs
|
||||||
|
and control-Z for EOF. In addition, IBM mainframes and the
|
||||||
|
Michigan Terminal System use EBCDIC rather than the more common
|
||||||
|
ASCII character set, and NT supports Unicode.) Note that zip's
|
||||||
|
identification of text files is by no means perfect; some
|
||||||
|
``text'' files may actually be binary and vice versa. unzip
|
||||||
|
therefore prints ``[text]'' or ``[binary]'' as a visual check
|
||||||
|
for each file it extracts when using the -a option. The -aa
|
||||||
|
option forces all files to be extracted as text, regardless of
|
||||||
|
the supposed file type. On VMS, see also -S.
|
||||||
|
|
||||||
|
-b [general] treat all files as binary (no text conversions). This
|
||||||
|
is a shortcut for ---a.
|
||||||
|
|
||||||
|
-b [Tandem] force the creation files with filecode type 180 ('C')
|
||||||
|
when extracting Zip entries marked as "text". (On Tandem, -a is
|
||||||
|
enabled by default, see above).
|
||||||
|
|
||||||
|
-b [VMS] auto-convert binary files (see -a above) to fixed-length,
|
||||||
|
512-byte record format. Doubling the option (-bb) forces all
|
||||||
|
files to be extracted in this format. When extracting to stan-
|
||||||
|
dard output (-c or -p option in effect), the default conversion
|
||||||
|
of text record delimiters is disabled for binary (-b) resp. all
|
||||||
|
(-bb) files.
|
||||||
|
|
||||||
|
-B [when compiled with UNIXBACKUP defined] save a backup copy of
|
||||||
|
each overwritten file. The backup file is gets the name of the
|
||||||
|
target file with a tilde and optionally a unique sequence number
|
||||||
|
(up to 5 digits) appended. The sequence number is applied when-
|
||||||
|
ever another file with the original name plus tilde already
|
||||||
|
exists. When used together with the "overwrite all" option -o,
|
||||||
|
numbered backup files are never created. In this case, all
|
||||||
|
backup files are named as the original file with an appended
|
||||||
|
tilde, existing backup files are deleted without notice. This
|
||||||
|
feature works similarly to the default behavior of emacs(1) in
|
||||||
|
many locations.
|
||||||
|
|
||||||
|
Example: the old copy of ``foo'' is renamed to ``foo~''.
|
||||||
|
|
||||||
|
Warning: Users should be aware that the -B option does not pre-
|
||||||
|
vent loss of existing data under all circumstances. For exam-
|
||||||
|
ple, when unzip is run in overwrite-all mode, an existing
|
||||||
|
``foo~'' file is deleted before unzip attempts to rename ``foo''
|
||||||
|
to ``foo~''. When this rename attempt fails (because of a file
|
||||||
|
locks, insufficient privileges, or ...), the extraction of
|
||||||
|
``foo~'' gets cancelled, but the old backup file is already
|
||||||
|
lost. A similar scenario takes place when the sequence number
|
||||||
|
range for numbered backup files gets exhausted (99999, or 65535
|
||||||
|
for 16-bit systems). In this case, the backup file with the
|
||||||
|
maximum sequence number is deleted and replaced by the new
|
||||||
|
backup version without notice.
|
||||||
|
|
||||||
|
-C use case-insensitive matching for the selection of archive
|
||||||
|
entries from the command-line list of extract selection pat-
|
||||||
|
terns. unzip's philosophy is ``you get what you ask for'' (this
|
||||||
|
is also responsible for the -L/-U change; see the relevant
|
||||||
|
options below). Because some file systems are fully case-sensi-
|
||||||
|
tive (notably those under the Unix operating system) and because
|
||||||
|
both ZIP archives and unzip itself are portable across plat-
|
||||||
|
forms, unzip's default behavior is to match both wildcard and
|
||||||
|
literal filenames case-sensitively. That is, specifying ``make-
|
||||||
|
file'' on the command line will only match ``makefile'' in the
|
||||||
|
archive, not ``Makefile'' or ``MAKEFILE'' (and similarly for
|
||||||
|
wildcard specifications). Since this does not correspond to the
|
||||||
|
behavior of many other operating/file systems (for example, OS/2
|
||||||
|
HPFS, which preserves mixed case but is not sensitive to it),
|
||||||
|
the -C option may be used to force all filename matches to be
|
||||||
|
case-insensitive. In the example above, all three files would
|
||||||
|
then match ``makefile'' (or ``make*'', or similar). The -C
|
||||||
|
option affects file specs in both the normal file list and the
|
||||||
|
excluded-file list (xlist).
|
||||||
|
|
||||||
|
Please note that the -C option does neither affect the search
|
||||||
|
for the zipfile(s) nor the matching of archive entries to exist-
|
||||||
|
ing files on the extraction path. On a case-sensitive file sys-
|
||||||
|
tem, unzip will never try to overwrite a file ``FOO'' when
|
||||||
|
extracting an entry ``foo''!
|
||||||
|
|
||||||
|
-D skip restoration of timestamps for extracted items. Normally,
|
||||||
|
unzip tries to restore all meta-information for extracted items
|
||||||
|
that are supplied in the Zip archive (and do not require privi-
|
||||||
|
leges or impose a security risk). By specifying -D, unzip is
|
||||||
|
told to suppress restoration of timestamps for directories
|
||||||
|
explicitly created from Zip archive entries. This option only
|
||||||
|
applies to ports that support setting timestamps for directories
|
||||||
|
(currently ATheOS, BeOS, MacOS, OS/2, Unix, VMS, Win32, for
|
||||||
|
other unzip ports, -D has no effect). The duplicated option -DD
|
||||||
|
forces suppression of timestamp restoration for all extracted
|
||||||
|
entries (files and directories). This option results in setting
|
||||||
|
the timestamps for all extracted entries to the current time.
|
||||||
|
|
||||||
|
On VMS, the default setting for this option is -D for consis-
|
||||||
|
tency with the behaviour of BACKUP: file timestamps are
|
||||||
|
restored, timestamps of extracted directories are left at the
|
||||||
|
current time. To enable restoration of directory timestamps,
|
||||||
|
the negated option --D should be specified. On VMS, the option
|
||||||
|
-D disables timestamp restoration for all extracted Zip archive
|
||||||
|
items. (Here, a single -D on the command line combines with the
|
||||||
|
default -D to do what an explicit -DD does on other systems.)
|
||||||
|
|
||||||
|
-E [MacOS only] display contents of MacOS extra field during
|
||||||
|
restore operation.
|
||||||
|
|
||||||
|
-F [Acorn only] suppress removal of NFS filetype extension from
|
||||||
|
stored filenames.
|
||||||
|
|
||||||
|
-F [non-Acorn systems supporting long filenames with embedded com-
|
||||||
|
mas, and only if compiled with ACORN_FTYPE_NFS defined] trans-
|
||||||
|
late filetype information from ACORN RISC OS extra field blocks
|
||||||
|
into a NFS filetype extension and append it to the names of the
|
||||||
|
extracted files. (When the stored filename appears to already
|
||||||
|
have an appended NFS filetype extension, it is replaced by the
|
||||||
|
info from the extra field.)
|
||||||
|
|
||||||
|
-i [MacOS only] ignore filenames stored in MacOS extra fields.
|
||||||
|
Instead, the most compatible filename stored in the generic part
|
||||||
|
of the entry's header is used.
|
||||||
|
|
||||||
|
-j junk paths. The archive's directory structure is not recreated;
|
||||||
|
all files are deposited in the extraction directory (by default,
|
||||||
|
the current one).
|
||||||
|
|
||||||
|
-J [BeOS only] junk file attributes. The file's BeOS file
|
||||||
|
attributes are not restored, just the file's data.
|
||||||
|
|
||||||
|
-J [MacOS only] ignore MacOS extra fields. All Macintosh specific
|
||||||
|
info is skipped. Data-fork and resource-fork are restored as
|
||||||
|
separate files.
|
||||||
|
|
||||||
|
-K [AtheOS, BeOS, Unix only] retain SUID/SGID/Tacky file
|
||||||
|
attributes. Without this flag, these attribute bits are cleared
|
||||||
|
for security reasons.
|
||||||
|
|
||||||
|
-L convert to lowercase any filename originating on an uppercase-
|
||||||
|
only operating system or file system. (This was unzip's default
|
||||||
|
behavior in releases prior to 5.11; the new default behavior is
|
||||||
|
identical to the old behavior with the -U option, which is now
|
||||||
|
obsolete and will be removed in a future release.) Depending on
|
||||||
|
the archiver, files archived under single-case file systems
|
||||||
|
(VMS, old MS-DOS FAT, etc.) may be stored as all-uppercase
|
||||||
|
names; this can be ugly or inconvenient when extracting to a
|
||||||
|
case-preserving file system such as OS/2 HPFS or a case-sensi-
|
||||||
|
tive one such as under Unix. By default unzip lists and
|
||||||
|
extracts such filenames exactly as they're stored (excepting
|
||||||
|
truncation, conversion of unsupported characters, etc.); this
|
||||||
|
option causes the names of all files from certain systems to be
|
||||||
|
converted to lowercase. The -LL option forces conversion of
|
||||||
|
every filename to lowercase, regardless of the originating file
|
||||||
|
system.
|
||||||
|
|
||||||
|
-M pipe all output through an internal pager similar to the Unix
|
||||||
|
more(1) command. At the end of a screenful of output, unzip
|
||||||
|
pauses with a ``--More--'' prompt; the next screenful may be
|
||||||
|
viewed by pressing the Enter (Return) key or the space bar.
|
||||||
|
unzip can be terminated by pressing the ``q'' key and, on some
|
||||||
|
systems, the Enter/Return key. Unlike Unix more(1), there is no
|
||||||
|
forward-searching or editing capability. Also, unzip doesn't
|
||||||
|
notice if long lines wrap at the edge of the screen, effectively
|
||||||
|
resulting in the printing of two or more lines and the likeli-
|
||||||
|
hood that some text will scroll off the top of the screen before
|
||||||
|
being viewed. On some systems the number of available lines on
|
||||||
|
the screen is not detected, in which case unzip assumes the
|
||||||
|
height is 24 lines.
|
||||||
|
|
||||||
|
-n never overwrite existing files. If a file already exists, skip
|
||||||
|
the extraction of that file without prompting. By default unzip
|
||||||
|
queries before extracting any file that already exists; the user
|
||||||
|
may choose to overwrite only the current file, overwrite all
|
||||||
|
files, skip extraction of the current file, skip extraction of
|
||||||
|
all existing files, or rename the current file.
|
||||||
|
|
||||||
|
-N [Amiga] extract file comments as Amiga filenotes. File comments
|
||||||
|
are created with the -c option of zip(1L), or with the -N option
|
||||||
|
of the Amiga port of zip(1L), which stores filenotes as com-
|
||||||
|
ments.
|
||||||
|
|
||||||
|
-o overwrite existing files without prompting. This is a dangerous
|
||||||
|
option, so use it with care. (It is often used with -f, how-
|
||||||
|
ever, and is the only way to overwrite directory EAs under
|
||||||
|
OS/2.)
|
||||||
|
|
||||||
|
-P password
|
||||||
|
use password to decrypt encrypted zipfile entries (if any).
|
||||||
|
THIS IS INSECURE! Many multi-user operating systems provide
|
||||||
|
ways for any user to see the current command line of any other
|
||||||
|
user; even on stand-alone systems there is always the threat of
|
||||||
|
over-the-shoulder peeking. Storing the plaintext password as
|
||||||
|
part of a command line in an automated script is even worse.
|
||||||
|
Whenever possible, use the non-echoing, interactive prompt to
|
||||||
|
enter passwords. (And where security is truly important, use
|
||||||
|
strong encryption such as Pretty Good Privacy instead of the
|
||||||
|
relatively weak encryption provided by standard zipfile utili-
|
||||||
|
ties.)
|
||||||
|
|
||||||
|
-q perform operations quietly (-qq = even quieter). Ordinarily
|
||||||
|
unzip prints the names of the files it's extracting or testing,
|
||||||
|
the extraction methods, any file or zipfile comments that may be
|
||||||
|
stored in the archive, and possibly a summary when finished with
|
||||||
|
each archive. The -q[q] options suppress the printing of some
|
||||||
|
or all of these messages.
|
||||||
|
|
||||||
|
-s [OS/2, NT, MS-DOS] convert spaces in filenames to underscores.
|
||||||
|
Since all PC operating systems allow spaces in filenames, unzip
|
||||||
|
by default extracts filenames with spaces intact (e.g.,
|
||||||
|
``EA DATA. SF''). This can be awkward, however, since MS-DOS in
|
||||||
|
particular does not gracefully support spaces in filenames.
|
||||||
|
Conversion of spaces to underscores can eliminate the awkward-
|
||||||
|
ness in some cases.
|
||||||
|
|
||||||
|
-S [VMS] convert text files (-a, -aa) into Stream_LF record format,
|
||||||
|
instead of the text-file default, variable-length record format.
|
||||||
|
(Stream_LF is the default record format of VMS unzip. It is
|
||||||
|
applied unless conversion (-a, -aa and/or -b, -bb) is requested
|
||||||
|
or a VMS-specific entry is processed.)
|
||||||
|
|
||||||
|
-U [UNICODE_SUPPORT only] modify or disable UTF-8 handling. When
|
||||||
|
UNICODE_SUPPORT is available, the option -U forces unzip to
|
||||||
|
escape all non-ASCII characters from UTF-8 coded filenames as
|
||||||
|
``#Uxxxx'' (for UCS-2 characters, or ``#Lxxxxxx'' for unicode
|
||||||
|
codepoints needing 3 octets). This option is mainly provided
|
||||||
|
for debugging purpose when the fairly new UTF-8 support is sus-
|
||||||
|
pected to mangle up extracted filenames.
|
||||||
|
|
||||||
|
The option -UU allows to entirely disable the recognition of
|
||||||
|
UTF-8 encoded filenames. The handling of filename codings
|
||||||
|
within unzip falls back to the behaviour of previous versions.
|
||||||
|
|
||||||
|
[old, obsolete usage] leave filenames uppercase if created under
|
||||||
|
MS-DOS, VMS, etc. See -L above.
|
||||||
|
|
||||||
|
-V retain (VMS) file version numbers. VMS files can be stored with
|
||||||
|
a version number, in the format file.ext;##. By default the
|
||||||
|
``;##'' version numbers are stripped, but this option allows
|
||||||
|
them to be retained. (On file systems that limit filenames to
|
||||||
|
particularly short lengths, the version numbers may be truncated
|
||||||
|
or stripped regardless of this option.)
|
||||||
|
|
||||||
|
-W [only when WILD_STOP_AT_DIR compile-time option enabled] modi-
|
||||||
|
fies the pattern matching routine so that both `?' (single-char
|
||||||
|
wildcard) and `*' (multi-char wildcard) do not match the direc-
|
||||||
|
tory separator character `/'. (The two-character sequence
|
||||||
|
``**'' acts as a multi-char wildcard that includes the directory
|
||||||
|
separator in its matched characters.) Examples:
|
||||||
|
|
||||||
|
"*.c" matches "foo.c" but not "mydir/foo.c"
|
||||||
|
"**.c" matches both "foo.c" and "mydir/foo.c"
|
||||||
|
"*/*.c" matches "bar/foo.c" but not "baz/bar/foo.c"
|
||||||
|
"??*/*" matches "ab/foo" and "abc/foo"
|
||||||
|
but not "a/foo" or "a/b/foo"
|
||||||
|
|
||||||
|
This modified behaviour is equivalent to the pattern matching
|
||||||
|
style used by the shells of some of UnZip's supported target OSs
|
||||||
|
(one example is Acorn RISC OS). This option may not be avail-
|
||||||
|
able on systems where the Zip archive's internal directory sepa-
|
||||||
|
rator character `/' is allowed as regular character in native
|
||||||
|
operating system filenames. (Currently, UnZip uses the same
|
||||||
|
pattern matching rules for both wildcard zipfile specifications
|
||||||
|
and zip entry selection patterns in most ports. For systems
|
||||||
|
allowing `/' as regular filename character, the -W option would
|
||||||
|
not work as expected on a wildcard zipfile specification.)
|
||||||
|
|
||||||
|
-X [VMS, Unix, OS/2, NT, Tandem] restore owner/protection info
|
||||||
|
(UICs and ACL entries) under VMS, or user and group info
|
||||||
|
(UID/GID) under Unix, or access control lists (ACLs) under cer-
|
||||||
|
tain network-enabled versions of OS/2 (Warp Server with IBM LAN
|
||||||
|
Server/Requester 3.0 to 5.0; Warp Connect with IBM Peer 1.0), or
|
||||||
|
security ACLs under Windows NT. In most cases this will require
|
||||||
|
special system privileges, and doubling the option (-XX) under
|
||||||
|
NT instructs unzip to use privileges for extraction; but under
|
||||||
|
Unix, for example, a user who belongs to several groups can
|
||||||
|
restore files owned by any of those groups, as long as the user
|
||||||
|
IDs match his or her own. Note that ordinary file attributes
|
||||||
|
are always restored--this option applies only to optional, extra
|
||||||
|
ownership info available on some operating systems. [NT's
|
||||||
|
access control lists do not appear to be especially compatible
|
||||||
|
with OS/2's, so no attempt is made at cross-platform portability
|
||||||
|
of access privileges. It is not clear under what conditions
|
||||||
|
this would ever be useful anyway.]
|
||||||
|
|
||||||
|
-Y [VMS] treat archived file name endings of ``.nnn'' (where
|
||||||
|
``nnn'' is a decimal number) as if they were VMS version num-
|
||||||
|
bers (``;nnn''). (The default is to treat them as file types.)
|
||||||
|
Example:
|
||||||
|
"a.b.3" -> "a.b;3".
|
||||||
|
|
||||||
|
-$ [MS-DOS, OS/2, NT] restore the volume label if the extraction
|
||||||
|
medium is removable (e.g., a diskette). Doubling the option
|
||||||
|
(-$$) allows fixed media (hard disks) to be labelled as well.
|
||||||
|
By default, volume labels are ignored.
|
||||||
|
|
||||||
|
-/ extensions
|
||||||
|
[Acorn only] overrides the extension list supplied by Unzip$Ext
|
||||||
|
environment variable. During extraction, filename extensions
|
||||||
|
that match one of the items in this extension list are swapped
|
||||||
|
in front of the base name of the extracted file.
|
||||||
|
|
||||||
|
-: [all but Acorn, VM/CMS, MVS, Tandem] allows to extract archive
|
||||||
|
members into locations outside of the current `` extraction root
|
||||||
|
folder''. For security reasons, unzip normally removes ``parent
|
||||||
|
dir'' path components (``../'') from the names of extracted
|
||||||
|
file. This safety feature (new for version 5.50) prevents unzip
|
||||||
|
from accidentally writing files to ``sensitive'' areas outside
|
||||||
|
the active extraction folder tree head. The -: option lets
|
||||||
|
unzip switch back to its previous, more liberal behaviour, to
|
||||||
|
allow exact extraction of (older) archives that used ``../''
|
||||||
|
components to create multiple directory trees at the level of
|
||||||
|
the current extraction folder. This option does not enable
|
||||||
|
writing explicitly to the root directory (``/''). To achieve
|
||||||
|
this, it is necessary to set the extraction target folder to
|
||||||
|
root (e.g. -d / ). However, when the -: option is specified, it
|
||||||
|
is still possible to implicitly write to the root directory by
|
||||||
|
specifying enough ``../'' path components within the zip
|
||||||
|
archive. Use this option with extreme caution.
|
||||||
|
|
||||||
|
-^ [Unix only] allow control characters in names of extracted ZIP
|
||||||
|
archive entries. On Unix, a file name may contain any (8-bit)
|
||||||
|
character code with the two exception '/' (directory delimiter)
|
||||||
|
and NUL (0x00, the C string termination indicator), unless the
|
||||||
|
specific file system has more restrictive conventions. Gener-
|
||||||
|
ally, this allows to embed ASCII control characters (or even
|
||||||
|
sophisticated control sequences) in file names, at least on
|
||||||
|
'native' Unix file systems. However, it may be highly suspi-
|
||||||
|
cious to make use of this Unix "feature". Embedded control
|
||||||
|
characters in file names might have nasty side effects when dis-
|
||||||
|
played on screen by some listing code without sufficient filter-
|
||||||
|
ing. And, for ordinary users, it may be difficult to handle
|
||||||
|
such file names (e.g. when trying to specify it for open, copy,
|
||||||
|
move, or delete operations). Therefore, unzip applies a filter
|
||||||
|
by default that removes potentially dangerous control characters
|
||||||
|
from the extracted file names. The -^ option allows to override
|
||||||
|
this filter in the rare case that embedded filename control
|
||||||
|
characters are to be intentionally restored.
|
||||||
|
|
||||||
|
-2 [VMS] force unconditionally conversion of file names to
|
||||||
|
ODS2-compatible names. The default is to exploit the destina-
|
||||||
|
tion file system, preserving case and extended file name charac-
|
||||||
|
ters on an ODS5 destination file system; and applying the
|
||||||
|
ODS2-compatibility file name filtering on an ODS2 destination
|
||||||
|
file system.
|
||||||
|
|
||||||
|
ENVIRONMENT OPTIONS
|
||||||
|
unzip's default behavior may be modified via options placed in an envi-
|
||||||
|
ronment variable. This can be done with any option, but it is probably
|
||||||
|
most useful with the -a, -L, -C, -q, -o, or -n modifiers: make unzip
|
||||||
|
auto-convert text files by default, make it convert filenames from
|
||||||
|
uppercase systems to lowercase, make it match names case-insensitively,
|
||||||
|
make it quieter, or make it always overwrite or never overwrite files
|
||||||
|
as it extracts them. For example, to make unzip act as quietly as pos-
|
||||||
|
sible, only reporting errors, one would use one of the following com-
|
||||||
|
mands:
|
||||||
|
|
||||||
|
Unix Bourne shell:
|
||||||
|
UNZIP=-qq; export UNZIP
|
||||||
|
|
||||||
|
Unix C shell:
|
||||||
|
setenv UNZIP -qq
|
||||||
|
|
||||||
|
OS/2 or MS-DOS:
|
||||||
|
set UNZIP=-qq
|
||||||
|
|
||||||
|
VMS (quotes for lowercase):
|
||||||
|
define UNZIP_OPTS "-qq"
|
||||||
|
|
||||||
|
Environment options are, in effect, considered to be just like any
|
||||||
|
other command-line options, except that they are effectively the first
|
||||||
|
options on the command line. To override an environment option, one
|
||||||
|
may use the ``minus operator'' to remove it. For instance, to override
|
||||||
|
one of the quiet-flags in the example above, use the command
|
||||||
|
|
||||||
|
unzip --q[other options] zipfile
|
||||||
|
|
||||||
|
The first hyphen is the normal switch character, and the second is a
|
||||||
|
minus sign, acting on the q option. Thus the effect here is to cancel
|
||||||
|
one quantum of quietness. To cancel both quiet flags, two (or more)
|
||||||
|
minuses may be used:
|
||||||
|
|
||||||
|
unzip -t--q zipfile
|
||||||
|
unzip ---qt zipfile
|
||||||
|
|
||||||
|
(the two are equivalent). This may seem awkward or confusing, but it
|
||||||
|
is reasonably intuitive: just ignore the first hyphen and go from
|
||||||
|
there. It is also consistent with the behavior of Unix nice(1).
|
||||||
|
|
||||||
|
As suggested by the examples above, the default variable names are
|
||||||
|
UNZIP_OPTS for VMS (where the symbol used to install unzip as a foreign
|
||||||
|
command would otherwise be confused with the environment variable), and
|
||||||
|
UNZIP for all other operating systems. For compatibility with zip(1L),
|
||||||
|
UNZIPOPT is also accepted (don't ask). If both UNZIP and UNZIPOPT are
|
||||||
|
defined, however, UNZIP takes precedence. unzip's diagnostic option
|
||||||
|
(-v with no zipfile name) can be used to check the values of all four
|
||||||
|
possible unzip and zipinfo environment variables.
|
||||||
|
|
||||||
|
The timezone variable (TZ) should be set according to the local time-
|
||||||
|
zone in order for the -f and -u to operate correctly. See the descrip-
|
||||||
|
tion of -f above for details. This variable may also be necessary to
|
||||||
|
get timestamps of extracted files to be set correctly. The WIN32
|
||||||
|
(Win9x/ME/NT4/2K/XP/2K3) port of unzip gets the timezone configuration
|
||||||
|
from the registry, assuming it is correctly set in the Control Panel.
|
||||||
|
The TZ variable is ignored for this port.
|
||||||
|
|
||||||
|
DECRYPTION
|
||||||
|
Encrypted archives are fully supported by Info-ZIP software, but due to
|
||||||
|
United States export restrictions, de-/encryption support might be dis-
|
||||||
|
abled in your compiled binary. However, since spring 2000, US export
|
||||||
|
restrictions have been liberated, and our source archives do now
|
||||||
|
include full crypt code. In case you need binary distributions with
|
||||||
|
crypt support enabled, see the file ``WHERE'' in any Info-ZIP source or
|
||||||
|
binary distribution for locations both inside and outside the US.
|
||||||
|
|
||||||
|
Some compiled versions of unzip may not support decryption. To check a
|
||||||
|
version for crypt support, either attempt to test or extract an
|
||||||
|
encrypted archive, or else check unzip's diagnostic screen (see the -v
|
||||||
|
option above) for ``[decryption]'' as one of the special compilation
|
||||||
|
options.
|
||||||
|
|
||||||
|
As noted above, the -P option may be used to supply a password on the
|
||||||
|
command line, but at a cost in security. The preferred decryption
|
||||||
|
method is simply to extract normally; if a zipfile member is encrypted,
|
||||||
|
unzip will prompt for the password without echoing what is typed.
|
||||||
|
unzip continues to use the same password as long as it appears to be
|
||||||
|
valid, by testing a 12-byte header on each file. The correct password
|
||||||
|
will always check out against the header, but there is a 1-in-256
|
||||||
|
chance that an incorrect password will as well. (This is a security
|
||||||
|
feature of the PKWARE zipfile format; it helps prevent brute-force
|
||||||
|
attacks that might otherwise gain a large speed advantage by testing
|
||||||
|
only the header.) In the case that an incorrect password is given but
|
||||||
|
it passes the header test anyway, either an incorrect CRC will be gen-
|
||||||
|
erated for the extracted data or else unzip will fail during the
|
||||||
|
extraction because the ``decrypted'' bytes do not constitute a valid
|
||||||
|
compressed data stream.
|
||||||
|
|
||||||
|
If the first password fails the header check on some file, unzip will
|
||||||
|
prompt for another password, and so on until all files are extracted.
|
||||||
|
If a password is not known, entering a null password (that is, just a
|
||||||
|
carriage return or ``Enter'') is taken as a signal to skip all further
|
||||||
|
prompting. Only unencrypted files in the archive(s) will thereafter be
|
||||||
|
extracted. (In fact, that's not quite true; older versions of zip(1L)
|
||||||
|
and zipcloak(1L) allowed null passwords, so unzip checks each encrypted
|
||||||
|
file to see if the null password works. This may result in ``false
|
||||||
|
positives'' and extraction errors, as noted above.)
|
||||||
|
|
||||||
|
Archives encrypted with 8-bit passwords (for example, passwords with
|
||||||
|
accented European characters) may not be portable across systems and/or
|
||||||
|
other archivers. This problem stems from the use of multiple encoding
|
||||||
|
methods for such characters, including Latin-1 (ISO 8859-1) and OEM
|
||||||
|
code page 850. DOS PKZIP 2.04g uses the OEM code page; Windows PKZIP
|
||||||
|
2.50 uses Latin-1 (and is therefore incompatible with DOS PKZIP); Info-
|
||||||
|
ZIP uses the OEM code page on DOS, OS/2 and Win3.x ports but ISO coding
|
||||||
|
(Latin-1 etc.) everywhere else; and Nico Mak's WinZip 6.x does not
|
||||||
|
allow 8-bit passwords at all. UnZip 5.3 (or newer) attempts to use the
|
||||||
|
default character set first (e.g., Latin-1), followed by the alternate
|
||||||
|
one (e.g., OEM code page) to test passwords. On EBCDIC systems, if
|
||||||
|
both of these fail, EBCDIC encoding will be tested as a last resort.
|
||||||
|
(EBCDIC is not tested on non-EBCDIC systems, because there are no known
|
||||||
|
archivers that encrypt using EBCDIC encoding.) ISO character encodings
|
||||||
|
other than Latin-1 are not supported. The new addition of (partially)
|
||||||
|
Unicode (resp. UTF-8) support in UnZip 6.0 has not yet been adapted to
|
||||||
|
the encryption password handling in unzip. On systems that use UTF-8
|
||||||
|
as native character encoding, unzip simply tries decryption with the
|
||||||
|
native UTF-8 encoded password; the built-in attempts to check the pass-
|
||||||
|
word in translated encoding have not yet been adapted for UTF-8 support
|
||||||
|
and will consequently fail.
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
To use unzip to extract all members of the archive letters.zip into the
|
||||||
|
current directory and subdirectories below it, creating any subdirecto-
|
||||||
|
ries as necessary:
|
||||||
|
|
||||||
|
unzip letters
|
||||||
|
|
||||||
|
To extract all members of letters.zip into the current directory only:
|
||||||
|
|
||||||
|
unzip -j letters
|
||||||
|
|
||||||
|
To test letters.zip, printing only a summary message indicating whether
|
||||||
|
the archive is OK or not:
|
||||||
|
|
||||||
|
unzip -tq letters
|
||||||
|
|
||||||
|
To test all zipfiles in the current directory, printing only the sum-
|
||||||
|
maries:
|
||||||
|
|
||||||
|
unzip -tq \*.zip
|
||||||
|
|
||||||
|
(The backslash before the asterisk is only required if the shell
|
||||||
|
expands wildcards, as in Unix; double quotes could have been used
|
||||||
|
instead, as in the source examples below.) To extract to standard out-
|
||||||
|
put all members of letters.zip whose names end in .tex, auto-converting
|
||||||
|
to the local end-of-line convention and piping the output into more(1):
|
||||||
|
|
||||||
|
unzip -ca letters \*.tex | more
|
||||||
|
|
||||||
|
To extract the binary file paper1.dvi to standard output and pipe it to
|
||||||
|
a printing program:
|
||||||
|
|
||||||
|
unzip -p articles paper1.dvi | dvips
|
||||||
|
|
||||||
|
To extract all FORTRAN and C source files--*.f, *.c, *.h, and Make-
|
||||||
|
file--into the /tmp directory:
|
||||||
|
|
||||||
|
unzip source.zip "*.[fch]" Makefile -d /tmp
|
||||||
|
|
||||||
|
(the double quotes are necessary only in Unix and only if globbing is
|
||||||
|
turned on). To extract all FORTRAN and C source files, regardless of
|
||||||
|
case (e.g., both *.c and *.C, and any makefile, Makefile, MAKEFILE or
|
||||||
|
similar):
|
||||||
|
|
||||||
|
unzip -C source.zip "*.[fch]" makefile -d /tmp
|
||||||
|
|
||||||
|
To extract any such files but convert any uppercase MS-DOS or VMS names
|
||||||
|
to lowercase and convert the line-endings of all of the files to the
|
||||||
|
local standard (without respect to any files that might be marked
|
||||||
|
``binary''):
|
||||||
|
|
||||||
|
unzip -aaCL source.zip "*.[fch]" makefile -d /tmp
|
||||||
|
|
||||||
|
To extract only newer versions of the files already in the current
|
||||||
|
directory, without querying (NOTE: be careful of unzipping in one
|
||||||
|
timezone a zipfile created in another--ZIP archives other than those
|
||||||
|
created by Zip 2.1 or later contain no timezone information, and a
|
||||||
|
``newer'' file from an eastern timezone may, in fact, be older):
|
||||||
|
|
||||||
|
unzip -fo sources
|
||||||
|
|
||||||
|
To extract newer versions of the files already in the current directory
|
||||||
|
and to create any files not already there (same caveat as previous
|
||||||
|
example):
|
||||||
|
|
||||||
|
unzip -uo sources
|
||||||
|
|
||||||
|
To display a diagnostic screen showing which unzip and zipinfo options
|
||||||
|
are stored in environment variables, whether decryption support was
|
||||||
|
compiled in, the compiler with which unzip was compiled, etc.:
|
||||||
|
|
||||||
|
unzip -v
|
||||||
|
|
||||||
|
In the last five examples, assume that UNZIP or UNZIP_OPTS is set to
|
||||||
|
-q. To do a singly quiet listing:
|
||||||
|
|
||||||
|
unzip -l file.zip
|
||||||
|
|
||||||
|
To do a doubly quiet listing:
|
||||||
|
|
||||||
|
unzip -ql file.zip
|
||||||
|
|
||||||
|
(Note that the ``.zip'' is generally not necessary.) To do a standard
|
||||||
|
listing:
|
||||||
|
|
||||||
|
unzip --ql file.zip
|
||||||
|
or
|
||||||
|
unzip -l-q file.zip
|
||||||
|
or
|
||||||
|
unzip -l--q file.zip
|
||||||
|
(Extra minuses in options don't hurt.)
|
||||||
|
|
||||||
|
TIPS
|
||||||
|
The current maintainer, being a lazy sort, finds it very useful to
|
||||||
|
define a pair of aliases: tt for ``unzip -tq'' and ii for ``unzip -Z''
|
||||||
|
(or ``zipinfo''). One may then simply type ``tt zipfile'' to test an
|
||||||
|
archive, something that is worth making a habit of doing. With luck
|
||||||
|
unzip will report ``No errors detected in compressed data of zip-
|
||||||
|
file.zip,'' after which one may breathe a sigh of relief.
|
||||||
|
|
||||||
|
The maintainer also finds it useful to set the UNZIP environment vari-
|
||||||
|
able to ``-aL'' and is tempted to add ``-C'' as well. His ZIPINFO
|
||||||
|
variable is set to ``-z''.
|
||||||
|
|
||||||
|
DIAGNOSTICS
|
||||||
|
The exit status (or error level) approximates the exit codes defined by
|
||||||
|
PKWARE and takes on the following values, except under VMS:
|
||||||
|
|
||||||
|
0 normal; no errors or warnings detected.
|
||||||
|
|
||||||
|
1 one or more warning errors were encountered, but process-
|
||||||
|
ing completed successfully anyway. This includes zip-
|
||||||
|
files where one or more files was skipped due to unsup-
|
||||||
|
ported compression method or encryption with an unknown
|
||||||
|
password.
|
||||||
|
|
||||||
|
2 a generic error in the zipfile format was detected. Pro-
|
||||||
|
cessing may have completed successfully anyway; some bro-
|
||||||
|
ken zipfiles created by other archivers have simple work-
|
||||||
|
arounds.
|
||||||
|
|
||||||
|
3 a severe error in the zipfile format was detected. Pro-
|
||||||
|
cessing probably failed immediately.
|
||||||
|
|
||||||
|
4 unzip was unable to allocate memory for one or more
|
||||||
|
buffers during program initialization.
|
||||||
|
|
||||||
|
5 unzip was unable to allocate memory or unable to obtain a
|
||||||
|
tty to read the decryption password(s).
|
||||||
|
|
||||||
|
6 unzip was unable to allocate memory during decompression
|
||||||
|
to disk.
|
||||||
|
|
||||||
|
7 unzip was unable to allocate memory during in-memory
|
||||||
|
decompression.
|
||||||
|
|
||||||
|
8 [currently not used]
|
||||||
|
|
||||||
|
9 the specified zipfiles were not found.
|
||||||
|
|
||||||
|
10 invalid options were specified on the command line.
|
||||||
|
|
||||||
|
11 no matching files were found.
|
||||||
|
|
||||||
|
50 the disk is (or was) full during extraction.
|
||||||
|
|
||||||
|
51 the end of the ZIP archive was encountered prematurely.
|
||||||
|
|
||||||
|
80 the user aborted unzip prematurely with control-C (or
|
||||||
|
similar)
|
||||||
|
|
||||||
|
81 testing or extraction of one or more files failed due to
|
||||||
|
unsupported compression methods or unsupported decryp-
|
||||||
|
tion.
|
||||||
|
|
||||||
|
82 no files were found due to bad decryption password(s).
|
||||||
|
(If even one file is successfully processed, however, the
|
||||||
|
exit status is 1.)
|
||||||
|
|
||||||
|
VMS interprets standard Unix (or PC) return values as other, scarier-
|
||||||
|
looking things, so unzip instead maps them into VMS-style status codes.
|
||||||
|
The current mapping is as follows: 1 (success) for normal exit,
|
||||||
|
0x7fff0001 for warning errors, and (0x7fff000? + 16*nor-
|
||||||
|
mal_unzip_exit_status) for all other errors, where the `?' is 2 (error)
|
||||||
|
for unzip values 2, 9-11 and 80-82, and 4 (fatal error) for the remain-
|
||||||
|
ing ones (3-8, 50, 51). In addition, there is a compilation option to
|
||||||
|
expand upon this behavior: defining RETURN_CODES results in a human-
|
||||||
|
readable explanation of what the error status means.
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
Multi-part archives are not yet supported, except in conjunction with
|
||||||
|
zip. (All parts must be concatenated together in order, and then ``zip
|
||||||
|
-F'' (for zip 2.x) or ``zip -FF'' (for zip 3.x) must be performed on
|
||||||
|
the concatenated archive in order to ``fix'' it. Also, zip 3.0 and
|
||||||
|
later can combine multi-part (split) archives into a combined single-
|
||||||
|
file archive using ``zip -s- inarchive -O outarchive''. See the zip 3
|
||||||
|
manual page for more information.) This will definitely be corrected
|
||||||
|
in the next major release.
|
||||||
|
|
||||||
|
Archives read from standard input are not yet supported, except with
|
||||||
|
funzip (and then only the first member of the archive can be
|
||||||
|
extracted).
|
||||||
|
|
||||||
|
Archives encrypted with 8-bit passwords (e.g., passwords with accented
|
||||||
|
European characters) may not be portable across systems and/or other
|
||||||
|
archivers. See the discussion in DECRYPTION above.
|
||||||
|
|
||||||
|
unzip's -M (``more'') option tries to take into account automatic wrap-
|
||||||
|
ping of long lines. However, the code may fail to detect the correct
|
||||||
|
wrapping locations. First, TAB characters (and similar control
|
||||||
|
sequences) are not taken into account, they are handled as ordinary
|
||||||
|
printable characters. Second, depending on the actual system / OS
|
||||||
|
port, unzip may not detect the true screen geometry but rather rely on
|
||||||
|
"commonly used" default dimensions. The correct handling of tabs would
|
||||||
|
require the implementation of a query for the actual tabulator setup on
|
||||||
|
the output console.
|
||||||
|
|
||||||
|
Dates, times and permissions of stored directories are not restored
|
||||||
|
except under Unix. (On Windows NT and successors, timestamps are now
|
||||||
|
restored.)
|
||||||
|
|
||||||
|
[MS-DOS] When extracting or testing files from an archive on a defec-
|
||||||
|
tive floppy diskette, if the ``Fail'' option is chosen from DOS's
|
||||||
|
``Abort, Retry, Fail?'' message, older versions of unzip may hang the
|
||||||
|
system, requiring a reboot. This problem appears to be fixed, but con-
|
||||||
|
trol-C (or control-Break) can still be used to terminate unzip.
|
||||||
|
|
||||||
|
Under DEC Ultrix, unzip would sometimes fail on long zipfiles (bad CRC,
|
||||||
|
not always reproducible). This was apparently due either to a hardware
|
||||||
|
bug (cache memory) or an operating system bug (improper handling of
|
||||||
|
page faults?). Since Ultrix has been abandoned in favor of Digital
|
||||||
|
Unix (OSF/1), this may not be an issue anymore.
|
||||||
|
|
||||||
|
[Unix] Unix special files such as FIFO buffers (named pipes), block
|
||||||
|
devices and character devices are not restored even if they are somehow
|
||||||
|
represented in the zipfile, nor are hard-linked files relinked. Basi-
|
||||||
|
cally the only file types restored by unzip are regular files, directo-
|
||||||
|
ries and symbolic (soft) links.
|
||||||
|
|
||||||
|
[OS/2] Extended attributes for existing directories are only updated if
|
||||||
|
the -o (``overwrite all'') option is given. This is a limitation of
|
||||||
|
the operating system; because directories only have a creation time
|
||||||
|
associated with them, unzip has no way to determine whether the stored
|
||||||
|
attributes are newer or older than those on disk. In practice this may
|
||||||
|
mean a two-pass approach is required: first unpack the archive nor-
|
||||||
|
mally (with or without freshening/updating existing files), then
|
||||||
|
overwrite just the directory entries (e.g., ``unzip -o foo */'').
|
||||||
|
|
||||||
|
[VMS] When extracting to another directory, only the [.foo] syntax is
|
||||||
|
accepted for the -d option; the simple Unix foo syntax is silently
|
||||||
|
ignored (as is the less common VMS foo.dir syntax).
|
||||||
|
|
||||||
|
[VMS] When the file being extracted already exists, unzip's query only
|
||||||
|
allows skipping, overwriting or renaming; there should additionally be
|
||||||
|
a choice for creating a new version of the file. In fact, the ``over-
|
||||||
|
write'' choice does create a new version; the old version is not over-
|
||||||
|
written or deleted.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
funzip(1L), zip(1L), zipcloak(1L), zipgrep(1L), zipinfo(1L), zip-
|
||||||
|
note(1L), zipsplit(1L)
|
||||||
|
|
||||||
|
URL
|
||||||
|
The Info-ZIP home page is currently at
|
||||||
|
http://www.info-zip.org/pub/infozip/
|
||||||
|
or
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/ .
|
||||||
|
|
||||||
|
AUTHORS
|
||||||
|
The primary Info-ZIP authors (current semi-active members of the Zip-
|
||||||
|
Bugs workgroup) are: Ed Gordon (Zip, general maintenance, shared code,
|
||||||
|
Zip64, Win32, Unix, Unicode); Christian Spieler (UnZip maintenance
|
||||||
|
coordination, VMS, MS-DOS, Win32, shared code, general Zip and UnZip
|
||||||
|
integration and optimization); Onno van der Linden (Zip); Mike White
|
||||||
|
(Win32, Windows GUI, Windows DLLs); Kai Uwe Rommel (OS/2, Win32);
|
||||||
|
Steven M. Schweda (VMS, Unix, support of new features); Paul Kienitz
|
||||||
|
(Amiga, Win32, Unicode); Chris Herborth (BeOS, QNX, Atari); Jonathan
|
||||||
|
Hudson (SMS/QDOS); Sergio Monesi (Acorn RISC OS); Harald Denker (Atari,
|
||||||
|
MVS); John Bush (Solaris, Amiga); Hunter Goatley (VMS, Info-ZIP Site
|
||||||
|
maintenance); Steve Salisbury (Win32); Steve Miller (Windows CE GUI),
|
||||||
|
Johnny Lee (MS-DOS, Win32, Zip64); and Dave Smith (Tandem NSK).
|
||||||
|
|
||||||
|
The following people were former members of the Info-ZIP development
|
||||||
|
group and provided major contributions to key parts of the current
|
||||||
|
code: Greg ``Cave Newt'' Roelofs (UnZip, unshrink decompression); Jean-
|
||||||
|
loup Gailly (deflate compression); Mark Adler (inflate decompression,
|
||||||
|
fUnZip).
|
||||||
|
|
||||||
|
The author of the original unzip code upon which Info-ZIP's was based
|
||||||
|
is Samuel H. Smith; Carl Mascott did the first Unix port; and David P.
|
||||||
|
Kirschbaum organized and led Info-ZIP in its early days with Keith
|
||||||
|
Petersen hosting the original mailing list at WSMR-SimTel20. The full
|
||||||
|
list of contributors to UnZip has grown quite large; please refer to
|
||||||
|
the CONTRIBS file in the UnZip source distribution for a relatively
|
||||||
|
complete version.
|
||||||
|
|
||||||
|
VERSIONS
|
||||||
|
v1.2 15 Mar 89 Samuel H. Smith
|
||||||
|
v2.0 9 Sep 89 Samuel H. Smith
|
||||||
|
v2.x fall 1989 many Usenet contributors
|
||||||
|
v3.0 1 May 90 Info-ZIP (DPK, consolidator)
|
||||||
|
v3.1 15 Aug 90 Info-ZIP (DPK, consolidator)
|
||||||
|
v4.0 1 Dec 90 Info-ZIP (GRR, maintainer)
|
||||||
|
v4.1 12 May 91 Info-ZIP
|
||||||
|
v4.2 20 Mar 92 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.0 21 Aug 92 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.01 15 Jan 93 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.1 7 Feb 94 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.11 2 Aug 94 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.12 28 Aug 94 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.2 30 Apr 96 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.3 22 Apr 97 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.31 31 May 97 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.32 3 Nov 97 Info-ZIP (Zip-Bugs subgroup, GRR)
|
||||||
|
v5.4 28 Nov 98 Info-ZIP (Zip-Bugs subgroup, SPC)
|
||||||
|
v5.41 16 Apr 00 Info-ZIP (Zip-Bugs subgroup, SPC)
|
||||||
|
v5.42 14 Jan 01 Info-ZIP (Zip-Bugs subgroup, SPC)
|
||||||
|
v5.5 17 Feb 02 Info-ZIP (Zip-Bugs subgroup, SPC)
|
||||||
|
v5.51 22 May 04 Info-ZIP (Zip-Bugs subgroup, SPC)
|
||||||
|
v5.52 28 Feb 05 Info-ZIP (Zip-Bugs subgroup, SPC)
|
||||||
|
v6.0 20 Apr 09 Info-ZIP (Zip-Bugs subgroup, SPC)
|
||||||
|
|
||||||
|
Info-ZIP 20 April 2009 (v6.0) UNZIP(1L)
|
2869
third_party/unzip/unzpriv.h
vendored
Normal file
2869
third_party/unzip/unzpriv.h
vendored
Normal file
File diff suppressed because it is too large
Load diff
96
third_party/unzip/unzvers.h
vendored
Normal file
96
third_party/unzip/unzvers.h
vendored
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2010 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2009-Jan-02 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
unzvers.h (for UnZip) by Info-ZIP.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __unzvers_h /* don't include more than once */
|
||||||
|
#define __unzvers_h
|
||||||
|
|
||||||
|
/*
|
||||||
|
#ifdef BETA
|
||||||
|
# undef BETA
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BETA
|
||||||
|
# define BETA /* undefine BETA for public releases */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA
|
||||||
|
# define UZ_BETALEVEL "b BETA"
|
||||||
|
# define UZ_VERSION_DATE "10 Dec 10" /* internal beta version */
|
||||||
|
#else
|
||||||
|
# define UZ_BETALEVEL ""
|
||||||
|
# define UZ_VERSION_DATE "20 April 2009" /* official release version */
|
||||||
|
# define RELEASE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UZ_MAJORVER 6 /* UnZip */
|
||||||
|
#define UZ_MINORVER 1
|
||||||
|
|
||||||
|
#define ZI_MAJORVER 3 /* ZipInfo */
|
||||||
|
#define ZI_MINORVER 1
|
||||||
|
|
||||||
|
#define UZ_PATCHLEVEL 0
|
||||||
|
|
||||||
|
#define UZ_VER_STRING "6.1" /* keep in sync with Version numbers! */
|
||||||
|
|
||||||
|
#ifndef IZ_COMPANY_NAME /* might be already defined... */
|
||||||
|
# define IZ_COMPANY_NAME "Info-ZIP"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* these are obsolete but remain for backward compatibility: */
|
||||||
|
#if (defined(OS2) || defined(__OS2__))
|
||||||
|
# define D2_MAJORVER UZ_MAJORVER /* DLL for OS/2 */
|
||||||
|
# define D2_MINORVER UZ_MINORVER
|
||||||
|
# define D2_PATCHLEVEL UZ_PATCHLEVEL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DW_MAJORVER UZ_MAJORVER /* DLL for MS Windows */
|
||||||
|
#define DW_MINORVER UZ_MINORVER
|
||||||
|
#define DW_PATCHLEVEL UZ_PATCHLEVEL
|
||||||
|
|
||||||
|
#define WIN_VERSION_DATE UZ_VERSION_DATE
|
||||||
|
|
||||||
|
#define UNZ_DLL_VERSION UZ_VER_STRING
|
||||||
|
|
||||||
|
/* The following version constants specify the UnZip version that introduced
|
||||||
|
* the most recent incompatible change (means: change that breaks backward
|
||||||
|
* compatibility) of a DLL/Library binary API definition.
|
||||||
|
*
|
||||||
|
* Currently, UnZip supports three distinct DLL/Library APIs, which each
|
||||||
|
* carry their own "compatibility level":
|
||||||
|
* a) The "generic" (console-mode oriented) API has been used on UNIX,
|
||||||
|
* for example. This API provides a "callable" interface similar to the
|
||||||
|
* interactive command line of the normal program executables.
|
||||||
|
* b) The OS/2-only API provides (additional) functions specially tailored
|
||||||
|
* for interfacing with the REXX shell.
|
||||||
|
* c) The Win32 DLL API with a pure binary interface which can be used to
|
||||||
|
* build GUI mode as well as Console mode applications.
|
||||||
|
*
|
||||||
|
* Whenever a change that breaks backward compatibility gets applied to
|
||||||
|
* any of the DLL/Library APIs, the corresponding compatibility level should
|
||||||
|
* be synchronized with the current UnZip version numbers.
|
||||||
|
*/
|
||||||
|
/* generic DLL API minimum compatible version*/
|
||||||
|
#define UZ_GENAPI_COMP_MAJOR 6
|
||||||
|
#define UZ_GENAPI_COMP_MINOR 0
|
||||||
|
#define UZ_GENAPI_COMP_REVIS 0
|
||||||
|
/* os2dll API minimum compatible version*/
|
||||||
|
#define UZ_OS2API_COMP_MAJOR 6
|
||||||
|
#define UZ_OS2API_COMP_MINOR 0
|
||||||
|
#define UZ_OS2API_COMP_REVIS 0
|
||||||
|
/* windll API minimum compatible version*/
|
||||||
|
#define UZ_WINAPI_COMP_MAJOR 6
|
||||||
|
#define UZ_WINAPI_COMP_MINOR 0
|
||||||
|
#define UZ_WINAPI_COMP_REVIS 0
|
||||||
|
|
||||||
|
#endif /* !__unzvers_h */
|
26
third_party/unzip/zip.h
vendored
Normal file
26
third_party/unzip/zip.h
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// clang-format off
|
||||||
|
/*
|
||||||
|
Copyright (c) 1990-2005 Info-ZIP. All rights reserved.
|
||||||
|
|
||||||
|
See the accompanying file LICENSE, version 2003-May-08 or later
|
||||||
|
(the contents of which are also included in unzip.h) for terms of use.
|
||||||
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
*/
|
||||||
|
/* This is a dummy zip.h to allow the source files shared with Zip
|
||||||
|
(crypt.c, crc32.c, ttyio.c, win32/win32i64.c) to compile for UnZip.
|
||||||
|
(In case you are looking for the Info-ZIP license, please follow
|
||||||
|
the pointers above.) */
|
||||||
|
|
||||||
|
#ifndef __zip_h /* don't include more than once */
|
||||||
|
#define __zip_h
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "third_party/unzip/unzip.h"
|
||||||
|
|
||||||
|
#define local static
|
||||||
|
|
||||||
|
#define ZE_MEM PK_MEM
|
||||||
|
#define ziperr(c, h) return
|
||||||
|
|
||||||
|
#endif /* !__zip_h */
|
2522
third_party/unzip/zipinfo.c
vendored
Normal file
2522
third_party/unzip/zipinfo.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
436
third_party/unzip/zipinfo.txt
vendored
Normal file
436
third_party/unzip/zipinfo.txt
vendored
Normal file
|
@ -0,0 +1,436 @@
|
||||||
|
ZIPINFO(1L) ZIPINFO(1L)
|
||||||
|
|
||||||
|
NAME
|
||||||
|
zipinfo - list detailed information about a ZIP archive
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
zipinfo [-12smlvhMtTz] file[.zip] [file(s) ...] [-x xfile(s) ...]
|
||||||
|
|
||||||
|
unzip -Z [-12smlvhMtTz] file[.zip] [file(s) ...] [-x xfile(s) ...]
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
zipinfo lists technical information about files in a ZIP archive, most
|
||||||
|
commonly found on MS-DOS systems. Such information includes file
|
||||||
|
access permissions, encryption status, type of compression, version and
|
||||||
|
operating system or file system of compressing program, and the like.
|
||||||
|
The default behavior (with no options) is to list single-line entries
|
||||||
|
for each file in the archive, with header and trailer lines providing
|
||||||
|
summary information for the entire archive. The format is a cross
|
||||||
|
between Unix ``ls -l'' and ``unzip -v'' output. See DETAILED DESCRIP-
|
||||||
|
TION below. Note that zipinfo is the same program as unzip (under
|
||||||
|
Unix, a link to it); on some systems, however, zipinfo support may have
|
||||||
|
been omitted when unzip was compiled.
|
||||||
|
|
||||||
|
ARGUMENTS
|
||||||
|
file[.zip]
|
||||||
|
Path of the ZIP archive(s). If the file specification is a
|
||||||
|
wildcard, each matching file is processed in an order determined
|
||||||
|
by the operating system (or file system). Only the filename can
|
||||||
|
be a wildcard; the path itself cannot. Wildcard expressions are
|
||||||
|
similar to Unix egrep(1) (regular) expressions and may contain:
|
||||||
|
|
||||||
|
* matches a sequence of 0 or more characters
|
||||||
|
|
||||||
|
? matches exactly 1 character
|
||||||
|
|
||||||
|
[...] matches any single character found inside the brackets;
|
||||||
|
ranges are specified by a beginning character, a hyphen,
|
||||||
|
and an ending character. If an exclamation point or a
|
||||||
|
caret (`!' or `^') follows the left bracket, then the
|
||||||
|
range of characters within the brackets is complemented
|
||||||
|
(that is, anything except the characters inside the
|
||||||
|
brackets is considered a match). To specify a verbatim
|
||||||
|
left bracket, the three-character sequence ``[[]'' has to
|
||||||
|
be used.
|
||||||
|
|
||||||
|
(Be sure to quote any character that might otherwise be inter-
|
||||||
|
preted or modified by the operating system, particularly under
|
||||||
|
Unix and VMS.) If no matches are found, the specification is
|
||||||
|
assumed to be a literal filename; and if that also fails, the
|
||||||
|
suffix .zip is appended. Note that self-extracting ZIP files
|
||||||
|
are supported, as with any other ZIP archive; just specify the
|
||||||
|
.exe suffix (if any) explicitly.
|
||||||
|
|
||||||
|
[file(s)]
|
||||||
|
An optional list of archive members to be processed, separated
|
||||||
|
by spaces. (VMS versions compiled with VMSCLI defined must
|
||||||
|
delimit files with commas instead.) Regular expressions (wild-
|
||||||
|
cards) may be used to match multiple members; see above. Again,
|
||||||
|
be sure to quote expressions that would otherwise be expanded or
|
||||||
|
modified by the operating system.
|
||||||
|
|
||||||
|
[-x xfile(s)]
|
||||||
|
An optional list of archive members to be excluded from process-
|
||||||
|
ing.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
-1 list filenames only, one per line. This option excludes all
|
||||||
|
others; headers, trailers and zipfile comments are never
|
||||||
|
printed. It is intended for use in Unix shell scripts.
|
||||||
|
|
||||||
|
-2 list filenames only, one per line, but allow headers (-h),
|
||||||
|
trailers (-t) and zipfile comments (-z), as well. This option
|
||||||
|
may be useful in cases where the stored filenames are particu-
|
||||||
|
larly long.
|
||||||
|
|
||||||
|
-s list zipfile info in short Unix ``ls -l'' format. This is the
|
||||||
|
default behavior; see below.
|
||||||
|
|
||||||
|
-m list zipfile info in medium Unix ``ls -l'' format. Identical to
|
||||||
|
the -s output, except that the compression factor, expressed as
|
||||||
|
a percentage, is also listed.
|
||||||
|
|
||||||
|
-l list zipfile info in long Unix ``ls -l'' format. As with -m
|
||||||
|
except that the compressed size (in bytes) is printed instead of
|
||||||
|
the compression ratio.
|
||||||
|
|
||||||
|
-v list zipfile information in verbose, multi-page format.
|
||||||
|
|
||||||
|
-h list header line. The archive name, actual size (in bytes) and
|
||||||
|
total number of files is printed.
|
||||||
|
|
||||||
|
-M pipe all output through an internal pager similar to the Unix
|
||||||
|
more(1) command. At the end of a screenful of output, zipinfo
|
||||||
|
pauses with a ``--More--'' prompt; the next screenful may be
|
||||||
|
viewed by pressing the Enter (Return) key or the space bar.
|
||||||
|
zipinfo can be terminated by pressing the ``q'' key and, on some
|
||||||
|
systems, the Enter/Return key. Unlike Unix more(1), there is no
|
||||||
|
forward-searching or editing capability. Also, zipinfo doesn't
|
||||||
|
notice if long lines wrap at the edge of the screen, effectively
|
||||||
|
resulting in the printing of two or more lines and the likeli-
|
||||||
|
hood that some text will scroll off the top of the screen before
|
||||||
|
being viewed. On some systems the number of available lines on
|
||||||
|
the screen is not detected, in which case zipinfo assumes the
|
||||||
|
height is 24 lines.
|
||||||
|
|
||||||
|
-t list totals for files listed or for all files. The number of
|
||||||
|
files listed, their uncompressed and compressed total sizes ,
|
||||||
|
and their overall compression factor is printed; or, if only the
|
||||||
|
totals line is being printed, the values for the entire archive
|
||||||
|
are given. The compressed total size does not include the 12
|
||||||
|
additional header bytes of each encrypted entry. Note that the
|
||||||
|
total compressed (data) size will never match the actual zipfile
|
||||||
|
size, since the latter includes all of the internal zipfile
|
||||||
|
headers in addition to the compressed data.
|
||||||
|
|
||||||
|
-T print the file dates and times in a sortable decimal format
|
||||||
|
(yymmdd.hhmmss). The default date format is a more standard,
|
||||||
|
human-readable version with abbreviated month names (see exam-
|
||||||
|
ples below).
|
||||||
|
|
||||||
|
-U [UNICODE_SUPPORT only] modify or disable UTF-8 handling. When
|
||||||
|
UNICODE_SUPPORT is available, the option -U forces unzip to
|
||||||
|
escape all non-ASCII characters from UTF-8 coded filenames as
|
||||||
|
``#Uxxxx''. This option is mainly provided for debugging pur-
|
||||||
|
pose when the fairly new UTF-8 support is suspected to mangle up
|
||||||
|
extracted filenames.
|
||||||
|
|
||||||
|
The option -UU allows to entirely disable the recognition of
|
||||||
|
UTF-8 encoded filenames. The handling of filename codings
|
||||||
|
within unzip falls back to the behaviour of previous versions.
|
||||||
|
|
||||||
|
-z include the archive comment (if any) in the listing.
|
||||||
|
|
||||||
|
DETAILED DESCRIPTION
|
||||||
|
zipinfo has a number of modes, and its behavior can be rather difficult
|
||||||
|
to fathom if one isn't familiar with Unix ls(1) (or even if one is).
|
||||||
|
The default behavior is to list files in the following format:
|
||||||
|
|
||||||
|
-rw-rws--- 1.9 unx 2802 t- defX 11-Aug-91 13:48 perms.2660
|
||||||
|
|
||||||
|
The last three fields are the modification date and time of the file,
|
||||||
|
and its name. The case of the filename is respected; thus files that
|
||||||
|
come from MS-DOS PKZIP are always capitalized. If the file was zipped
|
||||||
|
with a stored directory name, that is also displayed as part of the
|
||||||
|
filename.
|
||||||
|
|
||||||
|
The second and third fields indicate that the file was zipped under
|
||||||
|
Unix with version 1.9 of zip. Since it comes from Unix, the file per-
|
||||||
|
missions at the beginning of the line are printed in Unix format. The
|
||||||
|
uncompressed file-size (2802 in this example) is the fourth field.
|
||||||
|
|
||||||
|
The fifth field consists of two characters, either of which may take on
|
||||||
|
several values. The first character may be either `t' or `b', indicat-
|
||||||
|
ing that zip believes the file to be text or binary, respectively; but
|
||||||
|
if the file is encrypted, zipinfo notes this fact by capitalizing the
|
||||||
|
character (`T' or `B'). The second character may also take on four
|
||||||
|
values, depending on whether there is an extended local header and/or
|
||||||
|
an ``extra field'' associated with the file (fully explained in
|
||||||
|
PKWare's APPNOTE.TXT, but basically analogous to pragmas in ANSI
|
||||||
|
C--i.e., they provide a standard way to include non-standard informa-
|
||||||
|
tion in the archive). If neither exists, the character will be a
|
||||||
|
hyphen (`-'); if there is an extended local header but no extra field,
|
||||||
|
`l'; if the reverse, `x'; and if both exist, `X'. Thus the file in
|
||||||
|
this example is (probably) a text file, is not encrypted, and has nei-
|
||||||
|
ther an extra field nor an extended local header associated with it.
|
||||||
|
The example below, on the other hand, is an encrypted binary file with
|
||||||
|
an extra field:
|
||||||
|
|
||||||
|
RWD,R,R 0.9 vms 168 Bx shrk 9-Aug-91 19:15 perms.0644
|
||||||
|
|
||||||
|
Extra fields are used for various purposes (see discussion of the -v
|
||||||
|
option below) including the storage of VMS file attributes, which is
|
||||||
|
presumably the case here. Note that the file attributes are listed in
|
||||||
|
VMS format. Some other possibilities for the host operating system
|
||||||
|
(which is actually a misnomer--host file system is more correct)
|
||||||
|
include OS/2 or NT with High Performance File System (HPFS), MS-DOS,
|
||||||
|
OS/2 or NT with File Allocation Table (FAT) file system, and Macintosh.
|
||||||
|
These are denoted as follows:
|
||||||
|
|
||||||
|
-rw-a-- 1.0 hpf 5358 Tl i4:3 4-Dec-91 11:33 longfilename.hpfs
|
||||||
|
-r--ahs 1.1 fat 4096 b- i4:2 14-Jul-91 12:58 EA DATA. SF
|
||||||
|
--w------- 1.0 mac 17357 bx i8:2 4-May-92 04:02 unzip.macr
|
||||||
|
|
||||||
|
File attributes in the first two cases are indicated in a Unix-like
|
||||||
|
format, where the seven subfields indicate whether the file: (1) is a
|
||||||
|
directory, (2) is readable (always true), (3) is writable, (4) is exe-
|
||||||
|
cutable (guessed on the basis of the extension--.exe, .com, .bat, .cmd
|
||||||
|
and .btm files are assumed to be so), (5) has its archive bit set, (6)
|
||||||
|
is hidden, and (7) is a system file. Interpretation of Macintosh file
|
||||||
|
attributes is unreliable because some Macintosh archivers don't store
|
||||||
|
any attributes in the archive.
|
||||||
|
|
||||||
|
Finally, the sixth field indicates the compression method and possible
|
||||||
|
sub-method used. There are six methods known at present: storing (no
|
||||||
|
compression), reducing, shrinking, imploding, tokenizing (never pub-
|
||||||
|
licly released), and deflating. In addition, there are four levels of
|
||||||
|
reducing (1 through 4); four types of imploding (4K or 8K sliding dic-
|
||||||
|
tionary, and 2 or 3 Shannon-Fano trees); and four levels of deflating
|
||||||
|
(superfast, fast, normal, maximum compression). zipinfo represents
|
||||||
|
these methods and their sub-methods as follows: stor; re:1, re:2,
|
||||||
|
etc.; shrk; i4:2, i8:3, etc.; tokn; and defS, defF, defN, and defX.
|
||||||
|
|
||||||
|
The medium and long listings are almost identical to the short format
|
||||||
|
except that they add information on the file's compression. The medium
|
||||||
|
format lists the file's compression factor as a percentage indicating
|
||||||
|
the amount of space that has been ``removed'':
|
||||||
|
|
||||||
|
-rw-rws--- 1.5 unx 2802 t- 81% defX 11-Aug-91 13:48 perms.2660
|
||||||
|
|
||||||
|
In this example, the file has been compressed by more than a factor of
|
||||||
|
five; the compressed data are only 19% of the original size. The long
|
||||||
|
format gives the compressed file's size in bytes, instead:
|
||||||
|
|
||||||
|
-rw-rws--- 1.5 unx 2802 t- 538 defX 11-Aug-91 13:48 perms.2660
|
||||||
|
|
||||||
|
In contrast to the unzip listings, the compressed size figures in this
|
||||||
|
listing format denote the complete size of compressed data, including
|
||||||
|
the 12 extra header bytes in case of encrypted entries.
|
||||||
|
|
||||||
|
Adding the -T option changes the file date and time to decimal format:
|
||||||
|
|
||||||
|
-rw-rws--- 1.5 unx 2802 t- 538 defX 910811.134804 perms.2660
|
||||||
|
|
||||||
|
Note that because of limitations in the MS-DOS format used to store
|
||||||
|
file times, the seconds field is always rounded to the nearest even
|
||||||
|
second. For Unix files this is expected to change in the next major
|
||||||
|
releases of zip(1L) and unzip.
|
||||||
|
|
||||||
|
In addition to individual file information, a default zipfile listing
|
||||||
|
also includes header and trailer lines:
|
||||||
|
|
||||||
|
Archive: OS2.zip 5453 bytes 5 files
|
||||||
|
,,rw, 1.0 hpf 730 b- i4:3 26-Jun-92 23:40 Contents
|
||||||
|
,,rw, 1.0 hpf 3710 b- i4:3 26-Jun-92 23:33 makefile.os2
|
||||||
|
,,rw, 1.0 hpf 8753 b- i8:3 26-Jun-92 15:29 os2unzip.c
|
||||||
|
,,rw, 1.0 hpf 98 b- stor 21-Aug-91 15:34 unzip.def
|
||||||
|
,,rw, 1.0 hpf 95 b- stor 21-Aug-91 17:51 zipinfo.def
|
||||||
|
5 files, 13386 bytes uncompressed, 4951 bytes compressed: 63.0%
|
||||||
|
|
||||||
|
The header line gives the name of the archive, its total size, and the
|
||||||
|
total number of files; the trailer gives the number of files listed,
|
||||||
|
their total uncompressed size, and their total compressed size (not
|
||||||
|
including any of zip's internal overhead). If, however, one or more
|
||||||
|
file(s) are provided, the header and trailer lines are not listed.
|
||||||
|
This behavior is also similar to that of Unix's ``ls -l''; it may be
|
||||||
|
overridden by specifying the -h and -t options explicitly. In such a
|
||||||
|
case the listing format must also be specified explicitly, since -h or
|
||||||
|
-t (or both) in the absence of other options implies that ONLY the
|
||||||
|
header or trailer line (or both) is listed. See the EXAMPLES section
|
||||||
|
below for a semi-intelligible translation of this nonsense.
|
||||||
|
|
||||||
|
The verbose listing is mostly self-explanatory. It also lists file
|
||||||
|
comments and the zipfile comment, if any, and the type and number of
|
||||||
|
bytes in any stored extra fields. Currently known types of extra
|
||||||
|
fields include PKWARE's authentication (``AV'') info; OS/2 extended
|
||||||
|
attributes; VMS filesystem info, both PKWARE and Info-ZIP versions;
|
||||||
|
Macintosh resource forks; Acorn/Archimedes SparkFS info; and so on.
|
||||||
|
(Note that in the case of OS/2 extended attributes--perhaps the most
|
||||||
|
common use of zipfile extra fields--the size of the stored EAs as
|
||||||
|
reported by zipinfo may not match the number given by OS/2's dir com-
|
||||||
|
mand: OS/2 always reports the number of bytes required in 16-bit for-
|
||||||
|
mat, whereas zipinfo always reports the 32-bit storage.)
|
||||||
|
|
||||||
|
Again, the compressed size figures of the individual entries include
|
||||||
|
the 12 extra header bytes for encrypted entries. In contrast, the
|
||||||
|
archive total compressed size and the average compression ratio shown
|
||||||
|
in the summary bottom line are calculated without the extra 12 header
|
||||||
|
bytes of encrypted entries.
|
||||||
|
|
||||||
|
ENVIRONMENT OPTIONS
|
||||||
|
Modifying zipinfo's default behavior via options placed in an environ-
|
||||||
|
ment variable can be a bit complicated to explain, due to zipinfo's
|
||||||
|
attempts to handle various defaults in an intuitive, yet Unix-like,
|
||||||
|
manner. (Try not to laugh.) Nevertheless, there is some underlying
|
||||||
|
logic. In brief, there are three ``priority levels'' of options: the
|
||||||
|
default options; environment options, which can override or add to the
|
||||||
|
defaults; and explicit options given by the user, which can override or
|
||||||
|
add to either of the above.
|
||||||
|
|
||||||
|
The default listing format, as noted above, corresponds roughly to the
|
||||||
|
"zipinfo -hst" command (except when individual zipfile members are
|
||||||
|
specified). A user who prefers the long-listing format (-l) can make
|
||||||
|
use of the zipinfo's environment variable to change this default:
|
||||||
|
|
||||||
|
Unix Bourne shell:
|
||||||
|
ZIPINFO=-l; export ZIPINFO
|
||||||
|
|
||||||
|
Unix C shell:
|
||||||
|
setenv ZIPINFO -l
|
||||||
|
|
||||||
|
OS/2 or MS-DOS:
|
||||||
|
set ZIPINFO=-l
|
||||||
|
|
||||||
|
VMS (quotes for lowercase):
|
||||||
|
define ZIPINFO_OPTS "-l"
|
||||||
|
|
||||||
|
If, in addition, the user dislikes the trailer line, zipinfo's concept
|
||||||
|
of ``negative options'' may be used to override the default inclusion
|
||||||
|
of the line. This is accomplished by preceding the undesired option
|
||||||
|
with one or more minuses: e.g., ``-l-t'' or ``--tl'', in this example.
|
||||||
|
The first hyphen is the regular switch character, but the one before
|
||||||
|
the `t' is a minus sign. The dual use of hyphens may seem a little
|
||||||
|
awkward, but it's reasonably intuitive nonetheless: simply ignore the
|
||||||
|
first hyphen and go from there. It is also consistent with the behav-
|
||||||
|
ior of the Unix command nice(1).
|
||||||
|
|
||||||
|
As suggested above, the default variable names are ZIPINFO_OPTS for VMS
|
||||||
|
(where the symbol used to install zipinfo as a foreign command would
|
||||||
|
otherwise be confused with the environment variable), and ZIPINFO for
|
||||||
|
all other operating systems. For compatibility with zip(1L), ZIPIN-
|
||||||
|
FOOPT is also accepted (don't ask). If both ZIPINFO and ZIPINFOOPT are
|
||||||
|
defined, however, ZIPINFO takes precedence. unzip's diagnostic option
|
||||||
|
(-v with no zipfile name) can be used to check the values of all four
|
||||||
|
possible unzip and zipinfo environment variables.
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
To get a basic, short-format listing of the complete contents of a ZIP
|
||||||
|
archive storage.zip, with both header and totals lines, use only the
|
||||||
|
archive name as an argument to zipinfo:
|
||||||
|
|
||||||
|
zipinfo storage
|
||||||
|
|
||||||
|
To produce a basic, long-format listing (not verbose), including header
|
||||||
|
and totals lines, use -l:
|
||||||
|
|
||||||
|
zipinfo -l storage
|
||||||
|
|
||||||
|
To list the complete contents of the archive without header and totals
|
||||||
|
lines, either negate the -h and -t options or else specify the contents
|
||||||
|
explicitly:
|
||||||
|
|
||||||
|
zipinfo --h-t storage
|
||||||
|
zipinfo storage \*
|
||||||
|
|
||||||
|
(where the backslash is required only if the shell would otherwise
|
||||||
|
expand the `*' wildcard, as in Unix when globbing is turned on--double
|
||||||
|
quotes around the asterisk would have worked as well). To turn off the
|
||||||
|
totals line by default, use the environment variable (C shell is
|
||||||
|
assumed here):
|
||||||
|
|
||||||
|
setenv ZIPINFO --t
|
||||||
|
zipinfo storage
|
||||||
|
|
||||||
|
To get the full, short-format listing of the first example again, given
|
||||||
|
that the environment variable is set as in the previous example, it is
|
||||||
|
necessary to specify the -s option explicitly, since the -t option by
|
||||||
|
itself implies that ONLY the footer line is to be printed:
|
||||||
|
|
||||||
|
setenv ZIPINFO --t
|
||||||
|
zipinfo -t storage [only totals line]
|
||||||
|
zipinfo -st storage [full listing]
|
||||||
|
|
||||||
|
The -s option, like -m and -l, includes headers and footers by default,
|
||||||
|
unless otherwise specified. Since the environment variable specified
|
||||||
|
no footers and that has a higher precedence than the default behavior
|
||||||
|
of -s, an explicit -t option was necessary to produce the full listing.
|
||||||
|
Nothing was indicated about the header, however, so the -s option was
|
||||||
|
sufficient. Note that both the -h and -t options, when used by them-
|
||||||
|
selves or with each other, override any default listing of member
|
||||||
|
files; only the header and/or footer are printed. This behavior is
|
||||||
|
useful when zipinfo is used with a wildcard zipfile specification; the
|
||||||
|
contents of all zipfiles are then summarized with a single command.
|
||||||
|
|
||||||
|
To list information on a single file within the archive, in medium for-
|
||||||
|
mat, specify the filename explicitly:
|
||||||
|
|
||||||
|
zipinfo -m storage unshrink.c
|
||||||
|
|
||||||
|
The specification of any member file, as in this example, will override
|
||||||
|
the default header and totals lines; only the single line of informa-
|
||||||
|
tion about the requested file will be printed. This is intuitively
|
||||||
|
what one would expect when requesting information about a single file.
|
||||||
|
For multiple files, it is often useful to know the total compressed and
|
||||||
|
uncompressed size; in such cases -t may be specified explicitly:
|
||||||
|
|
||||||
|
zipinfo -mt storage "*.[ch]" Mak\*
|
||||||
|
|
||||||
|
To get maximal information about the ZIP archive, use the verbose
|
||||||
|
option. It is usually wise to pipe the output into a filter such as
|
||||||
|
Unix more(1) if the operating system allows it:
|
||||||
|
|
||||||
|
zipinfo -v storage | more
|
||||||
|
|
||||||
|
Finally, to see the most recently modified files in the archive, use
|
||||||
|
the -T option in conjunction with an external sorting utility such as
|
||||||
|
Unix sort(1) (and sed(1) as well, in this example):
|
||||||
|
|
||||||
|
zipinfo -T storage | sort -nr -k 7 | sed 15q
|
||||||
|
|
||||||
|
The -nr option to sort(1) tells it to sort numerically in reverse order
|
||||||
|
rather than in textual order, and the -k 7 option tells it to sort on
|
||||||
|
the seventh field. This assumes the default short-listing format; if
|
||||||
|
-m or -l is used, the proper sort(1) option would be -k 8. Older ver-
|
||||||
|
sions of sort(1) do not support the -k option, but you can use the
|
||||||
|
traditional + option instead, e.g., +6 instead of -k 7. The sed(1)
|
||||||
|
command filters out all but the first 15 lines of the listing. Future
|
||||||
|
releases of zipinfo may incorporate date/time and filename sorting as
|
||||||
|
built-in options.
|
||||||
|
|
||||||
|
TIPS
|
||||||
|
The author finds it convenient to define an alias ii for zipinfo on
|
||||||
|
systems that allow aliases (or, on other systems, copy/rename the exe-
|
||||||
|
cutable, create a link or create a command file with the name ii). The
|
||||||
|
ii usage parallels the common ll alias for long listings in Unix, and
|
||||||
|
the similarity between the outputs of the two commands was intentional.
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
As with unzip, zipinfo's -M (``more'') option is overly simplistic in
|
||||||
|
its handling of screen output; as noted above, it fails to detect the
|
||||||
|
wrapping of long lines and may thereby cause lines at the top of the
|
||||||
|
screen to be scrolled off before being read. zipinfo should detect and
|
||||||
|
treat each occurrence of line-wrap as one additional line printed.
|
||||||
|
This requires knowledge of the screen's width as well as its height.
|
||||||
|
In addition, zipinfo should detect the true screen geometry on all sys-
|
||||||
|
tems.
|
||||||
|
|
||||||
|
zipinfo's listing-format behavior is unnecessarily complex and should
|
||||||
|
be simplified. (This is not to say that it will be.)
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
ls(1), funzip(1L), unzip(1L), unzipsfx(1L), zip(1L), zipcloak(1L), zip-
|
||||||
|
note(1L), zipsplit(1L)
|
||||||
|
|
||||||
|
URL
|
||||||
|
The Info-ZIP home page is currently at
|
||||||
|
http://www.info-zip.org/pub/infozip/
|
||||||
|
or
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/ .
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
Greg ``Cave Newt'' Roelofs. ZipInfo contains pattern-matching code by
|
||||||
|
Mark Adler and fixes/improvements by many others. Please refer to the
|
||||||
|
CONTRIBS file in the UnZip source distribution for a more complete
|
||||||
|
list.
|
||||||
|
|
||||||
|
Info-ZIP 20 April 2009 (v3.0) ZIPINFO(1L)
|
2
third_party/zip/zip.mk
vendored
2
third_party/zip/zip.mk
vendored
|
@ -5,7 +5,7 @@ PKGS += THIRD_PARTY_ZIP
|
||||||
|
|
||||||
THIRD_PARTY_ZIP_FILES := $(wildcard third_party/zip/*)
|
THIRD_PARTY_ZIP_FILES := $(wildcard third_party/zip/*)
|
||||||
THIRD_PARTY_ZIP_SRCS = $(filter %.c,$(THIRD_PARTY_ZIP_FILES))
|
THIRD_PARTY_ZIP_SRCS = $(filter %.c,$(THIRD_PARTY_ZIP_FILES))
|
||||||
THIRD_PARTY_ZIP_HDRS = $(filter %.h,$(THIRD_PARTY_ZIP_FILES))
|
#THIRD_PARTY_ZIP_HDRS = $(filter %.h,$(THIRD_PARTY_ZIP_FILES))
|
||||||
THIRD_PARTY_ZIP_INCS = $(filter %.inc,$(THIRD_PARTY_ZIP_FILES))
|
THIRD_PARTY_ZIP_INCS = $(filter %.inc,$(THIRD_PARTY_ZIP_FILES))
|
||||||
|
|
||||||
THIRD_PARTY_ZIP_COMS = \
|
THIRD_PARTY_ZIP_COMS = \
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "libc/calls/struct/stat.h"
|
#include "libc/calls/struct/stat.h"
|
||||||
#include "libc/fmt/fmt.h"
|
#include "libc/fmt/fmt.h"
|
||||||
#include "libc/log/log.h"
|
#include "libc/log/log.h"
|
||||||
|
#include "libc/macros.internal.h"
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
#include "libc/sysv/consts/exit.h"
|
#include "libc/sysv/consts/exit.h"
|
||||||
#include "libc/sysv/consts/fileno.h"
|
#include "libc/sysv/consts/fileno.h"
|
||||||
|
|
Loading…
Reference in a new issue