mirror of
https://github.com/darlinghq/darling-zip.git
synced 2024-11-23 11:59:40 +00:00
zip-15
This commit is contained in:
commit
1e61b20f59
50
Makefile
Normal file
50
Makefile
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
##
|
||||||
|
# Top-level wrapper Makefile for zip and unzip tools
|
||||||
|
##
|
||||||
|
|
||||||
|
PROJECT=zip
|
||||||
|
COMPONENTS=zip unzip
|
||||||
|
|
||||||
|
SRCROOT=$(shell pwd)
|
||||||
|
OBJROOT?=/tmp/$(PROJECT).obj
|
||||||
|
SYMROOT?=/tmp/$(PROJECT).sym
|
||||||
|
DSTROOT?=/tmp/$(PROJECT).dst
|
||||||
|
|
||||||
|
OSVERSIONS = /usr/local/OpenSourceVersions
|
||||||
|
|
||||||
|
.PHONY: installsrc install clean installhdrs builddirs
|
||||||
|
|
||||||
|
ifndef CoreOSMakefiles
|
||||||
|
CoreOSMakefiles = $(MAKEFILEPATH)/CoreOS
|
||||||
|
endif
|
||||||
|
|
||||||
|
include $(CoreOSMakefiles)/Standard/Standard.make
|
||||||
|
|
||||||
|
all: install
|
||||||
|
|
||||||
|
installsrc:
|
||||||
|
$(MKDIR) $(SRCROOT)
|
||||||
|
$(PAX) -rw . $(SRCROOT)
|
||||||
|
|
||||||
|
install installhdrs:: $(OBJROOT) $(SYMROOT) $(DSTROOT)
|
||||||
|
install:: builddirs ossinfo
|
||||||
|
|
||||||
|
install clean installhdrs::
|
||||||
|
for proj in $(COMPONENTS) ; do \
|
||||||
|
( cd $${proj} && $(MAKE) $@ $(MAKEFLAGS) SRCROOT=$(SRCROOT)/$${proj} \
|
||||||
|
OBJROOT=$(OBJROOT)/$${proj} SYMROOT=$(SYMROOT)/$${proj} \
|
||||||
|
DSTROOT=$(DSTROOT) ) || exit 1; \
|
||||||
|
done
|
||||||
|
|
||||||
|
$(OBJROOT) $(SYMROOT) $(DSTROOT):
|
||||||
|
$(_v) $(MKDIR) $@
|
||||||
|
|
||||||
|
builddirs: $(OBJROOT) $(SYMROOT)
|
||||||
|
for proj in $(COMPONENTS) ; do \
|
||||||
|
$(MKDIR) $(OBJROOT)/$${proj}; \
|
||||||
|
$(MKDIR) $(SYMROOT)/$${proj}; \
|
||||||
|
done
|
||||||
|
|
||||||
|
ossinfo: builddirs
|
||||||
|
$(MKDIR) $(DSTROOT)/$(OSVERSIONS)
|
||||||
|
$(INSTALL_FILE) $(SRCROOT)/$(PROJECT).plist $(DSTROOT)/$(OSVERSIONS)/$(PROJECT).plist
|
19
README
Normal file
19
README
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
This is the "zip" project, which comprises both zip(1) and unzip(1),
|
||||||
|
and associated tools. The canonical home page for these tools are:
|
||||||
|
|
||||||
|
Zip: <http://www.info-zip.org/Zip.html>
|
||||||
|
UnZip: <http://www.info-zip.org/UnZip.html>
|
||||||
|
|
||||||
|
Currently, this project tracks:
|
||||||
|
Zip 2.32 (released 20 June 2005)
|
||||||
|
UnZip 5.52 (released 27 February 2005)
|
||||||
|
|
||||||
|
Imports should commit the new tarball, and change the makefiles
|
||||||
|
as appropriate.
|
||||||
|
|
||||||
|
Local modifications should be implemented as patches applied during build.
|
||||||
|
|
||||||
|
|
||||||
|
Shantonu Sen
|
||||||
|
ssen@apple.com
|
||||||
|
October 5, 2006
|
55
unzip/Makefile
Normal file
55
unzip/Makefile
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
PROJECT = unzip
|
||||||
|
VERSION = 5.52
|
||||||
|
DISTFILE = $(PROJECT)$(shell echo $(VERSION) | tr -d '.').tar.gz
|
||||||
|
|
||||||
|
OSLICENSES = /usr/local/OpenSourceLicenses
|
||||||
|
PATCHFILES = patch-unix_unix.c patch-quarantine patch-CVE-2008-0888 \
|
||||||
|
unzip-6.0_overflow2.diff patch-list.c
|
||||||
|
|
||||||
|
SRCROOT ?= $(shell pwd)
|
||||||
|
OBJROOT ?= $(SRCROOT)/obj
|
||||||
|
SYMROOT ?= $(SRCROOT)/sym
|
||||||
|
DSTROOT ?= $(SRCROOT)/dst
|
||||||
|
|
||||||
|
ifndef CoreOSMakefiles
|
||||||
|
CoreOSMakefiles = $(MAKEFILEPATH)/CoreOS
|
||||||
|
endif
|
||||||
|
|
||||||
|
include $(MAKEFILEPATH)/CoreOS/Standard/Standard.make
|
||||||
|
|
||||||
|
all: install
|
||||||
|
|
||||||
|
installhdrs:
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(SYMROOT) $(OBJROOT)
|
||||||
|
|
||||||
|
install: destroot symbols ossinfo
|
||||||
|
|
||||||
|
installsrc:
|
||||||
|
pax -rw . $(SRCROOT)
|
||||||
|
|
||||||
|
destroot: patchsrc unpacksrc
|
||||||
|
$(MAKE) -C $(OBJROOT)/$(PROJECT)-$(VERSION) \
|
||||||
|
-f unix/Makefile macosx install \
|
||||||
|
prefix=$(DSTROOT)/usr \
|
||||||
|
MANDIR=$(DSTROOT)/usr/share/man/'man$$(manext)' \
|
||||||
|
LOC="$(CFLAGS) $(RC_CFLAGS)" LD="$(CC) $(RC_CFLAGS)" \
|
||||||
|
CC="$(CC)" INSTALL="$(INSTALL)" DESTDIR=$(DSTROOT) STRIP="echo"
|
||||||
|
|
||||||
|
symbols:
|
||||||
|
$(CP) $(OBJROOT)/$(PROJECT)-$(VERSION)/unzip $(SYMROOT)
|
||||||
|
$(DSYMUTIL) $(SYMROOT)/unzip
|
||||||
|
|
||||||
|
ossinfo: unpacksrc
|
||||||
|
$(MKDIR) $(DSTROOT)/$(OSLICENSES)
|
||||||
|
$(INSTALL_FILE) $(OBJROOT)/$(PROJECT)-$(VERSION)/LICENSE $(DSTROOT)/$(OSLICENSES)/$(PROJECT).txt
|
||||||
|
|
||||||
|
unpacksrc:
|
||||||
|
mkdir -p $(OBJROOT)
|
||||||
|
tar zxvf $(SRCROOT)/$(DISTFILE) -C $(OBJROOT)
|
||||||
|
|
||||||
|
patchsrc: unpacksrc
|
||||||
|
for p in $(PATCHFILES); do \
|
||||||
|
patch -d $(OBJROOT)/$(PROJECT)-$(VERSION) -f -p0 --posix < $(SRCROOT)/$${p} || exit 1; \
|
||||||
|
done
|
42
unzip/patch-CVE-2008-0888
Normal file
42
unzip/patch-CVE-2008-0888
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
diff -up inflate.c.pom inflate.c
|
||||||
|
--- inflate.c.pom 2005-02-27 07:08:46.000000000 +0100
|
||||||
|
+++ inflate.c 2008-03-19 14:47:58.000000000 +0100
|
||||||
|
@@ -983,6 +983,7 @@ static int inflate_dynamic(__G)
|
||||||
|
unsigned l; /* last length */
|
||||||
|
unsigned m; /* mask for bit lengths table */
|
||||||
|
unsigned n; /* number of lengths to get */
|
||||||
|
+ struct huft *tlp;
|
||||||
|
struct huft *tl; /* literal/length code table */
|
||||||
|
struct huft *td; /* distance code table */
|
||||||
|
unsigned bl; /* lookup bits for tl */
|
||||||
|
@@ -995,6 +996,7 @@ static int inflate_dynamic(__G)
|
||||||
|
register unsigned k; /* number of bits in bit buffer */
|
||||||
|
int retval = 0; /* error code returned: initialized to "no error" */
|
||||||
|
|
||||||
|
+ td = tlp = tl = (struct huft *)NULL;
|
||||||
|
|
||||||
|
/* make local bit buffer */
|
||||||
|
Trace((stderr, "\ndynamic block"));
|
||||||
|
@@ -1047,9 +1049,9 @@ static int inflate_dynamic(__G)
|
||||||
|
while (i < n)
|
||||||
|
{
|
||||||
|
NEEDBITS(bl)
|
||||||
|
- j = (td = tl + ((unsigned)b & m))->b;
|
||||||
|
+ j = (tlp = tl + ((unsigned)b & m))->b;
|
||||||
|
DUMPBITS(j)
|
||||||
|
- j = td->v.n;
|
||||||
|
+ j = tlp->v.n;
|
||||||
|
if (j < 16) /* length of code in bits (0..15) */
|
||||||
|
ll[i++] = l = j; /* save last length in l */
|
||||||
|
else if (j == 16) /* repeat last length 3 to 6 times */
|
||||||
|
@@ -1149,8 +1151,8 @@ static int inflate_dynamic(__G)
|
||||||
|
|
||||||
|
cleanup_and_exit:
|
||||||
|
/* free the decoding tables, return */
|
||||||
|
- huft_free(tl);
|
||||||
|
- huft_free(td);
|
||||||
|
+ if (tl) huft_free(tl);
|
||||||
|
+ if (td) huft_free(td);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
11
unzip/patch-list.c
Normal file
11
unzip/patch-list.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- list.c 2014-11-17 19:09:21.000000000 -0800
|
||||||
|
+++ list.c 2014-11-17 19:08:51.000000000 -0800
|
||||||
|
@@ -327,7 +327,7 @@ int list_files(__G) /* return PK-type
|
||||||
|
if (methnum == DEFLATED || methnum == ENHDEFLATED) {
|
||||||
|
methbuf[5] = dtype[(G.crec.general_purpose_bit_flag>>1) & 3];
|
||||||
|
} else if (methnum >= NUM_METHODS) {
|
||||||
|
- sprintf(&methbuf[4], "%03u", G.crec.compression_method);
|
||||||
|
+ snprintf(&methbuf[4], sizeof(methbuf)-4, "%03u", G.crec.compression_method);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 /* GRR/Euro: add this? */
|
70
unzip/patch-quarantine
Normal file
70
unzip/patch-quarantine
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
diff -ru unzip-5.52/unix/unix.c unzip-5.52.new/unix/unix.c
|
||||||
|
--- unix/unix.c.orig 2005-02-26 11:43:42.000000000 -0800
|
||||||
|
+++ unix/unix.c 2012-06-30 00:09:07.000000000 -0700
|
||||||
|
@@ -71,6 +71,8 @@
|
||||||
|
# endif
|
||||||
|
#endif /* ?DIRENT */
|
||||||
|
|
||||||
|
+#include <quarantine.h>
|
||||||
|
+
|
||||||
|
#ifdef SET_DIR_ATTRIB
|
||||||
|
typedef struct uxdirattr { /* struct for holding unix style directory */
|
||||||
|
struct uxdirattr *next; /* info until can be sorted and set at end */
|
||||||
|
@@ -685,6 +687,23 @@
|
||||||
|
/* Function checkdir() */
|
||||||
|
/***********************/
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+mkdir_qtn(int zipfd, const char *path, int mode)
|
||||||
|
+{
|
||||||
|
+ int r = mkdir(path, mode);
|
||||||
|
+
|
||||||
|
+ if (r != 0 && errno != EEXIST)
|
||||||
|
+ return r;
|
||||||
|
+
|
||||||
|
+ qtn_file_t qf = qtn_file_alloc();
|
||||||
|
+ if (qf != NULL) {
|
||||||
|
+ if (qtn_file_init_with_fd(qf, zipfd) == 0) {
|
||||||
|
+ (void)qtn_file_apply_to_path(qf, path);
|
||||||
|
+ }
|
||||||
|
+ qtn_file_free(qf);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int checkdir(__G__ pathcomp, flag)
|
||||||
|
__GDEF
|
||||||
|
char *pathcomp;
|
||||||
|
@@ -751,7 +770,7 @@
|
||||||
|
/* no room for filenames: fatal */
|
||||||
|
return MPN_ERR_TOOLONG;
|
||||||
|
}
|
||||||
|
- if (mkdir(G.buildpath, 0777) == -1) { /* create the directory */
|
||||||
|
+ if (mkdir_qtn(G.zipfd, G.buildpath, 0777) == -1) { /* create the directory */
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: cannot create %s\n\
|
||||||
|
unable to process %s.\n",
|
||||||
|
@@ -897,7 +916,7 @@
|
||||||
|
}
|
||||||
|
/* create the directory (could add loop here scanning tmproot
|
||||||
|
* to create more than one level, but why really necessary?) */
|
||||||
|
- if (mkdir(tmproot, 0777) == -1) {
|
||||||
|
+ if (mkdir_qtn(G.zipfd, tmproot, 0777) == -1) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir: cannot create extraction directory: %s\n",
|
||||||
|
FnFilter1(tmproot)));
|
||||||
|
@@ -1042,6 +1061,14 @@
|
||||||
|
ush z_uidgid[2];
|
||||||
|
int have_uidgid_flg;
|
||||||
|
|
||||||
|
+ qtn_file_t qf = qtn_file_alloc();
|
||||||
|
+ if (qf != NULL) {
|
||||||
|
+ if (qtn_file_init_with_fd(qf, G.zipfd) == 0) {
|
||||||
|
+ (void)qtn_file_apply_to_fd(qf, fileno(G.outfile));
|
||||||
|
+ }
|
||||||
|
+ qtn_file_free(qf);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
fclose(G.outfile);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Only in unzip-5.52.new/unix: unix.c.orig
|
36
unzip/patch-unix_unix.c
Normal file
36
unzip/patch-unix_unix.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
--- unix/unix.c.orig Sat Feb 26 16:43:42 2005
|
||||||
|
+++ unix/unix.c Fri Sep 9 14:36:35 2005
|
||||||
|
@@ -1042,6 +1042,16 @@
|
||||||
|
ush z_uidgid[2];
|
||||||
|
int have_uidgid_flg;
|
||||||
|
|
||||||
|
+/*---------------------------------------------------------------------------
|
||||||
|
+ Change the file permissions from default ones to those stored in the
|
||||||
|
+ zipfile.
|
||||||
|
+ ---------------------------------------------------------------------------*/
|
||||||
|
+
|
||||||
|
+#ifndef NO_CHMOD
|
||||||
|
+ if (fchmod(fileno(G.outfile), 0xffff & G.pInfo->file_attr))
|
||||||
|
+ perror("chmod (file attributes) error");
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
fclose(G.outfile);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
@@ -1150,16 +1160,6 @@
|
||||||
|
" (warning) cannot set times"));
|
||||||
|
#endif /* ?AOS_VS */
|
||||||
|
}
|
||||||
|
-
|
||||||
|
-/*---------------------------------------------------------------------------
|
||||||
|
- Change the file permissions from default ones to those stored in the
|
||||||
|
- zipfile.
|
||||||
|
- ---------------------------------------------------------------------------*/
|
||||||
|
-
|
||||||
|
-#ifndef NO_CHMOD
|
||||||
|
- if (chmod(G.filename, filtattr(__G__ G.pInfo->file_attr)))
|
||||||
|
- perror("chmod (file attributes) error");
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
} /* end function close_outfile() */
|
||||||
|
|
80
unzip/unzip-5.52/BUGS
Normal file
80
unzip/unzip-5.52/BUGS
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
Bogus bugs (not our fault!):
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
By far THE BIGGEST source of bug reports to Info-ZIP/zip-bugs is the
|
||||||
|
incorrect transfer of zipfiles (or of the UnZip executable itself).
|
||||||
|
ALWAYS TRANSFER IN BINARY MODE! This includes ftp transfers and *both*
|
||||||
|
ends of a Kermit connection ("set file type binary"). If your copy
|
||||||
|
isn't exactly the same size as the original, you made a mistake.
|
||||||
|
|
||||||
|
Another common source of errors such as "compression method 8 not sup-
|
||||||
|
ported" is the existence of an old version of UnZip somewhere in your
|
||||||
|
path. Make sure you're using the version you think you're using; give
|
||||||
|
the full path explicitly if necessary. Executing "unzip" without any
|
||||||
|
options will print a help screen, at the top of which is the UnZip
|
||||||
|
version number and release date; and executing "unzip -v" without any
|
||||||
|
zipfile or other options will give information about what compiler was
|
||||||
|
used, the target operating system, any special UnZip options, and the
|
||||||
|
date of compilation--only for version 5.11 and later, though! (Also,
|
||||||
|
under Unix C shell and some Bourne shells, "which unzip" will print
|
||||||
|
the path of the unzip you're actually using. Under OS/2 and MS-DOS,
|
||||||
|
whch21gr.zip [on Simtel mirror sites] will do the same thing; in addi-
|
||||||
|
tion, "which -a unzip" will show *all* copies of "unzip" in your path.)
|
||||||
|
|
||||||
|
|
||||||
|
Bugs (real and/or imagined):
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
- [OS/2 DLL] when trying to use the REXX function UzUnZipToStem to extract a
|
||||||
|
file with `&' in its name, the DLL crashes (but UzUnZipToVar still works)
|
||||||
|
[Daniel H, 961215]
|
||||||
|
- UnZip has problems with archives bigger than 2GB; it may print "note: didn't
|
||||||
|
find end-of-central-dir signature at end of central dir" (harmless) or
|
||||||
|
may not be able to seek to member files [James Lemley 970107, Iris Spaniol
|
||||||
|
970206, ...]
|
||||||
|
|
||||||
|
- fix overwrite behavior: hidden/system problems?; etc.
|
||||||
|
- 32-bit DOS UnZip still unable to set volume labels?
|
||||||
|
- 32-bit DOS UnZip under OS/2 doesn't extract all wildcard zipfiles?
|
||||||
|
[DOS box: unzip386 (ver 5.12) x:\32bit\unix\emx09a\*.zip, Hobbes 3/95]
|
||||||
|
- 32-bit DOS UnZip under OS/2 doesn't set timestamp when overwriting files
|
||||||
|
on HPFS partition? (go32 and pmode/w both; emx/rsx OK) [Eberhard Mattes
|
||||||
|
950726]
|
||||||
|
- USE_FWRITE still causes occasional CRC errors when extracting on Pyramid?
|
||||||
|
[Kevin Fritz 931102]
|
||||||
|
- still NT/W95 bug with "unzip -v d:*.zip" not matching properly? [Steve S
|
||||||
|
940527]
|
||||||
|
980427: bug no longer exists, Opendir() must have been corrected by someone
|
||||||
|
|
||||||
|
- when ^Z received in no-echo mode, echo is not restored (works OK if
|
||||||
|
resume, however)
|
||||||
|
- signal() handler disabled after first use with one of BSD/SysV?
|
||||||
|
- MKS Korn shell: unzip assumes the MKS-style command-line environment
|
||||||
|
options are relevant to it, but this is not the case if unzip was called
|
||||||
|
by another program (e.g., from a .BAT file). A fix for this exists for
|
||||||
|
Borland compilers but not for MSC, Watcom, djgpp, etc.
|
||||||
|
- OS/2: for paths with one long component, the .LONGNAME EA may be saved for
|
||||||
|
all components (waste of disk space): how to check??
|
||||||
|
- VMS: for extracting to other directories, only the VMS-style "-d [.foo]"
|
||||||
|
format is accepted; "-d foo" should also be allowed. Long filenames are
|
||||||
|
not automatically truncated to 39.39.
|
||||||
|
- Novell Netware: Netware drives may clear the archive bit on extracted
|
||||||
|
files under OS/2 and/or MS-DOS. UnZip always *tries* to set the archive
|
||||||
|
bit, however. [pynq@uchicago, 940527]
|
||||||
|
- DEC Ultrix: on long zipfiles, unzip will sometimes fail (bad CRC, not always
|
||||||
|
reproducible); this is apparently due either to a hardware bug (cache mem)
|
||||||
|
or OS bug (page faults?) [Igor, Jean-loup, bottom of BUGS.long]
|
||||||
|
- funzip/more/decryption/no-echo bug: race condition(?) causes terminal to
|
||||||
|
be "reset" to no-echo state
|
||||||
|
- Macintosh (100200), Atari (020000) external file attributes not interpreted
|
||||||
|
correctly (both unzip and zipinfo)
|
||||||
|
- pkbug error: zipfile with incorrect csize and/or ucsize--check for end of
|
||||||
|
compressed (csize) data in uncompression routines:
|
||||||
|
unreduce.c: while (((outpos + outcnt) < ucsize) && (!zipeof)) {
|
||||||
|
[James Birdsall, Mark, bottom of BUGS.long]
|
||||||
|
- OS/2: directory EAs not restored if directory exists [Kai Uwe, KG27515@uark]
|
||||||
|
(subsequent note: no way to determine which EAs are newer ==> cannot
|
||||||
|
restore without user input)
|
||||||
|
(update: as of UnZip 5.30, option -o forces restoring of directory EAs)
|
||||||
|
- MS-DOS: Borland executables don't allow other than 80-column, 25/43/50-line
|
||||||
|
screen modes (Borland bug) [Michael Stillwell]
|
212
unzip/unzip-5.52/COPYING.OLD
Normal file
212
unzip/unzip-5.52/COPYING.OLD
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
This is the Info-ZIP file COPYING (for UnZip), last updated 17 Jul 2000.
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
FIRST NOTE:
|
||||||
|
This file contains some details about the copyright history of
|
||||||
|
contributions to the UnZip project.
|
||||||
|
Additionally, it summarises some exceptions to the general BSD-like
|
||||||
|
copyright found in LICENSE that covers our generic code and most of
|
||||||
|
the system specific ports.
|
||||||
|
Please read LICENSE first to find out what is allowed to do with
|
||||||
|
Info-ZIP's UnZip code.
|
||||||
|
|
||||||
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
There are currently two explicit copyrights on portions of UnZip
|
||||||
|
code (at least, of which Info-ZIP is aware):
|
||||||
|
Jim Luther's Mac OS File Manager interface code; and Christopher Evans'
|
||||||
|
MacBinaryIII coding code (for the MacOS port).. These copyrights
|
||||||
|
are discussed in more detail below.
|
||||||
|
|
||||||
|
All remaining code is now (starting with UnZip version 5.41) covered
|
||||||
|
by the new Info-ZIP license. For details, please read the acompaning
|
||||||
|
file LICENSE. The terms and conditions in this license supersede the
|
||||||
|
copyright conditions of the contributions by Igor Mandrichenko
|
||||||
|
(vms/vms.c), Greg Roelofs (zipinfo.c, new version of unshrink.c),
|
||||||
|
Mike White (Windows DLL code in "windll/*"), Steve P. Miller (Pocket
|
||||||
|
UnZip GUI "wince/*"), and Mark Adler (inflate/explode decompresseion
|
||||||
|
core routines, previously put into the public domain). All these
|
||||||
|
Info-ZIP contributors (or "primary" authors) have permitted us to
|
||||||
|
replace their copyright notes by the Info-ZIP License.
|
||||||
|
|
||||||
|
Frequently Asked Questions regarding (re)distribution of Zip and UnZip
|
||||||
|
are near the end of this file.
|
||||||
|
|
||||||
|
There are no known patents on any of the code in UnZip. Unisys
|
||||||
|
claims a patent on LZW encoding and on LZW decoding _in an apparatus
|
||||||
|
that performs LZW encoding_, but the patent appears to exempt a stand-
|
||||||
|
alone decoder (as in UnZip's unshrink.c). Unisys has publicly claimed
|
||||||
|
otherwise, but the issue has never been tested in court. Since this
|
||||||
|
point is unclear, unshrinking is not enabled by default. It is the
|
||||||
|
responsibility of the user to make his or her peace with Unisys and
|
||||||
|
its licensing requirements. (unshrink.c may be removed from future
|
||||||
|
releases altogether.)
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
The original unzip source code has been extensively modified and
|
||||||
|
almost entirely rewritten (changes include random zipfile access
|
||||||
|
rather than sequential; replacement of unimplode() with explode();
|
||||||
|
replacement of old unshrink() with new (unrelated) unshrink(); re-
|
||||||
|
placement of output routines; addition of inflate(), wildcards,
|
||||||
|
filename-mapping, text translation, ...; etc.). As far as we can
|
||||||
|
tell, only the core code of the unreduce method remained substantially
|
||||||
|
similar to Mr. Smith's original source. As of UnZip 5.42, the complete
|
||||||
|
core code is now covered by the Info-ZIP Licence. Therefore, support
|
||||||
|
for the reduce method has been removed.
|
||||||
|
The drop of the reduce method should only affect some test archives,
|
||||||
|
reducing was never used in any publically distributed Zip program.
|
||||||
|
For pathologic cases where support for reduced archive entries is
|
||||||
|
needed, the unreduce code copyrighted by Samuel H. Smith is available
|
||||||
|
as a separate distribution (the restricted copyright of this code is
|
||||||
|
cited below in the "historical" section).
|
||||||
|
|
||||||
|
The following copyright applies to the Mac OS File Manager interface code
|
||||||
|
(macos/source/macstuff.[ch]), distributed with UnZip 5.4 and later:
|
||||||
|
|
||||||
|
* MoreFiles
|
||||||
|
*
|
||||||
|
* A collection of File Manager and related routines
|
||||||
|
*
|
||||||
|
* by Jim Luther (Apple Macintosh Developer Technical Support Emeritus)
|
||||||
|
* with significant code contributions by Nitin Ganatra
|
||||||
|
* (Apple Macintosh Developer Technical Support Emeritus)
|
||||||
|
* Copyright 1992-1998 Apple Computer, Inc.
|
||||||
|
* Portions copyright 1995 Jim Luther
|
||||||
|
* All rights reserved.
|
||||||
|
* The Package "More Files" is distributed under the following
|
||||||
|
* license terms:
|
||||||
|
*
|
||||||
|
* "You may incorporate this sample code into your
|
||||||
|
* applications without restriction, though the
|
||||||
|
* sample code has been provided "AS IS" and the
|
||||||
|
* responsibility for its operation is 100% yours.
|
||||||
|
* However, what you are not permitted to do is to
|
||||||
|
* redistribute the source as "DSC Sample Code" after
|
||||||
|
* having made changes. If you're going to
|
||||||
|
* redistribute the source, we require that you make
|
||||||
|
* it clear in the source that the code was descended
|
||||||
|
* from Apple Sample Code, but that you've made
|
||||||
|
* changes."
|
||||||
|
|
||||||
|
The usage terms of this copyright note are compatible with the
|
||||||
|
Info-ZIP license, they do not add further restrictions.
|
||||||
|
|
||||||
|
|
||||||
|
The following copyright applies to the Mac OS "macbin3" decoding code
|
||||||
|
(extra field compatibility with ZipIt):
|
||||||
|
|
||||||
|
* MacBinaryIII.h
|
||||||
|
*
|
||||||
|
* Copyright 1997 Christopher Evans (cevans@poppybank.com)
|
||||||
|
*
|
||||||
|
* Basic encoding and decoding of Macintosh files to the
|
||||||
|
* MacBinary III spec.
|
||||||
|
* ----------------------------------------------------------------------
|
||||||
|
* This source is copyrighted by Christopher Evans (cevans@poppybank.com)
|
||||||
|
* (available at ftp://ftp.lazerware.com/MacBinaryIII_src_C.sit
|
||||||
|
* homepage of Leonard Rosenthol leonardr@netcom.com)
|
||||||
|
|
||||||
|
This copyright note does not contain any usage terms. So, we assume
|
||||||
|
that this code is freely reusable until we are proved wrong...
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
The remaining copyright notes have been superseeded by the new
|
||||||
|
Info-ZIP license, with explicit permission from the respective
|
||||||
|
original authors. They are cited here for historical reasons,
|
||||||
|
only:
|
||||||
|
|
||||||
|
The following copyright applies to the full-featured unreduce.c
|
||||||
|
(now distributed separately):
|
||||||
|
|
||||||
|
* Copyright 1989 Samuel H. Smith; All rights reserved
|
||||||
|
*
|
||||||
|
* Do not distribute modified versions without my permission.
|
||||||
|
* Do not remove or alter this notice or any other copyright notice.
|
||||||
|
* If you use this in your own program you must distribute source code.
|
||||||
|
* Do not use any of this in a commercial product.
|
||||||
|
|
||||||
|
Regarding the first stipulation, Mr. Smith was tracked down in southern
|
||||||
|
California some years back [Samuel H. Smith, The Tool Shop; as of mid-
|
||||||
|
May 1994, (213) 851-9969 (voice), (213) 887-2127(?) (subscription BBS),
|
||||||
|
71150.2731@compuserve.com]:
|
||||||
|
|
||||||
|
"He says that he thought that whoever contacted him understood that
|
||||||
|
he has no objection to the Info-ZIP group's inclusion of his code.
|
||||||
|
His primary concern is that it remain freely distributable, he said."
|
||||||
|
|
||||||
|
Despite the fact that our "normal" code has been entirely rewritten
|
||||||
|
and by default no longer contains any of Mr. Smith's code, Info-ZIP
|
||||||
|
remains indebted and grateful to him. We hope he finds our contribu-
|
||||||
|
tions as useful as we have his.
|
||||||
|
|
||||||
|
Note that the third and fourth stipulations still apply to any com-
|
||||||
|
pany that wishes to incorporate the unreduce code into its products;
|
||||||
|
if you wish to do so, you must contact Mr. Smith directly regarding
|
||||||
|
licensing.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
The following copyright applied to most of the VMS code in vms.c,
|
||||||
|
distributed with UnZip version 4.2 and later:
|
||||||
|
|
||||||
|
* Copyright (c) 1992-93 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 and that this copyright notice is retained.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
The following copyright applied to the new version of unshrink.c,
|
||||||
|
distributed with UnZip version 5.2 and later:
|
||||||
|
|
||||||
|
* Copyright (c) 1994 Greg Roelofs.
|
||||||
|
* Permission is granted to any individual/institution/corporate
|
||||||
|
* entity to use, copy, redistribute or modify this software for
|
||||||
|
* any purpose whatsoever, subject to the conditions noted in the
|
||||||
|
* Frequently Asked Questions section below, plus one additional
|
||||||
|
* condition: namely, that my name not be removed from the source
|
||||||
|
* code. (Other names may, of course, be added as modifications
|
||||||
|
* are made.) Corporate legal staff (like at IBM :-) ) who have
|
||||||
|
* problems understanding this can contact me through Zip-Bugs...
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
The following copyright applied to the Windows DLL code (windll/*),
|
||||||
|
distributed with UnZip version 5.2 and later:
|
||||||
|
|
||||||
|
* Copyright (c) 1996 Mike White.
|
||||||
|
* Permission is granted to any individual or institution to use,
|
||||||
|
* copy, or redistribute this software so long as all of the original
|
||||||
|
* files are included, that it is not sold for profit, and that this
|
||||||
|
* copyright notice is retained.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
The following copyright applied to the Windows CE GUI port, ``Pocket
|
||||||
|
UnZip,'' distributed with UnZip version 5.3 and later:
|
||||||
|
|
||||||
|
* All the source files for Pocket UnZip, except for components
|
||||||
|
* written by the Info-ZIP group, are copyrighted 1997 by Steve P.
|
||||||
|
* Miller. The product "Pocket UnZip" itself is property of the
|
||||||
|
* author and cannot be altered in any way without written consent
|
||||||
|
* from Steve P. Miller.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
The remaining code was written by many people associated with the
|
||||||
|
Info-ZIP group, with large contributions from (but not limited to):
|
||||||
|
Greg Roelofs (overall program logic, ZipInfo, unshrink, filename
|
||||||
|
mapping/portability, etc.), Mark Adler (inflate, explode, funzip),
|
||||||
|
Kai Uwe Rommel (OS/2), John Bush and Paul Kienitz (Amiga), Antoine
|
||||||
|
Verheijen (Macintosh), Hunter Goatley (more VMS), Mike White (Windows
|
||||||
|
DLLs), Christian Spieler (overall logic, optimization, VMS, etc.) and
|
||||||
|
others. See the file CONTRIBS in the source distribution for a much
|
||||||
|
more complete list of contributors.
|
||||||
|
The decompression core code for the deflate method (inflate.[ch],
|
||||||
|
explode.c) was originally written by Mark Adler who submitted it
|
||||||
|
as public domain code.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------
|
84
unzip/unzip-5.52/Contents
Normal file
84
unzip/unzip-5.52/Contents
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
Contents of the UnZip 5.52 source archive. The OS-specific subdirectories
|
||||||
|
at the end contain their own Contents listings:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
README what UnZip is; general information
|
||||||
|
LICENSE Info-ZIP license; terms for using and distributing UnZip
|
||||||
|
COPYING.OLD historic copyrights and distribution policy (obsolete)
|
||||||
|
INSTALL how to compile and install UnZip and related utilities
|
||||||
|
WHERE where Zip/UnZip and encryption/decryption support can be found
|
||||||
|
History.550 new features and fixes of the last major release
|
||||||
|
History.551 new features and fixes in this maintenance release
|
||||||
|
ToDo rough priority list of new features to be added in next release
|
||||||
|
BUGS known bugs, problems, and (possible) other features to be added
|
||||||
|
unzip.txt UnZip manual page, human-readable format
|
||||||
|
unzipsfx.txt UnZipSFX manual page, human-readable format
|
||||||
|
zipinfo.txt ZipInfo manual page, human-readable format
|
||||||
|
zipgrep.txt ZipGrep manual page, human-readable format
|
||||||
|
funzip.txt fUnZip manual page, human-readable format
|
||||||
|
file_id.diz BBS-oriented file describing this archive
|
||||||
|
testmake.zip test archive for checking whether newly compiled UnZip works
|
||||||
|
api.c generic DLL entry points, support functions (required for DLLs)
|
||||||
|
apihelp.c API help text for DLL versions (currently OS/2 only)
|
||||||
|
consts.h global, initialized variables that never change (required)
|
||||||
|
crc32.c code for calculation 32bit CRC of a string buffer (required*)
|
||||||
|
crc_i386.S fast assembler replacement for crc32.c (Intel 386 and newer)
|
||||||
|
crctab.c supplies polynomial table for CRC calculation
|
||||||
|
crypt.c de-/encryption routines (required*)
|
||||||
|
crypt.h de-/encryption header file (required*)
|
||||||
|
ebcdic.h static lookup table for ASCII <-> EBCDIC translation (required)
|
||||||
|
envargs.c code to read options from environment variables (required)
|
||||||
|
explode.c code for exploding (required)
|
||||||
|
extract.c high-level extraction and decryption code (required)
|
||||||
|
fileio.c file manipulation and password code (required)
|
||||||
|
funzip.c filter unzip: extracts in a pipe from stdin to stdout
|
||||||
|
gbloffs.c helper program to retrieve offsets of globals struct members
|
||||||
|
globals.c code to support global variables with reentrancy (required)
|
||||||
|
globals.h definition of global structure G (required)
|
||||||
|
inflate.c code for inflating (required*)
|
||||||
|
inflate.h header file for inflating (required*)
|
||||||
|
list.c UnZip listing routines, non-ZipInfo mode (required)
|
||||||
|
match.c pattern-matching code for filename wildcards (required)
|
||||||
|
process.c zipfile headers code (required)
|
||||||
|
tables.h static lookup tables used in fileio.c and funzip.c (required*)
|
||||||
|
timezone.c timezone and timestamp functions (required)
|
||||||
|
timezone.h header file for interface to "internal" tz functions (required)
|
||||||
|
ttyio.c code for handling nonecho tty input: password, pager (required)
|
||||||
|
ttyio.h header file for nonecho tty input: password, pager (required)
|
||||||
|
unreduce.c code for unreducing (required)
|
||||||
|
unshrink.c code for unshrinking (required)
|
||||||
|
unzip.c UnZip main(), usage and options code (required)
|
||||||
|
unzip.h public half of main UnZip header file (required*)
|
||||||
|
unzipstb.c minimal UnZip "stub" file demonstrating use of DLL versions
|
||||||
|
unzpriv.h private (internal) half of main UnZip header file (required*)
|
||||||
|
unzvers.h header with UnZip/UnZipSFX and ZipInfo version info (required)
|
||||||
|
zip.h dummy header for use with crypt.c (required*)
|
||||||
|
zipinfo.c UnZip listing routines, ZipInfo mode (required)
|
||||||
|
acorn/ support files for compiling under Acorn RISC OS
|
||||||
|
amiga/ support files for compiling under AmigaDOS
|
||||||
|
aosvs/ support files for compiling under Data General AOS/VS
|
||||||
|
atari/ support files for compiling under Atari TOS
|
||||||
|
atheos/ support files for compiling under AtheOS/Syllable
|
||||||
|
beos/ support files for compiling under BeOS
|
||||||
|
cmsmvs/ support files for compiling under VM/CMS and MVS
|
||||||
|
flexos/ support files for compiling under FlexOS
|
||||||
|
human68k/ support files for compiling under X68000/Human68K
|
||||||
|
macos/ support files for compiling under Macintosh OS
|
||||||
|
msdos/ support files for compiling under MS-DOS
|
||||||
|
novell/ support files for compiling for Novell Netware NLM
|
||||||
|
os2/ support files for compiling under OS/2 (includes DLL stuff)
|
||||||
|
qdos/ support files for compiling under SMS/QDOS
|
||||||
|
tandem/ support files for compiling under Tandem NSK
|
||||||
|
theos/ support files for compiling under Theos
|
||||||
|
tops20/ support files for compiling under TOPS-20
|
||||||
|
unix/ support files for compiling under Unix
|
||||||
|
vms/ support files for compiling under VMS
|
||||||
|
win32/ support files for compiling under Windows 9x and Windows NT
|
||||||
|
wince/ support files for compiling under Windows CE (GUI version)
|
||||||
|
windll/ support files for compiling Windows 3.x/9x/NT DLLs
|
||||||
|
man/ nroff man-page sources for the main user documentation
|
||||||
|
proginfo/ programming docs, additional technical info, contributor list
|
||||||
|
|
||||||
|
Files marked "required*" are also needed to compile fUnZip. The normal
|
||||||
|
UnZip makefile targets now make both UnZipSFX and fUnZip, except in a few
|
||||||
|
cases; ZipInfo is now incorporated into UnZip (see zipinfo.txt for usage).
|
273
unzip/unzip-5.52/History.550
Normal file
273
unzip/unzip-5.52/History.550
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
UnZip, version 5.5, 17 February 2002
|
||||||
|
|
||||||
|
Features added (or removed):
|
||||||
|
|
||||||
|
5.5a (04 Feb 01):
|
||||||
|
- unzip.1: added documentation for the new Acorn NFS filetype features [SPC]
|
||||||
|
- generic (inflate.c, globals.h, fileio.c, unzpriv.h): integrated support of
|
||||||
|
Deflate64 for all ports with exception of MSDOS and OS/2 16-bit [SPC]
|
||||||
|
|
||||||
|
5.5b (11 Feb 01):
|
||||||
|
- added Deflate64 support to fUnZip [SPC]
|
||||||
|
- added Deflate64 support for 16-bit environments [SPC]
|
||||||
|
|
||||||
|
5.5c (18 Apr 01):
|
||||||
|
- SFX: made SFX_EXDIR default, added NO_SFXEXDIR option to allow switching
|
||||||
|
off the "-d exdir" support [SPC]
|
||||||
|
- OS2, WIN32: added presetting of file size for extracted files, to reduce
|
||||||
|
file fragmentation [Pavel Lastovicka, Kai Uwe Rommel, SPC]
|
||||||
|
- VMS, new functionality of -b option: when extracting to standard output
|
||||||
|
(-c or -p), -b switches to "binary piping mode" by disabling text data
|
||||||
|
conversion [SPC]
|
||||||
|
|
||||||
|
5.5d (28 Apr 01):
|
||||||
|
- SFX: added simple "execute command after extraction" feature that uses a
|
||||||
|
command specification supplied with the Zip archive comment, controlled
|
||||||
|
by the CHEAP_SFX_AUTORUN compile time option [Paul Kienitz]
|
||||||
|
- SFX: slightly refined the CHEAP_SFX_AUTORUN code, switched off SFX_EXDIR
|
||||||
|
when CHEAP_SFX_AUTORUN is enabled, documented the new autorun feature [SPC]
|
||||||
|
- VMS: extended new "binary piping" functionality of -b switch to extraction
|
||||||
|
of archive entries with VMS attributes saved [SPC]
|
||||||
|
|
||||||
|
5.5f (30 Sep 01):
|
||||||
|
- extract.c, TestExtraField(): added crc32 check for PKVMS e.f. type [SPC]
|
||||||
|
- added real VMS-e.f. analysis for fool-proof detection of VMS "variable
|
||||||
|
length record" text files, enabled VMS_TEXT_CONV as default (but not for
|
||||||
|
SFX stub) [SPC]
|
||||||
|
- added support for optional ACORN_FTYPE_NFS feature to more OS that allow
|
||||||
|
long filenames and commas within filenames (BeOS, Novell, OS/2, Theos,
|
||||||
|
Win32) [SPC]
|
||||||
|
|
||||||
|
5.5g (05 Nov 01):
|
||||||
|
- extract.c, extract_or_test_entrylist(): added code for "stripping off
|
||||||
|
absolute path spec" when extracting [SPC]
|
||||||
|
|
||||||
|
5.5h (12 Jan 02):
|
||||||
|
- unzip.h, unzip.c; mapname() in all ports except CMS/MVS, Tandem, TOPS20:
|
||||||
|
added code to strip "../" path components from extracted names and new
|
||||||
|
option "-:" to allow deactivating this security feature; changed mapname()
|
||||||
|
calling interface to allow reporting warning error levels to caller [SPC]
|
||||||
|
- man/unzip.1: documented the new "-:" option [SPC]
|
||||||
|
- vms/cmdline.c etc.: added support for "-:" option to VMS DCL interface;
|
||||||
|
updated VMS help files with description of "-:" option [SPC]
|
||||||
|
- windll/windll.{c|txt}: modified handling of DCL struct's "ndflag" member
|
||||||
|
to allow setting the "-:" option through the windll interface [SPC]
|
||||||
|
- unzpriv.h, zipinfo.c: rudimentary support for recognizing PKWARE's new
|
||||||
|
"64-bit size specs" extra field [SPC]
|
||||||
|
|
||||||
|
5.5 (17 Feb 02):
|
||||||
|
- unix/Makefile: added separate makefile symbol INSTALL_PROGRAM for command
|
||||||
|
to install "binary" (compiled and linked) program files [Santiago Vila]
|
||||||
|
|
||||||
|
|
||||||
|
Bugs fixed:
|
||||||
|
|
||||||
|
5.5a (04 Feb 01):
|
||||||
|
- all OS with Unix-compatible file attributes (Acorn, AosVS, BeOS, QDOS, Unix,
|
||||||
|
and others), mapattr(): corrected wrong masking expression in check for
|
||||||
|
missing directory attribute; added this check for ports where it was
|
||||||
|
still missing [Eric Siegerman, SPC]
|
||||||
|
- inflate.c: reorganized inner loop function for slight performance gain [SPC]
|
||||||
|
- explode.c: reorganized code (2 instead of 4 inner-loop function versions),
|
||||||
|
fixed memory leaks when get_tree() fails (added huft_free() calls) [SPC]
|
||||||
|
|
||||||
|
5.5b (11 Feb 01):
|
||||||
|
- inflate.c: some more optimizations (also resulting in easier readable code)
|
||||||
|
[SPC]
|
||||||
|
- unzip.c: revised work area size calculation in the WORK_MALLOC case, when
|
||||||
|
the decompression buffer is malloc'ed separately; removed suspicious
|
||||||
|
"one unit excess" allocation (8193 instead of 8192, not clear why this
|
||||||
|
was introduced in ancient times) [SPC]
|
||||||
|
- VMS - cvthelp.tpu, unzip_cli.help: reformatted CLI help file to show negated
|
||||||
|
form of negatable options on a separate line in the header of qualifier
|
||||||
|
descriptions [Hunter Goatley]
|
||||||
|
- generic: renamed version.h into unzvers.h (for better distinction from zip
|
||||||
|
sources) and updated all makefiles [SPC]
|
||||||
|
- windll: changed windll.rc to get version info directly from unzvers.h and
|
||||||
|
killed windll/unzver.h [SPC]
|
||||||
|
- api.c, global.h, extract.c, explode.c, inflate.c, unshrink.c: corrected
|
||||||
|
declarations of variables and function parameters holding redirected buffer
|
||||||
|
size (unsigned vs. ulg issues), added/modified appropiate type casts [SPC]
|
||||||
|
|
||||||
|
5.5c (18 Apr 01):
|
||||||
|
- most make procedures: unzipsfx compilation requires completely separate
|
||||||
|
object files (exception: crc32), because global structure is now different
|
||||||
|
from unzip setup (sfx: no Deflate64!) [Thom Schmidt, SPC]
|
||||||
|
- inflate.c: moved macro definitions for invalid huft code marker out of
|
||||||
|
"no ZLIB only" code part; it is used in huft_build() [Thomas Klausner]
|
||||||
|
- AMIGA, HUMAN68K: replaced specific mkGoff.c helper program sources by a more
|
||||||
|
generic gbloffs.c source (located in the top level directory); adapted
|
||||||
|
makefiles to this change [SPC]
|
||||||
|
- win32/win32: modified version() to recognize Borland C++ 5.5.1 [SPC]
|
||||||
|
- AMIGA: adapted assembler core routine flate.a to Deflate64 and the 64k
|
||||||
|
extraction buffer; adapted inflate setup to allow for 16bit ints in
|
||||||
|
an otherwise 32-bit environment [Paul Kienitz]
|
||||||
|
- human68k/flate.s: incorporated Paul's updates of amiga/flate.a in the
|
||||||
|
HUMAN68K source variant [SPC]
|
||||||
|
- MacOS: updates from MacZip release 1.07b [Dirk Haase]
|
||||||
|
- unzpriv.h: updated exceptions of "made by FAT -> filename charset is OEM"
|
||||||
|
rule to now include the PKZIP 4.0 case [SPC]
|
||||||
|
- unzpriv.h, extract.c zipinfo.c: in preparation to multivolume support,
|
||||||
|
struct min_info has been extended to hold the entry's disk volume number
|
||||||
|
(to conserve space, hostnum & hostver members are shortened to uch) [SPC]
|
||||||
|
- extract.c, extract_or_test_files() function: isolated code of "second loop"
|
||||||
|
in a separate function, in preparation for multivolume support [SPC]
|
||||||
|
- os2/os2.c: use posix-style mkdir definition whenever __GNUC__ is defined,
|
||||||
|
for better compatibility with non-EMX gcc ports [Pavel Lastovicka, SPC]
|
||||||
|
- windll/windll.c: added missing SETLOCALE() initialization to Wiz_Init()
|
||||||
|
[Kevin Cheng]
|
||||||
|
- WINDLL port: in windll.c, changed FreeDllMem() scope into static; tried
|
||||||
|
to clarify in windll.txt that Wiz_SetOpts() and Wiz_Unzip() must be
|
||||||
|
used as a pair of functions [SPC]
|
||||||
|
- VMS: removed unused and undocumented /TYPE switch from CLI interface [SPC]
|
||||||
|
|
||||||
|
5.5d (28 Apr 01):
|
||||||
|
- unix/Makefile: correction for LynxOS target [Mark Clayton]
|
||||||
|
- extract.c: synchronized extract_or_test_entrylist() prototype declaration
|
||||||
|
for the SET_DIR_ATTRIB case with actually used function interface [SPC]
|
||||||
|
- vms/descrip.mms: corrected typo in match_$O rule [Michael Lemke]
|
||||||
|
- vms/vms.c: limit buffer size for single block output to less than 64k
|
||||||
|
(RMS limit on VAX); corrected record overflow checks to use the right
|
||||||
|
RMS limit of (32k-1) [Mike Freeman, SPC]
|
||||||
|
- unzver.h: renamed COMPANY_NAME symbol to IZ_COMPANY_NAME, check for
|
||||||
|
symbol being already defined; restrict definition of OS/2-DLL specific
|
||||||
|
version symbols to OS/2 port [Mike White, SPC]
|
||||||
|
- windll/uzexampl.c: corrected inclusion path of unzver.h [Mike White]
|
||||||
|
- acorn/GMakefile: need NO_STRNICMP, fixed missing renaming of version.h
|
||||||
|
into unzvers.h [Andy Wingate]
|
||||||
|
- vms/vms.c: fixed long standing bug BUFS512 expression - clipping to a
|
||||||
|
multiple of 512 is achieved by ANDing with ~511 instead of ~512 [SPC]
|
||||||
|
|
||||||
|
5.5e (29 Apr 01):
|
||||||
|
- vms/vms.c: added missing -c handling in WriteBuffer() to make the "-b"
|
||||||
|
binary piping mode functional [SPC]
|
||||||
|
|
||||||
|
5.5f (30 Sep 01):
|
||||||
|
- OS2, WIN32: reenable -X "restore ACLs" option (has been broken since
|
||||||
|
version 5.42 due to incomplete change by SPC [Michael Ringe, SPC]
|
||||||
|
- moved IZVMS specific e.f. decompression from vms/vms.c into extract.c, this
|
||||||
|
functionality is now needed for generic VMS_TEXT_CONV feature [SPC]
|
||||||
|
- zipinfo.c: fixed 16-bit specific bug in verbose IZVMS e.f. report [SPC]
|
||||||
|
- unix/unxcfg.h: fixed setup for GNU/Hurd [Marcus Brinkmann]
|
||||||
|
- tandem/tandem.c: fixed copy&paste typo in stat() [<YuZH@spdb.com.cn>]
|
||||||
|
- vms/cmdline.c: verbatim '%' signs in format specification strings are
|
||||||
|
"escaped" by doubling them, to prevent compiler warnings for newest
|
||||||
|
DEC (COMPAQ) C versions [Dirk Munk, SPC]
|
||||||
|
- tandem/tanunz.c, tandem/tandem.[ch], fileio.c: created Tandem-specific
|
||||||
|
version of open_outfile(), moved UNZIP part of zipopen() code into this
|
||||||
|
function [SPC]
|
||||||
|
- generic: added ZCONST attributes to several function string pointer
|
||||||
|
parameters when the function does not modify the string contents [SPC]
|
||||||
|
- Contents, README, INSTALL, ToDo, WHERE: documentation updates [SPC]
|
||||||
|
|
||||||
|
5.5g (05 Nov 01):
|
||||||
|
- win32/Makefile.bc: completed support for guisfx stub and static lib [SPC]
|
||||||
|
- vms/vms.c: in find_vms_attrs(), fixed IZVMS ef-block parser which has been
|
||||||
|
broken by changes for 5.5f beta [SPC]
|
||||||
|
- acorn/acorn.c: fixed missing semicolon in setRISCOSexfield() prototype
|
||||||
|
declaration [Andy Wingate]
|
||||||
|
- win32/Makefile.bc: removed -q flag for compatibility with older versions
|
||||||
|
of Borland C++ Builder [E-Yen Tan]
|
||||||
|
|
||||||
|
5.5h (12 Jan 02):
|
||||||
|
- man/*.1: modified manpages to be more "friendly" to automatic conversion
|
||||||
|
tools into the OpenSource "DocBook" format [Eric S. Raymond];
|
||||||
|
tested new manpages and corrected some formatting quirks [SPC]
|
||||||
|
- extract.c: corrected size mismatches between format specifiers and actual
|
||||||
|
numeric arguments [SPC]
|
||||||
|
- msdos/msdos.c: cleanup of token concatenation preprocessor warnings emitted
|
||||||
|
by GCC 3.02 [SPC]
|
||||||
|
- process.c: moved definition of symbol SPARKID_2 from acorn/riscos.h into
|
||||||
|
this file (symbol used by getRISCOSexfield()) [Santiago Vila, SPC]
|
||||||
|
- unzip.c, unzip() main function, REENTRANT code: fixed signal handler "leak"
|
||||||
|
by saving previous state of all allocated signal handlers and restoring
|
||||||
|
them at function exit [Jim Mathies, SPC]
|
||||||
|
- unzip.h, unzpriv.h: moved "internal" function return codes (IZ_DIR etc.)
|
||||||
|
into the private main header unzpriv.h [SPC]
|
||||||
|
- extract.c, fileio.c: extended UNIXBACKUP optional functionality to create
|
||||||
|
"numbered" backup filenames, fixed behaviour when backup file already
|
||||||
|
exists (-o option switches off numbered backup files and overwrites the
|
||||||
|
first backup file when neccessary) [Mauricio Ponzo, SPC]
|
||||||
|
- unzpriv.h, fileio.c, process.c: changed ZLSEEK macro into a real function
|
||||||
|
seek_zipf() (located in fileio.c); added check of return code to its
|
||||||
|
calls; fixed filehandle leak in do_seekable() that occured in case of
|
||||||
|
ZLSEEK errors [Miki Shapiro, SPC]
|
||||||
|
- wince/intrface.cpp: added SetFileSize() function to preallocate extraction
|
||||||
|
file space, as implemented in the win32 port (dummy function for WinCE
|
||||||
|
native compiles because availability of system service is unknown) [SPC]
|
||||||
|
- funzip.c: changed skope of err() helper function to "static" [Mark Adler]
|
||||||
|
|
||||||
|
5.5i (01 Feb 02):
|
||||||
|
- acorn/acorn.c: correct dir traversal security fix (Acorn uses '^'as parent
|
||||||
|
folder reference); update and enhance the special character translations;
|
||||||
|
static printRISCOSexfield() functions must only be declared when its
|
||||||
|
definition is active [Darren Salt]
|
||||||
|
- unzip.h, unzip.c, man/unzip.1: disabled -: option for Acorn [SPC]
|
||||||
|
- amiga/flate.a, amiga/makefile.azt: modified the way of including gbloffs'
|
||||||
|
output in the assembler inflate code [Paul Kienitz]
|
||||||
|
- gbloffs.c: corrected USE_DEFLATE64 symbol name, added missing type cast to
|
||||||
|
CRYPT symbol handling [Paul Kienitz]
|
||||||
|
- unix/Makefile: corrected and renamed target(s) for MacOS X [Mark Adler, SPC]
|
||||||
|
- acorn/makefile: make does not like recursive macro definitions [Darren Salt]
|
||||||
|
- unreduce.c: indented the #error message directive to hide it from pure
|
||||||
|
traditional K&R C style preprocessors [Peter Jones, SPC]
|
||||||
|
- amiga/filedate.c: exclude time handling code from Zip utility compiles
|
||||||
|
(a Zip change) [Paul Kienitz]
|
||||||
|
- acorn/GMakeFile: updated machine-specific options, used standard "gcc" as
|
||||||
|
command driver for linking [Andy Wingate]
|
||||||
|
- unix/unix.c, mapname(): removed extranous opening parentesis from optional
|
||||||
|
ACORN_FTYPE_NFS only code [Santiago Vila, SPC]
|
||||||
|
- acorn/acorn.c: corrected location of the MimeMap module [Darren Salt]
|
||||||
|
- acorn/riscos.c: fixed problem with readdir() sometimes not detecting end-
|
||||||
|
of-dir on "RISCOS V4 long directory format" FSs [Darren Salt]
|
||||||
|
- msdos/makefile.wat, os2/makefile.os2, win32/Makefile.wat: updated the
|
||||||
|
Watcom C support, checked MSDOS builds, added win32 DLL target [SPC]
|
||||||
|
|
||||||
|
5.5j (11 Feb 02):
|
||||||
|
- acorn/GMakefile, acorn/Contents: made clean target working as expected,
|
||||||
|
updated and moved version info of gcc used (Andy Wingate)
|
||||||
|
- tandem/make: added support for switching on/off of CRYPT option [Dave Smith]
|
||||||
|
- tandem/HISTORY: updated "version of current binaries" info [Dave Smith]
|
||||||
|
- tandem/tanunz.c, open_outfile(): removed unneeded fopen redefines [SPC]
|
||||||
|
- tandem/tanunz.c, checkdir(): fixed missing closing ')' of FnFilter2 macro
|
||||||
|
calls [Dave Smith]
|
||||||
|
- LICENSE: clarification that unmodified UnZipSFX stub binaries can be
|
||||||
|
distributed as part of SFX Zip archives without any further documentation
|
||||||
|
requirements [Christian Spieler, Ian E. Gorman, Greg Roelofs]
|
||||||
|
|
||||||
|
5.5 (17 Feb 02):
|
||||||
|
- inflate.c, explode.c, globals.h, unzpriv.h: changed type of "extra bits"
|
||||||
|
arrays used to build the decoding huffman trees from "ush" into "uch" for
|
||||||
|
optimization and adapted corresponding variable types [SPC]
|
||||||
|
- tandem/tandem.c: small cosmetic changes to catch up with Zip mods [SPC]
|
||||||
|
- unzpriv.h, tandem/tandem.h: removed Zip-specific settings, implemented the
|
||||||
|
USE_EF_UT_TIME default setting for both Zip and UnZip in tandem.h, removed
|
||||||
|
corresponding entry from unzpriv.h [SPC]
|
||||||
|
- LICENSE: refinement of the SFX stub related insertion [Greg Roelofs]
|
||||||
|
- windll/windll.rc: updated copyright year [SPC]
|
||||||
|
- msdos/makefile.dj1, msdos/makefile.dj2: added missing header dependencies,
|
||||||
|
corrected wrong object list for unzipsfx target (only .dj1) [SPC]
|
||||||
|
- tandem/tanunz.c, open_outfile(): repaired wrong variable names, added
|
||||||
|
"upshifting" of filename before executing system calls [Dave Smith]
|
||||||
|
- unzpriv.h, TANDEM setup: define INT_16BIT symbol when compiling in NON WIDE
|
||||||
|
mode to get DEFLATE64 option to work [Dave Smith]
|
||||||
|
- win32/Makefile.wat: finished "$(OBJS)" -> "$(OBJU) conversion [Paul Kienitz]
|
||||||
|
- win32/w32cfg.h: Watcom C requires IZTZ_DEFINESTDGLOBALS setting when using
|
||||||
|
the timehandling replacement code from timezone.c [Paul Kienitz]
|
||||||
|
- README, unzvers.h: removed BETA notes for public release [SPC]
|
||||||
|
- os2/os2.c, SetFileSize(): 16-bit OS/2 needs fake code here [Kai-Uwe Rommel]
|
||||||
|
- unzpriv.h: added ZCONST to varmessage() buf arg [Kai-Uwe Rommel, SPC]
|
||||||
|
- os2/os2.c: added #ifndef FUNZIP sections to allow inclusion of this module
|
||||||
|
in the object modules list for 16-bit fUnZip targets [SPC]
|
||||||
|
- os2/makefile.os2: fixed 16-bit targets to include os2f.obj resp. msdosf.obj
|
||||||
|
in the fUnZip object modules list [SPC]
|
||||||
|
- fileio.c, do_string(): added typecasts in CHEAP_SFX_AUTORUN option code to
|
||||||
|
remove signed/unsigned mismatch warnings [Hunter Goatley]
|
||||||
|
|
||||||
|
==================
|
||||||
|
|
||||||
|
These changes occurred in beta versions 5.5a to 5.5. This list may have
|
||||||
|
left out some bugfixes and even some features...void where prohibited, your
|
||||||
|
mileage may vary, etc., etc.
|
||||||
|
|
||||||
|
Christian Spieler
|
189
unzip/unzip-5.52/History.551
Normal file
189
unzip/unzip-5.52/History.551
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
UnZip, version 5.51, 22 May 2004
|
||||||
|
|
||||||
|
Features added (or removed):
|
||||||
|
|
||||||
|
5.51a (09 Mar 02):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.51b (11 Jan 03):
|
||||||
|
- TANDEM: new -r option to suppress extension merging [Dave Smith]
|
||||||
|
- WinCE, new port in addition to pUnZip (GUI): command line tool usable for
|
||||||
|
"batch" processes (not quite finished, needs "makefile" cleanup, tests,
|
||||||
|
and refinements) [Simon Roberts, SPC]
|
||||||
|
- SET_DIR_ATTRIB feature code revised and reorganized to allow seamless
|
||||||
|
adaption to different OS environments; added support for restoring
|
||||||
|
directory timestamps to the WIN32 port [Kai-Uwe-Rommel, SPC]
|
||||||
|
|
||||||
|
5.51c (13 May 03):
|
||||||
|
- WinCE command line tool integration is (almost) finished: project file is
|
||||||
|
cleaned up and works with VC-embedded 3.0; port needs testing... [SPC]
|
||||||
|
|
||||||
|
5.51d (27 Feb 04):
|
||||||
|
- Cygwin is recognized as a target in the Unix port
|
||||||
|
[Charles Wilson, Cosmin Truta, SPC]
|
||||||
|
- remove support for quoting characters from all ports; this feature was a
|
||||||
|
security hole [SPC]
|
||||||
|
|
||||||
|
5.51e (01 Mar 04):
|
||||||
|
- Win32 port (list.c, unzpriv.h, win32.c, w32cfg.h): the date in (non-ZipInfo)
|
||||||
|
listings is displayed using the separator given by the system's locale,
|
||||||
|
when available [Cosmin Truta]
|
||||||
|
|
||||||
|
5.51f (16 Apr 04):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.51 final (22 May 04):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
Bugs fixed:
|
||||||
|
|
||||||
|
5.51a (09 Mar 02):
|
||||||
|
- process.c: corrected process_zipfiles() message and return code when a
|
||||||
|
wildcard archive spec matches exactly one "non-ziparchive" file [SPC]
|
||||||
|
- fileio.c: fixed partflush() "-a" textmode output for 16-bit ports
|
||||||
|
(was a new bug, introduced in 5.50) [SPC]
|
||||||
|
- inflate.c: modified CHECK_EOF code to allow "virtual" reading beyond EOF in
|
||||||
|
NEEDBITS() macro to fix an old but rarely triggered extraction bug [SPC]
|
||||||
|
- amiga/flate.a, human68k/flate.s: attempted to synchronize with changed
|
||||||
|
C version [SPC]
|
||||||
|
- explode.c, inflate.c, globals.h, unzpriv.h: cleaned up some "signed vs.
|
||||||
|
unsigned" inconsistencies [SPC]
|
||||||
|
- inflate.c: provided workaround for CHECK_EOF problem when using zlib (send
|
||||||
|
a fake input byte when seeing error because of "premature" EOF) [SPC]
|
||||||
|
- unzpriv.h: disabled DEFLATE64 when compiling/linking against zlib [SPC]
|
||||||
|
- windll/windll_lc.def: added missing file to distribution archive [SPC]
|
||||||
|
- windll/vb/vbunzip.bas: corrected UZDLLServ callback function - the second
|
||||||
|
function parameter is the size of the archive entry, not the length of
|
||||||
|
the message string [SPC]
|
||||||
|
|
||||||
|
5.51b (11 Jan 03):
|
||||||
|
- consts.h, funzip.c, inflate.c, unzpriv.h: changed type of mask_bits[] array
|
||||||
|
into "unsigned" for better core-loop performance [SPC]
|
||||||
|
- amiga/flate.a, human68k/flate.s: small correction (optimization) to changes
|
||||||
|
in 5.51a, removed debugging stuff [Paul Kienitz]
|
||||||
|
- fileio.c: added display of system error string to error message shown when
|
||||||
|
open_input_file() fails at the [f]open() function [SPC]
|
||||||
|
- process.c: slightly generalize summary message when no Zip archive could be
|
||||||
|
found or opened (file may be present but unaccessible due to locking or
|
||||||
|
insufficient permission) [Santiago Vila, SPC]
|
||||||
|
- globals.h: undefine zlib_version macro when compiling against zlib to work
|
||||||
|
around a naming conflict [SPC]
|
||||||
|
- unzpriv.h: do not define WILD_STAT_BUG for Borland C on WIN32 [SPC]
|
||||||
|
- unzip.h, unzpriv.h: added precautions for some WIN32 compiler environments
|
||||||
|
which also try to appear as UNIX compatible [SPC]
|
||||||
|
- tandem/tanunz.c bugfix: set file code of generic (non-Tandem) non-text files
|
||||||
|
to 0 (unstructured) instead of 100 (object file) [Dave Smith]
|
||||||
|
- win32/win32.c: added recognition for Borland C++ Builder 6.0 to version()
|
||||||
|
[Brad Clarke]
|
||||||
|
- tandem/tanunz.c bugfix: set file code of Enscribe files containing text data
|
||||||
|
to 101 (Edit) [Dave Smith]
|
||||||
|
- api.c writeToMemory(), fileio.c flush(): Added check for buffer overflow
|
||||||
|
when extracting to memory and output buffer is different from decompression
|
||||||
|
work area [Samuel R. Blackburn, SPC]
|
||||||
|
- tandem configuration bugfix: Deflate64 was incompatible with non-WIDE memory
|
||||||
|
models; fixed OUTBUFSIZ logic and "unsigned" vs. "size_t" incompatibility
|
||||||
|
issues [Dave Smith, SPC]
|
||||||
|
|
||||||
|
5.51c (13 May 03):
|
||||||
|
- OS2, WIN32, WinCE: '\\' chars are not allowed in file names, map them to '_'
|
||||||
|
to prevent misinterpreting them as directory separators [David F, SPC]
|
||||||
|
- windll, VB example: updated integration of "Open file" common dialog and
|
||||||
|
added special Readme text to document installation and maintenance issues
|
||||||
|
of the VB example code [ED, SPC]
|
||||||
|
- unzpriv.h: enclosed shift op expressions in definitions of MPN_xxx macro
|
||||||
|
constant with parentheses (for safety) [Cosmin Truta]
|
||||||
|
- win32/win32.c: fixed bugs in set_direc_attribs(), do not try to set dirtimes
|
||||||
|
on Win9x systems [Cosmin Truta]
|
||||||
|
- SET_DIR_ATTRIBS option: changed defer_dir_attribs() function interface to
|
||||||
|
allow non-error return without deferred direntry data [SPC]
|
||||||
|
- BeOS, Theos: updated SET_DIR_ATTRIBS code to work with the revised generic
|
||||||
|
code [SPC]
|
||||||
|
- WinCE port: revitalized WinCE port code, updated VC project files, added
|
||||||
|
"VC embedded Tools 3.0" project file [SPC]
|
||||||
|
- unzip.h: added rule to define UNIX flag for NetBSD [Ray Phillips]
|
||||||
|
- unix/Makefile: added "-DUNIX" to default CF settings, to get rid of misc
|
||||||
|
problems concerning auto-detection of a "Unix" environment [SPC]
|
||||||
|
- LICENSE: include SFXWiz in the exeption clause concerning distribution
|
||||||
|
of self-extracting archives [Greg Roelofs]
|
||||||
|
- Amiga, AosVS, Atari, BeOS, FlexOS, Human68K, MacOS, MSDOS, Novell, OS/2,
|
||||||
|
Unix, Win32, (Theos, WinCE - only code sync, no bug to fix):
|
||||||
|
fixed hole in directory traversal security code which did not recognize
|
||||||
|
"../" when path component contained some control character which was
|
||||||
|
silently skipped ["jelmer", SPC]
|
||||||
|
|
||||||
|
5.51d (27 Feb 04):
|
||||||
|
- unix/unix.c: added recognition for Cygwin, i586 and i686 to version()
|
||||||
|
[Cosmin Truta]
|
||||||
|
- unzip.h, unzpriv.h, unix/unzcfg.h: allowed Cygwin to compile as a Unix port
|
||||||
|
[Charles Wilson, Cosmin Truta, SPC]
|
||||||
|
- unix/unxcfg.h: added inclusion of <utime.h> for DG/UX to fix setting
|
||||||
|
of file time-stamps [Dave Lovelace]
|
||||||
|
- macos/source/macstat.c: corrected size in zeroing instruction of stat buffer
|
||||||
|
[Yamaga Tomonori]
|
||||||
|
- extract.c: fixed memory leak in SET_DIR_ATTRIB code in case of premature
|
||||||
|
exit (disk full or user break), execute deferred tasks for processed
|
||||||
|
entries in this case [SPC]
|
||||||
|
- unix/zipgrep: allow grep of filenames with embedded spaces [Greg Roelofs]
|
||||||
|
- win32: update support for newer Cygwin releases [Cosmin Truta]
|
||||||
|
- use central directory's entry names for extraction/testing, emit warning for
|
||||||
|
local/central entry name difference (bug report by Jan Echternach) [SPC]
|
||||||
|
- all SYMLINKS-capable ports (AOS/VS, Atari, BeOS, Unix): defer creation of
|
||||||
|
symlinks until all extractions for current archive are finished, to close
|
||||||
|
a security hole (bug report by Jan Echternach)
|
||||||
|
(Changed: globals.h, unzpriv.h, extract.c, [system]/[system].c) [SPC]
|
||||||
|
- crypt.h: changed default setting for Zip to enable crypt support [SPC]
|
||||||
|
- partial documentation updates, as suggested by Greg [SPC]
|
||||||
|
|
||||||
|
5.51e (01 Mar 04):
|
||||||
|
- unzpriv.h: guarded some definitions of USE_EF_UT_TIME [Cosmin Truta]
|
||||||
|
- Cygwin: putenv() must not be called in iz_w32_prepareTZenv() [Cosmin Truta]
|
||||||
|
- unix/unxcfg.h: include <unistd.h> for Cygwin [Cosmin Truta]
|
||||||
|
- unix/unix.c: enable old code that sets DIRENT symbol for _POSIX_VERSION
|
||||||
|
environments [Cosmin Truta]
|
||||||
|
- win32/Makefile.bc: updated the "clean" target [Cosmin Truta]
|
||||||
|
- win32/Makefile.gcc: updated CC_CPU_OPT to "-mcpu=pentiumpro";
|
||||||
|
fixed the "clean" target [Cosmin Truta]
|
||||||
|
- man/unzip.1: added note about the use of the "-:" option [Lon Hohberger]
|
||||||
|
- merged in usable changes (see above) from Cosmin's bogus 5.51d beta archive
|
||||||
|
variant [SPC]
|
||||||
|
- win32: guarded "NTSD integration code" (not working, under construction)
|
||||||
|
with preprocessor symbol NTSD_DEV to allow intermediate compilation and
|
||||||
|
testing of the current state [SPC]
|
||||||
|
|
||||||
|
5.51f (16 Apr 04):
|
||||||
|
- Acorn: updated/fixed Makefile [Darren Salt]
|
||||||
|
- win32/Makefile: revised (experimental) USE_ZLIB support to work with the
|
||||||
|
current ZLIB release 1.2.1; [Cosmin Truta, Christian Spieler]
|
||||||
|
- win32/Makefile: "clean" target simplified for Win9x support [Cosmin Truta]
|
||||||
|
- INSTALL: describe DATE_SEPCHAR option [Cosmin Truta]
|
||||||
|
- unzip.c: make command-arg "\\"-to-"/" conversion MBCS-safe [SPC]
|
||||||
|
- BeOS, QDOS, Tandem, Theos, Unix - close_outfile(): to make compilers happy,
|
||||||
|
use union for matching "struct utimbuf" with "iztimes" [Jan Echternach]
|
||||||
|
- all SYMLINKS-capable ports (AOS/VS, Atari, BeOS, Unix): check for allocation
|
||||||
|
size overflow of "deferring symlink" structure (reported by Jan Echternach)
|
||||||
|
(Changed: [system]/[system].c) [SPC]
|
||||||
|
- api.c - redirect_outfile(): check for allocation overflow in textmode when
|
||||||
|
lenEOL != 1; check against integer overflow for 16-bit ports [SPC]
|
||||||
|
- fileio.c - open_outfile(): use G.lrec.ucsize throughoutly instead of
|
||||||
|
G.pInfo.uncompr_size [SPC]
|
||||||
|
- extract.c - extract_or_test_entrylist(): check for ucsize vs. csize mismatch
|
||||||
|
in STORED entries; synchronize and emit warning message [SPC]
|
||||||
|
|
||||||
|
5.51f2 (16 Apr 04):
|
||||||
|
- extract.c: fixed compilation error (misplaced ')') [Cosmin Truta]
|
||||||
|
- win32/Makefile: added missing rule to build unzsfx32.lib [Cosmin Truta]
|
||||||
|
- INSTALL, History.551: fixed some minor typos in docs [Cosmin Truta]
|
||||||
|
|
||||||
|
5.51 final (22 May 04):
|
||||||
|
- no code changes
|
||||||
|
- updated WHERE file, History.551 file, and various copyright and release
|
||||||
|
dates where necessary [GRR]
|
||||||
|
- removed "beta" status from unzver.h [GRR]
|
||||||
|
|
||||||
|
==================
|
||||||
|
|
||||||
|
These changes occurred in beta versions 5.51a to 5.51. This list may have
|
||||||
|
left out some bugfixes and even some features...void where prohibited, your
|
||||||
|
mileage may vary, etc., etc.
|
||||||
|
|
||||||
|
Christian Spieler
|
215
unzip/unzip-5.52/History.552
Normal file
215
unzip/unzip-5.52/History.552
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
UnZip, version 5.52, 28 February 2005
|
||||||
|
|
||||||
|
Features added (or removed):
|
||||||
|
|
||||||
|
5.52a (10 Dec 04):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.52b (30 Dec 04):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.52c (8 Jan 05):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.52d (17 Jan 05):
|
||||||
|
- VMS: Faster I/O, both reading the archive and creating extracted data
|
||||||
|
files. Disk paralysis during file allocation, when highwater marking
|
||||||
|
is enabled on the destination device, is gone. [Steven Schweda (SMS)]
|
||||||
|
- VMS: Where the C RTL permits, with SET PROCESS /PARSE = EXTENDED,
|
||||||
|
command-line case is preserved, obviating quotation of upper- or
|
||||||
|
mixed-case options and parameters. [SMS]
|
||||||
|
|
||||||
|
5.52e (23 Jan 05):
|
||||||
|
- i386 ASM_CRC code crc_i386.S, win32/crc_i386.asm, win32/crc_i386.c:
|
||||||
|
enabled optimization for i686 by default, as pre-686 CPUs are no longer
|
||||||
|
widely used nowadays. (win32/crc_lcc.asm was already i686-optimized)
|
||||||
|
[Cosmin Truta (CT)]
|
||||||
|
- INSTALL, unzpriv.h: unshrinking is now enabled by default [CT]
|
||||||
|
- AtheOS/BeOS/Unix: do not restore SUID/SGID/Tacky bits per default; added
|
||||||
|
new security override option "-K" for backward compatibility, updated
|
||||||
|
unzip.1 man page [Johnny Lee, EG]
|
||||||
|
|
||||||
|
5.52f (27 Jan 05):
|
||||||
|
- unzpriv.h, list.c, zipinfo.c: added recognition of additional hosts and
|
||||||
|
compression methods according to latest PKWARE appnote specs [SPC]
|
||||||
|
- AtheOS/Syllable: new port, kindly contributed by Nikolaev Ruslan [SPC]
|
||||||
|
|
||||||
|
5.52g (06 Feb 05):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.52h (20 Feb 05):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.52i (24 Feb 05):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.52j (27 Feb 05):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
5.52 (28 Feb 05):
|
||||||
|
- no new features
|
||||||
|
|
||||||
|
Bugs fixed:
|
||||||
|
|
||||||
|
5.52a (10 Dec 04):
|
||||||
|
- Debian patch 001 - change __GNU__ to __GLIBC__ in unix/unxcfg.h. This is
|
||||||
|
required to build under glibc-based systems not being Linux-based (like
|
||||||
|
the Debian GNU/kFreeBSD port, which is in preparation). In fact,
|
||||||
|
everywhere the macro __GNU__ is used, __GLIBC__ should be used instead.
|
||||||
|
It could be made even shorter since defined(linux) || defined(__GLIBC__)
|
||||||
|
should be the same as simply defined(__GLIBC__).
|
||||||
|
- fileio.c - open_input_file(): added trailing newline to error message
|
||||||
|
[Debian patch 002, Santiago Vila]
|
||||||
|
|
||||||
|
5.52b (30 Dec 04):
|
||||||
|
- README: added short note about purpose of release 5.52 [Ed Gordon]
|
||||||
|
- format fixes [Ed Gordon]
|
||||||
|
|
||||||
|
5.52c (8 Jan 05):
|
||||||
|
- minor fixes [Ed Gordon]
|
||||||
|
|
||||||
|
5.52d (17 Jan 05):
|
||||||
|
- On VMS, when an odd output byte count is incremented to the next
|
||||||
|
larger even value, the extra byte written is now always zero,
|
||||||
|
reducing random differences between original and extracted files. [SMS]
|
||||||
|
- On VMS, "cannot find either fred;1 or fred;1.zip." messages have been
|
||||||
|
changed to show only non-fictional file names. [SMS]
|
||||||
|
|
||||||
|
|
||||||
|
5.52e (23 Jan 05):
|
||||||
|
- win32/vc6/unzip.dsw (new): replaced win32/VC6.dsp with a complete
|
||||||
|
Visual C++ 6.0 project to build unzip, funzip and unzipsfx, with both
|
||||||
|
ASM and non-ASM settings [CT]
|
||||||
|
- win32: MSC project files now preserve Win32 CRLF line ends [CT]
|
||||||
|
- win32/crc_i386.c: compile only if ASM_CRC is defined [CT]
|
||||||
|
- changed strcasecmp to strncasecmp in vms/vmszip.c [SMS]
|
||||||
|
|
||||||
|
5.52f (27 Jan 05):
|
||||||
|
- win32: for UnZip 5.5x, our tradition "distribute all text files with LF line
|
||||||
|
endings" remains in effect, MSC project files are plain text and get
|
||||||
|
distributed in UNIX LF-only format [SPC]
|
||||||
|
- windll/windll.rc: updated copyright year [SPC]
|
||||||
|
- proginfo/extra.fld: synchronized with current appnote.iz (and PKWARE's
|
||||||
|
appnote.txt v6.2 as of 2004-04-26) [SPC]
|
||||||
|
- win32/makefile.lcc: adapted to current lcc-win32 release [SPC]
|
||||||
|
- windll/uzexampl.c: fixed some function definition mismatches (previously
|
||||||
|
there were different but compatible param types used) [SPC]
|
||||||
|
- extract.c: fixed ucsize/csize mismatch test introduced in UnZip 5.51 and
|
||||||
|
corrected a follow-up extraction size bug (12 excess bytes written) for
|
||||||
|
encrypted stored entries [SPC]
|
||||||
|
- MacOS, OS2 - fixed security holes: formatted output (?printf) should not
|
||||||
|
use unchecked strings as format specifiers [Ulf Harnhammar]
|
||||||
|
- man/unzip.1, man/zipinfo.1: added explicit note on how to supply a
|
||||||
|
left bracket in a filename argument; clarified the scope of the -C option;
|
||||||
|
documented the different compressed size calculation modes for encrypted
|
||||||
|
entries in UnZip's and ZipInfo's listing output [Greg Roelofs, SPC]
|
||||||
|
- list.c, zipinfo.c: fixed ancient bug: when specifying only an exclude list,
|
||||||
|
all not-excluded zip archive entries should be listed [SPC]
|
||||||
|
- extract.c, unzpriv.h, w32.cfg, wce.cfg: added Cdecl modifier to the qsort
|
||||||
|
comparison function (allows use of stdcall mode in SFXWiz project) [SPC]
|
||||||
|
- extract.c, unzpriv.h: use LONGINT consistently for >>all<< zipfile offset
|
||||||
|
variables and adapt some type casts (allow handling of 4G archives on
|
||||||
|
systems that support 64bit file offsets) [Paul Slootman]
|
||||||
|
- renamed LONGINT into Z_OFF_T for better "in-code-documentation" [SPC]
|
||||||
|
- unzpriv.h, NEXTBYTE macro modified to allow compatibility with unsigned
|
||||||
|
bufsize counter incnt [Steven M. Schweda]
|
||||||
|
- unix/unxcfg.h: corrected Debian patch #1 by re-adding __GNU__ conditionals
|
||||||
|
where they appeared before [SPC]
|
||||||
|
- unzip.h, win32/decs.h, win32/struct.h: encapsulated declarations as
|
||||||
|
extern "C" for C++ compilation mode [SPC]
|
||||||
|
- Win32 port: integrated deferred NTSD handling for directories in the
|
||||||
|
generic dir attributes setting functionality [SPC]
|
||||||
|
- Win32: synchronized new MSVC6 project files with master Makefile (removed
|
||||||
|
unused modules and link libs, SFX opt for size, enable DBCS) [SPC]
|
||||||
|
- BeOS: synchronized code with Unix port to support reentrancy [SPC]
|
||||||
|
- All but TOPS20, VMS, WinCE: added length check to externally
|
||||||
|
supplied argument in do_wild() [SPC]
|
||||||
|
|
||||||
|
5.52g (06 Feb 05):
|
||||||
|
- VMS (fileio.c - open_infile()): corrected VMS specific open-args, patch
|
||||||
|
was accidentally left out in 5.52f [SMS, SPC]
|
||||||
|
- win32/w32cfg.h: define Cdecl as empty macro for Watcom C [P. Kienitz, SPC]
|
||||||
|
- win32/win32.c: updated OS-system message in version() [SPC]
|
||||||
|
- extract.c: corrected integer size mismatch in deferred dirs code [SPC]
|
||||||
|
- VMS: support "-T" option as /TIMESTAMP in CLI command interface [SMC]
|
||||||
|
- VMS: updated help files for UNIX and DCL interface with missing descriptions
|
||||||
|
of recently added options and new hint notes [SMC, SPC]
|
||||||
|
- win32/win32.c - set_direc_attribs(): work-around for "cannot set timestamp
|
||||||
|
of read-only dirs" bug [Cosmin Truta]
|
||||||
|
- win32/win32.c - NTQueryVolInfo(): fixed typecast warning [Cosmin Truta]
|
||||||
|
- unzpriv.h, unix/Makefile, win32/Makefile.gcc: changed build policy for
|
||||||
|
POSIX-emulating gcc distributions on Win32 (e.g. CygWin) to default to
|
||||||
|
creating POSIX-mode binaries; win32/Makefile.gcc may be used to build
|
||||||
|
win32-aware binaries (added -DFORCE_WIN32_OVER_UNIX to default compilation
|
||||||
|
options) [Cosmin Truta, SPC]
|
||||||
|
- INSTALL, History.552: stylistic text corrections [Cosmin Truta]
|
||||||
|
- win32/win32.c: complete revision of timestamp handling code; added prepro-
|
||||||
|
cessor flag NO_W32TIMES_IZFIX to allow optional compile with time handling
|
||||||
|
exactly like the (faulty) standard of other Windows programs [SPC]
|
||||||
|
- unzip.c, INSTALL: announce and document new NO_W32TIMES_IZFIX compilation
|
||||||
|
option [SPC]
|
||||||
|
- WHERE: updated to new version numbers for Zip and UnZip [SPC]
|
||||||
|
- README: summary of main changes for 5.52 added [SPC]
|
||||||
|
|
||||||
|
5.52h (20 Feb 05):
|
||||||
|
- License: updated list of core authors [Cosmin Truta, Christian Spieler]
|
||||||
|
- WHERE: further corrections [Cosmin Truta]
|
||||||
|
- windll/windll.c - Wiz_SetOpts(): corrected mapping of PromptToOverwrite and
|
||||||
|
noflag to UnZip's internal options structure, finally fixing the windll
|
||||||
|
extract mode interface (previous change from 5.40 -> 5.41 fixed some
|
||||||
|
issues but created new bugs) [SPC]
|
||||||
|
- windll/windll.txt: documented the exact meaning of the windll struct DCL
|
||||||
|
flags nfflag, ExtractOnlyNewer, noflag, PromptToOverwrite and their
|
||||||
|
interactions [SPC]
|
||||||
|
- win32: set ASM_CRC as default for MSC, GCC, LCC, EMX/RSX (vanilla BCC does
|
||||||
|
not support inline asm) [SPC]
|
||||||
|
|
||||||
|
5.52i (24 Feb 05):
|
||||||
|
- proginfo/ziplimit.txt: corrected enhanced limits of the Zip64 extensions,
|
||||||
|
updated status info on Info-ZIP's support of Zip64 archives [SPC]
|
||||||
|
- windll: renamed MS Visual C++ (5&6) project files into unique names, added
|
||||||
|
master workspace file for building all windll projects in one process [SPC]
|
||||||
|
- windll: extended MS Visual C++ project files to support both ASM_CRC and
|
||||||
|
NOASM builds; changed unzip dll projects to link against the multithreading
|
||||||
|
MS C runtime dll [SPC]
|
||||||
|
- wince/intrface.cpp - utimeToFileTime(): revised code for more efficiency,
|
||||||
|
added support for NO_W32TIMES_IZFIX [SPC]
|
||||||
|
- documentation and changelog fixes [SPC]
|
||||||
|
|
||||||
|
5.52j (27 Feb 05):
|
||||||
|
- AtheOS: some documentation updates (2004-Sep-06) [SPC]
|
||||||
|
- tandem/tanunz.c: fix typo in do_wild() [SPC]
|
||||||
|
- unix/Makefile: added -DUNIX to some special targets, to be sure [SPC]
|
||||||
|
- vms/cmdline.c: corrected declaration of external string constants [SPC]
|
||||||
|
- vms/vms.h: removed obsolete definitions [SPC]
|
||||||
|
- vms/vms.c: stream-lined code formatting [SPC]
|
||||||
|
- WinCE: added workspace file for VCEmbedded 3.0 environment [SPC]
|
||||||
|
- windll/: windll.{c|txt}, uzexampl.{c|h}: misc formatting cleanups [SPC]
|
||||||
|
- extract.c, fileio.c: cosmetic updates [SPC]
|
||||||
|
- inflate.c: fixed undefined global vars error in DEBUG message of the
|
||||||
|
USE_ZLIB interface code [Johnny Lee]
|
||||||
|
- gbloffs.c: made assembler symbols output safe against multiple defines
|
||||||
|
(from UnZip 6.0 beta) [Paul Kienitz, SPC]
|
||||||
|
- Theos: updated theos/Contents, theos/makefile to include Theos-specific
|
||||||
|
translation table header file charconv.h [SPC]
|
||||||
|
- VMS (unzip.c): updated some help messages from UnZip 6.0 beta sources
|
||||||
|
[Steven M. Schweda, SPC]
|
||||||
|
- INSTALL: updated description of VMS_TEXT_CONV option [SPC]
|
||||||
|
- LICENSE, unzip.h: added Steven M. Schweda to Info-ZIP group [SPC]
|
||||||
|
- man/unzip.1: updated Authors list [SPC]
|
||||||
|
- README, unzvers.h: switched to "Release" mode (removed BETA note) [SPC]
|
||||||
|
|
||||||
|
5.52 (28 Feb 05):
|
||||||
|
- win32/win32.c - defer_dir_attribs(): fixed critical "mem-access to nirwana"
|
||||||
|
bug when processing directory entries without any local extra field;
|
||||||
|
added some explaining comments [Kai Uwe Rommel, Johnny Lee, SPC]
|
||||||
|
- wince/punzip.rcv: derive VERSION_PATCH from UZ_PATCHLEVEL [SPC]
|
||||||
|
- Updated release dates (History.552, README, unzvers.h, all man pages) [SPC]
|
||||||
|
|
||||||
|
==================
|
||||||
|
|
||||||
|
These changes occurred in beta versions 5.52a to 5.52. This list may have
|
||||||
|
left out some bugfixes and even some features...void where prohibited, your
|
||||||
|
mileage may vary, etc., etc.
|
||||||
|
|
||||||
|
Christian Spieler
|
641
unzip/unzip-5.52/INSTALL
Normal file
641
unzip/unzip-5.52/INSTALL
Normal file
@ -0,0 +1,641 @@
|
|||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
This is the Info-ZIP file INSTALL (for UnZip), last updated 27 Feb 2005.
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
Yes, this is a rather long file, but don't be intimidated: much of its
|
||||||
|
length is due to coverage of multiple operating systems and of optional
|
||||||
|
customization features, large portions of which may be skipped.
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
To compile UnZip, UnZipSFX and/or fUnZip (quick-start instructions):
|
||||||
|
========================================
|
||||||
|
|
||||||
|
(1) Unpack everything into a work directory somewhere, and make sure you're
|
||||||
|
in the main UnZip directory (the one with this file in it).
|
||||||
|
* (See note below concerning line termination format used in the source
|
||||||
|
distribution)
|
||||||
|
|
||||||
|
(2) Copy the appropriate makefile into the current directory, except under
|
||||||
|
OS/2.
|
||||||
|
|
||||||
|
(3) Run your "make" utility on the makefile (e.g., "nmake -f makefile.msc").
|
||||||
|
|
||||||
|
(4) Try out your new UnZip the way you would any new utility: read the
|
||||||
|
docs first.
|
||||||
|
|
||||||
|
Ah ha ha ha!! Oh, that kills me. But seriously...for VMS, UnZip must
|
||||||
|
be installed as a "foreign symbol"; see the Install section below or
|
||||||
|
[.vms]readme.vms for details. (It basically involves adding a line
|
||||||
|
sort of like this to login.com: $ unzip == "$disk:[dir]unzip.exe")
|
||||||
|
|
||||||
|
For DOS and other OSes without explicit timezone support (i.e., everybody
|
||||||
|
but Unix, Windows 95 and NT), make sure the "TZ" environment variable is
|
||||||
|
set to a valid and reasonable value; see your compiler docs for details.
|
||||||
|
|
||||||
|
(*) The unzip sources as well as other Info-ZIP source archives are packaged
|
||||||
|
in Unix format. All text files use single LF (Ascii 0x0a) characters as
|
||||||
|
line terminators. On systems that use different conventions for plain text
|
||||||
|
files (e.g.:DOS,Win9x,WinNT,OS/2 -> combined CR+LF; MacOS -> single CR),
|
||||||
|
some utilities (editors, compilers, etc.) may not accept source files
|
||||||
|
with LF line terminators.
|
||||||
|
For these systems, we recommend to use Info-ZIP's UnZip utility for
|
||||||
|
extraction of our distribution archives, applying the command option
|
||||||
|
"-a" (= translate text files to native format) in the extraction command.
|
||||||
|
In case this procedure is not applicable, an appropiate third-party
|
||||||
|
conversion utility may be used to achieve the desired line termination
|
||||||
|
style (examples: "flip", available for Unix, DOS, OS/2; or "tr" on Unix).
|
||||||
|
|
||||||
|
|
||||||
|
To compile UnZip, UnZipSFX and/or fUnZip (detailed instructions):
|
||||||
|
========================================
|
||||||
|
|
||||||
|
(1) Unpack *.c and *.h (the actual source files), preserving the directory
|
||||||
|
structure (e.g., ./unix/unix.c). The sole exception is TOPS-20, where
|
||||||
|
tops20/* should be unpacked into the current directory, but TOPS-20
|
||||||
|
is no longer fully supported anyway.
|
||||||
|
|
||||||
|
As of UnZip 5.41, full decryption support has been integrated in the
|
||||||
|
UnZip source distribution. If you wish to compile binaries without
|
||||||
|
decryption support, you must define the preprocessor flag NO_CRYPT.
|
||||||
|
For many environments, you may add this flag to the custom compilation
|
||||||
|
flags supplied by the environment variable LOCAL_UNZIP. For more
|
||||||
|
details, see the make procedures and accompanied documentation for your
|
||||||
|
particular target OS.
|
||||||
|
|
||||||
|
|
||||||
|
(2) Choose the appropriate makefile based on the description in the Con-
|
||||||
|
tents file for your OS (that is, there's only one for Unix or OS/2, but
|
||||||
|
MS-DOS and several other OSes have several, depending on the compiler).
|
||||||
|
Copy it into the current directory and rename if necessary or desired.
|
||||||
|
(Some makefiles can be invoked in place; see (5) below.)
|
||||||
|
|
||||||
|
Don't be afraid to read the makefile! Many options will be explained only
|
||||||
|
in the comments contained therein. The defaults may not quite suit your
|
||||||
|
system. When making changes, remember that some "make" utilities expect
|
||||||
|
tabs as part of the makefile syntax. Failure with cryptic error messages
|
||||||
|
will result if your editor quietly replaces those tabs with spaces.
|
||||||
|
|
||||||
|
Special point of confusion: some non-MSDOS makefiles contain MS-DOS
|
||||||
|
targets (useful for cross-compilations). An example is the OS/2 makefile
|
||||||
|
os2/makefile.os2 that contains the gccdos target for DOS emx+gcc and
|
||||||
|
some more DOS related targets for Watcom C and MSC. But since version 5.3,
|
||||||
|
the msdos subdirectory contains makefiles for all supported DOS compilers.
|
||||||
|
[The old djgpp, djgpp1 and gcc_dos targets in unix/Makefile have been
|
||||||
|
removed in 5.3; use msdos/makefile.dj* instead.]
|
||||||
|
|
||||||
|
Extra-special point of confusion: makefile.os2 expects to remain in
|
||||||
|
the os2 subdirectory. Invoke it via "nmake -f os2/makefile.os2 gcc",
|
||||||
|
for example.
|
||||||
|
|
||||||
|
|
||||||
|
(3) If you want a non-standard version of UnZip, define one or more of the
|
||||||
|
following optional macros, either by adding them to the LOCAL_UNZIP
|
||||||
|
environment variable or by editing your makefile as appropriate. The
|
||||||
|
syntax differs from compiler to compiler, but macros are often defined
|
||||||
|
via "-DMACRO_NAME" or similar (for one called MACRO_NAME). Note that
|
||||||
|
some of these may not be fully supported in future releases (or even
|
||||||
|
in the current release). Note also that very short command lines in
|
||||||
|
MS-DOS (128 characters) may place severe limits on how many of these
|
||||||
|
can be used; if need be, the definitions can be placed at the top of
|
||||||
|
unzip.h instead (it is included in all source files)--for example,
|
||||||
|
"#define MACRO_NAME", one macro per line.
|
||||||
|
|
||||||
|
DOSWILD (MS-DOS only)
|
||||||
|
Treat trailing "*.*" like Unix "*" (i.e., matches anything); treat
|
||||||
|
trailing "*." as match for files without a dot (i.e., matches any-
|
||||||
|
thing, as long as no dots in name). Special treatment only occurs
|
||||||
|
if patterns are at end of arguments; i.e., "a*.*" matches all files
|
||||||
|
starting with "a", but "*.*c" matches all files ending in "c" *only*
|
||||||
|
if they have a dot somewhere before the "c". [The default method of
|
||||||
|
specifying files without a dot would be "* -x *.*", making use of
|
||||||
|
UnZip's exclude-files option.] The matching is actually the same as
|
||||||
|
Unix, if you assume that undotted filenames really have an invisible
|
||||||
|
dot at the end, which is how DOS and related systems treat filenames
|
||||||
|
in general. All other regular expressions (including "?" and
|
||||||
|
"[range_of_chars]") retain their Unix-like behavior.
|
||||||
|
|
||||||
|
WILD_STOP_AT_DIR (incompatible with WINDLL!)
|
||||||
|
Enables an additional option "-W". When this qualifier is specified,
|
||||||
|
the pattern matching routine is modified so that both '?' (single-char
|
||||||
|
wildcard) and '*' (multi-char wildcard) do not match the directory
|
||||||
|
separator character '/'. Examples:
|
||||||
|
"*.c" matches "foo.c" but not "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"
|
||||||
|
To enable matching across directory separator chars, two consecutive
|
||||||
|
multi-char wildcards "**" should be specified.
|
||||||
|
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).
|
||||||
|
|
||||||
|
VMSWILD (VMS only)
|
||||||
|
Use parentheses rather than brackets to delimit sets (ranges), and
|
||||||
|
use '%' instead of '?' as the single-character wildcard for internal
|
||||||
|
filename matching. (External matching of zipfile names always uses
|
||||||
|
the standard VMS wildcard facilities; character sets are disallowed.)
|
||||||
|
|
||||||
|
VMSCLI (VMS only)
|
||||||
|
Use VMS-style "slash options" (/FOOBAR) instead of the default Unix-
|
||||||
|
style hyphenated options (-f). This capability does not affect options
|
||||||
|
stored in environment variables (UNZIP_OPTS or ZIPINFO_OPTS); those use
|
||||||
|
the Unix style regardless. Beginning with UnZip 5.32, the supplied
|
||||||
|
VMS build methods generate both VMS-style and default "UNIX-style"
|
||||||
|
executables; you should NOT add VMSCLI to the custom options.
|
||||||
|
|
||||||
|
CHECK_VERSIONS (VMS only)
|
||||||
|
UnZip "extra fields" are used to store VMS (RMS) filesystem info,
|
||||||
|
and the format of this information may differ in various versions
|
||||||
|
of VMS. Defining this option will enable UnZip warnings when the
|
||||||
|
stored extra-field VMS version(s) do(es) not match the version of
|
||||||
|
VMS currently being used. This is a common occurrence in zipfiles
|
||||||
|
received from other sites, but since the format of the filesystem
|
||||||
|
does not seem to have changed in years (including on Alpha and
|
||||||
|
IA64 systems), the warnings are not enabled by default.
|
||||||
|
|
||||||
|
RETURN_CODES (VMS only)
|
||||||
|
VMS interprets return codes according to a rigid set of guidelines,
|
||||||
|
which means it misinterprets normal UnZip return codes as all sorts
|
||||||
|
of really nasty errors. Therefore VMS UnZip returns an alternate set
|
||||||
|
of return codes; since these may be difficult to interpret, define
|
||||||
|
RETURN_CODES for human-readable explanations.
|
||||||
|
|
||||||
|
VMS_TEXT_CONV (everybody except VMS)
|
||||||
|
VMS Stream_LF-format text files archived with the "-V" option
|
||||||
|
(/VMS) should be readable when extracted on other systems.
|
||||||
|
They may
|
||||||
|
get some junk appended, depending on Zip version and precise options
|
||||||
|
used for archiving them, but appart from that problem they should
|
||||||
|
be fine. Text files with other formats (like the default VFC, with
|
||||||
|
its embedded byte counts) may be only semi-readable at best when
|
||||||
|
extracted on other systems. Defining this option enables UnZip's
|
||||||
|
-aa option to detect and convert VMS VFC-record text files into
|
||||||
|
native text format. Non-VMS UnZips now use a rudimentary VMS extra
|
||||||
|
field analyser to relyably determine such text files. (Earlier
|
||||||
|
versions of UnZip applied some heuristics instead.)
|
||||||
|
Therefore this option is now enabled by default for the main program
|
||||||
|
(but not the SFX stub), because it can be extremely useful on those
|
||||||
|
rare occasions when a VMS text file must be extracted as normal text.
|
||||||
|
|
||||||
|
USE_DJGPP_ENV (MS-DOS DJGPP 2.0x only)
|
||||||
|
Regular DJGPP v2.0x compiled programs which use ENVIRONMENT are
|
||||||
|
able to read from the file "djgpp.env" as well as those set in the
|
||||||
|
environment. This adds about 1KB to the size of the executable.
|
||||||
|
This option is disabled by default in Info-ZIP source. If you are
|
||||||
|
able to use "djgpp.env" and don't like to clutter the environment
|
||||||
|
with many special purpose variables, you may want to compile with
|
||||||
|
this option set.
|
||||||
|
|
||||||
|
USE_DJGPP_GLOB (MS-DOS DJGPP 2.0x only)
|
||||||
|
If you like to get UnZip binaries that handle command line arguments
|
||||||
|
similar to Unix tools which are run in an Unix shell, you might want
|
||||||
|
to set this compilation option. This option enables the support for
|
||||||
|
globbing command line arguments containing wild card that is built
|
||||||
|
into the DJGPP startup code. When using a binary compiled with this
|
||||||
|
option, you may have to enclose wildcard arguments in double quotes
|
||||||
|
to get them passed to the program unmodified. Enabling this option
|
||||||
|
is not recommended, because it results in Info-Zip binaries that do
|
||||||
|
not behave as expected for MS-DOS programs.
|
||||||
|
|
||||||
|
USE_VFAT (MS-DOS only, for using same executable under DOS and Win95/NT)
|
||||||
|
djgpp 2.x and emx/gcc+RSX 5.1 can detect when they are running under a
|
||||||
|
Win32 DOS box and will accordingly enable long-filename support. For
|
||||||
|
now only djgpp 2.x and emx/gcc with RSX 5.1 or later have this feature
|
||||||
|
(and it is defined by default in msdos/makefile.dj2 and makefile.emx),
|
||||||
|
but if/when other compilers build in similar support, define this
|
||||||
|
macro to enable its use. See also msdos/doscfg.h. [Note that djgpp
|
||||||
|
2.0's LFN support is flaky; users should upgrade to 2.01 or later.]
|
||||||
|
|
||||||
|
NO_W32TIMES_IZFIX (Win32 including WinDLL, and WinCE)
|
||||||
|
By specifying this option, you can disable Info-ZIP's special timestamp
|
||||||
|
adjustment to get stable time stamps on NTFS disks that do not change
|
||||||
|
depending on the current time being normal vs. daylight saving time.
|
||||||
|
When this option is set, UnZip behaves exactly like other programs;
|
||||||
|
file timestamps on NTFS partitions are created so that their >current<
|
||||||
|
local time representation displayed by directory listings (cmd.exe "dir"
|
||||||
|
command or Windows Explorer listings) is the same as shown by UnZip's
|
||||||
|
listing. But the actual UTC timestamp values stored in the NTFS
|
||||||
|
file attributes vary depending on whether extraction is done at
|
||||||
|
summer or winter time.
|
||||||
|
This option is not recommended because it sacrifies the timestamp
|
||||||
|
comparison checks when extracting or modifying archives in "update
|
||||||
|
only newer" mode.
|
||||||
|
However, for environments where consistency of >displayed< dates
|
||||||
|
of files extracted to NTFS vs. FAT disks is considered more important
|
||||||
|
than correctly working update/freshen tasks of Zip&UnZip, this
|
||||||
|
option may be used.
|
||||||
|
>> DO NOT DISTRIBUTE OR PUBLISH executables that were compiled with
|
||||||
|
this option! <<
|
||||||
|
|
||||||
|
NOTIMESTAMP
|
||||||
|
This option disables the -T option, which basically does exactly what
|
||||||
|
Zip's -go options do (i.e., set the timestamp of the zipfile to that of
|
||||||
|
the newest file in the archive without rewriting the archive). Unlike
|
||||||
|
Zip, however, UnZip supports wildcard specifications for the archive
|
||||||
|
name; for example, "unzip -T *.zip" will set the dates of all zipfiles
|
||||||
|
in the current directory. (UnZip's option is also much faster.)
|
||||||
|
|
||||||
|
DATE_FORMAT=DF_DMY or DF_MDY or DF_YMD
|
||||||
|
This option controls the order in which date components are printed
|
||||||
|
in listings: day-month-year or month-day-year or year-month-day.
|
||||||
|
For DOS, FlexOS, OS2, Theos and Win32, the format is automatically
|
||||||
|
obtained from the operating system; most others default to DF_MDY.
|
||||||
|
|
||||||
|
DATE_SEPCHAR='-' or '.' or '/' etc.
|
||||||
|
This option controls the character that separates the date components
|
||||||
|
shown in (non-ZipInfo-mode) listings. The Win32 port obtains the
|
||||||
|
separator automatically from the operating system's locale settings;
|
||||||
|
all others default to '-'.
|
||||||
|
|
||||||
|
ACORN_FTYPE_NFS (needs support for long filenames with embedded commas)
|
||||||
|
This option enables a -F option that instructs UnZip to interpret the
|
||||||
|
filetype information extracted from Acorn RiscOS extra field blocks.
|
||||||
|
The filetype IDs are translated into "NFS filetype extensions" and
|
||||||
|
appended to the names of the extracted files. This feature facilitates
|
||||||
|
maintenance of Unix-based NFS volumes that are exported to Acorn RiscOS
|
||||||
|
systems.
|
||||||
|
|
||||||
|
QLZIP (Unix only)
|
||||||
|
Add some support for QDOS extra fields. This option enables Unix
|
||||||
|
UnZip to append "datalen info" to QDOS exec type files in the same
|
||||||
|
format as used by QDOS cross-compilers on Unix or the qltools v2.2(+).
|
||||||
|
|
||||||
|
UNIXBACKUP (Unix only)
|
||||||
|
This option enables a -B option that instructs UnZip to rename files
|
||||||
|
that would normally be overwritten. The renamed files are given a
|
||||||
|
tilde suffix (`~'). Note that previously renamed files may be over-
|
||||||
|
written without notice, even if the -n option is given.
|
||||||
|
|
||||||
|
OS2_EAS
|
||||||
|
List the sizes of OS/2 EAs and ACLs for each file as two extra columns
|
||||||
|
in "unzip -l" output. This is primarily useful for OS/2 systems, but
|
||||||
|
because zipfiles are portable, OS2_EAS can be defined for any system.
|
||||||
|
(May be extended someday to show sizes of Mac resource forks, RISCOS
|
||||||
|
and VMS file info, etc.)
|
||||||
|
|
||||||
|
DELETE_IF_FULL (anybody with unlink() function)
|
||||||
|
If a write error is encountered (most likely due to a full disk),
|
||||||
|
enabling this option will cause the incomplete file to be deleted
|
||||||
|
instead of closed normally. This is particularly useful for the
|
||||||
|
Windows CE port, which must generally contend with extremely limited
|
||||||
|
resources.
|
||||||
|
|
||||||
|
ASM_CRC (Amiga/Aztec C; many x86 systems: DOS, OS/2, Win32, Unix)
|
||||||
|
Use an assembler routine to calculate the CRC for each file (speed).
|
||||||
|
|
||||||
|
ASM_INFLATECODES (Amiga/Aztec C only, for now)
|
||||||
|
Use an assembler version of inflate_codes() for speed.
|
||||||
|
|
||||||
|
OLD_EXDIR
|
||||||
|
No longer supported.
|
||||||
|
|
||||||
|
SFX_EXDIR
|
||||||
|
Enable the "-d <extract_dir>" option for UnZipSFX. This is now
|
||||||
|
enabled by default (since UnZip 5.5) to facilitate use with
|
||||||
|
automated installation scripts and the like. For disabling
|
||||||
|
this feature, see the NO_SFX_EXDIR option.
|
||||||
|
|
||||||
|
NO_SFX_EXDIR
|
||||||
|
Disables the "-d <extract_dir>" option for UnZipSFX to generate the
|
||||||
|
smallest possible executable stub. (Prior to the UnZip 5.5 release,
|
||||||
|
this was the default.)
|
||||||
|
|
||||||
|
CHEAP_SFX_AUTORUN
|
||||||
|
Enable a simple "run command after extraction" feature for
|
||||||
|
the (command line) UnZipSFX stub. This feature is currently
|
||||||
|
incompatible with the "-d <extract_dir>" command line option,
|
||||||
|
therefore CHEAP_SFX_AUTORUN implicitely sets the NO_SFX_EXDIR
|
||||||
|
option.
|
||||||
|
|
||||||
|
NO_ZIPINFO
|
||||||
|
Compile without ZipInfo mode (-Z) enabled; makes a smaller executable
|
||||||
|
because many text strings are left out. Automatically enabled for
|
||||||
|
some small-model compiles under MS-DOS and OS/2, so ordinarily there
|
||||||
|
is no need to specify this explicitly. (Note that even with this
|
||||||
|
defined, the resulting executable may still be too big to extract
|
||||||
|
some zipfiles correctly, if compiled with the small memory model.)
|
||||||
|
|
||||||
|
USE_DEFLATE64 (default for UnZip and fUnZip)
|
||||||
|
NO_DEFLATE64 (default for UnZipSFX stub)
|
||||||
|
The "deflate64" algorithm from PKZIP 4.0 (or newer) is an enhanced
|
||||||
|
variant of the deflate algorithm that achieves slightly better
|
||||||
|
compression ratios on highly redundant data. Normally, UnZip should
|
||||||
|
be compiled with support for this compression algorithm enabled.
|
||||||
|
However, this results in significantly larger memory requirements
|
||||||
|
to run the program. For 16-bit executables (DOS and OS/2), the
|
||||||
|
special memory management to support the 64k history buffer results
|
||||||
|
in a slight performance (= speed) penalty. And for the SFX stub,
|
||||||
|
"deflate64" support might be unnessessary as long as the Info-ZIP
|
||||||
|
Zip utility does not support it (quite likely, this will never
|
||||||
|
get implemented). So, the NO_DEFLATE64 option is provided to allow
|
||||||
|
exclusion of the deflate64 support.
|
||||||
|
|
||||||
|
MULT_VOLUME (experimental for 5.5x, do NOT use in production versions!)
|
||||||
|
NO_MULT_VOLUME (default)
|
||||||
|
The symbol MULT_VOLUME is used to flag code portions needed for
|
||||||
|
support of multi-volume archives. For now, this flag MUST NOT be
|
||||||
|
used to compile a production versions of UnZip. This flag has been
|
||||||
|
introduced to allow integration of experimental code for multi-volume
|
||||||
|
support in the master source tree. This feature will become a default
|
||||||
|
option in the future 6.0 release of UnZip.
|
||||||
|
|
||||||
|
LZW_CLEAN
|
||||||
|
USE_UNSHRINK (now default, as of January 2005)
|
||||||
|
The "shrinking" algorithm from PKZIP 1.0 is an LZW variant. Unisys
|
||||||
|
patented the Lempel-Ziv-Welch algorithm in 1985 and has publicly
|
||||||
|
claimed that decompression is covered by it. (IBM also patented the
|
||||||
|
same thing in a filing 3 weeks prior to Unisys's.) In 2004, the
|
||||||
|
Unisys and IBM patents expired worldwide, so unshrinking is now
|
||||||
|
enabled again by default. If you do not wish to include the LZW
|
||||||
|
method, you may still disable it by defining LZW_CLEAN.
|
||||||
|
(Unshrinking was used by PKZIP 1.0 and 1.1, and Zip 1.0 and 1.1.
|
||||||
|
All newer archives use only the deflation method.)
|
||||||
|
|
||||||
|
COPYRIGHT_CLEAN (now default)
|
||||||
|
USE_SMITH_CODE
|
||||||
|
The last chunk of code in UnZip that was blatantly derived from Sam
|
||||||
|
Smith's unzip 2.0 (as in, "substantially similar") is in unreduce.c.
|
||||||
|
Since reducing was only used by very early PKZIP beta versions (0.9x),
|
||||||
|
support for it is now omitted by default (COPYRIGHT_CLEAN). To in-
|
||||||
|
clude unreducing capability, define USE_SMITH_CODE and replace the
|
||||||
|
stub unreduce.c source file by the separatly distributed full source
|
||||||
|
code module. Note that this subjects UnZip to any and all restrictions
|
||||||
|
in Smith's copyright; see the UnZip COPYING.OLD file for details.
|
||||||
|
|
||||||
|
USE_CRYPT
|
||||||
|
Enable decryption support for all binaries. The default setting
|
||||||
|
is to disable decryption support for the SFX stub to keep its size
|
||||||
|
as small as possible. For other binaries of the UnZip distribution,
|
||||||
|
decryption support is enabled by default.
|
||||||
|
|
||||||
|
NO_CRYPT
|
||||||
|
Disable decryption support for all binaries.
|
||||||
|
|
||||||
|
PASSWD_FROM_STDIN (with full crypt sources only; Unix, VMS only)
|
||||||
|
Used to allow the password on encrypted files to be read from stdin
|
||||||
|
rather than the default stderr. This was useful for those who wished
|
||||||
|
to automate the testing or decoding of encrypted archives (say, in a
|
||||||
|
shell script via ``echo "password" | unzip -tq archive''), but as of
|
||||||
|
version 5.3, UnZip has a -P option for passing a password directly to
|
||||||
|
the program. PASSWD_FROM_STDIN will therefore probably be phased out
|
||||||
|
in future versions. Note that the same security warnings given in the
|
||||||
|
description of the -P option apply here as well.
|
||||||
|
|
||||||
|
DEBUG
|
||||||
|
Used for debugging purposes; enables Trace() statements. Generally
|
||||||
|
it's best to compile only one or two modules this way.
|
||||||
|
|
||||||
|
DEBUG_TIME
|
||||||
|
Used for debugging the timezone code in fileio.c; enables TTrace()
|
||||||
|
statements. This code is only used for the freshen/update options
|
||||||
|
(-f and -u), and non-Unix compilers often get it wrong.
|
||||||
|
|
||||||
|
|
||||||
|
(4) If you regularly compile new versions of UnZip and always want the same
|
||||||
|
non-standard option(s), you may wish to add it (them) to the LOCAL_UNZIP
|
||||||
|
environment variable (assuming it's supported in your makefile). Under
|
||||||
|
MS-DOS, for example, add this to AUTOEXEC.BAT:
|
||||||
|
|
||||||
|
set LOCAL_UNZIP=-DDOSWILD -DDATE_FORMAT=DF_DMY
|
||||||
|
|
||||||
|
You can also use the variable to hold special compiler options (e.g.,
|
||||||
|
-FPi87 for Microsoft C, if the x87 libraries are the only ones on your
|
||||||
|
disk and they follow Microsoft's default naming conventions; MSC also
|
||||||
|
supports the CL environment variable, however).
|
||||||
|
|
||||||
|
|
||||||
|
(5) Run the make utility on your chosen makefile:
|
||||||
|
|
||||||
|
Unix
|
||||||
|
For most systems it's possible to invoke the makefile in place, at
|
||||||
|
the possible cost of an ignorable warning; do "make -f unix/Makefile
|
||||||
|
list" to get a list of possible system targets, and then "make -f
|
||||||
|
unix/Makefile target" for your chosen target. The "generic" target
|
||||||
|
works for most systems, but if it fails with a message about ftime()
|
||||||
|
unresolved or timezone redefined, do "make clean", "make help", and
|
||||||
|
then either "make generic2" or "make generic3" as instructed. If all
|
||||||
|
else fails, read the makefile itself; it contains numerous comments.
|
||||||
|
(One of these days we'll make a configure script that automates this
|
||||||
|
procedure better.)
|
||||||
|
|
||||||
|
VMS (OpenVMS):
|
||||||
|
For a one-time build of the default UnZip, simply run the supplied
|
||||||
|
command file MAKE_UNZ.COM. To use either DEC C on an Alpha or the
|
||||||
|
default compiler (DEC C if available, else VAX C) on a VAX, type
|
||||||
|
"@make_unz" (after copying make_unz.com into the current directory;
|
||||||
|
otherwise do "@[.vms]make_unz" to invoke it in place).
|
||||||
|
If you want to force the use of VAX C when both VAX C and DEC C are
|
||||||
|
available, do "@make_unz vaxc" (or "@[.vms]make_unz vaxc").
|
||||||
|
To use GNU C (gcc) on either platform, do "@make_unz gnuc".
|
||||||
|
(NOTE: Currently, gcc for VMS(AXP) is not yet available!)
|
||||||
|
The command procedure MAKE_UNZ.COM now recognizes custom feature
|
||||||
|
options supplied in the logical name LOCAL_UNZIP; details are
|
||||||
|
explained in the comments at the top of MAKE_UNZ.COM.
|
||||||
|
|
||||||
|
For repeated makes or other hacker-like tinkering with the sources,
|
||||||
|
or to create a custom version of UnZip, you may use the included "MMS"
|
||||||
|
makefile, DESCRIP.MMS. Copy it into the current directory, read the
|
||||||
|
comments at the top of it and run MadGoat's free MMS clone "MMK" on it.
|
||||||
|
Newer versions of DEC's MMS should work, too, but older ones apparently
|
||||||
|
choke on some MMK-specific extensions in DESCRIP.MMS. (If somebody
|
||||||
|
has an "older" version that works, let us know and we'll remove this
|
||||||
|
caveat.)
|
||||||
|
|
||||||
|
MS-DOS
|
||||||
|
See the msdos\Contents file for notes regarding which makefile(s) to
|
||||||
|
use with which compiler. In summary: pick one of msdos\makefile.*
|
||||||
|
as appropriate, or (as noted above) use the OS/2 gccdos target for
|
||||||
|
emx+gcc. There is also an mscdos cross-compilation target in
|
||||||
|
os2\makefile.os2 and a sco_dos cross-compilation target in the Unix
|
||||||
|
makefile. For Watcom 16-bit or 32-bit versions, see the comments in
|
||||||
|
the OS/2 section below.
|
||||||
|
|
||||||
|
After choosing the appropriate makefile and editing as necessary or
|
||||||
|
desired, invoke the corresponding make utility. Microsoft's NMAKE
|
||||||
|
and the free dmake and GNU make utilities are generally the most
|
||||||
|
versatile. The makefiles in the msdos directory can be invoked in
|
||||||
|
place ("nmake -f msdos\makefile.msc", for example).
|
||||||
|
|
||||||
|
OS/2
|
||||||
|
Either GNU make, nmake or dmake may be used with the OS/2 makefile;
|
||||||
|
all are freely available on the net. Do "nmake -f os2\makefile.os2",
|
||||||
|
for example, to get a list of supported targets. More generally,
|
||||||
|
read the comments at the top of the makefile for an explanation of
|
||||||
|
the differences between some of the same-compiler targets.
|
||||||
|
|
||||||
|
Win32 (WinNT or Win95)
|
||||||
|
You will need Microsoft Visual C++ 2.x for Win95 or NT (Intel, MIPS,
|
||||||
|
Alpha, PowerPC?), or Watcom C++ for Win95 or NT (Intel only). As an
|
||||||
|
alternative for Intel platforms, GNU C (the emx/rsxnt port) is now
|
||||||
|
supported as well. DEC C/C++ for NT/Alpha may or may not still work.
|
||||||
|
For the Watcom compiler, use WMAKE and win32\makefile.wat; for the
|
||||||
|
others, use NMAKE and win32\Makefile. With emx+gcc, a good choice is
|
||||||
|
GNUMake 3.75 from the djgpp V2.01 distribution.
|
||||||
|
|
||||||
|
WinCE (WinCE or WinNT)
|
||||||
|
Only Microsoft Visual C++ 5.0 or later is supported. Use the included
|
||||||
|
project file and check wince\README for details.
|
||||||
|
|
||||||
|
AmigaDOS
|
||||||
|
SAS/Lattice C and Manx Aztec C are supported. For SAS C 6.x do "smake
|
||||||
|
-f amiga/smakefile all"; for Aztec C do "make -f amiga/makefile.azt
|
||||||
|
all". The Aztec C version supports assembly-language versions of two
|
||||||
|
routines; these are enabled by default.
|
||||||
|
|
||||||
|
Atari TOS
|
||||||
|
Turbo C is no longer supported; use gcc and the MiNT libraries, and
|
||||||
|
do "make". Note that all versions of gcc prior to 2.5.8 have a bug
|
||||||
|
affecting 68000-based machines (optimizer adds 68020 instructions).
|
||||||
|
See atari\README for comments on using other compilers.
|
||||||
|
|
||||||
|
Macintosh
|
||||||
|
Metrowerks CodeWarrior Pro 4 with Universal Interfaces 3.1 is the only
|
||||||
|
currently supported compiler, although the Mac Programmer's Workbench
|
||||||
|
(MPW) and Think C were supported at one time and still have some hooks.
|
||||||
|
Other Compilers may work too, no compiler specific instructions
|
||||||
|
(pragma, header, macros, ...) were used in the code.
|
||||||
|
For CodeWarrior Pro 4, un-BinHex the CodeWarrior project file and
|
||||||
|
UnZip resource file (using Stuffit Expander or BinHex 4.0 or later),
|
||||||
|
then open the project and click on the compile button.
|
||||||
|
See ":macos:Contents" for the possible project targets.
|
||||||
|
Link order of the standard libraries is very important: Link all
|
||||||
|
sources first and all standard libraries last.
|
||||||
|
|
||||||
|
Acorn (RISC OS)
|
||||||
|
Extract the files from the archive and place in standard 'Acorn' C
|
||||||
|
form (i.e., *.c, *.h and *.s become c.*, h.* and s.*, respectively),
|
||||||
|
either using the UNZIP$EXTS environment variable and a pre-built UnZip
|
||||||
|
binary, or using Spark[FS] and doing it manually. Then copy the
|
||||||
|
Acorn.Makefile to the main UnZip directory and either type 'amu' or
|
||||||
|
use the desktop make utility.
|
||||||
|
|
||||||
|
VM/CMS
|
||||||
|
Unpack all the files and transfer them with ASCII -> EBCDIC conver-
|
||||||
|
sion to an appropriate directory/minidisk/whatever, then execute
|
||||||
|
UNZVMC to compile and link all the sources. This may require C/370
|
||||||
|
version 2.1 or later and certain `nucleus extensions,' although
|
||||||
|
UnZip 5.3 has been reported to compile fine with the `ADCYCLE C/370
|
||||||
|
v1.2 compiler.' Note that it will abend without access to the C/370
|
||||||
|
runtime library. See the README.CMS file for more details.
|
||||||
|
|
||||||
|
MVS
|
||||||
|
Unpack all the files and transfer them to an appropriate PDS with
|
||||||
|
ASCII -> EBCDIC conversion enabled, then edit UNZMVSC.JOB as required,
|
||||||
|
and execute it to compile and link all the sources. C/370 2.1 or
|
||||||
|
later is required. See README.MVS for further details. [This is a
|
||||||
|
new port and may need a little more work even to compile.]
|
||||||
|
|
||||||
|
Human68K
|
||||||
|
[This is a Japanese machine and OS.] It appears that GNU make and
|
||||||
|
gcc are required; presumably just do "gmake -f human68k/Makefile.gcc"
|
||||||
|
to build everything. This port has not been tested since the 5.12
|
||||||
|
release.
|
||||||
|
|
||||||
|
TOPS-20
|
||||||
|
[No longer fully supported due to new, unported features, although
|
||||||
|
patches are always accepted.] Unpack all files into the current
|
||||||
|
directory only (including those in the zipfile's tops20 directory),
|
||||||
|
then use make.mic and "do make".
|
||||||
|
|
||||||
|
BeOS
|
||||||
|
You can run the BeOS makefile in place by typing "make -f
|
||||||
|
beos/Makefile". In fact, this is how the author tests it.
|
||||||
|
|
||||||
|
Running the appropriate make utility should produce three executables on
|
||||||
|
most systems, one for UnZip/ZipInfo, one for UnZipSFX, and one for fUnZip.
|
||||||
|
(VMS is one prominent exception: fUnZip makes no sense on it. The Amiga
|
||||||
|
produces a fourth executable called MakeSFX, which is necessary because
|
||||||
|
Amiga self-extracting archives cannot be created by simple concatenation.
|
||||||
|
If necessary the source amiga/makesfx.c can be compiled on other systems.)
|
||||||
|
Read any OS-specific README files for notes on setting things up for
|
||||||
|
normal use (especially for VMS) and for warnings about known quirks and
|
||||||
|
bugs in various compilers (especially for MS-DOS).
|
||||||
|
|
||||||
|
Also note that many OSes require a timezone variable to be set correctly
|
||||||
|
(often "TZ"); Unix and VMS generally do so by default, Win95/NT do if set
|
||||||
|
up properly, but other OSes generally do not. See the discussion of the
|
||||||
|
-f and -u options in the UnZip man page (or unzip.txt). BeOS doesn't
|
||||||
|
currently support timezone information at all, but this will probably be
|
||||||
|
added soon.
|
||||||
|
|
||||||
|
Then test your new UnZip on a few archives and let us know if there are
|
||||||
|
problems (but *please* first make certain that the archives aren't actu-
|
||||||
|
ally corrupted and that you didn't make one of the silly mistakes dis-
|
||||||
|
cussed in the documentation). If possible, double-check any problems
|
||||||
|
with PKUNZIP or with a previous version of UnZip prior to reporting a
|
||||||
|
"bug." The zipfile itself may be damaged.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
To install:
|
||||||
|
===========
|
||||||
|
|
||||||
|
Unix
|
||||||
|
The default prefix for the installation location is /usr/local (things
|
||||||
|
go into the bin and man/man1 subdirectories beneath the prefix), and
|
||||||
|
the default man-page extension is "1" (corresponding to man/man1, above).
|
||||||
|
To install as per the defaults, do "make install"; otherwise do "make
|
||||||
|
prefix=/your/path manext=your_extension install". (For Intel Unix flavors
|
||||||
|
where the assembler CRC routines were used [ASM_CRC], use the install_asm
|
||||||
|
target instead of the regular install target.) For example, to install
|
||||||
|
in your home directory with "l" as the man-page extension (for "local"),
|
||||||
|
do "make prefix=$HOME manext=l install". Permissions will be 755 for the
|
||||||
|
executables and 644 for the man pages. In general root must perform in-
|
||||||
|
stallation into a public directory. Do "rehash" if your shell requires
|
||||||
|
it in order to find the new executables.
|
||||||
|
|
||||||
|
VMS
|
||||||
|
Install UnZip as foreign symbol by adding this to login.com:
|
||||||
|
|
||||||
|
$ unzip == "$disk:[dir]unzip.exe"
|
||||||
|
$ zipinfo == "$disk:[dir]unzip.exe ""-Z"""
|
||||||
|
|
||||||
|
where "disk" and "dir" are the location of the UnZip executable; the "$"
|
||||||
|
before the disk name is important, as are the double-double-quotes around
|
||||||
|
the -Z. Some people, including the author, prefer a short alias such as
|
||||||
|
"ii" instead of "zipinfo"; edit to taste. Optionally also install unzipsfx
|
||||||
|
for use with the MAKESFX.COM command file. See vms/README (or [.VMS]README.)
|
||||||
|
for details on this and for notes/warnings about zipfiles and UnZip under
|
||||||
|
VMS.
|
||||||
|
|
||||||
|
OS/2, MS-DOS, NT, Atari, Amiga
|
||||||
|
Move or copy unzip.exe (or unzip.ttp, or UnZip, or whatever) to a direc-
|
||||||
|
tory in your path; also possibly copy the UnZip executable to zipinfo.exe
|
||||||
|
(or ii.exe), or else create an alias or a batch/command file for ZipInfo
|
||||||
|
("@unzip -Z %1 %2 %3 %4 %5 %6 %7 %8 %9" under MS-DOS). The latter is only
|
||||||
|
relevant if NO_ZIPINFO was *not* defined, obviously... Under djgpp 2.x,
|
||||||
|
zipinfo.exe is a 2K stub symbolically linked to unzip.exe.
|
||||||
|
|
||||||
|
Acorn RISC OS
|
||||||
|
Copy the executables unzip, funzip and zipinfo to somewhere in your
|
||||||
|
Run$Path. See your Welcome manual if you don't know about Run$Path.
|
||||||
|
|
||||||
|
BeOS
|
||||||
|
The default prefix for the installation location is /boot/usr/local
|
||||||
|
(things go into the bin and man/man1 subdirectories beneath the prefix),
|
||||||
|
and the default man-page extension is "1" (corresponding to the man/man1,
|
||||||
|
above). Of course, these Unix man-pages aren't useful until someone ports
|
||||||
|
something that can format them... plain text versions are also installed
|
||||||
|
with an extension of ".txt". To install, do a "make install", or to
|
||||||
|
change the prefix, do "make prefix=/your/path install". For example, to
|
||||||
|
install in /boot/bin, do "make prefix=/boot/bin install".
|
||||||
|
|
||||||
|
Macintosh
|
||||||
|
MacZip requires at least System 7 and a Macintosh with a minimum of a
|
||||||
|
Motorola 68020 or PowerPC 601 processor. Other configurations may work
|
||||||
|
but it is not tested at all.
|
||||||
|
The application (MacZip) is distributed as a combination of zip and unzip
|
||||||
|
in one program. The offical release is a fat binary with both regular 68K
|
||||||
|
and native PowerPC versions included.
|
||||||
|
Move the executable(s) somewhere--for example, drag it (or them) to your
|
||||||
|
Applications folder. For easy access, make an alias in the Launcher Control
|
||||||
|
Panel or directly on your desktop.
|
||||||
|
This port supports also Apple-event.So you can install it in your
|
||||||
|
WWW-Browser as a helper-app.
|
||||||
|
Look into "macos/README.TXT" (or ":macos:README.TXT" on Mac) for further
|
||||||
|
info.
|
||||||
|
|
||||||
|
Human68K, TOPS-20, AOS/VS, MVS, VM/CMS, etc.
|
||||||
|
Dunno, sorry...
|
55
unzip/unzip-5.52/LICENSE
Normal file
55
unzip/unzip-5.52/LICENSE
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
This is version 2005-Feb-10 of the Info-ZIP copyright and license.
|
||||||
|
The definitive version of this document should be available at
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely.
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 1990-2005 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 following restrictions:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
definition, disclaimer, and this list of conditions.
|
||||||
|
|
||||||
|
2. Redistributions in binary form (compiled executables) must reproduce
|
||||||
|
the above copyright notice, definition, disclaimer, and this list of
|
||||||
|
conditions in documentation and/or other materials provided with the
|
||||||
|
distribution. 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, and dynamic,
|
||||||
|
shared, or static library versions--must be plainly marked as such
|
||||||
|
and must not be misrepresented as being 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 of the Info-ZIP URL(s).
|
||||||
|
|
||||||
|
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.
|
288
unzip/unzip-5.52/README
Normal file
288
unzip/unzip-5.52/README
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
This is the README file for the 28 February 2005 public release of the
|
||||||
|
Info-ZIP group's portable UnZip zipfile-extraction program (and related
|
||||||
|
utilities).
|
||||||
|
|
||||||
|
unzip552.zip portable UnZip, version 5.52, source code distribution
|
||||||
|
unzip552.tar.Z same as above, but compress'd tar format
|
||||||
|
unzip552.tar.gz same as above, but gzip'd tar format
|
||||||
|
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
BEFORE YOU ASK: UnZip, its companion utility Zip, and related utilities
|
||||||
|
and support files can be found in many places; read the file "WHERE" for
|
||||||
|
further details. To contact the authors with suggestions, bug reports,
|
||||||
|
or fixes, continue reading this file (README) and, if this is part of a
|
||||||
|
source distribution, the file "ZipPorts" in the proginfo directory. Also
|
||||||
|
in source distributions: read "BUGS" for a list of known bugs, non-bugs
|
||||||
|
and possible future bugs; INSTALL for instructions on how to build UnZip;
|
||||||
|
and "Contents" for a commented listing of all the distributed files.
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
|
||||||
|
GENERAL INFO
|
||||||
|
------------
|
||||||
|
UnZip is an extraction utility for archives compressed in .zip format (also
|
||||||
|
called "zipfiles"). Although highly compatible both with PKWARE's PKZIP
|
||||||
|
and PKUNZIP utilities for MS-DOS and with Info-ZIP's own Zip program, our
|
||||||
|
primary objectives have been portability and non-MSDOS functionality.
|
||||||
|
|
||||||
|
This version of UnZip has been ported to a stupendous array of hardware--
|
||||||
|
from micros to supercomputers--and operating systems: Unix (many flavors),
|
||||||
|
VMS, OS/2 (including DLL version), Windows NT and Windows 95 (including DLL
|
||||||
|
version), Windows CE (GUI version), Windows 3.x (including DLL version),
|
||||||
|
MS-DOS, AmigaDOS, Atari TOS, Acorn RISC OS, BeOS, Macintosh (GUI version),
|
||||||
|
SMS/QDOS, MVS, VM/CMS, FlexOS, Tandem NSK, Human68k (mostly), AOS/VS (partly)
|
||||||
|
and TOPS-20 (partly). UnZip features not found in PKUNZIP include source
|
||||||
|
code; default extraction of directory trees (with a switch to defeat this,
|
||||||
|
rather than the reverse); system-specific extended file attributes; and, of
|
||||||
|
course, the ability to run under most of your favorite operating systems.
|
||||||
|
Plus, it's free. :-)
|
||||||
|
|
||||||
|
For source distributions, see the main Contents file for a list of what's
|
||||||
|
included, and read INSTALL for instructions on compiling (including OS-
|
||||||
|
specific comments). The individual operating systems' Contents files (for
|
||||||
|
example, vms/Contents) may list important compilation info in addition to
|
||||||
|
explaining what files are what, so be sure to read them. Some of the ports
|
||||||
|
have their own, special README files, so be sure to look for those, too.
|
||||||
|
|
||||||
|
See unzip.1 or unzip.txt for usage (or the corresponding UnZipSFX, ZipInfo,
|
||||||
|
fUnZip and ZipGrep docs). For VMS, unzip_def.rnh or unzip_cli.help may be
|
||||||
|
compiled into unzip.hlp and installed as a normal VMS help entry; see
|
||||||
|
vms/descrip.mms.
|
||||||
|
|
||||||
|
|
||||||
|
CHANGES AND NEW FEATURES
|
||||||
|
------------------------
|
||||||
|
The 5.52 maintenance release fixes a few minor problems found in the 5.51
|
||||||
|
release, closes some more security holes, adds a new AtheOS port, and
|
||||||
|
contains a Win32 extra-field code cleanup that was not finished earlier.
|
||||||
|
The most important changes are:
|
||||||
|
|
||||||
|
- (re)enabled unshrinking support by default, the LZW patents have expired
|
||||||
|
- fixed an extraction size bug for encrypted stored entries (12 excess bytes
|
||||||
|
were written with 5.51)
|
||||||
|
- fixed false "uncompressed size mismatch" messages when extracting
|
||||||
|
encrypted archive entries
|
||||||
|
- do not restore SUID/SGID/Tacky attribute bits on Unix (BeOS, AtheOS)
|
||||||
|
unless explicitely requested by new "-K" command line qualifier
|
||||||
|
- optional support for "-W" qualifier to modify the pattern matching syntax
|
||||||
|
(with -W: "*" stops at directory delimiter, "**" matches unlimited)
|
||||||
|
- prevent buffer overflow caused by bogus extra-long Zipfile specification
|
||||||
|
- performance enhancements for VMS port
|
||||||
|
- fixed windll interface handling of its extraction mode qualifiers
|
||||||
|
nfflag, ExtractOnlyNewer, noflag, PromptToOverwrite; added detailed
|
||||||
|
explanation of their meanings and interactions to the windll documentation
|
||||||
|
|
||||||
|
The 5.51 maintenance release adds a command-line CE port, intended for
|
||||||
|
batch processing. With the integration of this port, the pUnZip port
|
||||||
|
has been revised and "revitalized".
|
||||||
|
The most important changes for the general public are a number of
|
||||||
|
bug fixes, mostly related to security issues:
|
||||||
|
|
||||||
|
- repair a serious bug in the textmode output conversion code for the 16-bit
|
||||||
|
ports (16-bit MSDOS, OS/2 1.x, some variants of AMIGA, possibly others)
|
||||||
|
which was introduced by the Deflate64 support of release 5.5
|
||||||
|
- fix a long standing bug in the the inflate decompression method that
|
||||||
|
prevented correct extraction in some rare cases
|
||||||
|
- fixed holes in parent dir traversal security code (e.g.: ".^C." slipped
|
||||||
|
through the previous version of the check code)
|
||||||
|
- fixed security hole: check naming consistency in local and central header
|
||||||
|
- fixed security hole: prevent extracted symlinks from redirecting file
|
||||||
|
extraction paths
|
||||||
|
|
||||||
|
The main addition in the 5.5 release is support for PKWARE's new Deflate64(tm)
|
||||||
|
algorithm, which appeared first in PKZIP 4.0 (published November 2000).
|
||||||
|
As usual, some other bugfixes and clean-ups have been integrated:
|
||||||
|
|
||||||
|
- support for Deflate64 (Zip compression method #9)
|
||||||
|
- support for extracting VMS variable length record text files on
|
||||||
|
any system
|
||||||
|
- optional "cheap autorun" feature for the SFX stub
|
||||||
|
- security fixes:
|
||||||
|
* strip leading slash from stored pathspecs,
|
||||||
|
* remove "../" parent dir path components from extracted file names
|
||||||
|
- new option "-:" to allow verbatim extraction of file names containing
|
||||||
|
"../" parent dir path specs
|
||||||
|
- fixed file handle leak for the DLL code
|
||||||
|
- repaired OS2 & WinNT ACL extraction which was broken in 5.42
|
||||||
|
|
||||||
|
The 5.42 maintenance release fixes more bugs and cleans up the redistribution
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
- removal of unreduce.c and amiga/timelib.c code to get rid of the last
|
||||||
|
distribution restrictions beyond the BSD-like Info-ZIP LICENSE
|
||||||
|
- new generic timelib replacement (currently used by AMIGA port)
|
||||||
|
- more reasonable mapping rules of UNIX "leading-dot" filenames to the
|
||||||
|
DOS 8.3 name convention
|
||||||
|
- repaired screensize detection in MORE paging code
|
||||||
|
(was broken for DOS/OS2/WIN32 in 5.41)
|
||||||
|
|
||||||
|
The 5.41 maintenance release adds another new port and fixes some bugs.
|
||||||
|
|
||||||
|
- new BSD-like LICENSE
|
||||||
|
- new Novell Netware NLM port
|
||||||
|
- supports extraction of archives with more than 64k entries
|
||||||
|
- attribute handling of VMS port was broken in UnZip 5.4
|
||||||
|
- decryption support integrated in the main source distribution
|
||||||
|
|
||||||
|
The 5.4 release adds new ports, again. Other important items are changes
|
||||||
|
to the listing format, new supplemental features and several bug fixes
|
||||||
|
(especially concerning time-stamp handling...):
|
||||||
|
|
||||||
|
- new IBM OS/390 port, a UNIX derivate (POSIX with EBCDIC charset)
|
||||||
|
- complete revision of the MacOS port
|
||||||
|
- changed listing formats to enlarge the file size fields for more digits
|
||||||
|
- added capability to restore directory attributes on MSDOS, OS/2, WIN32
|
||||||
|
- enabled support of symbolic links on BeOS
|
||||||
|
- Unix: optional Acorn filetype support, useful for volumes exported via NFS
|
||||||
|
- several changes/additions to the DLL API
|
||||||
|
- GUI SFX stub for Win16 (Windows 3.1) and Win32 (Windows 9x, Windows NT)
|
||||||
|
- new free GCC compiler environments supported on WIN32
|
||||||
|
- many time-zone handling bug fixes for WIN32, AMIGA, ...
|
||||||
|
|
||||||
|
The 5.32 release adds two new ports and a fix for at least one relatively
|
||||||
|
serious bug:
|
||||||
|
|
||||||
|
- new FlexOS port
|
||||||
|
- new Tandem NSK port
|
||||||
|
- new Visual BASIC support (compatibility with the Windows DLLs)
|
||||||
|
- new -T option (set zipfile timestamp) for virtually all ports
|
||||||
|
- fix for timestamps beyond 2038 (e.g., 2097; crashed under DOS/Win95/NT)
|
||||||
|
- fix for undetected "dangling" symbolic links (i.e., no pointee)
|
||||||
|
- fix for VMS indexed-file extraction problem (stored with Zip 2.0 or 2.1)
|
||||||
|
- further performance optimizations
|
||||||
|
|
||||||
|
The 5.31 release included nothing but small bug-fixes and typo corrections,
|
||||||
|
with the exception of some minor performance tweaks.
|
||||||
|
|
||||||
|
The 5.3 release added still more ports and more cross-platform portability
|
||||||
|
features:
|
||||||
|
|
||||||
|
- new BeOS port
|
||||||
|
- new SMS/QDOS port
|
||||||
|
- new Windows CE graphical port
|
||||||
|
- VM/CMS port fully updated and tested
|
||||||
|
- MVS port fully updated and tested
|
||||||
|
- updated Windows DLL port, with WiZ GUI spun off to a separate package
|
||||||
|
- full Universal Time (UTC or GMT) support for trans-timezone consistency
|
||||||
|
- cross-platform support for 8-bit characters (ISO Latin-1, OEM code pages)
|
||||||
|
- support for NT security descriptors (ACLs)
|
||||||
|
- support for overwriting OS/2 directory EAs if -o option given
|
||||||
|
- updated Solaris/SVR4 package facility
|
||||||
|
|
||||||
|
What is (still!) not added is multi-part archive support (a.k.a. "diskette
|
||||||
|
spanning") and a unified and more powerful DLL interface. These are the
|
||||||
|
two highest priorities for the 6.x releases. Work on the former is almost
|
||||||
|
certain to have commenced by the time you read this. This time we mean it!
|
||||||
|
You betcha. :-)
|
||||||
|
|
||||||
|
Although the DLLs are still basically a mess, the Windows DLLs (16- and 32-
|
||||||
|
bit) now have some documentation and a small example application. Note that
|
||||||
|
they should now be compatible with C/C++, Visual BASIC and Delphi. Weirder
|
||||||
|
languages (FoxBase, etc.) are probably Right Out.
|
||||||
|
|
||||||
|
Finally, note that support for unshrinking has now been turned OFF by default,
|
||||||
|
although the source code is still available (as with unreducing). This was
|
||||||
|
done for legal reasons, not technical ones, and no, we're not any happier
|
||||||
|
about it than you are. :-( See the COPYING file for details.
|
||||||
|
|
||||||
|
|
||||||
|
INTERNET RESOURCES
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Info-ZIP's web site is at http://www.info-zip.org/pub/infozip/
|
||||||
|
and contains the most up-to-date information about coming releases,
|
||||||
|
links to binaries, and common problems.
|
||||||
|
(See http://www.info-zip.org/pub/infozip/FAQ.html for the latter.)
|
||||||
|
Files may also be retrieved via ftp://ftp.info-zip.org/pub/infozip/ .
|
||||||
|
Thanks to LEO (Munich, Germany) for hosting our primary site.
|
||||||
|
|
||||||
|
|
||||||
|
DISTRIBUTION
|
||||||
|
------------
|
||||||
|
If you have a question regarding redistribution of Info-ZIP software, either
|
||||||
|
as is, as packaging for a commercial product, or as an integral part of a
|
||||||
|
commercial product, please read the Frequently Asked Questions (FAQ) section
|
||||||
|
of the included COPYING file.
|
||||||
|
|
||||||
|
Insofar as C compilers are rare on some platforms and the authors only have
|
||||||
|
direct access to a subset of the supported systems, others may wish to pro-
|
||||||
|
vide ready-to-run executables for new systems. In general there is no prob-
|
||||||
|
lem with this; we require only that such distributions include this README
|
||||||
|
file, the WHERE file, the COPYING file (contains copyright/redistribution
|
||||||
|
information), and the appropriate documentation files (unzip.txt and/or
|
||||||
|
unzip.1 for UnZip, etc.). If the local system provides a way to make self-
|
||||||
|
extracting archives in which both the executables and text files can be
|
||||||
|
stored together, that's best (in particular, use UnZipSFX if at all possible,
|
||||||
|
even if it's a few kilobytes bigger than the alternatives); otherwise we
|
||||||
|
suggest a bare UnZip executable and a separate zipfile containing the re-
|
||||||
|
maining text and binary files. If another archiving method is in common
|
||||||
|
use on the target system (for example, Zoo or LHa), that may also be used.
|
||||||
|
|
||||||
|
|
||||||
|
BUGS AND NEW PORTS: CONTACTING INFO-ZIP
|
||||||
|
----------------------------------------
|
||||||
|
All bug reports and patches (context diffs only, please!) should go to
|
||||||
|
Zip-Bugs@lists.wku.edu, which is the e-mail address for the Info-ZIP
|
||||||
|
authors. (Note that a few rare systems require the Zip-Bugs part to be
|
||||||
|
capitalized as shown; most systems work OK with lowercase "zip-bugs,"
|
||||||
|
however.) DO NOT MAIL US LARGE BINARIES--EVER. If you need to send us
|
||||||
|
a problem archive that happens to be large (> 20K), contact us first for
|
||||||
|
instructions.
|
||||||
|
|
||||||
|
"Dumb questions" that aren't adequately answered in the documentation
|
||||||
|
should also be directed to Zip-Bugs rather than to a global forum such
|
||||||
|
as Usenet. (Kindly make certain that your question *isn't* answered by
|
||||||
|
the documentation, however--a great deal of effort has gone into making
|
||||||
|
it clear and complete.)
|
||||||
|
|
||||||
|
Suggestions for new features can be discussed on Info-ZIP@lists.wku.edu,
|
||||||
|
a mailing list for Info-ZIP beta testers and interested parties; you need
|
||||||
|
to subscribe first, however (see below). We make no promises to act on all
|
||||||
|
suggestions or even all patches, but if it is something that is manifestly
|
||||||
|
useful, sending the required patches to Zip-Bugs directly (as per the
|
||||||
|
instructions in the ZipPorts file) is likely to produce a quicker response
|
||||||
|
than asking us to do it--the authors are always ridiculously short on time.
|
||||||
|
(Please do NOT send patches or encoded zipfiles to the Info-ZIP list.
|
||||||
|
Please DO read the ZipPorts file before sending any large patch. It would
|
||||||
|
be difficult to over-emphasize this point...)
|
||||||
|
|
||||||
|
If you are considering a port, not only should you read the ZipPorts file,
|
||||||
|
but also please check in with Zip-Bugs BEFORE getting started, since the
|
||||||
|
code is constantly being updated behind the scenes. (For example, VxWorks,
|
||||||
|
VMOS and Netware ports were once claimed to be under construction, although
|
||||||
|
we have yet to see any up-to-date patches.) We will arrange to send you the
|
||||||
|
latest sources. The alternative is the possibility that your hard work will
|
||||||
|
be tucked away in a subdirectory and mostly ignored, or completely ignored
|
||||||
|
if someone else has already done the port (and you'd be surprised how often
|
||||||
|
this has happened).
|
||||||
|
|
||||||
|
|
||||||
|
BETA TESTING: JOINING INFO-ZIP
|
||||||
|
-------------------------------
|
||||||
|
If you'd like to keep up to date with our UnZip (and companion Zip utility)
|
||||||
|
development, join the ranks of beta testers, add your own thoughts and
|
||||||
|
contributions, or simply lurk, you may join one of our mailing lists.
|
||||||
|
There is an announcements-only list (Info-ZIP-announce) and a general
|
||||||
|
discussion/testing list (Info-ZIP). You must be a subscriber to post, and
|
||||||
|
you can subscribe via the links on our Frequently Asked Questions page:
|
||||||
|
|
||||||
|
http://www.info-zip.org/pub/infozip/FAQ.html#lists
|
||||||
|
|
||||||
|
(Please note that as of late May 2004, the lists are unavailable pending
|
||||||
|
a move to a new site; we hope to have them restored shortly. In the
|
||||||
|
interim ...) Feel free to use our bug-reporting web page for bug reports
|
||||||
|
and to ask questions not answered on the FAQ page above:
|
||||||
|
|
||||||
|
http://www.info-zip.org/zip-bug.html
|
||||||
|
|
||||||
|
There is also a closed mailing list for internal discussions of our core
|
||||||
|
development team. This list is now kept secret to prevent us from being
|
||||||
|
flooded with spam messages.
|
||||||
|
|
||||||
|
|
||||||
|
-- Greg Roelofs (sometimes known as Cave Newt), principal UnZip developer
|
||||||
|
guy, with inspiration from David Kirschbaum, was Author of this text.
|
||||||
|
|
||||||
|
-- Christian Spieler (shorthand: SPC), current UnZip maintenance coordinator,
|
||||||
|
applied the most recent changes.
|
179
unzip/unzip-5.52/ToDo
Normal file
179
unzip/unzip-5.52/ToDo
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
================================
|
||||||
|
For UnZip 6.0/6.1/who knows:
|
||||||
|
================================
|
||||||
|
|
||||||
|
o implement handling of file sizes beyond the 32-bit limit of
|
||||||
|
2GByte (resp. 4GByte), using the new 64-bit extra field extensions
|
||||||
|
as defined by PKWARE (this will not get implemented for the present
|
||||||
|
16-bit ports - plain DOS and OS/2 1.x)
|
||||||
|
|
||||||
|
top of the list for 6.0!
|
||||||
|
UnZip 6.0 is now under development, first betas for Win32 and Unix
|
||||||
|
are available
|
||||||
|
|
||||||
|
o add multi-part zipfile handling
|
||||||
|
|
||||||
|
major feature for 6.0!
|
||||||
|
|
||||||
|
could happen for 6.0 - 10/8/2004 EG
|
||||||
|
|
||||||
|
o better support for multilingual uses and different codepages;
|
||||||
|
support unicode (UTF-8 coded) filenames and comment texts
|
||||||
|
|
||||||
|
a requested feature getting more and more important,
|
||||||
|
maybe in 6.1
|
||||||
|
|
||||||
|
o add new low-level, binary API; rewrite "normal" (command-line) UnZip
|
||||||
|
to use it
|
||||||
|
|
||||||
|
maybe soon (maybe 6.1)
|
||||||
|
|
||||||
|
o use (simple!) configure script in combination with Unix Makefile
|
||||||
|
|
||||||
|
very soon (6.0 or 6.1)
|
||||||
|
|
||||||
|
may be needed in 6.0 to autodetect large file support - 10/8/2004 EG
|
||||||
|
|
||||||
|
o add precautions against extracting files outside the tree below
|
||||||
|
the current directory resp. the specified extraction folder.
|
||||||
|
(automatically remove absolute path specs from zip entries; emit
|
||||||
|
warnings when traversing outside the extraction tree...)
|
||||||
|
|
||||||
|
done as of version 5.51
|
||||||
|
|
||||||
|
o MSDOS/WIN32/others: detection of "reserved" names (= names of character
|
||||||
|
devices, or system extensions that look like a characters device driver)
|
||||||
|
at runtime; with the goal of emitting "meaningful" error messages and/or
|
||||||
|
rename queries.
|
||||||
|
(Currently, these reserved names are catched as "non-deletable files".
|
||||||
|
On MSDOS and WIN32, when the RTL stat() function allows to identify
|
||||||
|
character devices, the "reserved" names are automatically prefixed with
|
||||||
|
an underscore.)
|
||||||
|
|
||||||
|
o redesign "file exists -- is newer/older -- overwrite/skip/rename"
|
||||||
|
logic in extract.c and the corresponding system specific mapname()
|
||||||
|
services; to prevent superfluous decryption key prompts for entry
|
||||||
|
that will be skipped, later.
|
||||||
|
|
||||||
|
o rewrite to use fread/fseek/etc. [eventually: test
|
||||||
|
write(bytes) vs. fwrite(words), especially on Crays/Alphas]
|
||||||
|
|
||||||
|
soon (probably in conjunction with multi-part handling)
|
||||||
|
|
||||||
|
o incorporate new backfill version of inflate()
|
||||||
|
|
||||||
|
wait for zlib version
|
||||||
|
|
||||||
|
o check NEXTBYTE for EOF in crypt.c, funzip.c and explode.c, too
|
||||||
|
|
||||||
|
whenever
|
||||||
|
|
||||||
|
o add option to force completely non-interactive operation (no queries
|
||||||
|
for overwrite/rename, password, etc.); also allow some sort of non-
|
||||||
|
interactive password provision? (file? command-line? env. variable?)
|
||||||
|
|
||||||
|
someday?
|
||||||
|
|
||||||
|
o add testing of extra fields (if have CRC)
|
||||||
|
|
||||||
|
later
|
||||||
|
|
||||||
|
o rewrite to allow use as a filter
|
||||||
|
|
||||||
|
way, way later...
|
||||||
|
|
||||||
|
o add Unix hard-link support?
|
||||||
|
|
||||||
|
way, way later...
|
||||||
|
|
||||||
|
o add ".ini" file support as a (more elaborate) alternative to the presently
|
||||||
|
supported preconfiguring abilities via special environment variables
|
||||||
|
(UNZIP on many systems...)?
|
||||||
|
|
||||||
|
way, way later (if ever)...
|
||||||
|
|
||||||
|
o add option to search zipfile contents for a string and print the
|
||||||
|
results? ("zipgrep" option--e.g., unzip -g or unzip -S) (easy for
|
||||||
|
fixed strings, hard for wildcards/true regex's)
|
||||||
|
|
||||||
|
way, way later, if at all...probably use libregex
|
||||||
|
|
||||||
|
o add -y "display symlinks" option to zipinfo? various sorting options?
|
||||||
|
(-St date/time, -Sn name)?
|
||||||
|
|
||||||
|
who knows
|
||||||
|
|
||||||
|
o add "in-depth" option to zipinfo? (check local headers against
|
||||||
|
central, etc.)--make it a better debugging tool (or just create
|
||||||
|
zipfix)
|
||||||
|
|
||||||
|
who knows (zip -F, -FF already exist)
|
||||||
|
|
||||||
|
Some maintenance or OS specific topics for 6.0 release:
|
||||||
|
|
||||||
|
* add "unix-style-path -> partitioned-dataset filename" conversion
|
||||||
|
to MVS port
|
||||||
|
|
||||||
|
* should we add support for (null) entry names (empty entry name field), to
|
||||||
|
conform to the PKWARE specification?
|
||||||
|
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
Requested features:
|
||||||
|
|
||||||
|
- extract or exclude on basis of UID [Armin Bub, Armin.Bub@bk.bosch.de, 970904]
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
o miscellaneous little stuff: whenever
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
- add support for setting directory time stamps to win32 port. This requires
|
||||||
|
a solution similar to the UNIX SET_DIR_ATTRIB optional code; maybe, it could
|
||||||
|
be combined with the delayed restoring of directory ACLs. Unfortunately,
|
||||||
|
the simple version used in the OS/2 case (setting dir time stamp just after
|
||||||
|
creating the directory) does not work, because WinNT updates directory
|
||||||
|
change times whenever the directory content gets modified (addition,
|
||||||
|
deletion, rename, file change), at least for NTFS file systems.
|
||||||
|
(SPC, 2000-11-16)
|
||||||
|
|
||||||
|
- change DOS -f/-u stuff to use DOS API for getting filetimes, not stat()
|
||||||
|
|
||||||
|
- add (-N?) option to lose all user input and/or switch to "(*input)()"
|
||||||
|
function, replaceable by UzpAltMain() param
|
||||||
|
- add -@ option to read from stdin (zip) or from file (PKZIP)? (go32 built-in)
|
||||||
|
- add -oo option to overwrite OS/2 and DOS system and hidden files, too
|
||||||
|
- add option to compute MD5 checksum on files and/or on entire zipfile?
|
||||||
|
|
||||||
|
- decide whether to use WinGUI "skipping" diagnostics in extract.c
|
||||||
|
- combine "y/n/A/N" query/response stuff into unified section with query
|
||||||
|
function(s) (InputFn?)
|
||||||
|
- disable ^V code in remaining mapname() routines
|
||||||
|
|
||||||
|
- change filename-matching logic so case-insensitive if case-sensitive fails?
|
||||||
|
|
||||||
|
- allow multiple dir creation with -d option? [Bob Maynard]
|
||||||
|
|
||||||
|
- use gcc -pg, gprof to do profiling on unzip
|
||||||
|
|
||||||
|
- Doug Patriarche (doug.patriarche.bvdhp01@nt.com) Northern Telecom Canada Ltd.
|
||||||
|
"I need to do a port of zip/unzip for Wind River Systems' VxWorks OS"
|
||||||
|
[GRR: 15 March 95 -> "early June"]
|
||||||
|
|
||||||
|
|
||||||
|
Features from old BUGS file (mostly duplicates of other entries above):
|
||||||
|
|
||||||
|
- ignore case for internal filename match on non-Unix systems, unless file-
|
||||||
|
specs enclosed in single quotes
|
||||||
|
- modify to decompress input stream if part of a pipe, but continue using
|
||||||
|
central directory if not (BIG job!)--extended local header capability
|
||||||
|
- add zipinfo option(s) to sort alphabetically, by date/time, in reverse, etc.
|
||||||
|
- when listing filenames, use '?' for non-printables? [Thomas Wolff, 92.6.1]
|
||||||
|
- add zipinfo "in-depth" option? (check local vs. central filenames, etc.)
|
||||||
|
- create zipcat program to concatenate zipfiles
|
||||||
|
- add -oo option (overwrite and override)? no user queries (if bad password,
|
||||||
|
skip file; if disk full, take default action; if VMS special on non-VMS,
|
||||||
|
unpack anyway; etc.)
|
||||||
|
- add -Q[Q[Q]] option (quiet mode on comments, cautions, warnings and errors)?
|
||||||
|
forget -oo, or make synonym? Default level -Q?
|
258
unzip/unzip-5.52/WHERE
Normal file
258
unzip/unzip-5.52/WHERE
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
This is the Info-ZIP file ``WHERE,'' last updated on 17 February 2005.
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
The latest version of this file can be found online at:
|
||||||
|
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/doc/WHERE
|
||||||
|
|
||||||
|
Note that some ftp sites may not yet have the latest versions of Zip
|
||||||
|
and UnZip when you read this. The latest versions always appear in
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/ (and subdirectories thereof) first,
|
||||||
|
except for encryption binaries, which always appear in
|
||||||
|
ftp://ftp.icce.rug.nl/infozip/ (and subdirectories) first.
|
||||||
|
|
||||||
|
IF YOU FIND AN ERROR: please let us know! We don't have time to
|
||||||
|
check each and every site personally (or even collectively), so any
|
||||||
|
number of the sites listed below may have moved or disappeared en-
|
||||||
|
tirely. E-mail to Zip-Bugs@lists.wku.edu and we'll update this file.
|
||||||
|
__________________________________________________________________________
|
||||||
|
|
||||||
|
|
||||||
|
Info-ZIP's home WWW site is listed on Yahoo and is at:
|
||||||
|
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/Info-ZIP.html (master version)
|
||||||
|
http://ftp.info-zip.org/pub/infozip/ (master version)
|
||||||
|
http://www.info-zip.org/
|
||||||
|
|
||||||
|
Note that the old sites at http://www.cdrom.com/pub/infozip/ and
|
||||||
|
http://www.freesoftware.com/pub/infozip are PERMANENTLY BROKEN. They
|
||||||
|
cannot be updated or removed, apparently.
|
||||||
|
|
||||||
|
The Zip and UnZip pages have links to most known mirror sites carrying our
|
||||||
|
source and/or binary distributions, and they generally are more up-to-date
|
||||||
|
and have better information than what you are reading:
|
||||||
|
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/Zip.html
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/UnZip.html
|
||||||
|
|
||||||
|
The related zlib package by Info-ZIP's Jean-loup Gailly and Mark Adler is at:
|
||||||
|
|
||||||
|
http://www.zlib.org/
|
||||||
|
|
||||||
|
Source-code archives for Info-ZIP's portable Zip, UnZip, and related
|
||||||
|
utilities:
|
||||||
|
|
||||||
|
zip231.zip Zip 2.31 (deflation; includes zipnote/zipsplit/zipcloak)
|
||||||
|
zip231.tar.Z ditto, compress'd tar format
|
||||||
|
|
||||||
|
zip11.zip Zip 1.1 (shrinking, implosion; compatible w. PKUNZIP 1.1)
|
||||||
|
zip11.tar.Z ditto, compress'd tar format
|
||||||
|
|
||||||
|
unzip552.zip UnZip 5.52 (all methods[*]; unzip/funzip/unzipsfx/zipgrep)
|
||||||
|
unzip552.tar.gz ditto, gzip'd tar format
|
||||||
|
unzip552.tar.Z ditto, compress'd tar format
|
||||||
|
|
||||||
|
unred552.zip UnZip 5.52 add-on, contains copyrighted unreduce support
|
||||||
|
|
||||||
|
zcrypt29.zip encryption support for Zip 2.3[**]
|
||||||
|
zcrypt10.zip encryption support for Zip 1.1
|
||||||
|
|
||||||
|
MacZip106src.zip contains all the GUI stuff and the project files to build
|
||||||
|
the MacZip main-app. To build MacZip successfully, both
|
||||||
|
the Zip 2.31 and UnZip 5.52 sources are required, too.
|
||||||
|
|
||||||
|
wiz502.zip WiZ 5.02, Windows 9x/NT GUI front-end for Info-ZIP DLLs
|
||||||
|
wiz502+dlls.zip WiZ 5.02, Windows 9x/NT GUI front-end plus DLL sources
|
||||||
|
|
||||||
|
[*] Unreducing is disabled by default, but is available as add-on.
|
||||||
|
As of July 2004, Unisys's LZW patent was expired worldwide, and
|
||||||
|
unshrinking is turned on by default since the release of UnZip 5.52.
|
||||||
|
See UnZip's INSTALL file for details.
|
||||||
|
|
||||||
|
[**] As of January 2000, US export regulations were amended to allow export
|
||||||
|
of free encryption source code from the US. As of June 2002, these
|
||||||
|
regulations were further relaxed to allow export of encryption binaries
|
||||||
|
associated with free encryption source code. The Zip 2.31, UnZip 5.52
|
||||||
|
and Wiz 5.02 archives now include full crypto source code. As of the
|
||||||
|
Zip 2.31 release, all official binaries include encryption support; the
|
||||||
|
former "zcr" archives ceased to exist.
|
||||||
|
(Note that restrictions may still exist in other countries, of course.)
|
||||||
|
|
||||||
|
Executables archives (and related files) for Info-ZIP's software; not all
|
||||||
|
of these will be immediately available due to lack of access to appropriate
|
||||||
|
systems on the part of Info-ZIP members.
|
||||||
|
|
||||||
|
zip231x.zip MSDOS executables and docs
|
||||||
|
zip231x1.zip OS/2 1.x (16-bit) executables and docs
|
||||||
|
zip231x2.zip OS/2 2/3/4.x (32-bit) executables and docs
|
||||||
|
zip231xA.zip Amiga executables and docs
|
||||||
|
zip231xB.zip BeOS executables and docs
|
||||||
|
zip231xC.zip VM/CMS executable and docs
|
||||||
|
zip231xK.zip Tandem NSK executables and docs
|
||||||
|
zip231xM.xmit MVS classic executable
|
||||||
|
zip231xM-docs.zip MVS classic port, docs only
|
||||||
|
zip231dN.zip WinNT/Win9x (Intel) DLL, header files, docs
|
||||||
|
zip231xN.zip WinNT/Win9x (Intel) executables and docs
|
||||||
|
zip231xN-axp.zip WinNT (Alpha AXP) executables and docs
|
||||||
|
zip231xN-mip.zip WinNT (MIPS R4000) executables and docs
|
||||||
|
zip231xN-ppc.zip WinNT (PowerPC) executables and docs
|
||||||
|
zip231xO.zip IBM OS/390 Open Edition binaries and docs
|
||||||
|
zip231xQ.zip SMS/QDOS executables and docs
|
||||||
|
zip231xR.zip Acorn RISC OS executables and docs
|
||||||
|
zip231xT.zip Atari TOS executables and docs
|
||||||
|
zip231-vms-axp-obj.zip
|
||||||
|
VMS (Alpha AXP) object libs, link procedure and docs
|
||||||
|
zip231-vms-axp-exe.zip
|
||||||
|
VMS (Alpha AXP) executables for VMS 6.1 or later and docs
|
||||||
|
zip231-vms-vax-decc-obj.zip
|
||||||
|
VMS (VAX) object libs (new DEC C), link procedure and docs
|
||||||
|
zip231-vms-vax-decc-exe.zip
|
||||||
|
VMS (VAX) executables (DEC C) for VMS 6.1 or later; docs
|
||||||
|
zip231-vms-vax-vaxc-obj.zip
|
||||||
|
VMS (VAX) object libs (old VAX C), link procedure and docs
|
||||||
|
zip231x.hqx Macintosh BinHex'd executables and docs
|
||||||
|
|
||||||
|
unz552x.exe MSDOS self-extracting executable (16-bit unzip, ..., docs)
|
||||||
|
unz552x3.exe MSDOS self-extracting executable (16-, 32-bit unzip, docs)
|
||||||
|
unz552x1.exe OS/2 1.x (16-bit) self-extracting executables and docs
|
||||||
|
unz552x2.exe OS/2 2/3/4.x (32-bit) self-extracting executables and docs
|
||||||
|
unz552d2.zip OS/2 2/3/4.x (32-bit) DLL, header file, demo exe and docs
|
||||||
|
unz552xA.ami Amiga self-extracting executables and docs
|
||||||
|
unz552xA.lha Amiga executables and docs, LHa archive
|
||||||
|
unz552xB.sfx BeOS self-extracting executables and docs
|
||||||
|
unz552xB.tar.gz BeOS executables and docs, gzip'd tar archive
|
||||||
|
unz552xC.mod VM/CMS executable module in "packed" format
|
||||||
|
unz552xC-docs.zip VM/CMS docs, only
|
||||||
|
unz552xF.zip FlexOS executable and docs
|
||||||
|
unz552xK.zip Tandem NSK executable and docs
|
||||||
|
unz552xM.xmit MVS classic executable
|
||||||
|
unz552xM-docs.zip MVS classic port, docs only
|
||||||
|
unz552dN.zip NT4/W2K/XP/2K3/W9x (32-bit Intel) DLL, header files, docs
|
||||||
|
unz552xN.exe NT/2K/XP/2K3/W9x self-extracting i386 executables and docs
|
||||||
|
unz552xN-axp.exe WinNT (Alpha AXP) self-extracting executables and docs
|
||||||
|
unz552xN-mip.exe WinNT (MIPS R4000) self-extracting executables and docs
|
||||||
|
unz552xN-ppc.exe WinNT (PowerPC) self-extracting executables and docs
|
||||||
|
unz552xQ.sfx SMS/QDOS self-extracting executables and docs
|
||||||
|
unz552xO.tar.Z IBM OS/390 Open edition (Unix-like), exes and docs
|
||||||
|
unz552xR.exe Acorn RISC OS self-extracting executables and docs
|
||||||
|
unz552xR.spk Acorn RISC OS Spark'd executables and docs
|
||||||
|
unz552xT.tos Atari TOS self-extracting executables and docs
|
||||||
|
unz552x-vms-axp-obj.bck VMS backup saveset,
|
||||||
|
contains UnZip (Alpha) obj libs, link procedure, docs
|
||||||
|
unz552x-vms-axp-obj.exe VMS (Alpha AXP) SFX archive (statically linked),
|
||||||
|
contains UnZip (Alpha) obj libs, link procedure, docs
|
||||||
|
unz552x-vms-axp-exe.exe VMS (Alpha AXP) SFX archive (dynamically linked),
|
||||||
|
contains UnZip (Alpha AXP, DEC C) executables and docs,
|
||||||
|
smaller than object archive, but requires VMS 6.1
|
||||||
|
unz552x-vms-vax-decc-obj.bck VMS backup saveset,
|
||||||
|
contains UnZip (new DEC C) obj libs, link procedure, docs
|
||||||
|
unz552x-vms-vax-decc-obj.exe VMS (VAX) SFX archive (statically linked),
|
||||||
|
contains UnZip (new DEC C) obj libs, link procedure, docs
|
||||||
|
unz552x-vms-vax-decc-exe.exe VMS (VAX) SFX archive (dynamically linked),
|
||||||
|
contains UnZip (new DEC C) executables and docs,
|
||||||
|
smaller than object archive, but requires VMS 6.1
|
||||||
|
unz552x-vms-vax-vaxc-obj.bck VMS backup saveset,
|
||||||
|
contains UnZip (old VAX C) obj libs, link procedure, docs
|
||||||
|
unz552x-vms-vax-vaxc-obj.exe VMS (VAX) SFX archive (statically linked),
|
||||||
|
contains UnZip (old VAX C) obj libs, link procedure, docs
|
||||||
|
unz552x.hqx Macintosh BinHex'd executables and docs for unzip
|
||||||
|
(unz552x.tar.{Z,gz} Unix exes/docs for Solaris 2.x, SCO Unix, Linux, etc.,
|
||||||
|
depending on directory/location; generally only provided
|
||||||
|
in cases where the OS does *not* ship with a bundled C
|
||||||
|
compiler)
|
||||||
|
|
||||||
|
MacZip106nc.hqx Macintosh combined Zip&UnZip application with GUI,
|
||||||
|
executables and docs (no encryption)
|
||||||
|
MacZip106c.hqx Macintosh combined Zip&UnZip application with GUI,
|
||||||
|
executables and docs (with encryption)
|
||||||
|
|
||||||
|
wiz502xN.exe WiZ 5.02 32-bit (Win9x/NT/2K/XP/2K3) app+docs (self-extr.)
|
||||||
|
|
||||||
|
UnzpHist.zip complete changes-history of UnZip and its precursors
|
||||||
|
ZipHist.zip complete changes-history of Zip
|
||||||
|
|
||||||
|
ftp/web sites for the US-exportable sources and executables:
|
||||||
|
|
||||||
|
NOTE: Look for the Info-ZIP file names given above (not PKWARE or third-
|
||||||
|
party stuff) in the following locations. Some sites like to use slightly
|
||||||
|
different names, such as zip-2.31.tar.gz instead of zip231.tar.Z.
|
||||||
|
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/ [THE INFO-ZIP HOME SITE]
|
||||||
|
ftp://sunsite.doc.ic.ac.uk/packages/zip/ [MIRRORS THE INFO-ZIP HOME SITE]
|
||||||
|
ftp://unix.hensa.ac.uk/mirrors/uunet/pub/archiving/zip/
|
||||||
|
|
||||||
|
ftp://ftp.cmdl.noaa.gov/aerosol/doc/archiver/{all,dos,os2,mac,vax_alpha}/
|
||||||
|
ftp://garbo.uwasa.fi/pc/arcers/ [AND OTHER GARBO MIRRORS]
|
||||||
|
ftp://garbo.uwasa.fi/unix/arcers/ [AND OTHER GARBO MIRRORS]
|
||||||
|
ftp://ftp.elf.stuba.sk/pub/pc/pack/ [AND OTHER STUBA MIRRORS]
|
||||||
|
ftp://ftp-os2.cdrom.com/pub/os2/archiver/
|
||||||
|
ftp://ftp-os2.nmsu.edu/os2/archiver/
|
||||||
|
ftp://ftp.informatik.tu-muenchen.de/pub/comp/os/os2/archiver/
|
||||||
|
ftp://sumex-aim.stanford.edu/info-mac/cmp/
|
||||||
|
ftp://ftp.wustl.edu/pub/aminet/util/arc/ [AND OTHER AMINET MIRRORS]
|
||||||
|
ftp://atari.archive.umich.edu/pub/Archivers/ [AND OTHER UMICH MIRRORS]
|
||||||
|
http://www.umich.edu/~archive/atari/Archivers/
|
||||||
|
ftp://jake.educom.com.au/pub/infozip/acorn/ [Acorn RISC OS]
|
||||||
|
http://www.sitec.net/maczip/ [MacZip port]
|
||||||
|
|
||||||
|
ftp/web sites for the encryption and decryption sources and/or executables:
|
||||||
|
|
||||||
|
Outside the US:
|
||||||
|
ftp://ftp.info-zip.org/pub/infozip/ [THE INFO-ZIP HOME SITE]
|
||||||
|
ftp://ftp.icce.rug.nl/infozip/ [THE INFO-ZIP ENCRYPTION HOME SITE]
|
||||||
|
ftp://ftp.elf.stuba.sk/pub/pc/pack/
|
||||||
|
ftp://garbo.uwasa.fi/pc/arcers/
|
||||||
|
ftp://ftp.inria.fr/system/arch-compr/
|
||||||
|
ftp://ftp.leo.org/pub/comp/os/os2/leo/archiver/
|
||||||
|
(mail server at ftp-mailer@ftp.leo.org)
|
||||||
|
|
||||||
|
ftp://ftp.win.tue.nl/pub/compression/zip/
|
||||||
|
ftp://ftp.uni-erlangen.de/pub/pc/msdos/arc-utils/zip/
|
||||||
|
|
||||||
|
|
||||||
|
The primary distribution site for the MacZip port can be found at:
|
||||||
|
|
||||||
|
http://www.sitec.net/maczip/
|
||||||
|
|
||||||
|
ftp sites for VMS-format Zip and UnZip packages (sources, object files and
|
||||||
|
executables, no encryption/decryption--see also "Mail servers" section below):
|
||||||
|
|
||||||
|
ftp.spc.edu [192.107.46.27] and ftp.wku.edu:
|
||||||
|
|
||||||
|
[.MACRO32]AAAREADME.TXT
|
||||||
|
[.MACRO32.SAVESETS]UNZIP.BCK or UNZIP.ZIP (if already have older version)
|
||||||
|
[.MACRO32.SAVESETS]ZIP.ZIP
|
||||||
|
|
||||||
|
To find other ftp/web sites:
|
||||||
|
|
||||||
|
The "archie" ftp database utility can be used to find an ftp site near
|
||||||
|
you (although the command-line versions always seem to find old ver-
|
||||||
|
sions...the `FTPsearch' server at http://ftpsearch.ntnu.no/ftpsearch
|
||||||
|
--formerly `Archie 95'--is quite up-to-date, however). Or check a stan-
|
||||||
|
dard WWW search engine like AltaVista (http://www.altavista.digital.com/)
|
||||||
|
or Yahoo (http://www.yahoo.com/). If you don't know how to use these,
|
||||||
|
DON'T ASK US--read the web sites' help pages or check the Usenet groups
|
||||||
|
news.announce.newusers or news.answers or some such, or ask your system
|
||||||
|
administrator.
|
||||||
|
|
||||||
|
Mail servers:
|
||||||
|
|
||||||
|
To get the encryption sources by e-mail, send the following commands
|
||||||
|
to ftp-mailer@informatik.tu-muenchen.de:
|
||||||
|
|
||||||
|
get /pub/comp/os/os2/archiver/zcrypt29.zip
|
||||||
|
quit
|
||||||
|
|
||||||
|
To get the VMS Zip/UnZip package by e-mail, send the following
|
||||||
|
commands in the body of a mail message to fileserv@wku.edu (the
|
||||||
|
"HELP" command is also accepted):
|
||||||
|
|
||||||
|
SEND FILESERV_TOOLS
|
||||||
|
SEND UNZIP
|
||||||
|
SEND ZIP
|
||||||
|
|
||||||
|
To get Atari executables by e-mail, send a message to
|
||||||
|
atari@atari.archive.umich.edu for information about the mail server.
|
||||||
|
__________________________________________________________________________
|
26
unzip/unzip-5.52/acorn/Contents
Normal file
26
unzip/unzip-5.52/acorn/Contents
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Contents of the "acorn" subdirectory for UnZip 5.4 and later:
|
||||||
|
|
||||||
|
acorn.c.acorn Acorn-specific resources
|
||||||
|
acorn.c.riscos mainly file-handling routines for FileCore-based filesystems
|
||||||
|
acorn.Contents this file
|
||||||
|
acorn.GMakeFile Makefile for gcc
|
||||||
|
acorn.h.riscos
|
||||||
|
acorn.h.swiven
|
||||||
|
acorn.makefile Makefile script for default Acorn C compiler
|
||||||
|
acorn.README notes about Acorn-specific features
|
||||||
|
acorn.RunMe1st Obey file to move files into suitable place for compilation
|
||||||
|
on RISC OS machines
|
||||||
|
acorn.s.swiven SWI veneers
|
||||||
|
acorn.srcrename small executable that converts files from Unix style to
|
||||||
|
RISC OS style, used by RunMe1st
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
Use the "RunMe1st" file (it is an Obey file) to convert all the files from
|
||||||
|
"filename/[chs]" to "[chs].filename" (so that UnZip could be easily compiled
|
||||||
|
under RISC OS). It will also set the correct makefile.
|
||||||
|
|
||||||
|
To compile just set the CSD to the main UnZip directory and run 'amu'.
|
||||||
|
|
||||||
|
Currently only the Acorn C V5 compiler has been tested but probably also
|
||||||
|
Acorn C V4 and the Acorn Assembler V2 will be able to compile UnZip.
|
142
unzip/unzip-5.52/acorn/GMakefile
Normal file
142
unzip/unzip-5.52/acorn/GMakefile
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
# Makefile for UnZip, UnZipSFX, ZipInfo and fUnZip (5.2 or later)
|
||||||
|
# using gcc 2.95.4 (or later).
|
||||||
|
# You may look at <URL:http://hard-mofo.dsvr.net/gcc/> for an up-to-date
|
||||||
|
# gcc port.
|
||||||
|
|
||||||
|
CC = gcc -mlibscl
|
||||||
|
BIND = $(CC)
|
||||||
|
AS = $(CC) -c
|
||||||
|
ASM = as
|
||||||
|
SQUEEZE = squeeze -v
|
||||||
|
E =
|
||||||
|
|
||||||
|
# flags
|
||||||
|
# CFLAGS flags for C compile
|
||||||
|
# LFLAGS1 flags after output file spec, before obj file list
|
||||||
|
# LFLAGS2 flags after obj file list (libraries, etc)
|
||||||
|
#
|
||||||
|
LIB =
|
||||||
|
CFLAGS = -O2 -mthrowback -DNO_STRNICMP
|
||||||
|
ASMFLAGS = -throwback -objasm -upper
|
||||||
|
LFLAGS1 =
|
||||||
|
LFLAGS2 = $(LIB)
|
||||||
|
|
||||||
|
# object file lists
|
||||||
|
OBJS1 = o.unzip o.crc32 o.crctab o.crypt o.envargs o.explode
|
||||||
|
OBJS2 = o.extract o.fileio o.globals o.inflate o.list o.match
|
||||||
|
OBJS3 = o.process o.ttyio o.unreduce o.unshrink o.zipinfo
|
||||||
|
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) o.riscos o.swiven o.acorn
|
||||||
|
OBJF = o.funzip o.crc32 o.cryptf o.globalsf o.inflatef o.ttyiof \
|
||||||
|
o.riscos o.swiven
|
||||||
|
OBJX = o.unzipsfx o.crc32 o.crctab_ o.crypt_ o.extract_ o.fileio_ o.globals_ \
|
||||||
|
o.inflate_ o.match_ o.process_ o.ttyio_ o.acorn_ o.swiven o.riscos_
|
||||||
|
|
||||||
|
UNZIP_H = h.unzip h.unzpriv h.globals acorn.h.riscos acorn.h.swiven
|
||||||
|
|
||||||
|
all: unzip funzip unzipsfx
|
||||||
|
|
||||||
|
|
||||||
|
install: unzip funzip unzipsfx
|
||||||
|
$(SQUEEZE) unzip %.unzip
|
||||||
|
$(SQUEEZE) funzip %.funzip
|
||||||
|
$(SQUEEZE) unzipsfx unzipsfx
|
||||||
|
copy %.unzip %.zipinfo ~CVF
|
||||||
|
|
||||||
|
# rules for unzip and funzip
|
||||||
|
o.crc32: c.crc32 $(UNZIP_H) h.zip
|
||||||
|
$(CC) $(CFLAGS) -c c.crc32 -o o.crc32
|
||||||
|
o.crctab: c.crctab $(UNZIP_H) h.zip
|
||||||
|
$(CC) $(CFLAGS) -c c.crctab -o o.crctab
|
||||||
|
o.crypt: c.crypt $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -c c.crypt -o o.crypt
|
||||||
|
o.envargs: c.envargs $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.envargs -o o.envargs
|
||||||
|
o.explode: c.explode $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.explode -o o.explode
|
||||||
|
o.extract: c.extract $(UNZIP_H) h.crypt
|
||||||
|
$(CC) $(CFLAGS) -c c.extract -o o.extract
|
||||||
|
o.fileio: c.fileio $(UNZIP_H) h.crypt h.ttyio h.ebcdic
|
||||||
|
$(CC) $(CFLAGS) -c c.fileio -o o.fileio
|
||||||
|
o.funzip: c.funzip $(UNZIP_H) h.crypt h.ttyio h.tables
|
||||||
|
$(CC) $(CFLAGS) -c c.funzip -o o.funzip
|
||||||
|
o.globals: c.globals $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.globals -o o.globals
|
||||||
|
o.inflate: c.inflate h.inflate $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.inflate -o o.inflate
|
||||||
|
o.list: c.list $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.list -o o.list
|
||||||
|
o.match: c.match $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.match -o o.match
|
||||||
|
o.process: c.process $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.process -o o.process
|
||||||
|
o.ttyio: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -c c.ttyio -o o.ttyio
|
||||||
|
o.unreduce: c.unreduce $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.unreduce -o o.unreduce
|
||||||
|
o.unshrink: c.unshrink $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.unshrink -o o.unshrink
|
||||||
|
o.unzip: c.unzip $(UNZIP_H) h.crypt h.unzvers h.consts
|
||||||
|
$(CC) $(CFLAGS) -c c.unzip -o o.unzip
|
||||||
|
o.zipinfo: c.zipinfo $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c c.zipinfo -o o.zipinfo
|
||||||
|
|
||||||
|
o.crctab_: c.crctab $(UNZIP_H) h.zip
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.crctab -o o.crctab_
|
||||||
|
o.crypt_: c.crypt $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.crypt -o o.crypt_
|
||||||
|
o.extract_: c.extract $(UNZIP_H) h.crypt
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.extract -o o.extract_
|
||||||
|
o.fileio_: c.fileio $(UNZIP_H) h.crypt h.ttyio h.ebcdic
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.fileio -o o.fileio_
|
||||||
|
o.globals_: c.globals $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.globals -o o.globals_
|
||||||
|
o.inflate_: c.inflate h.inflate $(UNZIP_H) h.crypt
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.inflate -o o.inflate_
|
||||||
|
o.match_: c.match $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.match -o o.match_
|
||||||
|
o.process_: c.process $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.process -o o.process_
|
||||||
|
o.ttyio_: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.ttyio -o o.ttyio_
|
||||||
|
|
||||||
|
o.unzipsfx: c.unzip $(UNZIP_H) h.crypt h.unzvers h.consts
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.unzip -o o.unzipsfx
|
||||||
|
|
||||||
|
o.cryptf: c.crypt $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.crypt -o o.cryptf
|
||||||
|
o.globalsf: c.globals $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.globals -o o.globalsf
|
||||||
|
o.inflatef: c.inflate h.inflate $(UNZIP_H) h.crypt
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.inflate -o o.inflatef
|
||||||
|
o.ttyiof: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.ttyio -o o.ttyiof
|
||||||
|
|
||||||
|
o.acorn: acorn.c.acorn $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -I@ -c acorn.c.acorn
|
||||||
|
o.acorn_: acorn.c.acorn $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -I@ -c -DSFX -DSFX_EXDIR -o o.acorn_ acorn.c.acorn
|
||||||
|
|
||||||
|
o.riscos: acorn.c.riscos $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -I@ -c acorn.c.riscos
|
||||||
|
o.riscos_: acorn.c.riscos $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -I@ -c -DSFX -DSFX_EXDIR -o o.riscos_ acorn.c.riscos
|
||||||
|
|
||||||
|
o.swiven: acorn.s.swiven
|
||||||
|
$(ASM) $(ASMFLAGS) acorn.s.swiven -o o.swiven
|
||||||
|
|
||||||
|
unzip: $(OBJS)
|
||||||
|
$(BIND) -o unzip$(E) $(LFLAGS1) $(OBJS) $(LFLAGS2)
|
||||||
|
funzip: $(OBJF)
|
||||||
|
$(BIND) -o funzip$(E) $(LFLAGS1) $(OBJF) $(LFLAGS2)
|
||||||
|
unzipsfx: $(OBJX)
|
||||||
|
$(BIND) -o unzipsfx$(E) $(LFLAGS1) $(OBJX) $(LFLAGS2)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
remove unzip
|
||||||
|
remove funzip
|
||||||
|
remove zipinfo
|
||||||
|
remove unzipsfx
|
||||||
|
create o.!fake! 0
|
||||||
|
wipe o.* ~cf
|
||||||
|
|
||||||
|
# end of Makefile
|
69
unzip/unzip-5.52/acorn/ReadMe
Normal file
69
unzip/unzip-5.52/acorn/ReadMe
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
Acorn-specific usage instructions
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
As zipfiles can come from a variety of sources apart from Acorn machines,
|
||||||
|
consideration had to be given to the handling of dot-extensions, e.g.
|
||||||
|
"DOSFILE.TXT", "unix-filename.tar.gz". These are extracted as "DOSFILE/TXT"
|
||||||
|
and "unix-filename/tar/gz"; their names may or may not be truncated,
|
||||||
|
depending on where the files are being created: what filing system and, for
|
||||||
|
Filecore-based filing systems such as ADFS or an IDEFS or SCSIFS, which
|
||||||
|
disk/partition format (names will not be truncated if you're using E+ or F+).
|
||||||
|
|
||||||
|
Where truncation occurs, you must be REALLY careful about extracting files
|
||||||
|
from archives. The files
|
||||||
|
|
||||||
|
dummy_source.c and dummy_source.h
|
||||||
|
|
||||||
|
will both be extracted as
|
||||||
|
|
||||||
|
dummy_sour
|
||||||
|
|
||||||
|
UnZip will prompt you for confirmation of the over-writing of these files,
|
||||||
|
but you must be really careful unless you wish to lose files! Also, because
|
||||||
|
UnZip is a unix-ported program, the filenames are CASE SENSITIVE.
|
||||||
|
|
||||||
|
*unzip new/zip newfile
|
||||||
|
|
||||||
|
will extract 'newfile', but not 'NewFile', 'NEWFILE' or any other
|
||||||
|
combinations. However, you can use the -C option to force operations to
|
||||||
|
disregard the case of filenames.
|
||||||
|
|
||||||
|
The Acorn UnZip port has an additional feature to cope with the extraction of
|
||||||
|
files containing 'c' code. As you may be aware, Acorn Desktop C requires all
|
||||||
|
files called "foo.c" to be renamed to "c.foo", ie "foo" in a directory called
|
||||||
|
"c".
|
||||||
|
|
||||||
|
There are two ways of using this feature.
|
||||||
|
|
||||||
|
- The old way: use a colon-separated environment variable named "Unzip$Exts".
|
||||||
|
|
||||||
|
Any extensions found in this variable will be extracted to directories
|
||||||
|
named after the extension, with the extension stripped. For example:
|
||||||
|
|
||||||
|
*Set Unzip$Exts "c:h:o:s"
|
||||||
|
*unzip foo/zip
|
||||||
|
|
||||||
|
- The new way: use the -/ option. For example:
|
||||||
|
|
||||||
|
Any extensions found in the parameter for this option will be extracted to
|
||||||
|
directories named after the extension, with the extension stripped. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
*unzip -/c:h:o:s foo/zip
|
||||||
|
|
||||||
|
If foo/zip contains a file named "foo.c", this file will be written as "foo"
|
||||||
|
in directory "c". This can be used to include "c:h:o:s:txt" to pull all the
|
||||||
|
text files out to a separate directory.
|
||||||
|
|
||||||
|
UnZip fully supports SparkFS Extra Field. This means that zipfiles created
|
||||||
|
with SparkFS or Zip (on RISC OS) will be correctly unzipped, including
|
||||||
|
filetypes.
|
||||||
|
|
||||||
|
UnZipSFX can be used to create self-extracting archives. To use it, just
|
||||||
|
create a common zipfile using Zip (or SparkFS), then load the UnZipSFX
|
||||||
|
executable into an editor (eg. Edit, Zap), go with the caret the end of the
|
||||||
|
file (using CTRL-CursorDown) and drag the zipfile to the editor window (in
|
||||||
|
other words, append the zipfile to the UnZipSFX executable). Now, saving the
|
||||||
|
resulting file (with filetype Absolute (&FF8)), you have a self-extracting
|
||||||
|
archive (ie. double-clicking on it will unzip the contents of the original
|
||||||
|
zipfile to the currently selected directory).
|
17
unzip/unzip-5.52/acorn/RunMe1st
Normal file
17
unzip/unzip-5.52/acorn/RunMe1st
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
| This Obey file prepares the UnZip port for a Desktop C re-compile.
|
||||||
|
| Run it and it will copy all the needed files into the correct
|
||||||
|
| place.
|
||||||
|
|
||||||
|
| Set the correct type of 'srcrename' so that the only requirement
|
||||||
|
| for the user is to set 'RunMe1st' to Obey
|
||||||
|
SetType <Obey$Dir>.srcrename FF8
|
||||||
|
|
||||||
|
| Run 'srcrename' on the main UnZip directory with recursion enabled
|
||||||
|
/<Obey$Dir>.srcrename -r -e c:h:s:o <Obey$Dir>.^
|
||||||
|
|
||||||
|
| Create the 'o' directory
|
||||||
|
CDir <Obey$Dir>.^.o
|
||||||
|
|
||||||
|
| Put the Makefile in its correct place and set the correct filetype
|
||||||
|
SetType <Obey$Dir>.makefile FE1
|
||||||
|
Copy <Obey$Dir>.makefile <Obey$Dir>.^.makefile ~C ~V F
|
989
unzip/unzip-5.52/acorn/acorn.c
Normal file
989
unzip/unzip-5.52/acorn/acorn.c
Normal file
@ -0,0 +1,989 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
acorn.c
|
||||||
|
|
||||||
|
RISCOS-specific routines for use with Info-ZIP's UnZip 5.2 and later.
|
||||||
|
|
||||||
|
Contains: do_wild() <-- generic enough to put in fileio.c?
|
||||||
|
mapattr()
|
||||||
|
mapname()
|
||||||
|
checkdir()
|
||||||
|
mkdir()
|
||||||
|
setRISCOSexfield()
|
||||||
|
printRISCOSexfield()
|
||||||
|
close_outfile()
|
||||||
|
stamp_file()
|
||||||
|
version()
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "^.unzip.h"
|
||||||
|
#include "riscos.h"
|
||||||
|
|
||||||
|
#define FTYPE_FFF (1<<17) /* set filetype to &FFF when extracting */
|
||||||
|
|
||||||
|
#ifdef WILD_STOP_AT_DIR
|
||||||
|
# define WESEP , (oU.W_flag ? '.' : '\0')
|
||||||
|
#else
|
||||||
|
# define WESEP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int created_dir; /* used in mapname(), checkdir() */
|
||||||
|
static int renamed_fullpath; /* ditto */
|
||||||
|
static int has_mimemap = -1; /* used in mimemap() */
|
||||||
|
|
||||||
|
extern int mkdir(const char *path, int mode);
|
||||||
|
static int has_NFS_ext(const char *name);
|
||||||
|
static void setRISCOSexfield(ZCONST char *path, ZCONST void *ef_spark);
|
||||||
|
#ifdef DEBUG
|
||||||
|
static void printRISCOSexfield(int isdir, ZCONST void *extra_field);
|
||||||
|
#endif
|
||||||
|
static int uxtime2acornftime(unsigned *pexadr, unsigned *pldadr, time_t ut);
|
||||||
|
static int mimemap(const char *name);
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
char *do_wild(__G__ wildspec)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *wildspec; /* only used first time on a given dir */
|
||||||
|
{
|
||||||
|
static DIR *wild_dir = (DIR *)NULL;
|
||||||
|
static ZCONST char *wildname;
|
||||||
|
static char *dirname, matchname[FILNAMSIZ];
|
||||||
|
static int notfirstcall=FALSE, have_dirname, dirnamelen;
|
||||||
|
struct dirent *file;
|
||||||
|
|
||||||
|
/* Even when we're just returning wildspec, we *always* do so in
|
||||||
|
* matchname[]--calling routine is allowed to append four characters
|
||||||
|
* to the returned string, and wildspec may be a pointer to argv[].
|
||||||
|
*/
|
||||||
|
if (!notfirstcall) { /* first call: must initialize everything */
|
||||||
|
notfirstcall = TRUE;
|
||||||
|
|
||||||
|
/* break the wildspec into a directory part and a wildcard filename */
|
||||||
|
if ((wildname = (ZCONST char *)strrchr(wildspec, '.')) ==
|
||||||
|
(ZCONST char *)NULL)
|
||||||
|
{
|
||||||
|
dirname = ".";
|
||||||
|
dirnamelen = 1;
|
||||||
|
have_dirname = FALSE;
|
||||||
|
wildname = wildspec;
|
||||||
|
} else {
|
||||||
|
++wildname; /* point at character after '/' */
|
||||||
|
dirnamelen = wildname - wildspec;
|
||||||
|
if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) {
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: cannot allocate wildcard buffers\n"));
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
return matchname; /* but maybe filespec was not a wildcard */
|
||||||
|
}
|
||||||
|
strncpy(dirname, wildspec, dirnamelen);
|
||||||
|
dirname[dirnamelen] = '\0'; /* terminate for strcpy below */
|
||||||
|
have_dirname = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((wild_dir = opendir(dirname)) != (DIR *)NULL) {
|
||||||
|
while ((file = readdir(wild_dir)) != (struct dirent *)NULL) {
|
||||||
|
if (file->d_name[0] == '/' && wildname[0] != '/')
|
||||||
|
continue; /* Unix: '*' and '?' do not match leading dot */
|
||||||
|
if (match(file->d_name, wildname, 0 WESEP)) { /* 0=case sens.*/
|
||||||
|
if (have_dirname) {
|
||||||
|
strcpy(matchname, dirname);
|
||||||
|
strcpy(matchname+dirnamelen, file->d_name);
|
||||||
|
} else
|
||||||
|
strcpy(matchname, file->d_name);
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* if we get to here directory is exhausted, so close it */
|
||||||
|
closedir(wild_dir);
|
||||||
|
wild_dir = (DIR *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return the raw wildspec in case that works (e.g., directory not
|
||||||
|
* searchable, but filespec was not wild and file is readable) */
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* last time through, might have failed opendir but returned raw wildspec */
|
||||||
|
if (wild_dir == (DIR *)NULL) {
|
||||||
|
notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */
|
||||||
|
if (have_dirname)
|
||||||
|
free(dirname);
|
||||||
|
return (char *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we've gotten this far, we've read and matched at least one entry
|
||||||
|
* successfully (in a previous call), so dirname has been copied into
|
||||||
|
* matchname already.
|
||||||
|
*/
|
||||||
|
while ((file = readdir(wild_dir)) != (struct dirent *)NULL)
|
||||||
|
if (match(file->d_name, wildname, 0 WESEP)) { /* 0 == case sens. */
|
||||||
|
if (have_dirname) {
|
||||||
|
/* strcpy(matchname, dirname); */
|
||||||
|
strcpy(matchname+dirnamelen, file->d_name);
|
||||||
|
} else
|
||||||
|
strcpy(matchname, file->d_name);
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(wild_dir); /* have read at least one dir entry; nothing left */
|
||||||
|
wild_dir = (DIR *)NULL;
|
||||||
|
notfirstcall = FALSE; /* reset for new wildspec */
|
||||||
|
if (have_dirname)
|
||||||
|
free(dirname);
|
||||||
|
return (char *)NULL;
|
||||||
|
|
||||||
|
} /* end function do_wild() */
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**************************/
|
||||||
|
/* Function has_NFS_ext() */
|
||||||
|
/**************************/
|
||||||
|
|
||||||
|
static int has_NFS_ext(const char* name)
|
||||||
|
{
|
||||||
|
int i = strlen(name) - 4;
|
||||||
|
|
||||||
|
return (i >= 0 && name[i] == ',' && (i > 0 || name[i-1]=='/') &&
|
||||||
|
isxdigit(name[i+1]) && isxdigit(name[i+2]) && isxdigit(name[i+3]));
|
||||||
|
} /* end function has_NFS_ext() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function mapattr() */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
int mapattr(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
ulg tmp = G.crec.external_file_attributes;
|
||||||
|
|
||||||
|
switch (G.pInfo->hostnum) {
|
||||||
|
case AMIGA_:
|
||||||
|
tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */
|
||||||
|
G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp);
|
||||||
|
break;
|
||||||
|
case THEOS_:
|
||||||
|
tmp &= 0xF1FFFFFFL;
|
||||||
|
if ((tmp & 0xF0000000L) != 0x40000000L)
|
||||||
|
tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */
|
||||||
|
else
|
||||||
|
tmp &= 0x41FFFFFFL; /* leave directory bit as set */
|
||||||
|
/* fall through! */
|
||||||
|
case ACORN_:
|
||||||
|
case UNIX_:
|
||||||
|
case VMS_:
|
||||||
|
case ATARI_:
|
||||||
|
case ATHEOS_:
|
||||||
|
case BEOS_:
|
||||||
|
case QDOS_:
|
||||||
|
case TANDEM_:
|
||||||
|
G.pInfo->file_attr = (unsigned)(tmp >> 16);
|
||||||
|
if (G.pInfo->file_attr != 0 || !G.extra_field) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
/* Some (non-Info-ZIP) implementations of Zip for Unix and
|
||||||
|
VMS (and probably others ??) leave 0 in the upper 16-bit
|
||||||
|
part of the external_file_attributes field. Instead, they
|
||||||
|
store file permission attributes in some extra field.
|
||||||
|
As a work-around, we search for the presence of one of
|
||||||
|
these extra fields and fall back to the MSDOS compatible
|
||||||
|
part of external_file_attributes if one of the known
|
||||||
|
e.f. types has been detected.
|
||||||
|
Later, we might implement extraction of the permission
|
||||||
|
bits from the VMS extra field. But for now, the work-around
|
||||||
|
should be sufficient to provide "readable" extracted files.
|
||||||
|
(For ASI Unix e.f., an experimental remap of the e.f.
|
||||||
|
mode value IS already provided!)
|
||||||
|
*/
|
||||||
|
ush ebID;
|
||||||
|
unsigned ebLen;
|
||||||
|
uch *ef = G.extra_field;
|
||||||
|
unsigned ef_len = G.crec.extra_field_length;
|
||||||
|
int r = FALSE;
|
||||||
|
|
||||||
|
while (!r && ef_len >= EB_HEADSIZE) {
|
||||||
|
ebID = makeword(ef);
|
||||||
|
ebLen = (unsigned)makeword(ef+EB_LEN);
|
||||||
|
if (ebLen > (ef_len - EB_HEADSIZE))
|
||||||
|
/* discoverd some e.f. inconsistency! */
|
||||||
|
break;
|
||||||
|
switch (ebID) {
|
||||||
|
case EF_ASIUNIX:
|
||||||
|
if (ebLen >= (EB_ASI_MODE+2)) {
|
||||||
|
G.pInfo->file_attr =
|
||||||
|
(unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE));
|
||||||
|
/* force stop of loop: */
|
||||||
|
ef_len = (ebLen + EB_HEADSIZE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* else: fall through! */
|
||||||
|
case EF_PKVMS:
|
||||||
|
/* "found nondecypherable e.f. with perm. attr" */
|
||||||
|
r = TRUE;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ef_len -= (ebLen + EB_HEADSIZE);
|
||||||
|
ef += (ebLen + EB_HEADSIZE);
|
||||||
|
}
|
||||||
|
if (!r)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall through! */
|
||||||
|
/* all remaining cases: expand MSDOS read-only bit into write perms */
|
||||||
|
case FS_FAT_:
|
||||||
|
/* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the
|
||||||
|
* Unix attributes in the upper 16 bits of the external attributes
|
||||||
|
* field, just like Info-ZIP's Zip for Unix. We try to use that
|
||||||
|
* value, after a check for consistency with the MSDOS attribute
|
||||||
|
* bits (see below).
|
||||||
|
*/
|
||||||
|
G.pInfo->file_attr = (unsigned)(tmp >> 16);
|
||||||
|
/* fall through! */
|
||||||
|
case FS_HPFS_:
|
||||||
|
case FS_NTFS_:
|
||||||
|
case MAC_:
|
||||||
|
case TOPS20_:
|
||||||
|
default:
|
||||||
|
/* Ensure that DOS subdir bit is set when the entry's name ends
|
||||||
|
* in a '/'. Some third-party Zip programs fail to set the subdir
|
||||||
|
* bit for directory entries.
|
||||||
|
*/
|
||||||
|
if ((tmp & 0x10) == 0) {
|
||||||
|
extent fnlen = strlen(G.filename);
|
||||||
|
if (fnlen > 0 && G.filename[fnlen-1] == '/')
|
||||||
|
tmp |= 0x10;
|
||||||
|
}
|
||||||
|
/* read-only bit --> write perms; subdir bit --> dir exec bit */
|
||||||
|
tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4;
|
||||||
|
if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6))
|
||||||
|
/* keep previous G.pInfo->file_attr setting, when its "owner"
|
||||||
|
* part appears to be consistent with DOS attribute flags!
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp);
|
||||||
|
break;
|
||||||
|
} /* end switch (host-OS-created-by) */
|
||||||
|
|
||||||
|
G.pInfo->file_attr&=0xFFFF;
|
||||||
|
|
||||||
|
G.pInfo->file_attr|=(0xFFDu<<20);
|
||||||
|
|
||||||
|
if (has_NFS_ext(G.filename)) {
|
||||||
|
int ftype=strtol(G.filename+strlen(G.filename)-3,NULL,16)&0xFFF;
|
||||||
|
|
||||||
|
G.pInfo->file_attr = (G.pInfo->file_attr & 0x000FFFFF) | (ftype<<20);
|
||||||
|
} else {
|
||||||
|
int type = mimemap(G.filename);
|
||||||
|
if (type == -1)
|
||||||
|
type = (G.crec.internal_file_attributes & 1) ? 0xFFF : 0xFFD;
|
||||||
|
G.pInfo->file_attr = (G.pInfo->file_attr & 0x000FFFFF) | (type<<20);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} /* end function mapattr() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function mimemap() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
static int mimemap(const char *name)
|
||||||
|
{
|
||||||
|
const char *ext = name;
|
||||||
|
int type;
|
||||||
|
|
||||||
|
if (has_mimemap < 0)
|
||||||
|
has_mimemap =
|
||||||
|
!(SWI_OS_CLI("%RMEnsure MimeMap 0.05 RMLoad System:Modules.Network.MimeMap")
|
||||||
|
|| SWI_OS_CLI("%RMEnsure MimeMap 0.05"));
|
||||||
|
|
||||||
|
if (!has_mimemap)
|
||||||
|
return -1; /* no MimeMap module; fall back on text flag test */
|
||||||
|
|
||||||
|
do {
|
||||||
|
while (*ext && *ext!='.')
|
||||||
|
ext++;
|
||||||
|
if (!*ext)
|
||||||
|
return -1; /* no suitable extension; fallback */
|
||||||
|
type = SWI_MimeMap_Translate(ext++);
|
||||||
|
} while (type == -1);
|
||||||
|
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function mapname() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
int mapname(__G__ renamed)
|
||||||
|
__GDEF
|
||||||
|
int renamed;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - caution (truncated filename)
|
||||||
|
* MPN_INF_SKIP - info "skip entry" (dir doesn't exist)
|
||||||
|
* MPN_ERR_SKIP - error -> skip entry
|
||||||
|
* MPN_ERR_TOOLONG - error -> path is too long
|
||||||
|
* MPN_NOMEM - error (memory allocation failed) -> skip entry
|
||||||
|
* [also MPN_VOL_LABEL, MPN_CREATED_DIR]
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
char pathcomp[FILNAMSIZ]; /* path-component buffer */
|
||||||
|
char *pp, *cp=(char *)NULL; /* character pointers */
|
||||||
|
char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */
|
||||||
|
int error = MPN_OK;
|
||||||
|
register unsigned workch; /* hold the character being tested */
|
||||||
|
char *checkswap=NULL; /* pointer the the extension to check */
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Initialize various pointers and counters and stuff.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (G.pInfo->vollabel)
|
||||||
|
return MPN_VOL_LABEL; /* can't set disk volume labels in RISCOS */
|
||||||
|
|
||||||
|
/* can create path as long as not just freshening, or if user told us */
|
||||||
|
G.create_dirs = (!uO.fflag || renamed);
|
||||||
|
|
||||||
|
created_dir = FALSE; /* not yet */
|
||||||
|
|
||||||
|
/* user gave full pathname: don't prepend rootpath */
|
||||||
|
renamed_fullpath = (renamed && (*G.filename == '/'));
|
||||||
|
|
||||||
|
if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM)
|
||||||
|
return MPN_NOMEM; /* initialize path buffer, unless no memory */
|
||||||
|
|
||||||
|
*pathcomp = '\0'; /* initialize translation buffer */
|
||||||
|
pp = pathcomp; /* point to translation buffer */
|
||||||
|
if (uO.jflag) /* junking directories */
|
||||||
|
cp = (char *)strrchr(G.filename, '/');
|
||||||
|
if (cp == (char *)NULL) /* no '/' or not junking dirs */
|
||||||
|
cp = G.filename; /* point to internal zipfile-member pathname */
|
||||||
|
else
|
||||||
|
++cp; /* point to start of last component of path */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Begin main loop through characters in filename.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
while ((workch = (uch)*cp++) != 0) {
|
||||||
|
|
||||||
|
switch (workch) {
|
||||||
|
case '/': /* can assume -j flag not given */
|
||||||
|
*pp = '\0';
|
||||||
|
if (((error = checkdir(__G__ pathcomp, APPEND_DIR))
|
||||||
|
& MPN_MASK) > MPN_INF_TRUNC)
|
||||||
|
return error;
|
||||||
|
pp = pathcomp; /* reset conversion buffer for next piece */
|
||||||
|
lastsemi = (char *)NULL; /* leave direct. semi-colons alone */
|
||||||
|
checkswap=NULL; /* reset checking at start of new leafname */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '.':
|
||||||
|
*pp++ = '/';
|
||||||
|
checkswap=pp;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ';': /* VMS version (or DEC-20 attrib?) */
|
||||||
|
lastsemi = pp;
|
||||||
|
*pp++ = ';'; /* keep for now; remove VMS ";##" */
|
||||||
|
break; /* later, if requested */
|
||||||
|
|
||||||
|
case ' ': /* change spaces to hard-spaces */
|
||||||
|
*pp++ = 160; /* (ISO 8859-1 Latin-1 codepage) */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* The following substitutions, unless stated otherwise, follow
|
||||||
|
* those for DOSFS. They translate special symbols into other
|
||||||
|
* characters which have no special meaning to RISC OS. */
|
||||||
|
case '#': *pp++ = '?'; break; /* single-char wildcard */
|
||||||
|
case '&': *pp++ = '+'; break;
|
||||||
|
case '@': *pp++ = '='; break;
|
||||||
|
case '%': *pp++ = ';'; break;
|
||||||
|
case '$': *pp++ = '<'; break;
|
||||||
|
case '^': *pp++ = '>'; break; /* parent-dir reference */
|
||||||
|
|
||||||
|
/* The following substitutions deal with the remaining special
|
||||||
|
* symbols. ('.' is handled above.) */
|
||||||
|
case '*': *pp++ = 0xD7; break; /* Latin-1 'multiply' */
|
||||||
|
case '"': *pp++ = '~'; break;
|
||||||
|
case ':': *pp++ = ';'; break;
|
||||||
|
case '\\': *pp++ = '/'; break;
|
||||||
|
case '|': *pp++ = 0xA6; break; /* Latin-1 'broken bar' */
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* allow European characters in filenames: */
|
||||||
|
if (isprint(workch) || (128 <= workch && workch <= 254))
|
||||||
|
*pp++ = (char)workch;
|
||||||
|
} /* end switch */
|
||||||
|
|
||||||
|
} /* end while loop */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Report if directory was created (and no file to create: filename ended
|
||||||
|
in '/'), check name to be sure it exists, and combine path and name be-
|
||||||
|
fore exiting.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (G.filename[strlen(G.filename) - 1] == '/') {
|
||||||
|
checkdir(__G__ G.filename, GETPATH);
|
||||||
|
if (created_dir) {
|
||||||
|
if (QCOND2) {
|
||||||
|
Info(slide, 0, ((char *)slide, " creating: %s\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
}
|
||||||
|
/* set dir time (note trailing '/') */
|
||||||
|
return (error & ~MPN_MASK) | MPN_CREATED_DIR;
|
||||||
|
}
|
||||||
|
/* dir existed already; don't look for data to extract */
|
||||||
|
return (error & ~MPN_MASK) | MPN_INF_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pp = '\0'; /* done with pathcomp: terminate it */
|
||||||
|
|
||||||
|
/* if not saving them, remove VMS version numbers (appended ";###") */
|
||||||
|
if (!uO.V_flag && lastsemi) {
|
||||||
|
pp = lastsemi + 1;
|
||||||
|
while (isdigit((uch)(*pp)))
|
||||||
|
++pp;
|
||||||
|
if (*pp == '\0') /* only digits between ';' and end: nuke */
|
||||||
|
*lastsemi = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*pathcomp == '\0') {
|
||||||
|
Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
return (error & ~MPN_MASK) | MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkswap!=NULL) {
|
||||||
|
if (checkext(checkswap)) {
|
||||||
|
if ((error = checkdir(__G__ checkswap, APPEND_DIR)) > 1)
|
||||||
|
return error;
|
||||||
|
*(checkswap-1)=0; /* remove extension from pathcomp */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!uO.acorn_nfs_ext && has_NFS_ext(pathcomp)) {
|
||||||
|
/* remove the filetype extension unless requested otherwise */
|
||||||
|
/* the filetype should be already set by mapattr() */
|
||||||
|
pathcomp[strlen(pathcomp)-4]=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */
|
||||||
|
checkdir(__G__ G.filename, GETPATH);
|
||||||
|
|
||||||
|
return error;
|
||||||
|
|
||||||
|
} /* end function mapname() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************/
|
||||||
|
/* Function checkdir() */
|
||||||
|
/***********************/
|
||||||
|
|
||||||
|
int checkdir(__G__ pathcomp, flag)
|
||||||
|
__GDEF
|
||||||
|
char *pathcomp;
|
||||||
|
int flag;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - (on APPEND_NAME) truncated filename
|
||||||
|
* MPN_INF_SKIP - path doesn't exist, not allowed to create
|
||||||
|
* MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path
|
||||||
|
* exists and is not a directory, but is supposed to be
|
||||||
|
* MPN_ERR_TOOLONG - path is too long
|
||||||
|
* MPN_NOMEM - can't allocate memory for filename buffers
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
static int rootlen = 0; /* length of rootpath */
|
||||||
|
static char *rootpath; /* user's "extract-to" directory */
|
||||||
|
static char *buildpath; /* full path (so far) to extracted file */
|
||||||
|
static char *end; /* pointer to end of buildpath ('\0') */
|
||||||
|
|
||||||
|
# define FN_MASK 7
|
||||||
|
# define FUNCTION (flag & FN_MASK)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
APPEND_DIR: append the path component to the path being built and check
|
||||||
|
for its existence. If doesn't exist and we are creating directories, do
|
||||||
|
so for this one; else signal success or error as appropriate.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == APPEND_DIR) {
|
||||||
|
int too_long = FALSE;
|
||||||
|
#ifdef SHORT_NAMES
|
||||||
|
char *old_end = end;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp)));
|
||||||
|
while ((*end = *pathcomp++) != '\0')
|
||||||
|
++end;
|
||||||
|
#ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */
|
||||||
|
if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */
|
||||||
|
*(end = old_end + FILENAME_MAX) = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GRR: could do better check, see if overrunning buffer as we go:
|
||||||
|
* check end-buildpath after each append, set warning variable if
|
||||||
|
* within 20 of FILNAMSIZ; then if var set, do careful check when
|
||||||
|
* appending. Clear variable when begin new path. */
|
||||||
|
|
||||||
|
/* next check: need to append '/', at least one-char name, '\0' */
|
||||||
|
if ((end-buildpath) > FILNAMSIZ-3)
|
||||||
|
too_long = TRUE; /* check if extracting dir? */
|
||||||
|
if (stat(buildpath, &G.statbuf)) { /* path doesn't exist */
|
||||||
|
if (!G.create_dirs) { /* told not to create (freshening) */
|
||||||
|
free(buildpath);
|
||||||
|
return MPN_INF_SKIP; /* path doesn't exist: nothing to do */
|
||||||
|
}
|
||||||
|
if (too_long) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: path too long: %s\n",
|
||||||
|
FnFilter1(buildpath)));
|
||||||
|
fflush(stderr);
|
||||||
|
free(buildpath);
|
||||||
|
/* no room for filenames: fatal */
|
||||||
|
return MPN_ERR_TOOLONG;
|
||||||
|
}
|
||||||
|
if (mkdir(buildpath, 0777) == -1) { /* create the directory */
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: cannot create %s\n\
|
||||||
|
unable to process %s.\n",
|
||||||
|
FnFilter2(buildpath), FnFilter1(G.filename)));
|
||||||
|
free(buildpath);
|
||||||
|
/* path didn't exist, tried to create, failed */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
created_dir = TRUE;
|
||||||
|
} else if (!S_ISDIR(G.statbuf.st_mode)) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: %s exists but is not directory\n\
|
||||||
|
unable to process %s.\n",
|
||||||
|
FnFilter2(buildpath), FnFilter1(G.filename)));
|
||||||
|
free(buildpath);
|
||||||
|
/* path existed but wasn't dir */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
if (too_long) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: path too long: %s\n", FnFilter1(buildpath)));
|
||||||
|
free(buildpath);
|
||||||
|
/* no room for filenames: fatal */
|
||||||
|
return MPN_ERR_TOOLONG;
|
||||||
|
}
|
||||||
|
*end++ = '.'; /************* was '/' *************/
|
||||||
|
*end = '\0';
|
||||||
|
Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath)));
|
||||||
|
return MPN_OK;
|
||||||
|
|
||||||
|
} /* end if (FUNCTION == APPEND_DIR) */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
GETPATH: copy full path to the string pointed at by pathcomp, and free
|
||||||
|
buildpath.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == GETPATH) {
|
||||||
|
strcpy(pathcomp, buildpath);
|
||||||
|
Trace((stderr, "getting and freeing path [%s]\n",
|
||||||
|
FnFilter1(pathcomp)));
|
||||||
|
free(buildpath);
|
||||||
|
buildpath = end = (char *)NULL;
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
APPEND_NAME: assume the path component is the filename; append it and
|
||||||
|
return without checking for existence.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == APPEND_NAME) {
|
||||||
|
#ifdef SHORT_NAMES
|
||||||
|
char *old_end = end;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp)));
|
||||||
|
while ((*end = *pathcomp++) != '\0') {
|
||||||
|
++end;
|
||||||
|
#ifdef SHORT_NAMES /* truncate name at 14 characters, typically */
|
||||||
|
if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */
|
||||||
|
*(end = old_end + FILENAME_MAX) = '\0';
|
||||||
|
#endif
|
||||||
|
if ((end-buildpath) >= FILNAMSIZ) {
|
||||||
|
*--end = '\0';
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"checkdir warning: path too long; truncating\n\
|
||||||
|
%s\n -> %s\n",
|
||||||
|
FnFilter1(G.filename), FnFilter2(buildpath)));
|
||||||
|
return MPN_INF_TRUNC; /* filename truncated */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath)));
|
||||||
|
/* could check for existence here, prompt for new name... */
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
INIT: allocate and initialize buffer space for the file currently being
|
||||||
|
extracted. If file was renamed with an absolute path, don't prepend the
|
||||||
|
extract-to path.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* GRR: for VMS and TOPS-20, add up to 13 to strlen */
|
||||||
|
|
||||||
|
if (FUNCTION == INIT) {
|
||||||
|
Trace((stderr, "initializing buildpath to "));
|
||||||
|
if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+1))
|
||||||
|
== (char *)NULL)
|
||||||
|
return MPN_NOMEM;
|
||||||
|
if ((rootlen > 0) && !renamed_fullpath) {
|
||||||
|
strcpy(buildpath, rootpath);
|
||||||
|
end = buildpath + rootlen;
|
||||||
|
} else {
|
||||||
|
*buildpath = '\0';
|
||||||
|
end = buildpath;
|
||||||
|
}
|
||||||
|
Trace((stderr, "[%s]\n", FnFilter1(buildpath)));
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
ROOT: if appropriate, store the path in rootpath and create it if
|
||||||
|
necessary; else assume it's a zipfile member and return. This path
|
||||||
|
segment gets used in extracting all members from every zipfile specified
|
||||||
|
on the command line.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if (!defined(SFX) || defined(SFX_EXDIR))
|
||||||
|
if (FUNCTION == ROOT) {
|
||||||
|
Trace((stderr, "initializing root path to [%s]\n",
|
||||||
|
FnFilter1(pathcomp)));
|
||||||
|
if (pathcomp == (char *)NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
if (rootlen > 0) /* rootpath was already set, nothing to do */
|
||||||
|
return MPN_OK;
|
||||||
|
if ((rootlen = strlen(pathcomp)) > 0) {
|
||||||
|
char *tmproot;
|
||||||
|
|
||||||
|
if ((tmproot = (char *)malloc(rootlen+2)) == (char *)NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_NOMEM;
|
||||||
|
}
|
||||||
|
strcpy(tmproot, pathcomp);
|
||||||
|
if (tmproot[rootlen-1] == '.') { /****** was '/' ********/
|
||||||
|
tmproot[--rootlen] = '\0';
|
||||||
|
}
|
||||||
|
if (rootlen > 0 && (SSTAT(tmproot, &G.statbuf) ||
|
||||||
|
!S_ISDIR(G.statbuf.st_mode)))
|
||||||
|
{ /* path does not exist */
|
||||||
|
if (!G.create_dirs /* || isshexp(tmproot) */ ) {
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
/* skip (or treat as stored file) */
|
||||||
|
return MPN_INF_SKIP;
|
||||||
|
}
|
||||||
|
/* create the directory (could add loop here scanning tmproot
|
||||||
|
* to create more than one level, but why really necessary?) */
|
||||||
|
if (mkdir(tmproot, 0777) == -1) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir: cannot create extraction directory: %s\n",
|
||||||
|
FnFilter1(tmproot)));
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
/* path didn't exist, tried to create, and failed: */
|
||||||
|
/* file exists, or 2+ subdir levels required */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tmproot[rootlen++] = '.'; /*********** was '/' *************/
|
||||||
|
tmproot[rootlen] = '\0';
|
||||||
|
if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) {
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_NOMEM;
|
||||||
|
}
|
||||||
|
Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath)));
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
#endif /* !SFX || SFX_EXDIR */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
END: free rootpath, immediately prior to program exit.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == END) {
|
||||||
|
Trace((stderr, "freeing rootpath\n"));
|
||||||
|
if (rootlen > 0) {
|
||||||
|
free(rootpath);
|
||||||
|
rootlen = 0;
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MPN_INVALID; /* should never reach */
|
||||||
|
|
||||||
|
} /* end function checkdir() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/********************/
|
||||||
|
/* Function mkdir() */
|
||||||
|
/********************/
|
||||||
|
|
||||||
|
int mkdir(path, mode)
|
||||||
|
const char *path;
|
||||||
|
int mode; /* ignored */
|
||||||
|
/*
|
||||||
|
* returns: 0 - successful
|
||||||
|
* -1 - failed (errno not set, however)
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
return (SWI_OS_File_8((char *)path) == NULL)? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************/
|
||||||
|
/* extra_field-related functions */
|
||||||
|
/*********************************/
|
||||||
|
|
||||||
|
static void setRISCOSexfield(ZCONST char *path, ZCONST void *ef_spark)
|
||||||
|
{
|
||||||
|
if (ef_spark!=NULL) {
|
||||||
|
extra_block *block=(extra_block *)ef_spark;
|
||||||
|
SWI_OS_File_1((char *)path,block->loadaddr,block->execaddr,block->attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
static void printRISCOSexfield(int isdir, ZCONST void *extra_field)
|
||||||
|
{
|
||||||
|
extra_block *block=(extra_block *)extra_field;
|
||||||
|
printf("\n This file has RISC OS file informations in the local extra field.\n");
|
||||||
|
|
||||||
|
if (isdir) {
|
||||||
|
/* I prefer not to print this string... should change later... */
|
||||||
|
/* printf(" The file is a directory.\n");*/
|
||||||
|
} else if ((block->loadaddr & 0xFFF00000) != 0xFFF00000) {
|
||||||
|
printf(" Load address: %.8X\n",block->loadaddr);
|
||||||
|
printf(" Exec address: %.8X\n",block->execaddr);
|
||||||
|
} else {
|
||||||
|
/************* should change this to use OS_FSControl 18 to get filetype string ************/
|
||||||
|
char tmpstr[16];
|
||||||
|
char ftypestr[32];
|
||||||
|
int flen;
|
||||||
|
sprintf(tmpstr,"File$Type_%03x",(block->loadaddr & 0x000FFF00) >> 8);
|
||||||
|
if (SWI_OS_ReadVarVal(tmpstr,ftypestr,32,&flen)==NULL) {
|
||||||
|
ftypestr[flen]=0;
|
||||||
|
printf(" Filetype: %s (&%.3X)\n",ftypestr,(block->loadaddr & 0x000FFF00) >> 8);
|
||||||
|
} else {
|
||||||
|
printf(" Filetype: &%.3X\n",(block->loadaddr & 0x000FFF00) >> 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf(" Access: ");
|
||||||
|
if (block->attr & (1<<3))
|
||||||
|
printf("L");
|
||||||
|
if (block->attr & (1<<0))
|
||||||
|
printf("W");
|
||||||
|
if (block->attr & (1<<1))
|
||||||
|
printf("R");
|
||||||
|
printf("/");
|
||||||
|
if (block->attr & (1<<4))
|
||||||
|
printf("w");
|
||||||
|
if (block->attr & (1<<5))
|
||||||
|
printf("r");
|
||||||
|
printf("\n\n");
|
||||||
|
}
|
||||||
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************/
|
||||||
|
/* internal help function for time conversion */
|
||||||
|
/**********************************************/
|
||||||
|
static int uxtime2acornftime(unsigned *pexadr, unsigned *pldadr, time_t ut)
|
||||||
|
{
|
||||||
|
unsigned timlo; /* 3 lower bytes of acorn file-time plus carry byte */
|
||||||
|
unsigned timhi; /* 2 high bytes of acorn file-time */
|
||||||
|
|
||||||
|
timlo = ((unsigned)ut & 0x00ffffffU) * 100 + 0x00996a00U;
|
||||||
|
timhi = ((unsigned)ut >> 24);
|
||||||
|
timhi = timhi * 100 + 0x0000336eU + (timlo >> 24);
|
||||||
|
if (timhi & 0xffff0000U)
|
||||||
|
return 1; /* calculation overflow, do not change time */
|
||||||
|
|
||||||
|
/* insert the five time bytes into loadaddr and execaddr variables */
|
||||||
|
*pexadr = (timlo & 0x00ffffffU) | ((timhi & 0x000000ffU) << 24);
|
||||||
|
*pldadr = (*pldadr & 0xffffff00U) | ((timhi >> 8) & 0x000000ffU);
|
||||||
|
|
||||||
|
return 0; /* subject to future extension to signal overflow */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* Function close_outfile() */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
|
void close_outfile(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
zvoid *spark_ef;
|
||||||
|
|
||||||
|
fclose(G.outfile);
|
||||||
|
|
||||||
|
if ((spark_ef = getRISCOSexfield(G.extra_field, G.lrec.extra_field_length))
|
||||||
|
!= NULL) {
|
||||||
|
setRISCOSexfield(G.filename, spark_ef);
|
||||||
|
} else {
|
||||||
|
unsigned int loadaddr, execaddr;
|
||||||
|
int attr;
|
||||||
|
int mode=G.pInfo->file_attr&0xffff; /* chmod equivalent mode */
|
||||||
|
|
||||||
|
time_t m_time;
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
iztimes z_utime;
|
||||||
|
#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.lrec.extra_field_length, 0,
|
||||||
|
G.lrec.last_mod_dos_datetime, &z_utime, NULL)
|
||||||
|
& EB_UT_FL_MTIME))
|
||||||
|
{
|
||||||
|
TTrace((stderr, "close_outfile: Unix e.f. modif. time = %ld\n",
|
||||||
|
z_utime.mtime));
|
||||||
|
m_time = z_utime.mtime;
|
||||||
|
} else
|
||||||
|
#endif /* USE_EF_UT_TIME */
|
||||||
|
m_time = dos_to_unix_time(G.lrec.last_mod_dos_datetime);
|
||||||
|
|
||||||
|
/* set the file's modification time */
|
||||||
|
SWI_OS_File_5(G.filename, NULL, &loadaddr, NULL, NULL, &attr);
|
||||||
|
|
||||||
|
uxtime2acornftime(&execaddr, &loadaddr, m_time);
|
||||||
|
|
||||||
|
loadaddr = (loadaddr & 0xfff000ffU) |
|
||||||
|
((G.pInfo->file_attr&0xfff00000) >> 12);
|
||||||
|
|
||||||
|
attr=(attr&0xffffff00) | ((mode&0400) >> 8) | ((mode&0200) >> 6) |
|
||||||
|
((mode&0004) << 2) | ((mode&0002) << 4);
|
||||||
|
|
||||||
|
SWI_OS_File_1(G.filename, loadaddr, execaddr, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end function close_outfile() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TIMESTAMP
|
||||||
|
|
||||||
|
/***************************/
|
||||||
|
/* Function stamp_file() */
|
||||||
|
/***************************/
|
||||||
|
|
||||||
|
int stamp_file(fname, modtime)
|
||||||
|
ZCONST char *fname;
|
||||||
|
time_t modtime;
|
||||||
|
{
|
||||||
|
unsigned int loadaddr, execaddr;
|
||||||
|
int attr;
|
||||||
|
|
||||||
|
/* set the file's modification time */
|
||||||
|
if (SWI_OS_File_5((char *)fname, NULL, &loadaddr, NULL, NULL, &attr)
|
||||||
|
!= NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (uxtime2acornftime(&execaddr, &loadaddr, modtime) != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return (SWI_OS_File_1((char *)fname, loadaddr, execaddr, attr) == NULL) ?
|
||||||
|
0 : -1;
|
||||||
|
|
||||||
|
} /* end function stamp_file() */
|
||||||
|
|
||||||
|
#endif /* TIMESTAMP */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function version() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
void version(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
sprintf((char *)slide, LoadFarString(CompiledWith),
|
||||||
|
#ifdef __GNUC__
|
||||||
|
"gcc ", __VERSION__,
|
||||||
|
#else
|
||||||
|
# ifdef __CC_NORCROFT
|
||||||
|
"Norcroft ", "cc",
|
||||||
|
# else
|
||||||
|
"cc", "",
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
"RISC OS",
|
||||||
|
|
||||||
|
" (Acorn Computers Ltd)",
|
||||||
|
|
||||||
|
#ifdef __DATE__
|
||||||
|
" on ", __DATE__
|
||||||
|
#else
|
||||||
|
"", ""
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
(*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0);
|
||||||
|
|
||||||
|
} /* end function version() */
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
125
unzip/unzip-5.52/acorn/makefile
Normal file
125
unzip/unzip-5.52/acorn/makefile
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
# Makefile for UnZip, UnZipSFX, ZipInfo and fUnZip (5.5 or later)
|
||||||
|
# last modified: 01 Mar 2004
|
||||||
|
|
||||||
|
# add -g to CC to debug
|
||||||
|
# add -d to BIND to debug
|
||||||
|
CC = cc
|
||||||
|
BIND = link
|
||||||
|
AS = $(CC) -c
|
||||||
|
ASM = objasm
|
||||||
|
SQUEEZE = squeeze -v
|
||||||
|
E =
|
||||||
|
|
||||||
|
# flags
|
||||||
|
# CFLAGS flags for C compile
|
||||||
|
# LFLAGS1 flags after output file spec, before obj file list
|
||||||
|
# LFLAGS2 flags after obj file list (libraries, etc)
|
||||||
|
#
|
||||||
|
LIB =
|
||||||
|
CBASE = -throwback -wn -DNO_STRNICMP
|
||||||
|
CFLAGS = $(CBASE) -IC:,@.
|
||||||
|
ASMFLAGS = -Throwback -Stamp -NoCache -CloseExec -quit
|
||||||
|
LFLAGS1 =
|
||||||
|
LFLAGS2 = $(LIB) C:o.Stubs
|
||||||
|
|
||||||
|
# object file lists
|
||||||
|
OBJS1 = unzip.o crc32.o crctab.o crypt.o envargs.o explode.o
|
||||||
|
OBJS2 = extract.o fileio.o globals.o inflate.o list.o match.o
|
||||||
|
OBJS3 = process.o ttyio.o unreduce.o unshrink.o zipinfo.o
|
||||||
|
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) riscos.o swiven.o acorn.o
|
||||||
|
OBJF = funzip.o crc32.o cryptf.o globalsf.o inflatef.o ttyiof.o \
|
||||||
|
riscos.o swiven.o
|
||||||
|
OBJX = unzipsfx.o crc32.o crctab.o crypt_.o extract_.o fileio_.o globals.o \
|
||||||
|
inflate.o match.o process_.o ttyio.o acorn_.o swiven.o riscos_.o
|
||||||
|
|
||||||
|
UNZIP_H = unzip.h unzpriv.h globals.h acorn/riscos.h acorn/swiven.h
|
||||||
|
|
||||||
|
all: unzip funzip unzipsfx
|
||||||
|
|
||||||
|
|
||||||
|
install: unzip funzip unzipsfx
|
||||||
|
$(SQUEEZE) unzip %.unzip
|
||||||
|
$(SQUEEZE) funzip %.funzip
|
||||||
|
$(SQUEEZE) unzipsfx unzipsfx
|
||||||
|
copy %.unzip %.zipinfo ~CVF
|
||||||
|
|
||||||
|
# suffix rules
|
||||||
|
.SUFFIXES: .o .c
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) -c $<
|
||||||
|
.s.o:
|
||||||
|
$(ASM) $(ASMFLAGS) -from @*.s -to @*.o
|
||||||
|
|
||||||
|
# rules for unzip and funzip
|
||||||
|
crc32.o: crc32.c $(UNZIP_H) zip.h
|
||||||
|
crctab.o: crctab.c $(UNZIP_H) zip.h
|
||||||
|
crypt.o: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
envargs.o: envargs.c $(UNZIP_H)
|
||||||
|
explode.o: explode.c $(UNZIP_H)
|
||||||
|
extract.o: extract.c $(UNZIP_H) crypt.h
|
||||||
|
fileio.o: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
funzip.o: funzip.c $(UNZIP_H) crypt.h ttyio.h tables.h
|
||||||
|
globals.o: globals.c $(UNZIP_H)
|
||||||
|
inflate.o: inflate.c inflate.h $(UNZIP_H)
|
||||||
|
list.o: list.c $(UNZIP_H)
|
||||||
|
match.o: match.c $(UNZIP_H)
|
||||||
|
process.o: process.c $(UNZIP_H)
|
||||||
|
ttyio.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
unreduce.o: unreduce.c $(UNZIP_H)
|
||||||
|
unshrink.o: unshrink.c $(UNZIP_H)
|
||||||
|
unzip.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
||||||
|
zipinfo.o: zipinfo.c $(UNZIP_H)
|
||||||
|
|
||||||
|
crypt_.o: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.crypt -o o.crypt_
|
||||||
|
extract_.o: extract.c $(UNZIP_H) crypt.h
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.extract -o o.extract_
|
||||||
|
fileio_.o: fileio.c $(UNZIP_H) crypt.h
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.fileio -o o.fileio_
|
||||||
|
globals_.o: globals.c $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.globals -o o.globals_
|
||||||
|
inflate_.o: inflate.c inflate.h $(UNZIP_H) crypt.h
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.inflate -o o.inflate_
|
||||||
|
process_.o: process.c $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.process -o o.process_
|
||||||
|
ttyio_.o: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.ttyio -o o.ttyio_
|
||||||
|
|
||||||
|
unzipsfx.o: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
||||||
|
$(CC) $(CFLAGS) -DSFX -c c.unzip -o o.unzipsfx
|
||||||
|
|
||||||
|
o.cryptf: c.crypt $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.crypt -o o.cryptf
|
||||||
|
o.globalsf: c.globals $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.globals -o o.globalsf
|
||||||
|
o.inflatef: c.inflate h.inflate $(UNZIP_H) h.crypt
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.inflate -o o.inflatef
|
||||||
|
o.ttyiof: c.ttyio $(UNZIP_H) h.zip h.crypt h.ttyio
|
||||||
|
$(CC) $(CFLAGS) -DFUNZIP -c c.ttyio -o o.ttyiof
|
||||||
|
|
||||||
|
acorn.o: acorn/acorn.c $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c acorn/acorn.c
|
||||||
|
acorn_.o: acorn/acorn.c $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c -DSFX -DSFX_EXDIR -o acorn_.o acorn/acorn.c
|
||||||
|
|
||||||
|
riscos.o: acorn/riscos.c $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c acorn/riscos.c
|
||||||
|
riscos_.o: acorn/riscos.c $(UNZIP_H)
|
||||||
|
$(CC) $(CFLAGS) -c -DSFX -DSFX_EXDIR -o riscos_.o acorn/riscos.c
|
||||||
|
|
||||||
|
swiven.o: acorn/swiven.s
|
||||||
|
$(ASM) $(ASMFLAGS) -from acorn.s.swiven -to o.swiven
|
||||||
|
|
||||||
|
unzip: $(OBJS)
|
||||||
|
$(BIND) -o unzip$(E) $(LFLAGS1) $(OBJS) $(LFLAGS2)
|
||||||
|
funzip: $(OBJF)
|
||||||
|
$(BIND) -o funzip$(E) $(LFLAGS1) $(OBJF) $(LFLAGS2)
|
||||||
|
unzipsfx: $(OBJX)
|
||||||
|
$(BIND) -o unzipsfx$(E) $(LFLAGS1) $(OBJX) $(LFLAGS2)
|
||||||
|
|
||||||
|
clean: ;remove unzip; remove funzip;
|
||||||
|
remove zipinfo; remove unzipsfx;
|
||||||
|
create o.!fake! 0
|
||||||
|
wipe o.* ~cf
|
||||||
|
|
||||||
|
# end of Makefile
|
364
unzip/unzip-5.52/acorn/riscos.c
Normal file
364
unzip/unzip-5.52/acorn/riscos.c
Normal file
@ -0,0 +1,364 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/* riscos.c */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* #define NO_UNZIPH_STUFF */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "unzip.h"
|
||||||
|
#include "riscos.h"
|
||||||
|
|
||||||
|
#define MAXEXT 16
|
||||||
|
|
||||||
|
char *exts2swap = NULL; /* Extensions to swap (actually, directory names) */
|
||||||
|
|
||||||
|
int stat(char *filename,struct stat *res)
|
||||||
|
{
|
||||||
|
int attr; /* object attributes */
|
||||||
|
unsigned int load; /* load address */
|
||||||
|
unsigned int exec; /* exec address */
|
||||||
|
int type; /* type: 0 not found, 1 file, 2 dir, 3 image */
|
||||||
|
|
||||||
|
if (!res)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (SWI_OS_File_5(filename,&type,&load,&exec,(int *)&res->st_size,&attr)!=NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (type==0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
res->st_dev=0;
|
||||||
|
res->st_ino=0;
|
||||||
|
res->st_nlink=0;
|
||||||
|
res->st_uid=1;
|
||||||
|
res->st_gid=1;
|
||||||
|
res->st_rdev=0;
|
||||||
|
res->st_blksize=1024;
|
||||||
|
|
||||||
|
res->st_mode = ((attr & 0001) << 8) | ((attr & 0002) << 6) |
|
||||||
|
((attr & 0020) >> 2) | ((attr & 0040) >> 4);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 1: /* File */
|
||||||
|
res->st_mode |= S_IFREG;
|
||||||
|
break;
|
||||||
|
case 2: /* Directory */
|
||||||
|
res->st_mode |= S_IFDIR | 0700;
|
||||||
|
break;
|
||||||
|
case 3: /* Image file */
|
||||||
|
if (uO.scanimage)
|
||||||
|
res->st_mode |= S_IFDIR | 0700;
|
||||||
|
else
|
||||||
|
res->st_mode |= S_IFREG;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((((unsigned int) load) >> 20) == 0xfff) { /* date stamped file */
|
||||||
|
register unsigned int t1, t2, tc;
|
||||||
|
|
||||||
|
t1 = (unsigned int) (exec);
|
||||||
|
t2 = (unsigned int) (load & 0xff);
|
||||||
|
|
||||||
|
tc = 0x6e996a00U;
|
||||||
|
if (t1 < tc)
|
||||||
|
t2--;
|
||||||
|
t1 -= tc;
|
||||||
|
t2 -= 0x33; /* 00:00:00 Jan. 1 1970 = 0x336e996a00 */
|
||||||
|
|
||||||
|
t1 = (t1 / 100) + (t2 * 42949673U); /* 0x100000000 / 100 = 42949672.96 */
|
||||||
|
t1 -= (t2 / 25); /* compensate for .04 error */
|
||||||
|
|
||||||
|
res->st_atime = res->st_mtime = res->st_ctime = t1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
res->st_atime = res->st_mtime = res->st_ctime = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
DIR *opendir(char *dirname)
|
||||||
|
{
|
||||||
|
DIR *thisdir;
|
||||||
|
int type;
|
||||||
|
int attr;
|
||||||
|
os_error *er;
|
||||||
|
|
||||||
|
thisdir=(DIR *)malloc(sizeof(DIR));
|
||||||
|
if (thisdir==NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
thisdir->dirname=(char *)malloc(strlen(dirname)+1);
|
||||||
|
if (thisdir->dirname==NULL) {
|
||||||
|
free(thisdir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(thisdir->dirname,dirname);
|
||||||
|
if (thisdir->dirname[strlen(thisdir->dirname)-1]=='.')
|
||||||
|
thisdir->dirname[strlen(thisdir->dirname)-1]=0;
|
||||||
|
|
||||||
|
if (er=SWI_OS_File_5(thisdir->dirname,&type,NULL,NULL,NULL,&attr),er!=NULL ||
|
||||||
|
type<=1 || (type==3 && !uO.scanimage))
|
||||||
|
{
|
||||||
|
free(thisdir->dirname);
|
||||||
|
free(thisdir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
thisdir->buf=malloc(DIR_BUFSIZE);
|
||||||
|
if (thisdir->buf==NULL) {
|
||||||
|
free(thisdir->dirname);
|
||||||
|
free(thisdir);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
thisdir->size=DIR_BUFSIZE;
|
||||||
|
thisdir->offset=0;
|
||||||
|
thisdir->read=0;
|
||||||
|
|
||||||
|
return thisdir;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dirent *readdir(DIR *d)
|
||||||
|
{
|
||||||
|
static struct dirent dent;
|
||||||
|
|
||||||
|
if (d->read==0) { /* no more objects read in the buffer */
|
||||||
|
if (d->offset==-1) { /* no more objects to read */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->read=255;
|
||||||
|
if (SWI_OS_GBPB_9(d->dirname,d->buf,&d->read,&d->offset,DIR_BUFSIZE,NULL)!=NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (d->read==0) {
|
||||||
|
d->offset=-1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
d->read--;
|
||||||
|
d->act=(char *)d->buf;
|
||||||
|
}
|
||||||
|
else { /* some object is ready in buffer */
|
||||||
|
d->read--;
|
||||||
|
d->act=(char *)(d->act+strlen(d->act)+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(dent.d_name,d->act);
|
||||||
|
dent.d_namlen=strlen(dent.d_name);
|
||||||
|
|
||||||
|
/* If we're returning the last item, check if there are any more.
|
||||||
|
* If there are, nothing will happen; if not, then d->offset = -1 */
|
||||||
|
if (!d->read)
|
||||||
|
SWI_OS_GBPB_9(d->dirname,d->buf,&d->read,&d->offset,0,NULL);
|
||||||
|
|
||||||
|
return &dent;
|
||||||
|
}
|
||||||
|
|
||||||
|
void closedir(DIR *d)
|
||||||
|
{
|
||||||
|
if (d->buf!=NULL)
|
||||||
|
free(d->buf);
|
||||||
|
if (d->dirname!=NULL)
|
||||||
|
free(d->dirname);
|
||||||
|
free(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
int unlink(f)
|
||||||
|
char *f; /* file to delete */
|
||||||
|
/* Delete the file *f, returning non-zero on failure. */
|
||||||
|
{
|
||||||
|
os_error *er;
|
||||||
|
char canon[256];
|
||||||
|
int size=255;
|
||||||
|
|
||||||
|
er=SWI_OS_FSControl_37(f,canon,&size);
|
||||||
|
if (er==NULL) {
|
||||||
|
er=SWI_OS_FSControl_27(canon,0x100);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
er=SWI_OS_FSControl_27(f,0x100);
|
||||||
|
}
|
||||||
|
return (int)er;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rmdir(char *d)
|
||||||
|
{
|
||||||
|
int objtype;
|
||||||
|
char *s;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = strlen(d);
|
||||||
|
if ((s = malloc(len + 1)) == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
strcpy(s,d);
|
||||||
|
if (s[len-1]=='.')
|
||||||
|
s[len-1]=0;
|
||||||
|
|
||||||
|
if (SWI_OS_File_5(s,&objtype,NULL,NULL,NULL,NULL)!=NULL) {
|
||||||
|
free(s);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (objtype<2 || (!uO.scanimage && objtype==3)) {
|
||||||
|
/* this is a file or it doesn't exist */
|
||||||
|
free(s);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (SWI_OS_File_6(s)!=NULL) {
|
||||||
|
free(s);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
free(s);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
int chmod(char *file, int mode)
|
||||||
|
{
|
||||||
|
/*************** NOT YET IMPLEMENTED!!!!!! ******************/
|
||||||
|
/* I don't know if this will be needed or not... */
|
||||||
|
file=file;
|
||||||
|
mode=mode;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setfiletype(char *fname,int ftype)
|
||||||
|
{
|
||||||
|
char str[256];
|
||||||
|
sprintf(str,"SetType %s &%3.3X",fname,ftype);
|
||||||
|
SWI_OS_CLI(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void getRISCOSexts(char *envstr)
|
||||||
|
{
|
||||||
|
char *envptr; /* value returned by getenv */
|
||||||
|
|
||||||
|
envptr = getenv(envstr);
|
||||||
|
if (envptr == NULL || *envptr == 0) return;
|
||||||
|
|
||||||
|
exts2swap=malloc(1+strlen(envptr));
|
||||||
|
if (exts2swap == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
strcpy(exts2swap, envptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int checkext(char *suff)
|
||||||
|
{
|
||||||
|
register char *extptr = exts2swap ? exts2swap : "";
|
||||||
|
register char *suffptr;
|
||||||
|
register int e,s;
|
||||||
|
|
||||||
|
while(*extptr) {
|
||||||
|
suffptr=suff;
|
||||||
|
e=*extptr; s=*suffptr;
|
||||||
|
while (e && e!=':' && s && s!='.' && s!='/' && e==s) {
|
||||||
|
e=*++extptr; s=*++suffptr;
|
||||||
|
}
|
||||||
|
if (e==':') e=0;
|
||||||
|
if (s=='.' || s=='/') s=0;
|
||||||
|
if (!e && !s) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
while(*extptr!=':' && *extptr!='\0') /* skip to next extension */
|
||||||
|
extptr++;
|
||||||
|
if (*extptr!='\0')
|
||||||
|
extptr++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void swapext(char *name, char *exptr)
|
||||||
|
{
|
||||||
|
char ext[MAXEXT];
|
||||||
|
register char *p1=exptr+1;
|
||||||
|
register char *p2=ext;
|
||||||
|
int extchar=*exptr;
|
||||||
|
|
||||||
|
while(*p1 && *p1!='.' && *p1!='/')
|
||||||
|
*p2++=*p1++;
|
||||||
|
*p2=0;
|
||||||
|
p2=exptr-1;
|
||||||
|
p1--;
|
||||||
|
while(p2 >= name)
|
||||||
|
*p1--=*p2--;
|
||||||
|
p1=name;
|
||||||
|
p2=ext;
|
||||||
|
while(*p2)
|
||||||
|
*p1++=*p2++;
|
||||||
|
*p1=(extchar=='/'?'.':'/');
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_prefix(void)
|
||||||
|
{
|
||||||
|
SWI_DDEUtils_Prefix(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_prefix(void)
|
||||||
|
{
|
||||||
|
char *pref;
|
||||||
|
int size=0;
|
||||||
|
|
||||||
|
if (SWI_OS_FSControl_37("@",pref,&size)!=NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
size=1-size;
|
||||||
|
|
||||||
|
if (pref=malloc(size),pref!=NULL) {
|
||||||
|
if (SWI_OS_FSControl_37("@",pref,&size)!=NULL) {
|
||||||
|
free(pref);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SWI_DDEUtils_Prefix(pref)==NULL) {
|
||||||
|
atexit(remove_prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pref);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef localtime
|
||||||
|
# undef localtime
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef gmtime
|
||||||
|
# undef gmtime
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Acorn's implementation of localtime() and gmtime()
|
||||||
|
* doesn't consider the timezone offset, so we have to
|
||||||
|
* add it before calling the library functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct tm *riscos_localtime(const time_t *timer)
|
||||||
|
{
|
||||||
|
time_t localt=*timer;
|
||||||
|
|
||||||
|
localt+=SWI_Read_Timezone()/100;
|
||||||
|
|
||||||
|
return localtime(&localt);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm *riscos_gmtime(const time_t *timer)
|
||||||
|
{
|
||||||
|
time_t localt=*timer;
|
||||||
|
|
||||||
|
localt+=SWI_Read_Timezone()/100;
|
||||||
|
|
||||||
|
return gmtime(&localt);
|
||||||
|
}
|
136
unzip/unzip-5.52/acorn/riscos.h
Normal file
136
unzip/unzip-5.52/acorn/riscos.h
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/* riscos.h */
|
||||||
|
|
||||||
|
#ifndef __riscos_h
|
||||||
|
#define __riscos_h
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int errnum;
|
||||||
|
char errmess[252];
|
||||||
|
} os_error;
|
||||||
|
|
||||||
|
#ifndef __swiven_h
|
||||||
|
# include "swiven.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MAXPATHLEN 256
|
||||||
|
#define MAXFILENAMELEN 64 /* should be 11 for ADFS, 13 for DOS, 64 seems a sensible value... */
|
||||||
|
#define DIR_BUFSIZE 1024 /* this should be enough to read a whole E-Format directory */
|
||||||
|
|
||||||
|
struct stat {
|
||||||
|
unsigned int st_dev;
|
||||||
|
int st_ino;
|
||||||
|
unsigned int st_mode;
|
||||||
|
int st_nlink;
|
||||||
|
unsigned short st_uid;
|
||||||
|
unsigned short st_gid;
|
||||||
|
unsigned int st_rdev;
|
||||||
|
unsigned int st_size;
|
||||||
|
unsigned int st_blksize;
|
||||||
|
time_t st_atime;
|
||||||
|
time_t st_mtime;
|
||||||
|
time_t st_ctime;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *dirname;
|
||||||
|
void *buf;
|
||||||
|
int size;
|
||||||
|
char *act;
|
||||||
|
int offset;
|
||||||
|
int read;
|
||||||
|
} DIR;
|
||||||
|
|
||||||
|
|
||||||
|
struct dirent {
|
||||||
|
unsigned int d_off; /* offset of next disk directory entry */
|
||||||
|
int d_fileno; /* file number of entry */
|
||||||
|
size_t d_reclen; /* length of this record */
|
||||||
|
size_t d_namlen; /* length of d_name */
|
||||||
|
char d_name[MAXFILENAMELEN]; /* name */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int load_addr;
|
||||||
|
unsigned int exec_addr;
|
||||||
|
int lenght;
|
||||||
|
int attrib;
|
||||||
|
int objtype;
|
||||||
|
char name[13];
|
||||||
|
} riscos_direntry;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
short ID;
|
||||||
|
short size;
|
||||||
|
int ID_2;
|
||||||
|
unsigned int loadaddr;
|
||||||
|
unsigned int execaddr;
|
||||||
|
int attr;
|
||||||
|
int zero;
|
||||||
|
} extra_block;
|
||||||
|
|
||||||
|
|
||||||
|
#define S_IFMT 0770000
|
||||||
|
|
||||||
|
#define S_IFDIR 0040000
|
||||||
|
#define S_IFREG 0100000 /* 0200000 in UnixLib !?!?!?!? */
|
||||||
|
|
||||||
|
#ifndef S_IEXEC
|
||||||
|
# define S_IEXEC 0000100
|
||||||
|
# define S_IWRITE 0000200
|
||||||
|
# define S_IREAD 0000400
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NO_UNZIPH_STUFF
|
||||||
|
# include <time.h>
|
||||||
|
# if (!defined(HAVE_STRNICMP) & !defined(NO_STRNICMP))
|
||||||
|
# define NO_STRNICMP
|
||||||
|
# endif
|
||||||
|
# ifndef DATE_FORMAT
|
||||||
|
# define DATE_FORMAT DF_DMY
|
||||||
|
# endif
|
||||||
|
# define lenEOL 1
|
||||||
|
# define PutNativeEOL *q++ = native(LF);
|
||||||
|
# define USE_STRM_INPUT
|
||||||
|
# define USE_FWRITE
|
||||||
|
# define PIPE_ERROR (errno == 9999) /* always false */
|
||||||
|
# define isatty(x) (TRUE) /* used in funzip.c to find if stdin redirected:
|
||||||
|
should find a better way, now just work as if stdin never redirected */
|
||||||
|
# define USE_EF_UT_TIME
|
||||||
|
# if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
|
||||||
|
# define TIMESTAMP
|
||||||
|
# endif
|
||||||
|
# define localtime riscos_localtime
|
||||||
|
# define gmtime riscos_gmtime
|
||||||
|
#endif /* !NO_UNZIPH_STUFF */
|
||||||
|
|
||||||
|
#define _raw_getc() SWI_OS_ReadC()
|
||||||
|
|
||||||
|
extern char *exts2swap; /* Extensions to swap */
|
||||||
|
|
||||||
|
int stat(char *filename,struct stat *res);
|
||||||
|
DIR *opendir(char *dirname);
|
||||||
|
struct dirent *readdir(DIR *d);
|
||||||
|
void closedir(DIR *d);
|
||||||
|
int unlink(char *f);
|
||||||
|
int rmdir(char *d);
|
||||||
|
int chmod(char *file, int mode);
|
||||||
|
void setfiletype(char *fname,int ftype);
|
||||||
|
void getRISCOSexts(char *envstr);
|
||||||
|
int checkext(char *suff);
|
||||||
|
void swapext(char *name, char *exptr);
|
||||||
|
void remove_prefix(void);
|
||||||
|
void set_prefix(void);
|
||||||
|
struct tm *riscos_localtime(const time_t *timer);
|
||||||
|
struct tm *riscos_gmtime(const time_t *timer);
|
||||||
|
|
||||||
|
#endif /* !__riscos_h */
|
BIN
unzip/unzip-5.52/acorn/srcrename
Normal file
BIN
unzip/unzip-5.52/acorn/srcrename
Normal file
Binary file not shown.
69
unzip/unzip-5.52/acorn/swiven.h
Normal file
69
unzip/unzip-5.52/acorn/swiven.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/* swiven.h */
|
||||||
|
|
||||||
|
#ifndef __swiven_h
|
||||||
|
#define __swiven_h
|
||||||
|
|
||||||
|
os_error *SWI_OS_FSControl_26(char *source, char *dest, int actionmask);
|
||||||
|
/* copy */
|
||||||
|
|
||||||
|
os_error *SWI_OS_FSControl_27(char *filename, int actionmask);
|
||||||
|
/* wipe */
|
||||||
|
|
||||||
|
os_error *SWI_OS_GBPB_9(char *dirname, void *buf, int *number,
|
||||||
|
int *offset, int size, char *match);
|
||||||
|
/* read dir */
|
||||||
|
|
||||||
|
os_error *SWI_OS_File_1(char *filename, unsigned int loadaddr,
|
||||||
|
unsigned int execaddr, int attrib);
|
||||||
|
/* write file attributes */
|
||||||
|
|
||||||
|
os_error *SWI_OS_File_5(char *filename, int *objtype, unsigned int *loadaddr,
|
||||||
|
unsigned int *execaddr, int *length, int *attrib);
|
||||||
|
/* read file info */
|
||||||
|
|
||||||
|
os_error *SWI_OS_File_6(char *filename);
|
||||||
|
/* delete */
|
||||||
|
|
||||||
|
os_error *SWI_OS_File_7(char *filename, int loadaddr, int execaddr, int size);
|
||||||
|
/* create an empty file */
|
||||||
|
|
||||||
|
os_error *SWI_OS_File_8(char *dirname);
|
||||||
|
/* create a directory */
|
||||||
|
|
||||||
|
os_error *SWI_OS_File_18(char *filename, int filetype);
|
||||||
|
/* set a file's type */
|
||||||
|
|
||||||
|
os_error *SWI_OS_CLI(char *cmd);
|
||||||
|
/* execute a command */
|
||||||
|
|
||||||
|
int SWI_OS_ReadC(void);
|
||||||
|
/* get a key from the keyboard buffer */
|
||||||
|
|
||||||
|
os_error *SWI_OS_ReadVarVal(char *var, char *buf, int len, int *bytesused);
|
||||||
|
/* reads an OS varibale */
|
||||||
|
|
||||||
|
os_error *SWI_OS_FSControl_54(char *buffer, int dir, char *fsname, int *size);
|
||||||
|
/* reads the path of a specified directory */
|
||||||
|
|
||||||
|
os_error *SWI_OS_FSControl_37(char *pathname, char *buffer, int *size);
|
||||||
|
/* canonicalise path */
|
||||||
|
|
||||||
|
os_error *SWI_DDEUtils_Prefix(char *dir);
|
||||||
|
/* sets the 'prefix' directory */
|
||||||
|
|
||||||
|
int SWI_Read_Timezone(void);
|
||||||
|
/* returns the timezone offset (centiseconds) */
|
||||||
|
|
||||||
|
int SWI_MimeMap_Translate(const char *ext);
|
||||||
|
/* given a filename extn, returns the filetype (or -1 if no match).
|
||||||
|
* Uses the MimeMap module */
|
||||||
|
|
||||||
|
#endif /* !__swiven_h */
|
316
unzip/unzip-5.52/acorn/swiven.s
Normal file
316
unzip/unzip-5.52/acorn/swiven.s
Normal file
@ -0,0 +1,316 @@
|
|||||||
|
;===========================================================================
|
||||||
|
; 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
|
||||||
|
;===========================================================================
|
||||||
|
; SWI veneers used by Zip/Unzip
|
||||||
|
;
|
||||||
|
|
||||||
|
r0 RN 0
|
||||||
|
r1 RN 1
|
||||||
|
r2 RN 2
|
||||||
|
r3 RN 3
|
||||||
|
r4 RN 4
|
||||||
|
r5 RN 5
|
||||||
|
r6 RN 6
|
||||||
|
r7 RN 7
|
||||||
|
r8 RN 8
|
||||||
|
r9 RN 9
|
||||||
|
r10 RN 10
|
||||||
|
r11 RN 11
|
||||||
|
r12 RN 12
|
||||||
|
sp RN 13
|
||||||
|
lr RN 14
|
||||||
|
pc RN 15
|
||||||
|
|
||||||
|
sl RN 10
|
||||||
|
fp RN 11
|
||||||
|
ip RN 12
|
||||||
|
|
||||||
|
|
||||||
|
XOS_Bit EQU &020000
|
||||||
|
|
||||||
|
OS_GBPB EQU &00000C
|
||||||
|
OS_File EQU &000008
|
||||||
|
OS_FSControl EQU &000029
|
||||||
|
OS_CLI EQU &000005
|
||||||
|
OS_ReadC EQU &000004
|
||||||
|
OS_ReadVarVal EQU &000023
|
||||||
|
DDEUtils_Prefix EQU &042580
|
||||||
|
Territory_ReadCurrentTimeZone EQU &043048
|
||||||
|
MimeMap_Translate EQU &050B00
|
||||||
|
|
||||||
|
MACRO
|
||||||
|
STARTCODE $name
|
||||||
|
EXPORT $name
|
||||||
|
$name
|
||||||
|
MEND
|
||||||
|
|
||||||
|
|
||||||
|
AREA |C$$code|, CODE, READONLY
|
||||||
|
|
||||||
|
; os_error *SWI_OS_FSControl_26(char *source, char *dest, int actionmask);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_FSControl_26
|
||||||
|
|
||||||
|
MOV ip, lr
|
||||||
|
|
||||||
|
MOV r3, r2
|
||||||
|
MOV r2, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #26
|
||||||
|
|
||||||
|
SWI OS_FSControl + XOS_Bit
|
||||||
|
|
||||||
|
MOVVC r0, #0
|
||||||
|
|
||||||
|
MOVS pc, ip
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_FSControl_27(char *filename, int actionmask);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_FSControl_27
|
||||||
|
|
||||||
|
MOV ip, lr
|
||||||
|
|
||||||
|
MOV r3, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #27
|
||||||
|
|
||||||
|
SWI OS_FSControl + XOS_Bit
|
||||||
|
|
||||||
|
MOVVC r0, #0
|
||||||
|
|
||||||
|
MOVS pc, ip
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_GBPB_9(char *dirname, void *buf, int *number,
|
||||||
|
; int *offset, int size, char *match);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_GBPB_9
|
||||||
|
|
||||||
|
MOV ip, sp
|
||||||
|
STMFD sp!, {r2-r6,lr}
|
||||||
|
LDMIA ip, {r5,r6}
|
||||||
|
LDR r4, [r3]
|
||||||
|
LDR r3, [r2]
|
||||||
|
MOV r2, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #9
|
||||||
|
SWI OS_GBPB + XOS_Bit
|
||||||
|
LDMVSFD sp!, {r2-r6,pc}^
|
||||||
|
MOV r0, #0
|
||||||
|
LDMFD sp, {r5,r6}
|
||||||
|
STR r3, [r5]
|
||||||
|
STR r4, [r6]
|
||||||
|
LDMFD sp!, {r2-r6,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_File_1(char *filename, int loadaddr, int execaddr, int attrib);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_File_1
|
||||||
|
|
||||||
|
STMFD sp!, {r5,lr}
|
||||||
|
MOV r5, r3
|
||||||
|
MOV r3, r2
|
||||||
|
MOV r2, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #1
|
||||||
|
SWI OS_File + XOS_Bit
|
||||||
|
MOVVC r0, #0
|
||||||
|
LDMFD sp!, {r5,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_File_5(char *filename, int *objtype, int *loadaddr,
|
||||||
|
; int *execaddr, int *length, int *attrib);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_File_5
|
||||||
|
|
||||||
|
STMFD sp!, {r1-r5,lr}
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #5
|
||||||
|
SWI OS_File + XOS_Bit
|
||||||
|
LDMVSFD sp!, {r1-r5,pc}^
|
||||||
|
LDR lr, [sp]
|
||||||
|
TEQ lr, #0
|
||||||
|
STRNE r0, [lr]
|
||||||
|
LDR lr, [sp, #4]
|
||||||
|
TEQ lr ,#0
|
||||||
|
STRNE r2, [lr]
|
||||||
|
LDR lr, [sp, #8]
|
||||||
|
TEQ lr, #0
|
||||||
|
STRNE r3, [lr]
|
||||||
|
LDR lr, [sp ,#24]
|
||||||
|
TEQ lr, #0
|
||||||
|
STRNE r4, [lr]
|
||||||
|
LDR lr, [sp ,#28]
|
||||||
|
TEQ lr, #0
|
||||||
|
STRNE r5, [lr]
|
||||||
|
MOV r0, #0
|
||||||
|
LDMFD sp!, {r1-r5,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_File_6(char *filename);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_File_6
|
||||||
|
|
||||||
|
STMFD sp!, {r4-r5,lr}
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #6
|
||||||
|
SWI OS_File + XOS_Bit
|
||||||
|
MOVVC r0, #0
|
||||||
|
LDMFD sp!, {r4-r5,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_File_7(char *filename, int loadaddr, int execaddr, int size);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_File_7
|
||||||
|
|
||||||
|
STMFD sp!, {r4-r5,lr}
|
||||||
|
MOV r5, r3
|
||||||
|
MOV r4, #0
|
||||||
|
MOV r3, r2
|
||||||
|
MOV r2, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #7
|
||||||
|
SWI OS_File + XOS_Bit
|
||||||
|
MOVVC r0, #0
|
||||||
|
LDMFD sp!, {r4-r5,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_File_8(char *dirname);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_File_8
|
||||||
|
|
||||||
|
STMFD sp!, {r4,lr}
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r4, #0
|
||||||
|
MOV r0, #8
|
||||||
|
SWI OS_File + XOS_Bit
|
||||||
|
MOVVC r0, #0
|
||||||
|
LDMFD sp!, {r4,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_File_18(char *filename, int filetype);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_File_18
|
||||||
|
|
||||||
|
STMFD sp!, {r4-r5,lr}
|
||||||
|
MOV r2, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #18
|
||||||
|
SWI OS_File + XOS_Bit
|
||||||
|
MOVVC r0, #0
|
||||||
|
LDMFD sp!, {r4-r5,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_CLI(char *cmd);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_CLI
|
||||||
|
|
||||||
|
MOV ip, lr
|
||||||
|
SWI OS_CLI + XOS_Bit
|
||||||
|
MOVVC r0, #0
|
||||||
|
MOVS pc, ip
|
||||||
|
|
||||||
|
|
||||||
|
; int SWI_OS_ReadC(void);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_ReadC
|
||||||
|
|
||||||
|
MOV ip, lr
|
||||||
|
SWI OS_ReadC + XOS_Bit
|
||||||
|
MOVS pc, ip
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_ReadVarVal(char *var, char *buf, int len, int *bytesused);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_ReadVarVal
|
||||||
|
|
||||||
|
STMFD sp!, {r4,lr}
|
||||||
|
MOV ip, r3
|
||||||
|
MOV r3, #0
|
||||||
|
MOV r4, #0
|
||||||
|
SWI OS_ReadVarVal + XOS_Bit
|
||||||
|
LDMVSFD sp!, {r4,pc}^
|
||||||
|
TEQ ip, #0
|
||||||
|
STRNE r2, [ip]
|
||||||
|
MOV r0, #0
|
||||||
|
LDMFD sp!, {r4,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_FSControl_54(char *buffer, int dir, char *fsname, int *size);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_FSControl_54
|
||||||
|
|
||||||
|
STMFD sp!, {r3-r6,lr}
|
||||||
|
LDR r5, [r3]
|
||||||
|
MOV r3, r2
|
||||||
|
MOV r2, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #54
|
||||||
|
SWI OS_FSControl + XOS_Bit
|
||||||
|
LDMVSFD sp!, {r3-r6,pc}^
|
||||||
|
MOV r0, #0
|
||||||
|
LDMFD sp!, {r3}
|
||||||
|
STR r5, [r3]
|
||||||
|
LDMFD sp!, {r4-r6,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_OS_FSControl_37(char *pathname, char *buffer, int *size);
|
||||||
|
|
||||||
|
STARTCODE SWI_OS_FSControl_37
|
||||||
|
|
||||||
|
STMFD sp!, {r2,r3-r5,lr}
|
||||||
|
LDR r5, [r2]
|
||||||
|
MOV r3, #0
|
||||||
|
MOV r4, #0
|
||||||
|
MOV r2, r1
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #37
|
||||||
|
SWI OS_FSControl + XOS_Bit
|
||||||
|
LDMVSFD sp!, {r2,r3-r5,pc}^
|
||||||
|
MOV r0, #0
|
||||||
|
LDMFD sp!, {r2}
|
||||||
|
STR r5, [r2]
|
||||||
|
LDMFD sp!, {r3-r5,pc}^
|
||||||
|
|
||||||
|
|
||||||
|
; os_error *SWI_DDEUtils_Prefix(char *dir);
|
||||||
|
|
||||||
|
STARTCODE SWI_DDEUtils_Prefix
|
||||||
|
|
||||||
|
MOV ip, lr
|
||||||
|
SWI DDEUtils_Prefix + XOS_Bit
|
||||||
|
MOVVC r0, #0
|
||||||
|
MOVS pc, ip
|
||||||
|
|
||||||
|
; int SWI_Read_Timezone(void);
|
||||||
|
|
||||||
|
STARTCODE SWI_Read_Timezone
|
||||||
|
|
||||||
|
MOV ip, lr
|
||||||
|
SWI Territory_ReadCurrentTimeZone + XOS_Bit
|
||||||
|
MOVVC r0, r1
|
||||||
|
MOVVS r0, #0
|
||||||
|
MOVS pc, ip
|
||||||
|
|
||||||
|
|
||||||
|
; int SWI_MimeMap_Translate(char *ext);
|
||||||
|
|
||||||
|
STARTCODE SWI_MimeMap_Translate
|
||||||
|
MOV ip,lr
|
||||||
|
MOV r1, r0
|
||||||
|
MOV r0, #3
|
||||||
|
MOV r2, #0
|
||||||
|
SWI MimeMap_Translate + XOS_Bit
|
||||||
|
MOVVC r0, r3
|
||||||
|
MVNVS r0, #0 ; return -1 on error
|
||||||
|
MOVS pc, ip
|
||||||
|
|
||||||
|
|
||||||
|
END
|
32
unzip/unzip-5.52/amiga/Contents
Normal file
32
unzip/unzip-5.52/amiga/Contents
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
Contents of the "amiga" directory for UnZip 5.5 and later:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
amiga.c Amiga-specific file I/O routines
|
||||||
|
amiga.h Amiga-specific header file
|
||||||
|
filedate.c SetFileDate clone for OS 1.3, and other low-level resources
|
||||||
|
|
||||||
|
smakefile SAS/C makefile for UnZip, fUnZip, and UnZipSFX
|
||||||
|
|
||||||
|
makefile.azt Aztec C makefile for UnZip, fUnZip, and UnZipSFX
|
||||||
|
stat.c stat() emulation for Aztec, along with opendir()/readdir()/etc
|
||||||
|
z-stat.h replacement stat.h header file for use with stat.c
|
||||||
|
crc_68.a assembler version of crc32.c
|
||||||
|
flate.a assembler version of inflate_codes() (define ASM_INFLATECODES)
|
||||||
|
|
||||||
|
makesfx.c source for MakeSFX, without which UnZipSFX is not usable
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
The crc_68.a source file is not currently used by the SAS/C makefile,
|
||||||
|
nor is flate.a; as of UnZip 5.2 neither of these wants args in
|
||||||
|
registers.
|
||||||
|
|
||||||
|
The DICE makefile has been removed since no one is supporting that
|
||||||
|
compiler anymore.
|
||||||
|
|
||||||
|
As of UnZip 5.2, if you have AmigaDOS 2.1 or newer and have set your
|
||||||
|
timezone in the Locale preferences editor, this will be an adequate
|
||||||
|
substitute for setting TZ. If you do not set TZ to your current timezone,
|
||||||
|
files will be restored with times corrsponding to "EST5EDT", U.S. Eastern
|
||||||
|
time. See ../proginfo/timezone.txt for directions on how to set the
|
||||||
|
TZ variable.
|
1031
unzip/unzip-5.52/amiga/amiga.c
Normal file
1031
unzip/unzip-5.52/amiga/amiga.c
Normal file
File diff suppressed because it is too large
Load Diff
177
unzip/unzip-5.52/amiga/amiga.h
Normal file
177
unzip/unzip-5.52/amiga/amiga.h
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/* amiga.h
|
||||||
|
*
|
||||||
|
* Globular definitions that affect all of AmigaDom.
|
||||||
|
*
|
||||||
|
* Originally included in unzip.h, extracted for simplicity and eeze of
|
||||||
|
* maintenance by John Bush.
|
||||||
|
*
|
||||||
|
* THIS FILE IS #INCLUDE'd by unzpriv.h
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __amiga_amiga_h
|
||||||
|
#define __amiga_amiga_h
|
||||||
|
|
||||||
|
#include "amiga/z-stat.h" /* substitute for <stat.h> and <direct.h> */
|
||||||
|
#include <limits.h>
|
||||||
|
#ifndef NO_FCNTL_H
|
||||||
|
# include <fcntl.h>
|
||||||
|
#else
|
||||||
|
int mkdir(const char *_name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef AZTEC_C /* Manx Aztec C, 5.0 or newer only */
|
||||||
|
# include <clib/dos_protos.h>
|
||||||
|
# include <pragmas/dos_lib.h> /* do inline dos.library calls */
|
||||||
|
# define O_BINARY 0
|
||||||
|
# define direct dirent
|
||||||
|
|
||||||
|
# ifndef IZTZ_DEFINESTDGLOBALS
|
||||||
|
# define IZTZ_DEFINESTDGLOBALS
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define DECLARE_TIMEZONE
|
||||||
|
# define ASM_INFLATECODES
|
||||||
|
# define ASM_CRC
|
||||||
|
|
||||||
|
/* This compiler environment supplies a flat 32-bit address space */
|
||||||
|
/* where C rtl functions are capable of handling large (32-bit-wide) */
|
||||||
|
/* allocations and I/O. But, for speed on old 68000 CPUs, standard */
|
||||||
|
/* ints are 16-bits wide per default. ("size_t" is defined as */
|
||||||
|
/* "unsigned long" in this case.) The Deflate64 support requires */
|
||||||
|
/* the variables for handling the decompression buffer to hold */
|
||||||
|
/* 32-bit wide integers. The INT_16BIT symbol defined below forces */
|
||||||
|
/* the declarations of these variables to use "unsigned long" type. */
|
||||||
|
# ifndef _INT32
|
||||||
|
# define INT_16BIT /* or deflate64 stuff will fail */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Note that defining REENTRANT will not eliminate all global/static */
|
||||||
|
/* variables. The functions we use from c.lib, including stdio, are */
|
||||||
|
/* not reentrant. Neither are the stuff in amiga/stat.c or the time */
|
||||||
|
/* functions in amiga/filedate.c, because they just augment c.lib. */
|
||||||
|
/* If you want a fully reentrant and reexecutable "pure" UnZip with */
|
||||||
|
/* Aztec C, assemble and link in the startup module purify.a by Paul */
|
||||||
|
/* Kienitz. REENTRANT should be used just to reduce memory waste. */
|
||||||
|
#endif /* AZTEC_C */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __SASC
|
||||||
|
/* includes */
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/dir.h>
|
||||||
|
# include <dos.h>
|
||||||
|
# include <exec/memory.h>
|
||||||
|
# include <exec/execbase.h>
|
||||||
|
# if (defined(_M68020) && (!defined(__USE_SYSBASE)))
|
||||||
|
/* on 68020 or higher processors it is faster */
|
||||||
|
# define __USE_SYSBASE /* to use the pragma libcall instead of syscall */
|
||||||
|
# endif /* to access functions of the exec.library */
|
||||||
|
# include <proto/exec.h> /* see SAS/C manual:part 2,chapter 2,pages 6-7 */
|
||||||
|
# include <proto/dos.h>
|
||||||
|
# include <proto/locale.h>
|
||||||
|
|
||||||
|
# ifdef DEBUG
|
||||||
|
# include <sprof.h> /* profiler header file */
|
||||||
|
# endif
|
||||||
|
# if ( (!defined(O_BINARY)) && defined(O_RAW))
|
||||||
|
# define O_BINARY O_RAW
|
||||||
|
# endif
|
||||||
|
# if (defined(_SHORTINT) && !defined(USE_FWRITE))
|
||||||
|
# define USE_FWRITE /* define if write() returns 16-bit int */
|
||||||
|
# endif
|
||||||
|
# if (!defined(REENTRANT) && !defined(FUNZIP))
|
||||||
|
# define REENTRANT /* define if unzip is going to be pure */
|
||||||
|
# endif
|
||||||
|
# if defined(REENTRANT) && defined(DYNALLOC_CRCTAB)
|
||||||
|
# undef DYNALLOC_CRCTAB
|
||||||
|
# endif
|
||||||
|
# ifdef MWDEBUG
|
||||||
|
# include <stdio.h> /* both stdio.h and stdlib.h must be included */
|
||||||
|
# include <stdlib.h> /* before memwatch.h */
|
||||||
|
# include "memwatch.h"
|
||||||
|
# undef getenv
|
||||||
|
# endif /* MWDEBUG */
|
||||||
|
# ifndef IZTZ_SETLOCALTZINFO
|
||||||
|
/* XXX !! We have really got to find a way to operate without these. */
|
||||||
|
# define IZTZ_SETLOCALTZINFO
|
||||||
|
# endif
|
||||||
|
#endif /* SASC */
|
||||||
|
|
||||||
|
|
||||||
|
#define MALLOC_WORK
|
||||||
|
#define USE_EF_UT_TIME
|
||||||
|
#if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
|
||||||
|
# define TIMESTAMP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef IZTZ_GETLOCALETZINFO
|
||||||
|
# define IZTZ_GETLOCALETZINFO GetPlatformLocalTimezone
|
||||||
|
#endif
|
||||||
|
/* the amiga port uses Info-ZIP's own timezone library, which includes
|
||||||
|
* a "working" mktime() implementation
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_MKTIME
|
||||||
|
# define HAVE_MKTIME
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check that TZ environment variable is defined before using UTC times */
|
||||||
|
#if (!defined(NO_IZ_CHECK_TZ) && !defined(IZ_CHECK_TZ))
|
||||||
|
# define IZ_CHECK_TZ
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define AMIGA_FILENOTELEN 80
|
||||||
|
#ifndef DATE_FORMAT
|
||||||
|
# define DATE_FORMAT DF_MDY
|
||||||
|
#endif
|
||||||
|
#define lenEOL 1
|
||||||
|
#define PutNativeEOL *q++ = native(LF);
|
||||||
|
#define PIPE_ERROR 0
|
||||||
|
|
||||||
|
#ifdef GLOBAL /* crypt.c usage conflicts with AmigaDOS headers */
|
||||||
|
# undef GLOBAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Funkshine Prough Toe Taipes */
|
||||||
|
|
||||||
|
extern int real_timezone_is_set;
|
||||||
|
void tzset(void);
|
||||||
|
#define VALID_TIMEZONE(tempvar) (tzset(), real_timezone_is_set)
|
||||||
|
|
||||||
|
int Agetch(void); /* getch() like function, in amiga/filedate.c */
|
||||||
|
LONG FileDate(char *, time_t[]);
|
||||||
|
int screensize(int *ttrows, int *ttcols);
|
||||||
|
void _abort(void); /* ctrl-C trap */
|
||||||
|
|
||||||
|
#define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols)
|
||||||
|
#define SCREENWIDTH 80
|
||||||
|
#define SCREENLWRAP 1
|
||||||
|
#define TABSIZE 8
|
||||||
|
|
||||||
|
/* Static variables that we have to add to Uz_Globs: */
|
||||||
|
#define SYSTEM_SPECIFIC_GLOBALS \
|
||||||
|
int filenote_slot;\
|
||||||
|
char *(filenotes[DIR_BLKSIZ]);\
|
||||||
|
int created_dir, renamed_fullpath, rootlen;\
|
||||||
|
char *rootpath, *buildpath, *build_end;\
|
||||||
|
DIR *wild_dir;\
|
||||||
|
ZCONST char *wildname;\
|
||||||
|
char *dirname, matchname[FILNAMSIZ];\
|
||||||
|
int dirnamelen, notfirstcall;
|
||||||
|
|
||||||
|
/* filenotes[] and filenote_slot are for the -N option that restores */
|
||||||
|
/* comments of Zip archive entries as AmigaDOS filenotes. The others */
|
||||||
|
/* are used by functions in amiga/amiga.c only. */
|
||||||
|
/* created_dir and renamed_fullpath are used by mapname() and checkdir(). */
|
||||||
|
/* rootlen, rootpath, buildpath, and build_end are used by checkdir(). */
|
||||||
|
/* wild_dir, dirname, wildname, matchname[], dirnamelen and notfirstcall */
|
||||||
|
/* are used by do_wild(). */
|
||||||
|
#endif /* __amiga_amiga_h */
|
144
unzip/unzip-5.52/amiga/crc_68.a
Normal file
144
unzip/unzip-5.52/amiga/crc_68.a
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
;===========================================================================
|
||||||
|
; 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 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
|
||||||
|
;===========================================================================
|
||||||
|
; crc_68 created by Paul Kienitz, last modified 04 Jan 96.
|
||||||
|
;
|
||||||
|
; Return an updated 32 bit CRC value, given the old value and a block of data.
|
||||||
|
; The CRC table used to compute the value is gotten by calling get_crc_table().
|
||||||
|
; This replaces the older updcrc() function used in Zip and fUnZip. The
|
||||||
|
; prototype of the function is:
|
||||||
|
;
|
||||||
|
; ulg crc32(ulg crcval, uch *text, extent textlen);
|
||||||
|
;
|
||||||
|
; On the Amiga, type extent is always unsigned long, not unsigned int, because
|
||||||
|
; int can be short or long at whim, but size_t is long.
|
||||||
|
;
|
||||||
|
; If using this source on a non-Amiga 680x0 system, note that we treat
|
||||||
|
; a0/a1/d0/d1 as scratch registers not preserved across function calls.
|
||||||
|
; We do not bother to support registerized arguments for crc32() -- the
|
||||||
|
; textlen parm is usually large enough so that savings outside the loop
|
||||||
|
; are pointless.
|
||||||
|
;
|
||||||
|
; Define NO_UNROLLED_LOOPS to use a simple short loop which might be more
|
||||||
|
; efficient on certain machines with dinky instruction caches ('020?), or for
|
||||||
|
; processing short strings. If loops are unrolled, the textlen parm must be
|
||||||
|
; less than 512K; if not unrolled, it must be less than 64K.
|
||||||
|
|
||||||
|
xdef _crc32 ; (ulg val, uch *buf, extent bufsize)
|
||||||
|
|
||||||
|
DO_CRC0 MACRO
|
||||||
|
moveq #0,ltemp
|
||||||
|
move.b (textbuf)+,ltemp
|
||||||
|
eor.b crcval,ltemp
|
||||||
|
lsl.w #2,ltemp
|
||||||
|
move.l (crc_table,ltemp.w),ltemp
|
||||||
|
lsr.l #8,crcval
|
||||||
|
eor.l ltemp,crcval
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
machine mc68020
|
||||||
|
|
||||||
|
DO_CRC2 MACRO
|
||||||
|
move.b (textbuf)+,btemp
|
||||||
|
eor.b crcval,btemp
|
||||||
|
lsr.l #8,crcval
|
||||||
|
move.l (crc_table,btemp.w*4),ltemp
|
||||||
|
eor.l ltemp,crcval
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
crc_table equr a0 array of unsigned long
|
||||||
|
crcval equr d0 unsigned long initial value
|
||||||
|
textbuf equr a1 array of unsigned char
|
||||||
|
textbufsize equr d1 unsigned long (count of bytes in textbuf)
|
||||||
|
btemp equr d2
|
||||||
|
ltemp equr d3
|
||||||
|
|
||||||
|
|
||||||
|
xref _get_crc_table ; ulg *get_crc_table(void)
|
||||||
|
|
||||||
|
NOLIST
|
||||||
|
INCLUDE 'exec/execbase.i'
|
||||||
|
LIST
|
||||||
|
xref _SysBase ; struct ExecBase *
|
||||||
|
|
||||||
|
|
||||||
|
_crc32:
|
||||||
|
move.l 8(sp),d0
|
||||||
|
bne.s valid
|
||||||
|
moveq #0,d0
|
||||||
|
rts
|
||||||
|
valid: movem.l btemp/ltemp,-(sp)
|
||||||
|
jsr _get_crc_table
|
||||||
|
move.l d0,ltemp
|
||||||
|
move.l 12(sp),crcval
|
||||||
|
move.l 16(sp),textbuf
|
||||||
|
move.l 20(sp),textbufsize
|
||||||
|
not.l crcval
|
||||||
|
move.l _SysBase,crc_table
|
||||||
|
move.w AttnFlags(crc_table),btemp
|
||||||
|
move.l ltemp,crc_table
|
||||||
|
btst #AFB_68020,btemp
|
||||||
|
bne twenty
|
||||||
|
|
||||||
|
IFD NO_UNROLLED_LOOPS
|
||||||
|
|
||||||
|
bra.s decr
|
||||||
|
loop: DO_CRC0
|
||||||
|
decr: dbra textbufsize,loop
|
||||||
|
bra.s done
|
||||||
|
|
||||||
|
twenty: moveq #0,btemp
|
||||||
|
bra.s decr2
|
||||||
|
loop2: DO_CRC2
|
||||||
|
decr2: dbra textbufsize,loop2
|
||||||
|
|
||||||
|
ELSE ; !NO_UNROLLED_LOOPS
|
||||||
|
|
||||||
|
move.l textbufsize,btemp
|
||||||
|
lsr.l #3,textbufsize
|
||||||
|
bra decr8
|
||||||
|
loop8: DO_CRC0
|
||||||
|
DO_CRC0
|
||||||
|
DO_CRC0
|
||||||
|
DO_CRC0
|
||||||
|
DO_CRC0
|
||||||
|
DO_CRC0
|
||||||
|
DO_CRC0
|
||||||
|
DO_CRC0
|
||||||
|
decr8: dbra textbufsize,loop8
|
||||||
|
and.w #7,btemp
|
||||||
|
bra.s decr1
|
||||||
|
loop1: DO_CRC0
|
||||||
|
decr1: dbra btemp,loop1
|
||||||
|
bra done
|
||||||
|
|
||||||
|
twenty: moveq #0,btemp
|
||||||
|
move.l textbufsize,-(sp)
|
||||||
|
lsr.l #3,textbufsize
|
||||||
|
bra decr82
|
||||||
|
loop82: DO_CRC2
|
||||||
|
DO_CRC2
|
||||||
|
DO_CRC2
|
||||||
|
DO_CRC2
|
||||||
|
DO_CRC2
|
||||||
|
DO_CRC2
|
||||||
|
DO_CRC2
|
||||||
|
DO_CRC2
|
||||||
|
decr82: dbra textbufsize,loop82
|
||||||
|
move.l (sp)+,textbufsize
|
||||||
|
and.w #7,textbufsize
|
||||||
|
bra.s decr12
|
||||||
|
loop12: DO_CRC2
|
||||||
|
decr12: dbra textbufsize,loop12
|
||||||
|
|
||||||
|
ENDC ; ?NO_UNROLLED_LOOPS
|
||||||
|
|
||||||
|
done: movem.l (sp)+,btemp/ltemp
|
||||||
|
not.l crcval
|
||||||
|
;;;;; move.l crcval,d0 ; crcval already is d0
|
||||||
|
rts
|
599
unzip/unzip-5.52/amiga/filedate.c
Normal file
599
unzip/unzip-5.52/amiga/filedate.c
Normal file
@ -0,0 +1,599 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/* Low-level Amiga routines shared between Zip and UnZip.
|
||||||
|
*
|
||||||
|
* Contains: FileDate()
|
||||||
|
* getenv() [replaces inadequate standard library version]
|
||||||
|
* setenv() [SAS/C only, replaces standard library version]
|
||||||
|
* set_TZ() [SAS/C only]
|
||||||
|
* GetPlatformLocalTimezone() [callback from timezone.c tzset()]
|
||||||
|
* time()
|
||||||
|
* sendpkt()
|
||||||
|
* Agetch()
|
||||||
|
*
|
||||||
|
* The first five are used by most Info-ZIP programs except fUnZip.
|
||||||
|
* The last two are used by all except the non-CRYPT version of fUnZip.
|
||||||
|
* Probably some of the stuff in here is unused by ZipNote and ZipSplit too...
|
||||||
|
* sendpkt() is used by Agetch() and FileDate(), and by screensize() in
|
||||||
|
* amiga/amiga.c (UnZip); time() is used only by Zip.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* HISTORY/CHANGES
|
||||||
|
* 2 Sep 92, Greg Roelofs, Original coding.
|
||||||
|
* 6 Sep 92, John Bush, Incorporated into UnZip 5.1
|
||||||
|
* 6 Sep 92, John Bush, Interlude "FileDate()" defined, which calls or
|
||||||
|
* redefines SetFileDate() depending upon AMIGADOS2 definition.
|
||||||
|
* 11 Oct 92, John Bush, Eliminated AMIGADOS2 switch by determining
|
||||||
|
* revision via OpenLibrary() call. Now only one version of
|
||||||
|
* the program runs on both platforms (1.3.x vs. 2.x)
|
||||||
|
* 11 Oct 92, John Bush, Merged with Zip version and changed arg passing
|
||||||
|
* to take time_t input instead of struct DateStamp.
|
||||||
|
* Arg passing made to conform with utime().
|
||||||
|
* 22 Nov 92, Paul Kienitz, fixed includes for Aztec and cleaned up some
|
||||||
|
* lint-ish errors; simplified test for AmigaDOS version.
|
||||||
|
* 11 Nov 95, Paul Kienitz, added Agetch() for crypt password input and
|
||||||
|
* UnZip's "More" prompt -- simplifies crypt.h and avoids
|
||||||
|
* use of library code redundant with sendpkt(). Made it
|
||||||
|
* available to fUnZip, which does not use FileDate().
|
||||||
|
* 22 Nov 95, Paul Kienitz, created a new tzset() that gets the current
|
||||||
|
* timezone from the Locale preferences. These exist only under
|
||||||
|
* AmigaDOS 2.1 and up, but it is probably correctly set on more
|
||||||
|
* Amigas than the TZ environment variable is. We check that
|
||||||
|
* only if TZ is not validly set. We do not parse daylight
|
||||||
|
* savings syntax except to check for presence vs. absence of a
|
||||||
|
* DST part; United States rules are assumed. This is better
|
||||||
|
* than the tzset()s in the Amiga compilers' libraries do.
|
||||||
|
* 15 Jan 96, Chr. Spieler, corrected the logic when to select low level
|
||||||
|
* sendpkt() (when FileDate(), Agetch() or windowheight() is used),
|
||||||
|
* and AMIGA's Agetch() (CRYPT, and UnZip(SFX)'s UzpMorePause()).
|
||||||
|
* 10 Feb 96, Paul Kienitz, re-fiddled that selection logic again, moved
|
||||||
|
* stuff around for clarity.
|
||||||
|
* 16 Mar 96, Paul Kienitz, created a replacement localtime() to go with the
|
||||||
|
* new tzset(), because Aztec's is hopelessly broken. Also
|
||||||
|
* gmtime(), which localtime() calls.
|
||||||
|
* 12 Apr 96, Paul Kienitz, daylight savings was being handled incorrectly.
|
||||||
|
* 21 Apr 96, Paul Kienitz, had to replace time() as well, Aztec's returns
|
||||||
|
* local time instead of GMT. That's why their localtime() was bad,
|
||||||
|
* because it assumed time_t was already local, and gmtime() was
|
||||||
|
* the one that checked TZ.
|
||||||
|
* 23 Apr 96, Chr. Spieler, deactivated time() replacement for UnZip stuff.
|
||||||
|
* Currently, the UnZip sources do not make use of time() (and do
|
||||||
|
* not supply the working mktime() replacement, either!).
|
||||||
|
* 29 Apr 96, Paul Kienitz, created a replacement getenv() out of code that
|
||||||
|
* was previously embedded in tzset(), for reliable global test
|
||||||
|
* of whether TZ is set or not.
|
||||||
|
* 19 Jun 96, Haidinger Walter, re-adapted for current SAS/C compiler.
|
||||||
|
* 7 Jul 96, Paul Kienitz, smoothed together compiler-related changes.
|
||||||
|
* 4 Feb 97, Haidinger Walter, added set_TZ() for SAS/C.
|
||||||
|
* 23 Apr 97, Paul Kienitz, corrected Unix->Amiga DST error by adding
|
||||||
|
* mkgmtime() so localtime() could be used.
|
||||||
|
* 28 Apr 97, Christian Spieler, deactivated mkgmtime() definition for ZIP;
|
||||||
|
* the Zip sources supply this function as part of util.c.
|
||||||
|
* 24 May 97, Haidinger Walter, added time_lib support for SAS/C and moved
|
||||||
|
* set_TZ() to time_lib.c.
|
||||||
|
* 12 Jul 97, Paul Kienitz, adapted time_lib stuff for Aztec.
|
||||||
|
* 26 Jul 97, Chr. Spieler, old mkgmtime() fixed (ydays[] def, sign vs unsign).
|
||||||
|
* 30 Dec 97, Haidinger Walter, adaptation for SAS/C using z-stat.h functions.
|
||||||
|
* 19 Feb 98, Haidinger Walter, removed alloc_remember, more SAS.C fixes.
|
||||||
|
* 23 Apr 98, Chr. Spieler, removed mkgmtime(), changed FileDate to convert to
|
||||||
|
* Amiga file-time directly.
|
||||||
|
* 24 Apr 98, Paul Kienitz, clip Unix dates earlier than 1978 in FileDate().
|
||||||
|
* 02 Sep 98, Paul Kienitz, C. Spieler, always include zip.h to get a defined
|
||||||
|
* header inclusion sequence that resolves all header dependencies.
|
||||||
|
* 06 Jun 00, Paul Kienitz, removed time_lib.c due to its incompatible license,
|
||||||
|
* moved set_TZ() back here, replaced minimal tzset() and localtime()
|
||||||
|
* with new versions derived from GNU glibc source. Gave locale_TZ()
|
||||||
|
* reasonable European defaults for daylight savings.
|
||||||
|
* 17 Jun 00, Paul Kienitz, threw out GNU code because of objections to the GPL
|
||||||
|
* virus, replaced with similar functions based on the public domain
|
||||||
|
* timezone code at ftp://elsie.nci.nih.gov/pub. As with the GNU
|
||||||
|
* stuff, support for timezone files and leap seconds was removed.
|
||||||
|
* 23 Aug 00, Paul Kienitz, moved timezone code out from here into separate
|
||||||
|
* platform-independent module 'timezone.c'.
|
||||||
|
* 31 Dec 00, Christian Spieler, moved system-specific timezone help funcions
|
||||||
|
* back in here, from 'timezone.c'.
|
||||||
|
* 07 Jan 01, Paul Kienitz, Chr. Spieler, added missing #include "timezone.h"
|
||||||
|
* and "symbolic" preprocessor constants for time calculations.
|
||||||
|
* 15 Jan 02, Paul Kienitz, excluded all time handling code from compilation
|
||||||
|
* for Zip utilities (when "defined(UTIL)")
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __amiga_filedate_c
|
||||||
|
#define __amiga_filedate_c
|
||||||
|
|
||||||
|
|
||||||
|
#include "zip.h"
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <exec/types.h>
|
||||||
|
#include <exec/execbase.h>
|
||||||
|
#include <exec/memory.h>
|
||||||
|
#include <dos/dosextens.h>
|
||||||
|
|
||||||
|
#ifdef AZTEC_C
|
||||||
|
# include <libraries/dos.h>
|
||||||
|
# include <libraries/dosextens.h>
|
||||||
|
# include <clib/exec_protos.h>
|
||||||
|
# include <clib/dos_protos.h>
|
||||||
|
# include <clib/locale_protos.h>
|
||||||
|
# include <pragmas/exec_lib.h>
|
||||||
|
# include <pragmas/dos_lib.h>
|
||||||
|
# include <pragmas/locale_lib.h>
|
||||||
|
# define ESRCH ENOENT
|
||||||
|
# define EOSERR EIO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __SASC
|
||||||
|
# include <stdlib.h>
|
||||||
|
# if (defined(_M68020) && (!defined(__USE_SYSBASE)))
|
||||||
|
/* on 68020 or higher processors it is faster */
|
||||||
|
# define __USE_SYSBASE /* to use the pragma libcall instead of syscall */
|
||||||
|
# endif /* to access functions of the exec.library */
|
||||||
|
# include <proto/exec.h> /* see SAS/C manual:part 2,chapter 2,pages 6-7 */
|
||||||
|
# include <proto/dos.h>
|
||||||
|
# include <proto/locale.h>
|
||||||
|
# ifdef DEBUG
|
||||||
|
# include <sprof.h>
|
||||||
|
# endif
|
||||||
|
# ifdef MWDEBUG
|
||||||
|
# include <stdio.h> /* include both before memwatch.h again just */
|
||||||
|
# include <stdlib.h> /* to be safe */
|
||||||
|
# include "memwatch.h"
|
||||||
|
# endif /* MWDEBUG */
|
||||||
|
#endif /* __SASC */
|
||||||
|
|
||||||
|
#include "crypt.h" /* just so we can tell if CRYPT is supported */
|
||||||
|
|
||||||
|
|
||||||
|
#if (!defined(FUNZIP) && !defined(UTIL))
|
||||||
|
|
||||||
|
#include "timezone.h" /* for AMIGA-specific timezone callbacks */
|
||||||
|
|
||||||
|
#ifndef SUCCESS
|
||||||
|
# define SUCCESS (-1L)
|
||||||
|
# define FAILURE 0L
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ReqVers 36L /* required library version for SetFileDate() */
|
||||||
|
#define ENVSIZE 100 /* max space allowed for an environment var */
|
||||||
|
|
||||||
|
extern struct ExecBase *SysBase;
|
||||||
|
|
||||||
|
#ifndef min
|
||||||
|
# define min(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
# define max(a, b) ((a) < (b) ? (b) : (a))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ZIP) || defined(HAVE_MKTIME)
|
||||||
|
static const unsigned short ydays[] =
|
||||||
|
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
|
||||||
|
#else
|
||||||
|
extern const unsigned short ydays[]; /* in unzip's fileio.c */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LEAP(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0)
|
||||||
|
#define YDAYS(m, y) (ydays[m] + (m > 1 && LEAP(y)))
|
||||||
|
/* Number of leap years from 1978 to `y' (not including `y' itself). */
|
||||||
|
#define ANLEAP(y) (((y) - 1977) / 4 - ((y) - 1901) / 100 + ((y) - 1601) / 400)
|
||||||
|
#define SECSPERMIN 60
|
||||||
|
#define MINSPERHOUR 60
|
||||||
|
#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
|
||||||
|
#define SECSPERDAY 86400L
|
||||||
|
|
||||||
|
/* prototypes */
|
||||||
|
char *getenv(const char *var);
|
||||||
|
#ifdef __SASC
|
||||||
|
/* XXX !! We have really got to find a way to operate without these. */
|
||||||
|
int setenv(const char *var, const char *value, int overwrite);
|
||||||
|
void set_TZ(long time_zone, int day_light);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LONG FileDate(char *filename, time_t u[]);
|
||||||
|
LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs);
|
||||||
|
int Agetch(void);
|
||||||
|
|
||||||
|
/* =============================================================== */
|
||||||
|
|
||||||
|
/***********************/
|
||||||
|
/* Function filedate() */
|
||||||
|
/***********************/
|
||||||
|
|
||||||
|
/* FileDate() (originally utime.c), by Paul Wells. Modified by John Bush
|
||||||
|
* and others (see also sendpkt() comments, below); NewtWare SetFileDate()
|
||||||
|
* clone cheaply ripped off from utime().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* DESCRIPTION
|
||||||
|
* This routine chooses between 2 methods to set the file date on AMIGA.
|
||||||
|
* Since AmigaDOS 2.x came out, SetFileDate() was available in ROM (v.36
|
||||||
|
* and higher). Under AmigaDOS 1.3.x (less than v.36 ROM), SetFileDate()
|
||||||
|
* must be accomplished by constructing a message packet and sending it
|
||||||
|
* to the file system handler of the file to be stamped.
|
||||||
|
*
|
||||||
|
* The system's ROM version is extracted from the external system Library
|
||||||
|
* base.
|
||||||
|
*
|
||||||
|
* NOTE: although argument passing conforms with utime(), note the
|
||||||
|
* following differences:
|
||||||
|
* - Return value is boolean success/failure.
|
||||||
|
* - If a structure or array is passed, only the first value
|
||||||
|
* is used, which *may* correspond to date accessed and not
|
||||||
|
* date modified.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LONG FileDate(filename, u)
|
||||||
|
char *filename;
|
||||||
|
time_t u[];
|
||||||
|
{
|
||||||
|
LONG SetFileDate(UBYTE *filename, struct DateStamp *pDate);
|
||||||
|
LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs);
|
||||||
|
struct MsgPort *taskport;
|
||||||
|
BPTR dirlock, lock;
|
||||||
|
struct FileInfoBlock *fib;
|
||||||
|
LONG pktargs[4];
|
||||||
|
UBYTE *ptr;
|
||||||
|
long ret;
|
||||||
|
|
||||||
|
struct DateStamp pDate;
|
||||||
|
struct tm *ltm;
|
||||||
|
int years;
|
||||||
|
|
||||||
|
tzset();
|
||||||
|
/* Amiga file date is based on 01-Jan-1978 00:00:00 (local time):
|
||||||
|
* 8 years and 2 leapdays difference from Unix time.
|
||||||
|
*/
|
||||||
|
ltm = localtime(&u[0]);
|
||||||
|
years = ltm->tm_year + 1900;
|
||||||
|
if (years < 1978)
|
||||||
|
pDate.ds_Days = pDate.ds_Minute = pDate.ds_Tick = 0;
|
||||||
|
else {
|
||||||
|
pDate.ds_Days = (years - 1978) * 365L + (ANLEAP(years)) +
|
||||||
|
YDAYS(ltm->tm_mon, years) + (ltm->tm_mday - 1);
|
||||||
|
pDate.ds_Minute = ltm->tm_hour * 60 + ltm->tm_min;
|
||||||
|
pDate.ds_Tick = ltm->tm_sec * TICKS_PER_SECOND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SysBase->LibNode.lib_Version >= ReqVers)
|
||||||
|
{
|
||||||
|
return (SetFileDate(filename,&pDate)); /* native routine at 2.0+ */
|
||||||
|
}
|
||||||
|
else /* !(SysBase->lib_Version >=ReqVers) */
|
||||||
|
{
|
||||||
|
if( !(taskport = (struct MsgPort *)DeviceProc(filename)) )
|
||||||
|
{
|
||||||
|
errno = ESRCH; /* no such process */
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !(lock = Lock(filename,SHARED_LOCK)) )
|
||||||
|
{
|
||||||
|
errno = ENOENT; /* no such file */
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !(fib = (struct FileInfoBlock *)AllocMem(
|
||||||
|
(long)sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR)) )
|
||||||
|
{
|
||||||
|
errno = ENOMEM; /* insufficient memory */
|
||||||
|
UnLock(lock);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Examine(lock,fib)==FAILURE )
|
||||||
|
{
|
||||||
|
errno = EOSERR; /* operating system error */
|
||||||
|
UnLock(lock);
|
||||||
|
FreeMem(fib,(long)sizeof(*fib));
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dirlock = ParentDir(lock);
|
||||||
|
ptr = (UBYTE *)AllocMem(64L,MEMF_PUBLIC);
|
||||||
|
strcpy((ptr+1),fib->fib_FileName);
|
||||||
|
*ptr = strlen(fib->fib_FileName);
|
||||||
|
FreeMem(fib,(long)sizeof(*fib));
|
||||||
|
UnLock(lock);
|
||||||
|
|
||||||
|
/* now fill in argument array */
|
||||||
|
|
||||||
|
pktargs[0] = 0;
|
||||||
|
pktargs[1] = (LONG)dirlock;
|
||||||
|
pktargs[2] = (LONG)&ptr[0] >> 2;
|
||||||
|
pktargs[3] = (LONG)&pDate;
|
||||||
|
|
||||||
|
errno = ret = sendpkt(taskport,ACTION_SET_DATE,pktargs,4L);
|
||||||
|
|
||||||
|
FreeMem(ptr,64L);
|
||||||
|
UnLock(dirlock);
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
} /* ?(SysBase->lib_Version >= ReqVers) */
|
||||||
|
} /* FileDate() */
|
||||||
|
|
||||||
|
|
||||||
|
char *getenv(const char *var) /* not reentrant! */
|
||||||
|
{
|
||||||
|
static char space[ENVSIZE];
|
||||||
|
struct Process *me = (void *) FindTask(NULL);
|
||||||
|
void *old_window = me->pr_WindowPtr;
|
||||||
|
char *ret = NULL;
|
||||||
|
|
||||||
|
me->pr_WindowPtr = (void *) -1; /* suppress any "Please insert" popups */
|
||||||
|
if (SysBase->LibNode.lib_Version >= ReqVers) {
|
||||||
|
if (GetVar((char *) var, space, ENVSIZE - 1, /*GVF_GLOBAL_ONLY*/ 0) > 0)
|
||||||
|
ret = space;
|
||||||
|
} else { /* early AmigaDOS, get env var the crude way */
|
||||||
|
BPTR hand, foot, spine;
|
||||||
|
int z = 0;
|
||||||
|
if (foot = Lock("ENV:", ACCESS_READ)) {
|
||||||
|
spine = CurrentDir(foot);
|
||||||
|
if (hand = Open((char *) var, MODE_OLDFILE)) {
|
||||||
|
z = Read(hand, space, ENVSIZE - 1);
|
||||||
|
Close(hand);
|
||||||
|
}
|
||||||
|
UnLock(CurrentDir(spine));
|
||||||
|
}
|
||||||
|
if (z > 0) {
|
||||||
|
space[z] = '\0';
|
||||||
|
ret = space;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
me->pr_WindowPtr = old_window;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __SASC
|
||||||
|
int setenv(const char *var, const char *value, int overwrite)
|
||||||
|
{
|
||||||
|
struct Process *me = (void *) FindTask(NULL);
|
||||||
|
void *old_window = me->pr_WindowPtr;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
me->pr_WindowPtr = (void *) -1; /* suppress any "Please insert" popups */
|
||||||
|
if (SysBase->LibNode.lib_Version >= ReqVers)
|
||||||
|
ret = !SetVar((char *)var, (char *)value, -1, GVF_GLOBAL_ONLY | LV_VAR);
|
||||||
|
else {
|
||||||
|
BPTR hand, foot, spine;
|
||||||
|
long len = value ? strlen(value) : 0;
|
||||||
|
if (foot = Lock("ENV:", ACCESS_READ)) {
|
||||||
|
spine = CurrentDir(foot);
|
||||||
|
if (len) {
|
||||||
|
if (hand = Open((char *) var, MODE_NEWFILE)) {
|
||||||
|
ret = Write(hand, (char *) value, len + 1) >= len;
|
||||||
|
Close(hand);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
ret = DeleteFile((char *) var);
|
||||||
|
UnLock(CurrentDir(spine));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
me->pr_WindowPtr = old_window;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stores data from timezone and daylight to ENV:TZ. */
|
||||||
|
/* ENV:TZ is required to exist by some other SAS/C library functions, */
|
||||||
|
/* like stat() or fstat(). */
|
||||||
|
void set_TZ(long time_zone, int day_light)
|
||||||
|
{
|
||||||
|
char put_tz[MAXTIMEZONELEN]; /* string for putenv: "TZ=aaabbb:bb:bbccc" */
|
||||||
|
int offset;
|
||||||
|
void *exists; /* dummy ptr to see if global envvar TZ already exists */
|
||||||
|
exists = (void *)getenv(TZ_ENVVAR);
|
||||||
|
/* see if there is already an envvar TZ_ENVVAR. If not, create it */
|
||||||
|
if (exists == NULL) {
|
||||||
|
/* create TZ string by pieces: */
|
||||||
|
sprintf(put_tz, "GMT%+ld", time_zone / 3600L);
|
||||||
|
if (time_zone % 3600L) {
|
||||||
|
offset = (int) labs(time_zone % 3600L);
|
||||||
|
sprintf(put_tz + strlen(put_tz), ":%02d", offset / 60);
|
||||||
|
if (offset % 60)
|
||||||
|
sprintf(put_tz + strlen(put_tz), ":%02d", offset % 60);
|
||||||
|
}
|
||||||
|
if (day_light)
|
||||||
|
strcat(put_tz,"DST");
|
||||||
|
setenv(TZ_ENVVAR, put_tz, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* __SASC */
|
||||||
|
|
||||||
|
/* set state as well as possible from settings found in locale.library */
|
||||||
|
int GetPlatformLocalTimezone(sp, fill_tzstate_from_rules)
|
||||||
|
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);
|
||||||
|
{
|
||||||
|
struct Library *LocaleBase;
|
||||||
|
struct Locale *ll;
|
||||||
|
struct Process *me = (void *) FindTask(NULL);
|
||||||
|
void *old_window = me->pr_WindowPtr;
|
||||||
|
BPTR eh;
|
||||||
|
int z, valid = FALSE;
|
||||||
|
|
||||||
|
/* read timezone from locale.library if TZ envvar missing */
|
||||||
|
me->pr_WindowPtr = (void *) -1; /* suppress any "Please insert" popups */
|
||||||
|
if (LocaleBase = OpenLibrary("locale.library", 0)) {
|
||||||
|
if (ll = OpenLocale(NULL)) {
|
||||||
|
z = ll->loc_GMTOffset; /* in minutes */
|
||||||
|
if (z == -300) {
|
||||||
|
if (eh = Lock("ENV:sys/locale.prefs", ACCESS_READ)) {
|
||||||
|
UnLock(eh);
|
||||||
|
valid = TRUE;
|
||||||
|
} else
|
||||||
|
z = 300; /* bug: locale not initialized, default bogus! */
|
||||||
|
} else
|
||||||
|
valid = TRUE;
|
||||||
|
if (valid) {
|
||||||
|
struct rule startrule, stoprule;
|
||||||
|
|
||||||
|
sp->timecnt = 0;
|
||||||
|
sp->typecnt = 1;
|
||||||
|
sp->charcnt = 2;
|
||||||
|
sp->chars[0] = sp->chars[1] = '\0';
|
||||||
|
sp->ttis[0].tt_abbrind = 0;
|
||||||
|
sp->ttis[1].tt_abbrind = 1;
|
||||||
|
sp->ttis[0].tt_gmtoff = -z * MINSPERHOUR;
|
||||||
|
sp->ttis[1].tt_gmtoff = -z * MINSPERHOUR + SECSPERHOUR;
|
||||||
|
sp->ttis[0].tt_isdst = 0;
|
||||||
|
sp->ttis[1].tt_isdst = 1;
|
||||||
|
stoprule.r_type = MONTH_NTH_DAY_OF_WEEK;
|
||||||
|
stoprule.r_day = 0;
|
||||||
|
stoprule.r_week = 5;
|
||||||
|
stoprule.r_mon = 10;
|
||||||
|
stoprule.r_time = 2 * SECSPERHOUR;
|
||||||
|
startrule = stoprule;
|
||||||
|
startrule.r_mon = 4;
|
||||||
|
startrule.r_week = 1;
|
||||||
|
if (z >= -180 && z < 150) {
|
||||||
|
/* At this point we make a really gratuitous assumption: */
|
||||||
|
/* if the time zone could be Europe, we use the European */
|
||||||
|
/* Union rules without checking what country we're in. */
|
||||||
|
/* The AmigaDOS locale country codes do not, at least in */
|
||||||
|
/* 2.x versions of the OS, recognize very many countries */
|
||||||
|
/* outside of Europe and North America. */
|
||||||
|
sp->typecnt = 2;
|
||||||
|
startrule.r_mon = 3; /* one week earlier than US DST */
|
||||||
|
startrule.r_week = 5;
|
||||||
|
} else if (z >= 150 && z <= 480 &&
|
||||||
|
/* no DST in alaska, hawaii */
|
||||||
|
(ll->loc_CountryCode == 0x55534100 /*"USA"*/ ||
|
||||||
|
ll->loc_CountryCode == 0x43414E00 /*"CAN"*/))
|
||||||
|
sp->typecnt = 2;
|
||||||
|
/* We check the country code for U.S. or Canada because */
|
||||||
|
/* most of Latin America has no DST. Even in these two */
|
||||||
|
/* countries there are some exceptions... */
|
||||||
|
/* else if... Feel free to add more cases here! */
|
||||||
|
|
||||||
|
if (sp->typecnt > 1)
|
||||||
|
(*fill_tzstate_from_rules)(sp, &startrule, &stoprule);
|
||||||
|
}
|
||||||
|
CloseLocale(ll);
|
||||||
|
}
|
||||||
|
CloseLibrary(LocaleBase);
|
||||||
|
}
|
||||||
|
me->pr_WindowPtr = old_window;
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ZIP
|
||||||
|
time_t time(time_t *tp)
|
||||||
|
{
|
||||||
|
time_t t;
|
||||||
|
struct DateStamp ds;
|
||||||
|
DateStamp(&ds);
|
||||||
|
t = ds.ds_Tick / TICKS_PER_SECOND + ds.ds_Minute * 60
|
||||||
|
+ (ds.ds_Days + 2922) * SECSPERDAY;
|
||||||
|
t = mktime(gmtime(&t));
|
||||||
|
/* gmtime leaves ds in the local timezone, mktime converts it to GMT */
|
||||||
|
if (tp) *tp = t;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
#endif /* ZIP */
|
||||||
|
|
||||||
|
#endif /* !FUNZIP && !UTIL */
|
||||||
|
|
||||||
|
|
||||||
|
#if CRYPT || !defined(FUNZIP)
|
||||||
|
|
||||||
|
/* sendpkt.c
|
||||||
|
* by A. Finkel, P. Lindsay, C. Sheppner
|
||||||
|
* returns Res1 of the reply packet
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
#include <exec/types.h>
|
||||||
|
#include <exec/memory.h>
|
||||||
|
#include <libraries/dos.h>
|
||||||
|
#include <libraries/dosextens.h>
|
||||||
|
#include <proto/exec.h>
|
||||||
|
#include <proto/dos.h>
|
||||||
|
*/
|
||||||
|
|
||||||
|
LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs);
|
||||||
|
|
||||||
|
LONG sendpkt(pid,action,args,nargs)
|
||||||
|
struct MsgPort *pid; /* process identifier (handler message port) */
|
||||||
|
LONG action, /* packet type (desired action) */
|
||||||
|
*args, /* a pointer to argument list */
|
||||||
|
nargs; /* number of arguments in list */
|
||||||
|
{
|
||||||
|
|
||||||
|
struct MsgPort *replyport, *CreatePort(UBYTE *, long);
|
||||||
|
void DeletePort(struct MsgPort *);
|
||||||
|
struct StandardPacket *packet;
|
||||||
|
LONG count, *pargs, res1;
|
||||||
|
|
||||||
|
replyport = CreatePort(NULL,0L);
|
||||||
|
if( !replyport ) return(0);
|
||||||
|
|
||||||
|
packet = (struct StandardPacket *)AllocMem(
|
||||||
|
(long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
|
||||||
|
if( !packet )
|
||||||
|
{
|
||||||
|
DeletePort(replyport);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
|
||||||
|
packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
|
||||||
|
packet->sp_Pkt.dp_Port = replyport;
|
||||||
|
packet->sp_Pkt.dp_Type = action;
|
||||||
|
|
||||||
|
/* copy the args into the packet */
|
||||||
|
pargs = &(packet->sp_Pkt.dp_Arg1); /* address of 1st argument */
|
||||||
|
for( count=0; count<nargs; count++ )
|
||||||
|
pargs[count] = args[count];
|
||||||
|
|
||||||
|
PutMsg(pid,(struct Message *)packet); /* send packet */
|
||||||
|
|
||||||
|
WaitPort(replyport);
|
||||||
|
GetMsg(replyport);
|
||||||
|
|
||||||
|
res1 = packet->sp_Pkt.dp_Res1;
|
||||||
|
|
||||||
|
FreeMem((char *)packet,(long)sizeof(*packet));
|
||||||
|
DeletePort(replyport);
|
||||||
|
|
||||||
|
return(res1);
|
||||||
|
|
||||||
|
} /* sendpkt() */
|
||||||
|
|
||||||
|
#endif /* CRYPT || !FUNZIP */
|
||||||
|
|
||||||
|
|
||||||
|
#if CRYPT || (defined(UNZIP) && !defined(FUNZIP))
|
||||||
|
|
||||||
|
/* Agetch() reads one raw keystroke -- uses sendpkt() */
|
||||||
|
|
||||||
|
int Agetch(void)
|
||||||
|
{
|
||||||
|
LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs);
|
||||||
|
struct Task *me = FindTask(NULL);
|
||||||
|
struct CommandLineInterface *cli = BADDR(((struct Process *) me)->pr_CLI);
|
||||||
|
BPTR fh = cli->cli_StandardInput; /* this is immune to < redirection */
|
||||||
|
void *conp = ((struct FileHandle *) BADDR(fh))->fh_Type;
|
||||||
|
char longspace[8];
|
||||||
|
long *flag = (long *) ((ULONG) &longspace[4] & ~3); /* LONGWORD ALIGNED! */
|
||||||
|
UBYTE c;
|
||||||
|
|
||||||
|
*flag = 1;
|
||||||
|
sendpkt(conp, ACTION_SCREEN_MODE, flag, 1); /* assume success */
|
||||||
|
Read(fh, &c, 1);
|
||||||
|
*flag = 0;
|
||||||
|
sendpkt(conp, ACTION_SCREEN_MODE, flag, 1);
|
||||||
|
if (c == 3) /* ^C in input */
|
||||||
|
Signal(me, SIGBREAKF_CTRL_C);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CRYPT || (UNZIP && !FUNZIP) */
|
||||||
|
|
||||||
|
#endif /* __amiga_filedate_c*/
|
502
unzip/unzip-5.52/amiga/flate.a
Normal file
502
unzip/unzip-5.52/amiga/flate.a
Normal file
@ -0,0 +1,502 @@
|
|||||||
|
;===========================================================================
|
||||||
|
; 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
|
||||||
|
;===========================================================================
|
||||||
|
; flate.a created by Paul Kienitz, 20 June 94. Last modified 23 Mar 2002.
|
||||||
|
;
|
||||||
|
; 68000 assembly language version of inflate_codes(), for Amiga. Prototype:
|
||||||
|
;
|
||||||
|
; int inflate_codes(__GPRO__ struct huft *tl, struct huft *td,
|
||||||
|
; unsigned bl, unsigned bd);
|
||||||
|
;
|
||||||
|
; Where __GPRO__ expands to "Uz_Globs *G," if REENTRANT is defined,
|
||||||
|
; otherwise to nothing. In the latter case G is a global variable.
|
||||||
|
;
|
||||||
|
; Define the symbol FUNZIP if this is for fUnZip. It overrides REENTRANT.
|
||||||
|
;
|
||||||
|
; Define AZTEC to use the Aztec C macro version of getc() instead of the
|
||||||
|
; library getc() with FUNZIP. AZTEC is ignored if FUNZIP is not defined.
|
||||||
|
;
|
||||||
|
; Define NO_CHECK_EOF to not use the fancy paranoid version of NEEDBITS --
|
||||||
|
; this is equivalent to removing the #define CHECK_EOF from inflate.c.
|
||||||
|
;
|
||||||
|
; Define INT16 if ints are short, otherwise it assumes ints are long.
|
||||||
|
;
|
||||||
|
; Define USE_DEFLATE64 if we're supporting Deflate64 decompression.
|
||||||
|
;
|
||||||
|
; Do NOT define WSIZE; it is always 32K or 64K depending on USE_DEFLATE64.
|
||||||
|
;
|
||||||
|
; ------
|
||||||
|
;
|
||||||
|
; The following include file is generated from globals.h, and gives us equates
|
||||||
|
; that give the offsets in Uz_Globs of the fields we use, which are:
|
||||||
|
; ulg bb
|
||||||
|
; unsigned int bk, wp
|
||||||
|
; (either array of unsigned char, or pointer to unsigned char) redirslide
|
||||||
|
; For fUnZip:
|
||||||
|
; FILE *in
|
||||||
|
; For regular UnZip but not fUnZip:
|
||||||
|
; int incnt, mem_mode
|
||||||
|
; long csize
|
||||||
|
; uch *inptr
|
||||||
|
; It also defines a value SIZEOF_slide, which tells us whether the appropriate
|
||||||
|
; slide field in G (either area.Slide or redirect_pointer) is a pointer or an
|
||||||
|
; array instance. It is 4 in the former case and a large value in the latter.
|
||||||
|
; Lastly, this include will define CRYPT as 1 if appropriate and supply flag
|
||||||
|
; definitions for major compile options that may affect the layout of the
|
||||||
|
; globals structure and the functionality of the core decompression routines
|
||||||
|
; (currently FUNZIP, SFX, REENTRANT, DLL, NO_SLIDE_REDIR, USE_DEFLATE64).
|
||||||
|
|
||||||
|
INCLUDE "amiga/G_offs.a"
|
||||||
|
|
||||||
|
; struct huft is defined as follows:
|
||||||
|
;
|
||||||
|
; struct huft {
|
||||||
|
; uch e; /* number of extra bits or operation */
|
||||||
|
; uch b; /* number of bits in this code or subcode */
|
||||||
|
; union {
|
||||||
|
; ush n; /* literal, length base, or distance base */
|
||||||
|
; struct huft *t; /* pointer to next level of table */
|
||||||
|
; } v;
|
||||||
|
; }; /* sizeof(struct huft) == 6 */
|
||||||
|
;
|
||||||
|
; The G_offs include defines offsets h_e, h_b, h_v_n, and h_v_t in this
|
||||||
|
; struct, plus SIZEOF_huft.
|
||||||
|
|
||||||
|
IFD REENTRANT
|
||||||
|
IFND FUNZIP
|
||||||
|
REENT_G equ 1
|
||||||
|
ENDC
|
||||||
|
ENDC
|
||||||
|
|
||||||
|
; These macros allow us to deal uniformly with short or long ints:
|
||||||
|
|
||||||
|
IFD INT16
|
||||||
|
MOVINT MACRO
|
||||||
|
move.w \1,\2
|
||||||
|
ENDM
|
||||||
|
INTSIZE equ 2
|
||||||
|
ELSE ; !INT16
|
||||||
|
MOVINT MACRO
|
||||||
|
move.l \1,\2
|
||||||
|
ENDM
|
||||||
|
INTSIZE equ 4
|
||||||
|
ENDC
|
||||||
|
|
||||||
|
; G.bb is the global buffer that holds bits from the huffman code stream, which
|
||||||
|
; we cache in the register variable b. G.bk is the number of valid bits in it,
|
||||||
|
; which we cache in k. The macros NEEDBITS(n) and DUMPBITS(n) have side effects
|
||||||
|
; on b and k.
|
||||||
|
|
||||||
|
IFD REENT_G
|
||||||
|
G_SIZE equ 4
|
||||||
|
G_PUSH MACRO ; this macro passes "__G__" to functions
|
||||||
|
move.l G,-(sp)
|
||||||
|
ENDM
|
||||||
|
ELSE
|
||||||
|
xref _G ; Uz_Globs
|
||||||
|
G_SIZE equ 0
|
||||||
|
G_PUSH MACRO
|
||||||
|
ds.b 0 ; does nothing; the assembler dislikes MACRO ENDM
|
||||||
|
ENDM
|
||||||
|
ENDC ; REENT_G
|
||||||
|
|
||||||
|
;; xref _mask_bits ; const unsigned mask_bits[17];
|
||||||
|
IFD FUNZIP
|
||||||
|
IF CRYPT
|
||||||
|
xref _encrypted ; int -- boolean flag
|
||||||
|
xref _update_keys ; int update_keys(__GPRO__ int)
|
||||||
|
xref _decrypt_byte ; int decrypt_byte(__GPRO)
|
||||||
|
ENDC ; CRYPT
|
||||||
|
ELSE ; !FUNZIP
|
||||||
|
xref _memflush ; int memflush(__GPRO__ uch *, ulg)
|
||||||
|
xref _readbyte ; int readbyte(__GPRO)
|
||||||
|
ENDC ; FUNZIP
|
||||||
|
|
||||||
|
xref _flush ; if FUNZIP: int flush(__GPRO__ ulg)
|
||||||
|
; else: int flush(__GPRO__ uch *, ulg, int)
|
||||||
|
|
||||||
|
; Here are our register variables.
|
||||||
|
|
||||||
|
b equr d2 ; unsigned long
|
||||||
|
k equr d3 ; unsigned short <= 32
|
||||||
|
e equr d4 ; unsigned int, mostly used as unsigned char
|
||||||
|
w equr d5 ; unsigned long (was short before deflate64)
|
||||||
|
n equr d6 ; unsigned long (was short before deflate64)
|
||||||
|
d equr d7 ; unsigned int, used as unsigned short
|
||||||
|
|
||||||
|
t equr a2 ; struct huft *
|
||||||
|
lmask equr a3 ; ulg *
|
||||||
|
G equr a6 ; Uz_Globs *
|
||||||
|
|
||||||
|
; Couple other items we need:
|
||||||
|
|
||||||
|
savregs reg d2-d7/a2/a3/a6
|
||||||
|
IFD USE_DEFLATE64
|
||||||
|
WSIZE equ $10000 ; 64K... be careful not to treat as short!
|
||||||
|
ELSE
|
||||||
|
WSIZE equ $08000 ; 32K... be careful not to treat as negative!
|
||||||
|
ENDC
|
||||||
|
EOF equ -1
|
||||||
|
INVALID equ 99
|
||||||
|
|
||||||
|
; inflate_codes() returns one of the following status codes:
|
||||||
|
; 0 OK
|
||||||
|
; 1 internal inflate error or EOF on input stream
|
||||||
|
; the following return codes are passed through from FLUSH() errors
|
||||||
|
; 50 (PK_DISK) "overflow of output space"
|
||||||
|
; 80 (IZ_CTRLC) "canceled by user's request"
|
||||||
|
|
||||||
|
RET_OK equ 0
|
||||||
|
RET_ERR equ 1
|
||||||
|
|
||||||
|
IFD FUNZIP
|
||||||
|
; This does getc(in). Aztec version is based on #define getc(fp) in stdio.h
|
||||||
|
|
||||||
|
IFD AZTEC
|
||||||
|
xref __filbuf
|
||||||
|
GETC MACRO
|
||||||
|
move.l in(G),a0
|
||||||
|
move.l (a0),a1 ; in->_bp
|
||||||
|
cmp.l 4(a0),a1 ; in->_bend
|
||||||
|
blo.s gci\@
|
||||||
|
move.l a0,-(sp)
|
||||||
|
jsr __filbuf
|
||||||
|
addq #4,sp
|
||||||
|
bra.s gce\@
|
||||||
|
gci\@: moveq #0,d0 ; must be valid as longword
|
||||||
|
move.b (a1)+,d0
|
||||||
|
move.l a1,(a0)
|
||||||
|
gce\@:
|
||||||
|
ENDM
|
||||||
|
ELSE ; !AZTEC
|
||||||
|
GETC MACRO
|
||||||
|
xref _getc
|
||||||
|
move.l in(G),-(sp)
|
||||||
|
jsr _getc
|
||||||
|
addq #4,sp
|
||||||
|
ENDM
|
||||||
|
ENDC ; AZTEC
|
||||||
|
ENDC ; FUNZIP
|
||||||
|
|
||||||
|
; Input depends on the NEXTBYTE macro. This exists in three different forms.
|
||||||
|
; The first two are for fUnZip, with and without decryption. The last is for
|
||||||
|
; regular UnZip with or without decryption. The resulting byte is returned
|
||||||
|
; in d0 as a longword, and d1, a0, and a1 are clobbered.
|
||||||
|
|
||||||
|
; FLUSH also has different forms for UnZip and fUnZip. Arg must be a longword.
|
||||||
|
; The same scratch registers are trashed.
|
||||||
|
|
||||||
|
IFD FUNZIP
|
||||||
|
|
||||||
|
NEXTBYTE MACRO
|
||||||
|
GETC
|
||||||
|
IF CRYPT
|
||||||
|
tst.w _encrypted+INTSIZE-2 ; test low word if long
|
||||||
|
beq.s nbe\@
|
||||||
|
MOVINT d0,-(sp) ; save thru next call
|
||||||
|
G_PUSH
|
||||||
|
jsr _decrypt_byte
|
||||||
|
eor.w d0,G_SIZE+INTSIZE-2(sp) ; becomes arg to update_keys
|
||||||
|
jsr _update_keys
|
||||||
|
addq #INTSIZE+G_SIZE,sp
|
||||||
|
nbe\@:
|
||||||
|
ENDC ; !CRYPT
|
||||||
|
IFGT 4-INTSIZE
|
||||||
|
ext.l d0 ; assert -1 <= d0 <= 255
|
||||||
|
ENDC
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
FLUSH MACRO
|
||||||
|
move.l \1,-(sp)
|
||||||
|
G_PUSH
|
||||||
|
jsr _flush
|
||||||
|
addq #4+G_SIZE,sp
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
ELSE ; !FUNZIP
|
||||||
|
|
||||||
|
NEXTBYTE MACRO
|
||||||
|
subq.w #1,incnt+INTSIZE-2(G) ; treat as short
|
||||||
|
bge.s nbs\@
|
||||||
|
G_PUSH
|
||||||
|
jsr _readbyte
|
||||||
|
IFNE G_SIZE
|
||||||
|
addq #G_SIZE,sp
|
||||||
|
ENDC
|
||||||
|
IFGT 4-INTSIZE
|
||||||
|
ext.l d0 ; assert -1 <= d0 <= 255
|
||||||
|
ENDC
|
||||||
|
bra.s nbe\@
|
||||||
|
nbs\@: moveq #0,d0
|
||||||
|
move.l inptr(G),a0 ; alt vers: move.b inptr(G),d0
|
||||||
|
move.b (a0)+,d0 ; addq #1,inptr(G)
|
||||||
|
move.l a0,inptr(G)
|
||||||
|
nbe\@:
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
FLUSH MACRO
|
||||||
|
MOVINT #0,-(sp) ; unshrink flag: always false
|
||||||
|
move.l \1,-(sp) ; length
|
||||||
|
IFGT SIZEOF_slide-4
|
||||||
|
pea redirslide(G) ; buffer to flush
|
||||||
|
ELSE
|
||||||
|
move.l redirslide(G),-(sp)
|
||||||
|
ENDC
|
||||||
|
G_PUSH
|
||||||
|
tst.w mem_mode+INTSIZE-2(G) ; test lower word if long
|
||||||
|
beq.s fm\@
|
||||||
|
jsr _memflush ; ignores the unshrink flag
|
||||||
|
bra.s fe\@
|
||||||
|
fm\@: jsr _flush
|
||||||
|
fe\@: lea 8+INTSIZE+G_SIZE(sp),sp
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
ENDC ; ?FUNZIP
|
||||||
|
|
||||||
|
; Here are the two bit-grabbing macros, defined in their NO_CHECK_EOF form:
|
||||||
|
;
|
||||||
|
; #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<<k;k+=8;}}
|
||||||
|
; #define DUMPBITS(n) {b>>=(n);k-=(n);}
|
||||||
|
;
|
||||||
|
; Without NO_CHECK_EOF, NEEDBITS reads like this:
|
||||||
|
;
|
||||||
|
; {while((int)k<(int)(n)){int c=NEXTBYTE;
|
||||||
|
; if(c==EOF){if((int)k>=0)break;return 1};
|
||||||
|
; b|=((ulg)c)<<k;k+=8;}}
|
||||||
|
;
|
||||||
|
; NEEDBITS clobbers d0, d1, a0, and a1, none of which can be used as the arg to
|
||||||
|
; the macro specifying the number of bits. The arg can be a shortword memory
|
||||||
|
; address, or d2-d7. The result is copied into d1 as a word ready for masking.
|
||||||
|
; DUMPBITS has no side effects; the arg must be a d-register (or immediate in
|
||||||
|
; the range 1-8?) and only the lower byte is significant.
|
||||||
|
|
||||||
|
NEEDBITS MACRO ; arg is short
|
||||||
|
nb\@: cmp.w \1,k ; assert 0 < k <= 32 ... arg may be 0
|
||||||
|
bge.s ne\@ ; signed compare!
|
||||||
|
NEXTBYTE ; returns in d0.l
|
||||||
|
IFND NO_CHECK_EOF
|
||||||
|
cmp.w #EOF,d0
|
||||||
|
bne.s nok\@
|
||||||
|
tst.w k
|
||||||
|
bge.s ne\@
|
||||||
|
moveq #RET_ERR,d0
|
||||||
|
bra return
|
||||||
|
ENDC ; !NO_CHECK_EOF
|
||||||
|
nok\@: lsl.l k,d0
|
||||||
|
or.l d0,b
|
||||||
|
addq.w #8,k
|
||||||
|
bra.s nb\@
|
||||||
|
ne\@: move.l b,d1 ; return a copy of b in d1
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
DUMPBITS MACRO ; arg is byte, not short!
|
||||||
|
lsr.l \1,b ; upper bits of \1 are ignored, right?
|
||||||
|
sub.b \1,k
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
|
||||||
|
; This is a longword version of the mask_bits constant array:
|
||||||
|
longmasks: dc.l $00000000,$00000001,$00000003,$00000007,$0000000F
|
||||||
|
dc.l $0000001F,$0000003F,$0000007F,$000000FF,$000001FF
|
||||||
|
dc.l $000003FF,$000007FF,$00000FFF,$00001FFF,$00003FFF
|
||||||
|
dc.l $00007FFF,$0000FFFF,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
|
||||||
|
|
||||||
|
; ******************************************************************************
|
||||||
|
; Here we go, finally:
|
||||||
|
|
||||||
|
xdef _inflate_codes
|
||||||
|
|
||||||
|
_inflate_codes:
|
||||||
|
link a5,#-8
|
||||||
|
movem.l savregs,-(sp)
|
||||||
|
; 8(a5) = tl, 12(a5) = td, 16(a5) = bl, 18|20(a5) = bd... add 4 for REENT_G
|
||||||
|
; -4(a5) = ml, -8(a5) = md, both unsigned long.
|
||||||
|
; Here we cache some globals and args:
|
||||||
|
IFD REENT_G
|
||||||
|
move.l 8(a5),G
|
||||||
|
ELSE
|
||||||
|
lea _G,G ; G is now a global instance
|
||||||
|
ENDC
|
||||||
|
lea longmasks,lmask
|
||||||
|
move.l bb(G),b
|
||||||
|
MOVINT bk(G),k
|
||||||
|
IFD INT16
|
||||||
|
moveq #0,w ; keep this usable as longword
|
||||||
|
ENDC
|
||||||
|
MOVINT wp(G),w
|
||||||
|
moveq #0,e ; keep this usable as longword too
|
||||||
|
MOVINT 16+G_SIZE(a5),d0
|
||||||
|
asl.w #2,d0
|
||||||
|
move.l (lmask,d0.w),-4(a5) ; ml = mask_bits[bl]
|
||||||
|
MOVINT 16+INTSIZE+G_SIZE(a5),d0
|
||||||
|
asl.w #2,d0
|
||||||
|
move.l (lmask,d0.w),-8(a5) ; md = mask_bits[bd]
|
||||||
|
|
||||||
|
xdef newtop
|
||||||
|
xdef nonlit
|
||||||
|
xdef distop
|
||||||
|
xdef docopy
|
||||||
|
xdef nonleng
|
||||||
|
xdef tailgo
|
||||||
|
xdef finish
|
||||||
|
xdef disbrk
|
||||||
|
main_loop:
|
||||||
|
NEEDBITS 14+INTSIZE+G_SIZE(a5) ; (unsigned) bl
|
||||||
|
and.l -4(a5),d1 ; ml
|
||||||
|
IFNE SIZEOF_huft-8
|
||||||
|
mulu #SIZEOF_huft,d1
|
||||||
|
ELSE
|
||||||
|
asl.l #3,d1
|
||||||
|
ENDC
|
||||||
|
move.l 8+G_SIZE(a5),t ; tl
|
||||||
|
add.l d1,t
|
||||||
|
newtop: move.b h_b(t),d0
|
||||||
|
DUMPBITS d0
|
||||||
|
move.b h_e(t),e
|
||||||
|
cmp.b #32,e ; is it a literal?
|
||||||
|
bne nonlit ; no
|
||||||
|
move.w h_v_n(t),d0 ; yes
|
||||||
|
IFGT SIZEOF_slide-4
|
||||||
|
lea redirslide(G),a0
|
||||||
|
ELSE
|
||||||
|
move.l redirslide(G),a0
|
||||||
|
ENDC
|
||||||
|
move.b d0,(a0,w.l) ; stick in the decoded byte
|
||||||
|
addq.l #1,w
|
||||||
|
cmp.l #WSIZE,w
|
||||||
|
blo main_loop
|
||||||
|
FLUSH w
|
||||||
|
ext.l d0 ; does a test as it casts long
|
||||||
|
bne return
|
||||||
|
moveq #0,w
|
||||||
|
bra main_loop ; break (newtop loop)
|
||||||
|
|
||||||
|
nonlit: cmp.b #31,e ; is it a length?
|
||||||
|
beq finish ; no, it's the end marker
|
||||||
|
bhi nonleng ; no, it's something else
|
||||||
|
NEEDBITS e ; yes: a duplicate string
|
||||||
|
move.w e,d0
|
||||||
|
asl.w #2,d0
|
||||||
|
and.l (lmask,d0.w),d1
|
||||||
|
moveq #0,n ; cast h_v_n(t) to long
|
||||||
|
move.w h_v_n(t),n
|
||||||
|
add.l d1,n ; length of block to copy
|
||||||
|
DUMPBITS e
|
||||||
|
NEEDBITS 14+(2*INTSIZE)+G_SIZE(a5) ; bd, lower word if long
|
||||||
|
and.l -8(a5),d1 ; md
|
||||||
|
IFNE SIZEOF_huft-8
|
||||||
|
mulu #SIZEOF_huft,d1
|
||||||
|
ELSE
|
||||||
|
asl.l #3,d1
|
||||||
|
ENDC
|
||||||
|
move.l 12+G_SIZE(a5),t ; td
|
||||||
|
add.l d1,t
|
||||||
|
distop: move.b h_b(t),d0
|
||||||
|
DUMPBITS d0
|
||||||
|
move.b h_e(t),e
|
||||||
|
cmp.b #32,e ; is it a literal?
|
||||||
|
blo.s disbrk ; then stop doing this
|
||||||
|
cmp.b #INVALID,e ; is it bogus?
|
||||||
|
bne.s disgo
|
||||||
|
moveq #RET_ERR,d0 ; then fail
|
||||||
|
bra return
|
||||||
|
disgo: and.w #$001F,e
|
||||||
|
NEEDBITS e
|
||||||
|
move.w e,d0
|
||||||
|
asl.w #2,d0
|
||||||
|
and.l (lmask,d0.w),d1
|
||||||
|
IFNE SIZEOF_huft-8
|
||||||
|
mulu #SIZEOF_huft,d1
|
||||||
|
ELSE
|
||||||
|
asl.l #3,d1
|
||||||
|
ENDC
|
||||||
|
move.l h_v_t(t),t
|
||||||
|
add.l d1,t
|
||||||
|
bra distop
|
||||||
|
disbrk: NEEDBITS e
|
||||||
|
move.l e,d0
|
||||||
|
asl.w #2,d0
|
||||||
|
and.l (lmask,d0.w),d1
|
||||||
|
move.l w,d
|
||||||
|
move.w h_v_n(t),d0 ; assert top word of d0 is zero
|
||||||
|
sub.l d0,d
|
||||||
|
sub.l d1,d ; distance back to copy the block
|
||||||
|
DUMPBITS e
|
||||||
|
|
||||||
|
docopy: move.l #WSIZE,e ; copy the duplicated string
|
||||||
|
and.l #WSIZE-1,d ; ...but first check if the length
|
||||||
|
cmp.l d,w ; will overflow the window...
|
||||||
|
blo.s ddgw
|
||||||
|
sub.l w,e
|
||||||
|
bra.s dadw
|
||||||
|
ddgw: sub.l d,e
|
||||||
|
dadw: cmp.l #$08000,e ; also, only copy <= 32K, so we can
|
||||||
|
bls.s dnox ; use a dbra loop to do it
|
||||||
|
move.l #$08000,e
|
||||||
|
dnox: cmp.l n,e
|
||||||
|
bls.s delen
|
||||||
|
move.l n,e
|
||||||
|
delen: sub.l e,n ; size of sub-block to copy in this pass
|
||||||
|
IFGT SIZEOF_slide-4
|
||||||
|
lea redirslide(G),a0
|
||||||
|
ELSE
|
||||||
|
move.l redirslide(G),a0
|
||||||
|
ENDC
|
||||||
|
move.l a0,a1
|
||||||
|
add.l w,a0
|
||||||
|
add.l d,a1
|
||||||
|
; Now at this point we could do tests to see if we should use an optimized
|
||||||
|
; large block copying method such as movem's, but since (a) such methods require
|
||||||
|
; the source and destination to be compatibly aligned -- and odd bytes at each
|
||||||
|
; end have to be handled separately, (b) it's only worth checking for if the
|
||||||
|
; block is pretty large, and (c) most strings are only a few bytes long, we're
|
||||||
|
; just not going to bother. Therefore we check above to make sure we move at
|
||||||
|
; most 32K in one sub-block, so a dbra loop can handle it.
|
||||||
|
dshort: move.l e,d0
|
||||||
|
subq #1,d0 ; assert >= 0
|
||||||
|
dspin: move.b (a1)+,(a0)+
|
||||||
|
dbra d0,dspin
|
||||||
|
add.l e,w
|
||||||
|
add.l e,d
|
||||||
|
cmp.l #WSIZE,w
|
||||||
|
blo.s dnfl
|
||||||
|
FLUSH w
|
||||||
|
ext.l d0 ; does a test as it casts to long
|
||||||
|
bne return
|
||||||
|
moveq #0,w
|
||||||
|
dnfl: tst.l n ; need to do more sub-blocks?
|
||||||
|
bne docopy ; yes
|
||||||
|
moveq #0,e ; restore zeroness in upper bytes of e
|
||||||
|
bra main_loop ; break (newtop loop)
|
||||||
|
|
||||||
|
nonleng: cmp.w #INVALID,e ; bottom of newtop loop -- misc. code
|
||||||
|
bne.s tailgo ; invalid code?
|
||||||
|
moveq #RET_ERR,d0 ; then fail
|
||||||
|
bra return
|
||||||
|
tailgo: and.w #$001F,e
|
||||||
|
NEEDBITS e
|
||||||
|
move.w e,d0
|
||||||
|
asl.w #2,d0
|
||||||
|
and.l (lmask,d0.w),d1
|
||||||
|
IFNE SIZEOF_huft-8
|
||||||
|
mulu #SIZEOF_huft,d1
|
||||||
|
ELSE
|
||||||
|
asl.l #3,d1
|
||||||
|
ENDC
|
||||||
|
move.l h_v_t(t),t
|
||||||
|
add.l d1,t
|
||||||
|
bra newtop
|
||||||
|
|
||||||
|
finish: MOVINT w,wp(G) ; done: restore cached globals
|
||||||
|
MOVINT k,bk(G)
|
||||||
|
move.l b,bb(G)
|
||||||
|
moveq #RET_OK,d0 ; return "no error"
|
||||||
|
return: movem.l (sp)+,savregs
|
||||||
|
unlk a5
|
||||||
|
rts
|
136
unzip/unzip-5.52/amiga/makefile.azt
Normal file
136
unzip/unzip-5.52/amiga/makefile.azt
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
# Makefile for UnZip 5.5 using Manx Aztec C 5.2, last revised 13 Jan 02.
|
||||||
|
# Define EXTRA=xxx on the Make command line for e.g. -dUSE_UNSHRINK.
|
||||||
|
|
||||||
|
EXTRA =
|
||||||
|
|
||||||
|
CC = cc
|
||||||
|
VERNUMS = -d __VERSION__=5 -d __REVISION__=2
|
||||||
|
CFLAGS = -ps -sabfmnpu -wcpr0u -d AMIGA $(EXTRA)
|
||||||
|
# -ps means short ints, -sabfmnpu is optimizations, -wcpr0u is type checking
|
||||||
|
# option flags MORE and ASM_* are now set in the Aztec section of amiga/amiga.h;
|
||||||
|
# it's cleaner, and that way any changes forces a recompile.
|
||||||
|
|
||||||
|
LD = ln
|
||||||
|
LDFLAGS = +q -m
|
||||||
|
LDLIBS = -lc16
|
||||||
|
# linker arg -m suppresses warnings about overriding c.lib functions
|
||||||
|
|
||||||
|
OBJS = unzip.o envargs.o process.o extract.o \
|
||||||
|
explode.o unshrink.o unreduce.o inflate.o match.o zipinfo.o \
|
||||||
|
list.o globals.o crypt.o ttyio.o fileio.o crctab.o timezone.o \
|
||||||
|
amiga/amiga.o amiga/crc_68.o amiga/flate.o
|
||||||
|
|
||||||
|
XOBJS = unzip.xo process.xo extract.xo inflate.xo match.xo \
|
||||||
|
globals.xo crypt.xo ttyio.xo fileio.xo crctab.xo timezone.xo \
|
||||||
|
amiga/amiga.xo amiga/crc_68.o amiga/flate.xo
|
||||||
|
|
||||||
|
FOBJS = funzip.o inflate.fo crypt.fo ttyio.fo globals.fo \
|
||||||
|
amiga/filedate.fo amiga/crc_68.o amiga/flate.fo
|
||||||
|
|
||||||
|
|
||||||
|
.c.o :
|
||||||
|
$(CC) -o $@ $(CFLAGS) $*.c
|
||||||
|
|
||||||
|
.c.xo:
|
||||||
|
$(CC) -o $@ -d SFX $(CFLAGS) $*.c
|
||||||
|
|
||||||
|
.c.fo:
|
||||||
|
$(CC) -o $@ -d FUNZIP $(CFLAGS) $*.c
|
||||||
|
|
||||||
|
all : UnZip UnZipSFX fUnZip MakeSFX
|
||||||
|
|
||||||
|
u : UnZip
|
||||||
|
|
||||||
|
f : fUnZip
|
||||||
|
|
||||||
|
x : UnZipSFX
|
||||||
|
|
||||||
|
m : MakeSFX
|
||||||
|
|
||||||
|
UnZip : $(OBJS)
|
||||||
|
$(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
|
||||||
|
|
||||||
|
UnZipSFX : $(XOBJS) MakeSFX
|
||||||
|
$(LD) $(LDFLAGS) -o $@ $(XOBJS) $(LDLIBS)
|
||||||
|
|
||||||
|
fUnZip : $(FOBJS)
|
||||||
|
$(LD) $(LDFLAGS) -o $@ $(FOBJS) $(LDLIBS)
|
||||||
|
|
||||||
|
MakeSFX : amiga/makesfx.c
|
||||||
|
$(CC) $(CFLAGS) -o t:makesfx.o amiga/makesfx.c
|
||||||
|
$(LD) $(LDFLAGS) -o MakeSFX t:makesfx.o $(LDLIBS)
|
||||||
|
-@delete t:makesfx.o
|
||||||
|
|
||||||
|
clean :
|
||||||
|
-delete $(OBJS)
|
||||||
|
-delete $(XOBJS)
|
||||||
|
-delete $(FOBJS)
|
||||||
|
-delete amiga/G_offs.a amiga/G_offs.fa amiga/gbloffs amiga/Fgbloffs
|
||||||
|
|
||||||
|
cleaner : clean
|
||||||
|
-delete UnZip fUnZip UnZipSFX MakeSFX
|
||||||
|
|
||||||
|
|
||||||
|
$(OBJS) $(XOBJS) $(FOBJS) : unzip.h unzpriv.h globals.h \
|
||||||
|
amiga/amiga.h amiga/z-stat.h
|
||||||
|
|
||||||
|
crypt.o crypt.fo timezone.o ttyio.o ttyio.fo : zip.h
|
||||||
|
|
||||||
|
inflate.o inflate.fo : inflate.h
|
||||||
|
|
||||||
|
fileio.o : ebcdic.h
|
||||||
|
|
||||||
|
funzip.o : tables.h
|
||||||
|
|
||||||
|
crypt.o crypt.fo crypt.xo ttyio.o ttyio.fo ttyio.xo : crypt.h
|
||||||
|
unzip.o unzip.xo funzip.o : crypt.h
|
||||||
|
fileio.o fileio.xo extract.o extract.xo : crypt.h
|
||||||
|
inflate.o inflate.fo inflate.xo amiga/filedate.fo : crypt.h
|
||||||
|
amiga/gbloffs amiga/Fgbloffs amiga/Xgbloffs : crypt.h
|
||||||
|
|
||||||
|
crypt.o crypt.fo crypt.xo ttyio.o ttyio.fo ttyio.xo : ttyio.h
|
||||||
|
funzip.o fileio.o fileio.xo : ttyio.h
|
||||||
|
|
||||||
|
timezone.o timezone.xo amiga/amiga.o amiga/amiga.xo : timezone.h
|
||||||
|
|
||||||
|
unzip.o unzip.xo : unzvers.h consts.h
|
||||||
|
|
||||||
|
|
||||||
|
# Special case object files:
|
||||||
|
|
||||||
|
amiga/amiga.o : amiga/filedate.c amiga/stat.c amiga/amiga.c unzvers.h
|
||||||
|
rx > env:VersionDate "say '""'translate(date('E'), '.', '/')'""'"
|
||||||
|
$(CC) -o amiga/amiga.o $(CFLAGS) $(VERNUMS) amiga/amiga.c
|
||||||
|
|
||||||
|
amiga/amiga.xo : amiga/filedate.c amiga/stat.c amiga/amiga.c unzvers.h
|
||||||
|
$(CC) -o amiga/amiga.xo $(CFLAGS) $(VERNUMS) -d SFX amiga/amiga.c
|
||||||
|
|
||||||
|
amiga/crc_68.o : amiga/crc_68.a
|
||||||
|
as -n -o amiga/crc_68.o amiga/crc_68.a
|
||||||
|
|
||||||
|
amiga/flate.o : amiga/flate.a amiga/gbloffs
|
||||||
|
amiga/gbloffs > amiga/G_offs.a
|
||||||
|
as -n -o amiga/flate.o -eINT16 amiga/flate.a
|
||||||
|
|
||||||
|
amiga/flate.fo : amiga/flate.a amiga/Fgbloffs
|
||||||
|
amiga/Fgbloffs > amiga/G_offs.a
|
||||||
|
as -n -o amiga/flate.fo -eINT16 -eAZTEC amiga/flate.a
|
||||||
|
|
||||||
|
amiga/flate.xo : amiga/flate.a amiga/Xgbloffs
|
||||||
|
amiga/Xgbloffs > amiga/G_offs.a
|
||||||
|
as -n -o amiga/flate.xo -eINT16 amiga/flate.a
|
||||||
|
|
||||||
|
amiga/gbloffs : gbloffs.c unzip.h unzpriv.h globals.h amiga/amiga.h crypt.h
|
||||||
|
$(CC) -o t:gbloffs.o $(CFLAGS) gbloffs.c
|
||||||
|
$(LD) $(LDFLAGS) -o amiga/gbloffs t:gbloffs.o $(LDLIBS)
|
||||||
|
-@delete t:gbloffs.o
|
||||||
|
|
||||||
|
amiga/Fgbloffs : gbloffs.c unzip.h unzpriv.h globals.h amiga/amiga.h crypt.h
|
||||||
|
$(CC) -o t:gbloffs.o $(CFLAGS) -d FUNZIP gbloffs.c
|
||||||
|
$(LD) $(LDFLAGS) -o amiga/Fgbloffs t:gbloffs.o $(LDLIBS)
|
||||||
|
-@delete t:gbloffs.o
|
||||||
|
|
||||||
|
amiga/Xgbloffs : gbloffs.c unzip.h unzpriv.h globals.h amiga/amiga.h crypt.h
|
||||||
|
$(CC) -o t:gbloffs.o $(CFLAGS) -d SFX gbloffs.c
|
||||||
|
$(LD) $(LDFLAGS) -o amiga/Xgbloffs t:gbloffs.o $(LDLIBS)
|
||||||
|
-@delete t:gbloffs.o
|
184
unzip/unzip-5.52/amiga/makesfx.c
Normal file
184
unzip/unzip-5.52/amiga/makesfx.c
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/* MakeSFX: join UnZipSFX and a .zip archive into a single self-extracting */
|
||||||
|
/* Amiga program. On most systems simple concatenation does the job but for */
|
||||||
|
/* the Amiga a special tool is needed. By Paul Kienitz, no rights reserved. */
|
||||||
|
/* This program is written portably, so if anyone really wants to they can */
|
||||||
|
/* produce Amiga self-extracting programs on a non-Amiga. We are careful */
|
||||||
|
/* not to mix Motorola-format longwords read from files with native long */
|
||||||
|
/* integers. Not necessarily limited to use with only the Zip format -- */
|
||||||
|
/* just combine any archive with any self-extractor program that is capable */
|
||||||
|
/* of reading a HUNK_DEBUG section at the end as an archive. */
|
||||||
|
|
||||||
|
#include <stat.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifdef __SASC
|
||||||
|
# include <proto/dos.h>
|
||||||
|
# ifdef DEBUG
|
||||||
|
# include <sprof.h>
|
||||||
|
# endif
|
||||||
|
#endif /* __SASC */
|
||||||
|
#ifdef AZTEC_C
|
||||||
|
# include <dos/dos.h>
|
||||||
|
# include <clib/dos_protos.h>
|
||||||
|
#endif /* AZTEC_C */
|
||||||
|
|
||||||
|
typedef unsigned long ulg;
|
||||||
|
typedef unsigned char uch;
|
||||||
|
typedef unsigned short bool;
|
||||||
|
#define false 0
|
||||||
|
#define true 1
|
||||||
|
|
||||||
|
/* the following are extracted from Commodore include file dos/doshunks.h: */
|
||||||
|
#define HUNK_NAME 1000L
|
||||||
|
#define HUNK_CODE 1001L
|
||||||
|
#define HUNK_DATA 1002L
|
||||||
|
#define HUNK_BSS 1003L
|
||||||
|
#define HUNK_RELOC32 1004L
|
||||||
|
#define HUNK_SYMBOL 1008L
|
||||||
|
#define HUNK_DEBUG 1009L
|
||||||
|
#define HUNK_END 1010L
|
||||||
|
#define HUNK_HEADER 1011L
|
||||||
|
#define HUNK_OVERLAY 1013L
|
||||||
|
#define HUNK_BREAK 1014L
|
||||||
|
|
||||||
|
/* Convert a big-endian (Motorola) sequence of four bytes to a longword: */
|
||||||
|
#define CHARS2LONG(b) (((ulg)(b)[0] << 24) | ((ulg)(b)[1] << 16) | \
|
||||||
|
((ulg)(b)[2] << 8) | ((ulg)(b)[3]))
|
||||||
|
/* b must be (uch *) in each of these. Now the reverse: */
|
||||||
|
#define LONG2CHARS(b,l) ((b)[0] = (uch)((l) >> 24), (b)[1] = (uch)((l) >> 16),\
|
||||||
|
(b)[2] = (uch)((l) >> 8), (b)[3] = (uch)(l))
|
||||||
|
|
||||||
|
#define COPYBUFFER 16384
|
||||||
|
|
||||||
|
ulg totalwritten = 0;
|
||||||
|
|
||||||
|
|
||||||
|
bool CopyData(FILE *out, FILE *inn, ulg archivesize,
|
||||||
|
char *outname, char *inname)
|
||||||
|
{
|
||||||
|
static uch buf[COPYBUFFER];
|
||||||
|
ulg written;
|
||||||
|
size_t chunk;
|
||||||
|
|
||||||
|
if (archivesize) {
|
||||||
|
LONG2CHARS(buf, HUNK_DEBUG);
|
||||||
|
written = (archivesize + 3) / 4;
|
||||||
|
LONG2CHARS(buf + 4, written);
|
||||||
|
if (fwrite(buf, 1, 8, out) < 8) {
|
||||||
|
printf("Error writing in-between data to %s\n", outname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
totalwritten += 8;
|
||||||
|
}
|
||||||
|
written = 0;
|
||||||
|
do {
|
||||||
|
chunk = fread(buf, 1, COPYBUFFER, inn);
|
||||||
|
if (ferror(inn)) {
|
||||||
|
printf("Error reading data from %s\n", inname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!archivesize && !written) { /* true only for first block read */
|
||||||
|
if (CHARS2LONG(buf) != HUNK_HEADER) {
|
||||||
|
printf("%s is not an Amiga executable.\n", inname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fwrite(buf, 1, chunk, out) < chunk) {
|
||||||
|
printf("Error writing %s to %s\n", archivesize ? "archive data" :
|
||||||
|
"self-extractor code", outname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
written += chunk;
|
||||||
|
totalwritten += chunk;
|
||||||
|
} while (!feof(inn));
|
||||||
|
if (archivesize) {
|
||||||
|
if (written != archivesize) {
|
||||||
|
printf("Wrong number of bytes copied from archive %s\n", outname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
LONG2CHARS(buf, 0);
|
||||||
|
chunk = 3 - (written + 3) % 4;
|
||||||
|
LONG2CHARS(buf + chunk, HUNK_END);
|
||||||
|
chunk += 4;
|
||||||
|
if (fwrite(buf, 1, chunk, out) < chunk) {
|
||||||
|
printf("Error writing end-marker data to %s\n", outname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
totalwritten += chunk;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *out, *arch, *tool;
|
||||||
|
char *toolname = argv[3];
|
||||||
|
struct stat ss;
|
||||||
|
int ret;
|
||||||
|
ulg archivesize;
|
||||||
|
|
||||||
|
if (argc < 3 || argc > 4) {
|
||||||
|
printf("Usage: %s <result-file> <zip-archive> [<self-extractor-"
|
||||||
|
"program>]\nThe third arg defaults to \"UnZipSFX\" in the"
|
||||||
|
" current dir or C:.\n", argv[0]);
|
||||||
|
exit(20);
|
||||||
|
}
|
||||||
|
if (!(arch = fopen(argv[2], "rb"))) {
|
||||||
|
printf("Could not find archive file %s\n", argv[2]);
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
if (stat(argv[2], &ss) || !(archivesize = ss.st_size)) {
|
||||||
|
fclose(arch);
|
||||||
|
printf("Could not check size of archive %s, or file is empty.\n",
|
||||||
|
argv[2]);
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
if (argc < 4)
|
||||||
|
toolname = "UnZipSFX";
|
||||||
|
if (!(tool = fopen(toolname, "rb"))) {
|
||||||
|
BPTR lk = Lock("C:", ACCESS_READ);
|
||||||
|
BPTR ocd = lk ? CurrentDir(lk) : 0;
|
||||||
|
if (!(tool = fopen(toolname, "rb"))) {
|
||||||
|
fclose(arch);
|
||||||
|
printf("Could not find self-extractor program %s\n", toolname);
|
||||||
|
if (lk)
|
||||||
|
UnLock(CurrentDir(ocd));
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
if (lk)
|
||||||
|
UnLock(CurrentDir(ocd));
|
||||||
|
}
|
||||||
|
if (!(out = fopen(argv[1], "wb"))) {
|
||||||
|
fclose(arch);
|
||||||
|
fclose(tool);
|
||||||
|
printf("Could not create output file %s\n", argv[1]);
|
||||||
|
exit(10);
|
||||||
|
}
|
||||||
|
ret = CopyData(out, tool, 0, argv[1], toolname)
|
||||||
|
&& CopyData(out, arch, archivesize, argv[1], argv[2]) ? 0 : 10;
|
||||||
|
fclose(out);
|
||||||
|
fclose(arch);
|
||||||
|
fclose(tool);
|
||||||
|
if (ret) {
|
||||||
|
printf("Deleting %s\n", argv[1]);
|
||||||
|
remove(argv[1]);
|
||||||
|
} else
|
||||||
|
printf("%s successfully written, size %lu bytes.\n",
|
||||||
|
argv[1], totalwritten);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if (defined(AZTEC_C) && defined(MCH_AMIGA))
|
||||||
|
void _wb_parse(void) { } /* avoid unneeded infrastructure */
|
||||||
|
#endif
|
628
unzip/unzip-5.52/amiga/smakefile
Normal file
628
unzip/unzip-5.52/amiga/smakefile
Normal file
@ -0,0 +1,628 @@
|
|||||||
|
#===========================================================================
|
||||||
|
# Makefile for UnZip, ZipInfo, fUnZip, MakeSFX AMIGA SAS/C Version 6.58
|
||||||
|
# Version: 5.5 last revised: 13 Feb 01
|
||||||
|
#===========================================================================
|
||||||
|
# from John Bush <john.bush@east.sun.com>
|
||||||
|
# or: <JBush@bix.com>
|
||||||
|
|
||||||
|
# updated for SAS/C Version 6.56+ and AmigaDOS 3.1 (V40)
|
||||||
|
# by Haidinger Walter <walthaid@unix.ict.tuwien.ac.at>
|
||||||
|
|
||||||
|
# additional supplements and maintenance by Paul Kienitz
|
||||||
|
|
||||||
|
# This makefile should work with at least AmigaDOS 2.04 (V37) (not tested)
|
||||||
|
# and will probably not work with AmigaDOS 1.3 (V34)
|
||||||
|
|
||||||
|
# If you have any improvements, critics or else please feel free to mail.
|
||||||
|
# Any response is appreciated. Haidinger Walter <walthaid@unix.ict.tuwien.ac.at>
|
||||||
|
|
||||||
|
# Available targets:
|
||||||
|
# all builds all executables below
|
||||||
|
# unzip builds unzip executable
|
||||||
|
# unzipsfx builds unzipsfx executable
|
||||||
|
# funzip builds funzip executable
|
||||||
|
# makesfx builds makesfx executable
|
||||||
|
# clean remove all files created by the compilation
|
||||||
|
# spotless like clean target but removes binaries too
|
||||||
|
|
||||||
|
|
||||||
|
##########################
|
||||||
|
# USER MACRO DEFINITIONS #
|
||||||
|
##########################
|
||||||
|
|
||||||
|
# Set the processor to generate code for UnZip and fUnZip. Specify one of:
|
||||||
|
# ANY 68000 68010 68020 68030 68040 68060 (Default: ANY or 68000)
|
||||||
|
|
||||||
|
# Use of the assembly versions is not supported yet since some of the asm
|
||||||
|
# source file do not assemble with 68000 instructions.
|
||||||
|
# Any help is appreciated of course.
|
||||||
|
|
||||||
|
CUSECPU = ANY
|
||||||
|
|
||||||
|
# Uncomment both CUTIL and LUTIL to make use of utility.library of OS 2.04+
|
||||||
|
# The utility.library is *not* used for UnZipSFX to ensure maximum portability
|
||||||
|
# between the different Amiga systems (minimal config: 68000 and OS 1.2).
|
||||||
|
# You can change this by adding the $(LUTIL) macro in the UnZipSFX linking
|
||||||
|
# rules (See below: Final output targets, UnZipSFX:).
|
||||||
|
# WARNINGS when using the utility library:
|
||||||
|
# 1. All Executables will *only* work with AmigaDOS 2.04 (v37) or higher.
|
||||||
|
# 2. You *need not* compile/link with short-integers using the
|
||||||
|
# utility.library. It will crash your machine. See Libraries below.
|
||||||
|
#
|
||||||
|
# Default: commented (not used)
|
||||||
|
#
|
||||||
|
#CUTIL = UTILLIB DEFINE=_UTILLIB
|
||||||
|
#LUTIL = WITH SC:LIB/utillib.with # include necessary linker defines
|
||||||
|
|
||||||
|
|
||||||
|
# Choose one stack-handling method (default=faster)
|
||||||
|
# StackExtend: Dynamic runtime stack extension. You won't notice stack overflows.
|
||||||
|
# StackCheck: On a stack overflow a requester appears which allows you to exit.
|
||||||
|
# Note that either stack watching will slow down your executable because of the
|
||||||
|
# extra code run on each function entry. On the other hand, you won't crash
|
||||||
|
# anymore due to stack overflows. However, you should not have *any* stack
|
||||||
|
# problems with info-zip if you raise your stack to 20000 (which I'd
|
||||||
|
# recommend as a minimum default stack for all applications) or more using the
|
||||||
|
# shell stack command. Type 'Stack 20000' or add it to your S:Shell-Startup.
|
||||||
|
# BTW: Typing 'Stack' prints your current stack size.
|
||||||
|
#
|
||||||
|
CSTACK = NOSTACKCHECK STACKEXTEND # slow, but always works
|
||||||
|
#CSTACK = STACKCHECK NOSTACKEXTEND # slow, requester & graceful exit
|
||||||
|
#CSTACK = NOSTACKCHECK NOSTACKEXTEND # faster but relies on larger stack (>=10K)
|
||||||
|
|
||||||
|
#
|
||||||
|
# LIBRARIES
|
||||||
|
# ---------
|
||||||
|
|
||||||
|
# Choose one DATAOPTS , SASLIB and LSTARTUP
|
||||||
|
# Always comment/uncomment all macros of a set.
|
||||||
|
|
||||||
|
# Library to use with near data and 2-byte integers
|
||||||
|
# Notes: o slower than 4-byte integers with 68000 cpu
|
||||||
|
# o *not* recommended due to poor overall performance
|
||||||
|
# o see comment in amiga/osdep.h
|
||||||
|
#DATAOPTS = DATA=NEAR SHORTINTEGERS DEF=_NEAR_DATA
|
||||||
|
#SASLIB = scs
|
||||||
|
#LSTARTUP = cres.o
|
||||||
|
|
||||||
|
# Library to use with near data and 4-byte integers (DEFAULT)
|
||||||
|
# *** use this with the utility.library ***
|
||||||
|
DATAOPTS = DATA=NEAR DEF=_NEAR_DATA
|
||||||
|
SASLIB = sc
|
||||||
|
LSTARTUP = cres.o
|
||||||
|
|
||||||
|
# Library to use with far data and 2-byte integers
|
||||||
|
# use if DYN_ALLOC is not defined
|
||||||
|
# old default - far data always works but is slower
|
||||||
|
#DATAOPTS = DATA=FAR SHORTINTEGERS DEF=_FAR_DATA
|
||||||
|
#SASLIB = scsnb
|
||||||
|
#LSTARTUP = c.o
|
||||||
|
|
||||||
|
# Library to use with far data and 4-byte integers
|
||||||
|
# if everything else fails: try this
|
||||||
|
#DATAOPTS = DATA=FAR DEF=_FAR_DATA
|
||||||
|
#SASLIB = scnb
|
||||||
|
#LSTARTUP = c.o
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# DEBUGGING
|
||||||
|
# ---------
|
||||||
|
|
||||||
|
# Default: No debugging information added.
|
||||||
|
# The two macros below will be overwritten if you choose to add
|
||||||
|
# debug info, therefore need to comment.
|
||||||
|
CDBG = NODEBUG NOPROFILE NOCOVERAGE # default: no debug info
|
||||||
|
LDBG = STRIPDEBUG # default: no debug info
|
||||||
|
|
||||||
|
# Compiler and loader debug flags. Uncomment as needed. Recomment when done.
|
||||||
|
# Optimization disabled for faster compilation (by using NOOPT)
|
||||||
|
#CDBG1 = DEF=DEBUG DEF=DEBUG_TIME # enables Info-ZIP's debug output
|
||||||
|
|
||||||
|
# Enable profiling and coverage when desired. Option COVERAGE commented
|
||||||
|
# seperately because running coverage may corrupt your drive in case of a
|
||||||
|
# system crash since a file 'cover.dat' is created in your working directory.
|
||||||
|
# Note that the use of COVERAGE forces the use of the c.o startup module.
|
||||||
|
#CDBG2 = PROFILE
|
||||||
|
#CDBG3 = COVERAGE # must use c.o startup code:
|
||||||
|
#LSTARTUP = c.o # Uncomment *only* when you use COVERAGE
|
||||||
|
|
||||||
|
# *Uncomment* _HERE_ macros CDBG and LDBG to include debugging information
|
||||||
|
#CDBG = $(CDBG1) $(CDBG2) $(CDBG3) ADDSYM DEBUG=FULLFLUSH STACKCHECK NOOPT
|
||||||
|
#LDBG = ADDSYM
|
||||||
|
# Optional use of memwatch.library which can be found in your
|
||||||
|
# sc:extras/memlib directory. Please read the short docs (memlib.doc).
|
||||||
|
# Note that memlib has a small bug: MWTerm() displays always the first entry.
|
||||||
|
# Get the latest version from aminet (dev/debug/memlib.lha) or
|
||||||
|
# contact me to get the patch. Uncomment all macros to use.
|
||||||
|
#CMEMLIB = DEFINE=MWDEBUG=1 # define to enable library
|
||||||
|
#LMEMLIB = SC:LIB/memwatch.lib # path to library
|
||||||
|
#LSTARTUP = c.o # must use c.o with memlib!
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# MAPPING
|
||||||
|
# -------
|
||||||
|
|
||||||
|
# Map filenames used when mapping (no need to comment)
|
||||||
|
#
|
||||||
|
MAPFS = unzip.map # UnZip map filename
|
||||||
|
MAPFX = unzipsfx.map # UnZipSFX map filename
|
||||||
|
MAPFF = funzip.map # fUnZip map filename
|
||||||
|
MAPFM = makesfx.map # MakeSFX map filename
|
||||||
|
|
||||||
|
# Map file output: Uncomment to highlight and bold headings.
|
||||||
|
#
|
||||||
|
#MAPFSTYLE = FANCY
|
||||||
|
|
||||||
|
# Map flags for each EXECUTABLE. Uncomment to enable mapping.
|
||||||
|
# For map options please refer to:
|
||||||
|
# SAS/C v6 manual, volume 1: user's guide, chapter 8, page 136: map
|
||||||
|
# Default: all options enabled: f,h,l,o,s,x
|
||||||
|
# |-> options start here
|
||||||
|
#LMAPS = $(MAPFSTYLE) MAP $(MAPFS) f,h,l,o,s,x # UnZip maps
|
||||||
|
#LMAPX = $(MAPFSTYLE) MAP $(MAPFX) f,h,l,o,s,x # UnZipSFX maps
|
||||||
|
#LMAPF = $(MAPFSTYLE) MAP $(MAPFF) f,h,l,o,s,x # fUnZip maps
|
||||||
|
#LMAPM = $(MAPFSTYLE) MAP $(MAPFM) f,h,l,o,s,x # MakeSFX maps
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LISTINGS
|
||||||
|
# --------
|
||||||
|
|
||||||
|
# Listfile-extensions for each executable (enter *with* dot)
|
||||||
|
#
|
||||||
|
LISTEXTS = .lst # extension for UnZip and MakeSFX listfiles
|
||||||
|
LISTEXTX = .xlst # extension for UnZipSFX listfiles
|
||||||
|
LISTEXTF = .flst # extension for fUnZip listfiles
|
||||||
|
|
||||||
|
|
||||||
|
# List files and cross references for each OBJECT.
|
||||||
|
# Add/remove flags as needed. All listed by default.
|
||||||
|
# Use LISTINCLUDES only to determine the dependencies for smake
|
||||||
|
#
|
||||||
|
CLISTOPT = LISTHEADERS LISTMACROS # LISTSYSTEM LISTINCLUDES
|
||||||
|
CXREFOPT = XHEAD XSYS
|
||||||
|
#
|
||||||
|
# Uncomment to enable listing (default: commented)
|
||||||
|
# *** WARNING: List files require *lots* of disk space!
|
||||||
|
#
|
||||||
|
#CLIST = LIST $(CLISTOPT)
|
||||||
|
#CXREF = XREF $(CXREFOPT)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# SUPPRESSED COMPILER WARNINGS
|
||||||
|
# ----------------------------
|
||||||
|
|
||||||
|
# Compiler warnings to ignore
|
||||||
|
#
|
||||||
|
# Warning 105 : module does not define any externally-known symbols
|
||||||
|
# Warning 304 : Dead assignment eliminated...
|
||||||
|
# Note 306 : ...function inlined...
|
||||||
|
# Warning 317 : possibly uninitialized variable...
|
||||||
|
# Comment to enable.
|
||||||
|
#
|
||||||
|
CIGNORE = IGNORE=105,304,306,317
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# OBJECT EXTENSIONS
|
||||||
|
#
|
||||||
|
|
||||||
|
# Extensions used for objects of each executeable.
|
||||||
|
# Transformation rules require unique extensions.
|
||||||
|
# Enter *with* dot.
|
||||||
|
#
|
||||||
|
O = .o # general extension for objects
|
||||||
|
OX = .xo # extension for special UnZipSFX objects
|
||||||
|
OF = .fo # extension for special fUnZip objects
|
||||||
|
|
||||||
|
|
||||||
|
# Filename used to store converted options from environment variable
|
||||||
|
# LOCAL_UNZIP. Default: scoptions_local_unzip
|
||||||
|
#
|
||||||
|
CWITHOPT = scoptions_local_unzip
|
||||||
|
|
||||||
|
|
||||||
|
# Filenames to store compiler options to prevent command line overflow
|
||||||
|
#
|
||||||
|
# Options file for UnZip and fUnZip
|
||||||
|
CFILEC = scoptions-unzip
|
||||||
|
# Options file for UnZipSFX
|
||||||
|
CFILEX = scoptions-unzipsfx
|
||||||
|
# Special options for MakeSFX
|
||||||
|
CFILEM = scoptions-makesfx
|
||||||
|
|
||||||
|
|
||||||
|
# Temp filenames for object lists to load using linker "WITH" command.
|
||||||
|
#
|
||||||
|
OBJLISTS = unzip_objlist.with # UnZip object list
|
||||||
|
OBJLISTX = unzipsfx_objlist.with # UnZipSFX object list
|
||||||
|
OBJLISTF = funzip_objlist.with # fUnZip object list
|
||||||
|
OBJLISTM = makesfx_objlist.with # MakeSFX object list
|
||||||
|
|
||||||
|
|
||||||
|
# Filenames to store linker options
|
||||||
|
#
|
||||||
|
LWITHS = unzip.lnk # UnZip linker options
|
||||||
|
LWITHX = unzipsfx.lnk # UnZipSFX linker options
|
||||||
|
LWITHF = funzip.lnk # fUnZip linker options
|
||||||
|
LWITHM = makesfx.lnk # MakeSFX linker options
|
||||||
|
|
||||||
|
|
||||||
|
######################################
|
||||||
|
# NOTHING TO CHANGE BEYOND HERE ... #
|
||||||
|
######################################
|
||||||
|
|
||||||
|
|
||||||
|
# Compiler definitions
|
||||||
|
#
|
||||||
|
CC = sc
|
||||||
|
#
|
||||||
|
# Optimizer flags
|
||||||
|
#
|
||||||
|
OPTPASSES = 6 # set number of global optimizer passes
|
||||||
|
#
|
||||||
|
OPT1 = OPT OPTINL OPTINLOCAL OPTTIME OPTLOOP OPTSCHED
|
||||||
|
OPT2 = OPTCOMP=$(OPTPASSES) OPTDEP=$(OPTPASSES) OPTRDEP=$(OPTPASSES)
|
||||||
|
OPT = $(OPT1) $(OPT2)
|
||||||
|
|
||||||
|
# Compiler flags
|
||||||
|
#
|
||||||
|
# cpu flags for UnZip and fUnZip
|
||||||
|
CCPUOPTSF = CPU=$(CUSECPU) $(CUTIL)
|
||||||
|
# cpu flags for UnzipSFX and MakeSFX (ensures portability to all Amigas)
|
||||||
|
CCPUOPTXM = CPU=ANY
|
||||||
|
|
||||||
|
CDEFINES = $(CMEMLIB) $(CDEFINES) DEF=AMIGA DEF=PROTO
|
||||||
|
COPTIONS = CODE=NEAR NMINC VERBOSE STRINGMERGE PARAMETERS=BOTH
|
||||||
|
COPTIONS = $(COPTIONS) ERRORREXX NOERRORCONSOLE MEMSIZE=HUGE $(CLIST) $(CXREF)
|
||||||
|
COPTIONS = $(COPTIONS) $(CSTACK) STRICT UNSCHAR NOICONS
|
||||||
|
COPTIONS = $(COPTIONS) $(CIGNORE) $(OPT) $(CDBG)
|
||||||
|
# common compiler flags
|
||||||
|
CFLAGSC = $(CDEFINES) $(DATAOPTS) $(COPTIONS)
|
||||||
|
# special compiler flags with $(DATAOPTS) excluded
|
||||||
|
CFLAGSS = $(CDEFINES) $(COPTIONS)
|
||||||
|
|
||||||
|
# Linker definitions
|
||||||
|
# See SASLIB definition above
|
||||||
|
#
|
||||||
|
LD = slink
|
||||||
|
# special linker flags for UnZip to create pure (i.e. resident) binary.
|
||||||
|
LDFLAGSS = FROM SC:LIB/$(LSTARTUP)
|
||||||
|
# common linker flags for all other executeables
|
||||||
|
LDFLAGSC = FROM SC:LIB/c.o
|
||||||
|
|
||||||
|
LDFLAGS2 = NOICONS $(LDBG)
|
||||||
|
# special linker flags to select library set above
|
||||||
|
LIBFLAGSS = LIB $(LMEMLIB) SC:LIB/$(SASLIB).lib SC:LIB/amiga.lib
|
||||||
|
# common linker flags
|
||||||
|
LIBFLAGSC = LIB $(LMEMLIB) SC:LIB/sc.lib SC:LIB/amiga.lib
|
||||||
|
|
||||||
|
|
||||||
|
##################
|
||||||
|
# TARGET OBJECTS #
|
||||||
|
##################
|
||||||
|
|
||||||
|
|
||||||
|
# UnZip Objects
|
||||||
|
OBJS1 = unzip$(O) crc32$(O) crctab$(O) crypt$(O) envargs$(O) explode$(O)
|
||||||
|
OBJS2 = extract$(O) fileio$(O) globals$(O) list$(O) inflate$(O) match$(O)
|
||||||
|
OBJS3 = process$(O) ttyio$(O) unreduce$(O) unshrink$(O) zipinfo$(O)
|
||||||
|
OBJSA = amiga$(O) timezone$(O)
|
||||||
|
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJSA)
|
||||||
|
|
||||||
|
# UnZipSFX Objects
|
||||||
|
OBJX1 = unzip$(OX) extract$(OX) inflate$(OX) match$(OX) process$(OX)
|
||||||
|
OBJXI = crypt$(OX) crc32$(O) crctab$(OX) fileio$(OX) globals$(OX) ttyio$(OX)
|
||||||
|
OBJXA = amiga$(OX) timezone$(OX)
|
||||||
|
OBJX = $(OBJX1) $(OBJXI) $(OBJXA)
|
||||||
|
|
||||||
|
# fUnZip Objects
|
||||||
|
OBJF1 = funzip$(O)
|
||||||
|
OBJF2 = crc32$(OF) crypt$(OF) globals$(OF) inflate$(OF) ttyio$(OF)
|
||||||
|
OBJFA = filedate$(OF) stat$(O)
|
||||||
|
OBJF = $(OBJF1) $(OBJF2) $(OBJFA)
|
||||||
|
|
||||||
|
# MakeSFX Objects
|
||||||
|
OBJM = makesfx$(O)
|
||||||
|
|
||||||
|
# Common header files
|
||||||
|
UNZIP_H1 = unzip.h unzpriv.h globals.h
|
||||||
|
UNZIP_HA = amiga/amiga.h amiga/z-stat.h
|
||||||
|
UNZIP_H = $(UNZIP_H1) $(UNZIP_HA)
|
||||||
|
|
||||||
|
# Output targets
|
||||||
|
UNZIPS = UnZip UnZipSFX fUnZip MakeSFX
|
||||||
|
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# DEFAULT TARGET AND PROCESSING RULES #
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
all: request flush $(UNZIPS)
|
||||||
|
|
||||||
|
# UnZip transformation rules
|
||||||
|
#
|
||||||
|
.c$(O) :
|
||||||
|
$(CC) WITH=$(CFILEC) LISTFILE=$>$(LISTEXTS) OBJNAME=$@ $*.c
|
||||||
|
|
||||||
|
# UnZipSFX transformation rules
|
||||||
|
#
|
||||||
|
.c$(OX):
|
||||||
|
$(CC) DEF=SFX WITH=$(CFILEC) LISTFILE=$>$(LISTEXTX) OBJNAME=$@ $*.c
|
||||||
|
|
||||||
|
# fUnZip transformation rules
|
||||||
|
#
|
||||||
|
.c$(OF):
|
||||||
|
$(CC) DEF=FUNZIP WITH=$(CFILEC) LISTFILE=$>$(LISTEXTF) OBJNAME=$@ $*.c
|
||||||
|
|
||||||
|
|
||||||
|
#########################
|
||||||
|
# Final output targets. #
|
||||||
|
#########################
|
||||||
|
|
||||||
|
unzip: local_unzip CommonFlags $(OBJS)
|
||||||
|
@Echo "$(OBJS)" >$(OBJLISTS)
|
||||||
|
Type $(OBJLISTS)
|
||||||
|
# -----
|
||||||
|
# Note: Change $(LDFLAGSS) to $(LDFLAGSC) if DYN_ALLOC is *not* defined.
|
||||||
|
# -----
|
||||||
|
@Echo "$(LDFLAGSS) $(LUTIL) WITH $(OBJLISTS) $(LIBFLAGSS) " \
|
||||||
|
"$(LDFLAGS2) $(LMAPS)" >$(LWITHS)
|
||||||
|
Type $(LWITHS)
|
||||||
|
$(LD) TO UnZip WITH $(LWITHS)
|
||||||
|
|
||||||
|
funzip: local_unzip CommonFlags $(OBJF)
|
||||||
|
@Echo "$(OBJF)" >$(OBJLISTF)
|
||||||
|
Type $(OBJLISTF)
|
||||||
|
@Echo "$(LDFLAGSC) $(LUTIL) WITH $(OBJLISTF) $(LIBFLAGSS) " \
|
||||||
|
"$(LDFLAGS2) $(LMAPF)" >$(LWITHF)
|
||||||
|
Type $(LWITHF)
|
||||||
|
$(LD) TO fUnZip WITH $(LWITHF)
|
||||||
|
|
||||||
|
unzipsfx: local_unzip SFXFlags $(OBJX)
|
||||||
|
@Echo "$(OBJX)" >$(OBJLISTX)
|
||||||
|
Type $(OBJLISTX)
|
||||||
|
# ----
|
||||||
|
# Note: Insert $(LUTIL) here, to use utility library with UnZipSFX.
|
||||||
|
# ----- vvvvvvv
|
||||||
|
@Echo "$(LDFLAGSC) WITH $(OBJLISTX) $(LIBFLAGSS) " \
|
||||||
|
"$(LDFLAGS2) $(LMAPX)" >$(LWITHX)
|
||||||
|
Type $(LWITHX)
|
||||||
|
$(LD) TO UnZipSFX WITH $(LWITHX)
|
||||||
|
|
||||||
|
|
||||||
|
makesfx: MakeSFXFlags $(OBJM)
|
||||||
|
@Echo "$(OBJM)" >$(OBJLISTM)
|
||||||
|
Type $(OBJLISTM)
|
||||||
|
@Echo "$(LDFLAGSC) $(LUTIL) WITH $(OBJLISTM) $(LIBFLAGSC) " \
|
||||||
|
"$(LDFLAGS2) $(LMAPM)" >$(LWITHM)
|
||||||
|
Type $(LWITHM)
|
||||||
|
# never use short-integers with MakeSFX !
|
||||||
|
$(LD) TO MakeSFX WITH $(LWITHM)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-Delete >nil: $(OBJS) quiet
|
||||||
|
-Delete >nil: $(OBJX) quiet
|
||||||
|
-Delete >nil: $(OBJF) quiet
|
||||||
|
-Delete >nil: $(OBJM) quiet
|
||||||
|
-Delete >nil: $(OBJLISTS) $(OBJLISTX) $(OBJLISTF) $(OBJLISTM) quiet
|
||||||
|
-Delete >nil: $(MAPFS) $(MAPFX) $(MAPFF) $(MAPFM) quiet
|
||||||
|
-Delete >nil: \#?$(LISTEXTS) \#?$(LISTEXTX) \#?$(LISTEXTF) quiet
|
||||||
|
-Delete >nil: $(CWITHOPT) $(CFILEC) $(CFILEX) $(CFILEM) quiet
|
||||||
|
-Delete >nil: SCOPTIONS SASCOPTS quiet
|
||||||
|
-Delete >nil: $(LWITHS) $(LWITHX) $(LWITHF) $(LWITHM) quiet
|
||||||
|
-Delete >nil: \#?.q.?? \#?.tmp \#?.cov quiet
|
||||||
|
|
||||||
|
spotless: clean
|
||||||
|
-Delete >nil: $(UNZIPS) quiet
|
||||||
|
|
||||||
|
|
||||||
|
# UnZip dependencies:
|
||||||
|
# (objects not needed by Amiga port are commented)
|
||||||
|
|
||||||
|
# special rule for adding Amiga internal version number to UnZip
|
||||||
|
amiga$(O): amiga/amiga.c amiga/filedate.c amiga/stat.c $(UNZIP_H) crypt.h timezone.h env:Workbench
|
||||||
|
stat$(O): amiga/stat.c amiga/z-stat.h
|
||||||
|
filedate$(O): amiga/filedate.c crypt.h timezone.h
|
||||||
|
api$(O): api.c $(UNZIP_H) unzvers.h #zlib.h
|
||||||
|
apihelp$(O): apihelp.c $(UNZIP_H) unzvers.h
|
||||||
|
crc32$(O): crc32.c $(UNZIP_H) zip.h
|
||||||
|
crctab$(O): crctab.c $(UNZIP_H) zip.h
|
||||||
|
crypt$(O): crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
envargs$(O): envargs.c $(UNZIP_H)
|
||||||
|
explode$(O): explode.c $(UNZIP_H)
|
||||||
|
extract$(O): extract.c $(UNZIP_H) crypt.h
|
||||||
|
fileio$(O): fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
globals$(O): globals.c $(UNZIP_H)
|
||||||
|
inflate$(O): inflate.c $(UNZIP_H) inflate.h #zlib.h
|
||||||
|
list$(O): list.c $(UNZIP_H)
|
||||||
|
match$(O): match.c $(UNZIP_H)
|
||||||
|
process$(O): process.c $(UNZIP_H)
|
||||||
|
timezone$(O): timezone.c $(UNZIP_H) zip.h timezone.h
|
||||||
|
ttyio$(O): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
unreduce$(O): unreduce.c $(UNZIP_H)
|
||||||
|
unshrink$(O): unshrink.c $(UNZIP_H)
|
||||||
|
unzip$(O): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h #zlib.h
|
||||||
|
#unzipstb$(O): unzipstb.c $(UNZIP_H) unzvers.h
|
||||||
|
zipinfo$(O): zipinfo.c $(UNZIP_H)
|
||||||
|
|
||||||
|
|
||||||
|
# UnZipSFX dependencies:
|
||||||
|
#
|
||||||
|
# special rule for adding Amiga internal version number to UnZipSFX
|
||||||
|
amiga$(OX): amiga/amiga.c amiga/filedate.c amiga/stat.c $(UNZIP_H) crypt.h timezone.h
|
||||||
|
unzip$(OX): unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
||||||
|
crctab$(OX): crctab.c $(UNZIP_H) zip.h
|
||||||
|
crypt$(OX): crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
extract$(OX): extract.c $(UNZIP_H) crypt.h
|
||||||
|
fileio$(OX): fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
globals$(OX): globals.c $(UNZIP_H)
|
||||||
|
inflate$(OX): inflate.c $(UNZIP_H) inflate.h #zlib.h
|
||||||
|
match$(OX): match.c $(UNZIP_H)
|
||||||
|
process$(OX): process.c $(UNZIP_H)
|
||||||
|
timezone$(OX): timezone.c $(UNZIP_H) zip.h timezone.h
|
||||||
|
ttyio$(OX): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
|
||||||
|
|
||||||
|
# fUnZip dependencies:
|
||||||
|
#
|
||||||
|
funzip$(O): funzip.c $(UNZIP_H) crypt.h ttyio.h tables.h
|
||||||
|
crc32$(OF): crc32.c $(UNZIP_H) zip.h
|
||||||
|
crypt$(OF): crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
globals$(OF): globals.c $(UNZIP_H)
|
||||||
|
inflate$(OF): inflate.c $(UNZIP_H) inflate.h crypt.h #zlib.h
|
||||||
|
ttyio$(OF): ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
filedate$(OF): amiga/filedate.c crypt.h
|
||||||
|
|
||||||
|
|
||||||
|
# MakeSFX dependencies
|
||||||
|
#
|
||||||
|
# special transformation rules to never use shortintegers:
|
||||||
|
makesfx$(O): amiga/makesfx.c
|
||||||
|
$(CC) WITH=$(CFILEM) LISTFILE=$>$(LISTEXTS) OBJNAME=$@ $*.c
|
||||||
|
|
||||||
|
|
||||||
|
########################
|
||||||
|
# DEPENDECIES END HERE #
|
||||||
|
########################
|
||||||
|
|
||||||
|
# flush all libraries to provide more mem for compilation
|
||||||
|
flush:
|
||||||
|
@Avail flush >nil:
|
||||||
|
|
||||||
|
# write common compiler flags to file and echo to user
|
||||||
|
CommonFlags:
|
||||||
|
@Echo "$(CFLAGSC)" "$(CCPUOPTSF)" >$(CFILEC)
|
||||||
|
@Type "$(CWITHOPT)" >>$(CFILEC)
|
||||||
|
-Type $(CFILEC)
|
||||||
|
|
||||||
|
SFXFlags:
|
||||||
|
@Echo "$(CFLAGSC)" "$(CCPUOPTXM)" >$(CFILEX)
|
||||||
|
@Type "$(CWITHOPT)" >>$(CFILEX)
|
||||||
|
-Type $(CFILEX)
|
||||||
|
|
||||||
|
# write special MakeSFX flags
|
||||||
|
MakeSFXFlags:
|
||||||
|
@Echo "$(CFLAGSS) $(CCPUOPTXM) DATA=NEAR NOSHORTINTEGERS" >$(CFILEM)
|
||||||
|
# not really needed but if someday used:
|
||||||
|
@Type "$(CWITHOPT)" >>$(CFILEM)
|
||||||
|
-Type $(CFILEM)
|
||||||
|
|
||||||
|
|
||||||
|
# special rule for adding Amiga internal version number to amiga.c
|
||||||
|
amiga$(O):
|
||||||
|
rx > env:VersionDate "say '""'translate(date('E'),'.','/')'""'"
|
||||||
|
$(CC) WITH=$(CFILEC) LISTFILE=$>$(LISTEXTS) OBJNAME=$@ $*.c
|
||||||
|
-Delete env:VersionDate
|
||||||
|
|
||||||
|
|
||||||
|
# needed in amiga/amiga.c
|
||||||
|
# should be set in startup-sequence, but just in case:
|
||||||
|
# (only works with OS 2.04 and above)
|
||||||
|
|
||||||
|
env\:WorkBench:
|
||||||
|
@Execute < < (Workbench_smk.tmp)
|
||||||
|
FailAt 21
|
||||||
|
If not exists ENV:Workbench
|
||||||
|
Version >nil:
|
||||||
|
SetEnv Workbench $$Workbench
|
||||||
|
Endif
|
||||||
|
<
|
||||||
|
|
||||||
|
|
||||||
|
# #################
|
||||||
|
# ### LOCAL_UNZIP ###
|
||||||
|
# #################
|
||||||
|
#
|
||||||
|
# Read environment variable LOCAL_UNZIP and convert options from old Lattice
|
||||||
|
# v5 to new SAS/C v6 format. You may also use the new DEFINE= syntax but
|
||||||
|
# be sure not to mix v5 and v6 options, otherwise lctosc will be confused.
|
||||||
|
#
|
||||||
|
# e.g.: to define FOO_ONE and FOO_TWO enter:
|
||||||
|
#
|
||||||
|
# SetEnv LOCAL_UNZIP "-DFOO_ONE -DFOO_TWO"
|
||||||
|
#
|
||||||
|
# To make this permanent, i.e. survive an reboot, put the statement into
|
||||||
|
# your startup-sequence or (for AmigaDOS 2.0 or higher only) make sure
|
||||||
|
# LOCAL_UNZIP is stored in the ENVARC: directory too. To do this, simply
|
||||||
|
# copy the file from ENV: to ENVARC:
|
||||||
|
# Copy ENV:LOCAL_UNZIP ENVARC:
|
||||||
|
#
|
||||||
|
# For a list of all valid non-standard compilation options see the INSTALL
|
||||||
|
# file in the root zip tree. Please read the notes there before using the
|
||||||
|
# non-standard options.
|
||||||
|
#
|
||||||
|
# e.g.: To use the non-standard timezone environment variable "INFOZIP_TZ"
|
||||||
|
# (or another arbitary name) instead of "TZ", type in your shell:
|
||||||
|
#
|
||||||
|
# Setenv LOCAL_UNZIP "-DTZ_ENVVAR=*"INFOZIP_TZ*""
|
||||||
|
#
|
||||||
|
# Note that you need to escape the quotes of INFOZIP_TZ with leading stars.
|
||||||
|
# To verify that LOCAL_UNZIP has been saved correctly, use the Getenv command:
|
||||||
|
#
|
||||||
|
# Getenv LOCAL_UNZIP
|
||||||
|
#
|
||||||
|
# ...should display:
|
||||||
|
#
|
||||||
|
# -DTZ_ENVVAR="INFOZIP_TZ"
|
||||||
|
#
|
||||||
|
|
||||||
|
local_unzip:
|
||||||
|
@Execute < < (Local_UnZip_smk.tmp)
|
||||||
|
Failat 21
|
||||||
|
Echo ""
|
||||||
|
If exists ENV:LOCAL_UNZIP
|
||||||
|
Echo "Using environment variable LOCAL_UNZIP !"
|
||||||
|
Echo "LOCAL_UNZIP: " NOLINE
|
||||||
|
GetEnv LOCAL_UNZIP
|
||||||
|
Copy >NIL: ENV:LOCAL_UNZIP SASCOPTS
|
||||||
|
Else
|
||||||
|
Echo "You could use envvar LOCAL_UNZIP to set your special compilation options."
|
||||||
|
Echo "See the makefile for more information (LOCAL_UNZIP section)."
|
||||||
|
Delete >nil: SASCOPTS quiet
|
||||||
|
Endif
|
||||||
|
Echo ""
|
||||||
|
; Do not remove the lctosc command! If LOCAL_UNZIP is unset, an
|
||||||
|
; empty file is created which needed by CommonFlags !
|
||||||
|
; Moreover, lctosc also accepts new v6 options, i.e. only changes
|
||||||
|
; known v5 options. Try `lctosc -Dfoo' and `lctosc DEFINE=foo'.
|
||||||
|
; However, you *must not* mix v5 and v6 options!
|
||||||
|
lctosc > $(CWITHOPT)
|
||||||
|
; Now make sure that env:sc/scoptions are NOT used
|
||||||
|
; we just create an empty file. The options are stored elsewhere.
|
||||||
|
Echo > SCOPTIONS "" NOLINE
|
||||||
|
<
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Echo request to the user
|
||||||
|
#
|
||||||
|
request:
|
||||||
|
@Echo ""
|
||||||
|
@Echo " This makefile is for use with SAS/C version 6.58."
|
||||||
|
@Echo " If you still have an older version, please upgrade!"
|
||||||
|
@Echo " Patches are available on the Aminet under biz/patch/sc\#?."
|
||||||
|
@Echo ""
|
||||||
|
@Echo " Just a simple request..."
|
||||||
|
@Echo " Please give me a mail that you compiled whether you encounter any errors"
|
||||||
|
@Echo " or not. I'd just like to know how many Amiga users actually make use of"
|
||||||
|
@Echo " this makefile."
|
||||||
|
@Echo " If you mail me, I'll put you on my mailing-list and notify you whenever"
|
||||||
|
@Echo " new versions of Info-Zip are released."
|
||||||
|
@Echo " Have a look at the makefile for changes like CPU type, UtilLib, Stack, etc."
|
||||||
|
@Echo " Feel free to mail comments, suggestions, critics..."
|
||||||
|
@Echo " Enjoy Info-Zip !"
|
||||||
|
@Echo " Haidinger Walter, <walthaid@unix.ict.tuwien.ac.at>"
|
||||||
|
@Echo ""
|
||||||
|
|
||||||
|
# Echo help in case of an error
|
||||||
|
#
|
||||||
|
.ONERROR:
|
||||||
|
@Echo ""
|
||||||
|
@Echo "[sigh] An error running this makefile was detected."
|
||||||
|
@Echo "This message may also appear if you interrupted smake by pressing CTRL-C."
|
||||||
|
@Echo "Contact Info-ZIP authors at Zip-Bugs@lists.wku.edu or me for help."
|
||||||
|
@Echo "Haidinger Walter, <walthaid@unix.ict.tuwien.ac.at>"
|
293
unzip/unzip-5.52/amiga/stat.c
Normal file
293
unzip/unzip-5.52/amiga/stat.c
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/* Here we have a handmade stat() function because Aztec's c.lib stat() */
|
||||||
|
/* does not support an st_mode field, which we need... also a chmod(). */
|
||||||
|
|
||||||
|
/* This stat() is by Paul Wells, modified by Paul Kienitz. */
|
||||||
|
/* Originally for use with Aztec C >= 5.0 and Lattice C <= 4.01 */
|
||||||
|
/* Adapted for SAS/C 6.5x by Haidinger Walter */
|
||||||
|
|
||||||
|
/* POLICY DECISION: We will not attempt to remove global variables from */
|
||||||
|
/* this source file for Aztec C. These routines are essentially just */
|
||||||
|
/* augmentations of Aztec's c.lib, which is itself not reentrant. If */
|
||||||
|
/* we want to produce a fully reentrant UnZip, we will have to use a */
|
||||||
|
/* suitable startup module, such as purify.a for Aztec by Paul Kienitz. */
|
||||||
|
|
||||||
|
#ifndef __amiga_stat_c
|
||||||
|
#define __amiga_stat_c
|
||||||
|
|
||||||
|
#include <exec/types.h>
|
||||||
|
#include <exec/memory.h>
|
||||||
|
#include "amiga/z-stat.h" /* fake version of stat.h */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef AZTEC_C
|
||||||
|
# include <libraries/dos.h>
|
||||||
|
# include <libraries/dosextens.h>
|
||||||
|
# include <clib/exec_protos.h>
|
||||||
|
# include <clib/dos_protos.h>
|
||||||
|
# include <pragmas/exec_lib.h>
|
||||||
|
# include <pragmas/dos_lib.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __SASC
|
||||||
|
# include <sys/dir.h> /* SAS/C dir function prototypes */
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <proto/exec.h>
|
||||||
|
# include <proto/dos.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SUCCESS
|
||||||
|
# define SUCCESS (-1)
|
||||||
|
# define FAILURE (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void close_leftover_open_dirs(void); /* prototype */
|
||||||
|
|
||||||
|
static DIR *dir_cleanup_list = NULL; /* for resource tracking */
|
||||||
|
|
||||||
|
/* CALL THIS WHEN HANDLING CTRL-C OR OTHER UNEXPECTED EXIT! */
|
||||||
|
void close_leftover_open_dirs(void)
|
||||||
|
{
|
||||||
|
while (dir_cleanup_list)
|
||||||
|
closedir(dir_cleanup_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned short disk_not_mounted;
|
||||||
|
|
||||||
|
extern int stat(const char *file, struct stat *buf);
|
||||||
|
|
||||||
|
stat(file,buf)
|
||||||
|
const char *file;
|
||||||
|
struct stat *buf;
|
||||||
|
{
|
||||||
|
|
||||||
|
struct FileInfoBlock *inf;
|
||||||
|
BPTR lock;
|
||||||
|
time_t ftime;
|
||||||
|
struct tm local_tm;
|
||||||
|
|
||||||
|
if( (lock = Lock((char *)file,SHARED_LOCK))==0 )
|
||||||
|
/* file not found */
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
if( !(inf = (struct FileInfoBlock *)AllocMem(
|
||||||
|
(long)sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR)) )
|
||||||
|
{
|
||||||
|
UnLock(lock);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Examine(lock,inf)==FAILURE )
|
||||||
|
{
|
||||||
|
FreeMem((char *)inf,(long)sizeof(*inf));
|
||||||
|
UnLock(lock);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill in buf */
|
||||||
|
buf->st_dev =
|
||||||
|
buf->st_nlink =
|
||||||
|
buf->st_uid =
|
||||||
|
buf->st_gid =
|
||||||
|
buf->st_rdev = 0;
|
||||||
|
buf->st_ino = inf->fib_DiskKey;
|
||||||
|
buf->st_blocks = inf->fib_NumBlocks;
|
||||||
|
buf->st_size = inf->fib_Size;
|
||||||
|
|
||||||
|
/* now the date. AmigaDOS has weird datestamps---
|
||||||
|
* ds_Days is the number of days since 1-1-1978;
|
||||||
|
* however, as Unix wants date since 1-1-1970...
|
||||||
|
*/
|
||||||
|
|
||||||
|
ftime =
|
||||||
|
(inf->fib_Date.ds_Days * 86400 ) +
|
||||||
|
(inf->fib_Date.ds_Minute * 60 ) +
|
||||||
|
(inf->fib_Date.ds_Tick / TICKS_PER_SECOND ) +
|
||||||
|
(86400 * 8 * 365 ) +
|
||||||
|
(86400 * 2 ); /* two leap years */
|
||||||
|
|
||||||
|
/* tzset(); */ /* this should be handled by mktime(), instead */
|
||||||
|
/* ftime += timezone; */
|
||||||
|
local_tm = *gmtime(&ftime);
|
||||||
|
local_tm.tm_isdst = -1;
|
||||||
|
ftime = mktime(&local_tm);
|
||||||
|
|
||||||
|
buf->st_ctime =
|
||||||
|
buf->st_atime =
|
||||||
|
buf->st_mtime = ftime;
|
||||||
|
|
||||||
|
buf->st_mode = (inf->fib_DirEntryType < 0 ? S_IFREG : S_IFDIR);
|
||||||
|
|
||||||
|
/* lastly, throw in the protection bits */
|
||||||
|
buf->st_mode |= ((inf->fib_Protection ^ 0xF) & 0xFF);
|
||||||
|
|
||||||
|
FreeMem((char *)inf, (long)sizeof(*inf));
|
||||||
|
UnLock((BPTR)lock);
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int fstat(int handle, struct stat *buf)
|
||||||
|
{
|
||||||
|
/* fake some reasonable values for stdin */
|
||||||
|
buf->st_mode = (S_IREAD|S_IWRITE|S_IFREG);
|
||||||
|
buf->st_size = -1;
|
||||||
|
buf->st_mtime = time(&buf->st_mtime);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* opendir(), readdir(), closedir(), rmdir(), and chmod() by Paul Kienitz. */
|
||||||
|
|
||||||
|
DIR *opendir(const char *path)
|
||||||
|
{
|
||||||
|
DIR *dd = AllocMem(sizeof(DIR), MEMF_PUBLIC);
|
||||||
|
if (!dd) return NULL;
|
||||||
|
if (!(dd->d_parentlock = Lock((char *)path, MODE_OLDFILE))) {
|
||||||
|
disk_not_mounted = IoErr() == ERROR_DEVICE_NOT_MOUNTED;
|
||||||
|
FreeMem(dd, sizeof(DIR));
|
||||||
|
return NULL;
|
||||||
|
} else
|
||||||
|
disk_not_mounted = 0;
|
||||||
|
if (!Examine(dd->d_parentlock, &dd->d_fib) || dd->d_fib.fib_EntryType < 0) {
|
||||||
|
UnLock(dd->d_parentlock);
|
||||||
|
FreeMem(dd, sizeof(DIR));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
dd->d_cleanuplink = dir_cleanup_list; /* track them resources */
|
||||||
|
if (dir_cleanup_list)
|
||||||
|
dir_cleanup_list->d_cleanupparent = &dd->d_cleanuplink;
|
||||||
|
dd->d_cleanupparent = &dir_cleanup_list;
|
||||||
|
dir_cleanup_list = dd;
|
||||||
|
return dd;
|
||||||
|
}
|
||||||
|
|
||||||
|
void closedir(DIR *dd)
|
||||||
|
{
|
||||||
|
if (dd) {
|
||||||
|
if (dd->d_cleanuplink)
|
||||||
|
dd->d_cleanuplink->d_cleanupparent = dd->d_cleanupparent;
|
||||||
|
*(dd->d_cleanupparent) = dd->d_cleanuplink;
|
||||||
|
if (dd->d_parentlock)
|
||||||
|
UnLock(dd->d_parentlock);
|
||||||
|
FreeMem(dd, sizeof(DIR));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dirent *readdir(DIR *dd)
|
||||||
|
{
|
||||||
|
return (ExNext(dd->d_parentlock, &dd->d_fib) ? (struct dirent *)dd : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef AZTEC_C
|
||||||
|
|
||||||
|
int rmdir(const char *path)
|
||||||
|
{
|
||||||
|
return (DeleteFile((char *)path) ? 0 : IoErr());
|
||||||
|
}
|
||||||
|
|
||||||
|
int chmod(const char *filename, int bits) /* bits are as for st_mode */
|
||||||
|
{
|
||||||
|
long protmask = (bits & 0xFF) ^ 0xF;
|
||||||
|
return !SetProtection((char *)filename, protmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This here removes unnecessary bulk from the executable with Aztec: */
|
||||||
|
void _wb_parse(void) { }
|
||||||
|
|
||||||
|
/* fake a unix function that does not apply to amigados: */
|
||||||
|
int umask(void) { return 0; }
|
||||||
|
|
||||||
|
|
||||||
|
# include <signal.h>
|
||||||
|
|
||||||
|
/* C library signal() messes up debugging yet adds no actual usefulness */
|
||||||
|
typedef void (*__signal_return_type)(int);
|
||||||
|
__signal_return_type signal() { return SIG_ERR; }
|
||||||
|
|
||||||
|
|
||||||
|
/* The following replaces Aztec's argv-parsing function for compatibility with
|
||||||
|
Unix-like syntax used on other platforms. It also fixes the problem the
|
||||||
|
standard _cli_parse() has of accepting only lower-ascii characters. */
|
||||||
|
|
||||||
|
int _argc, _arg_len;
|
||||||
|
char **_argv, *_arg_lin;
|
||||||
|
|
||||||
|
void _cli_parse(struct Process *pp, long alen, register UBYTE *aptr)
|
||||||
|
{
|
||||||
|
register UBYTE *cp;
|
||||||
|
register struct CommandLineInterface *cli;
|
||||||
|
register short c;
|
||||||
|
register short starred = 0;
|
||||||
|
# ifdef PRESTART_HOOK
|
||||||
|
void Prestart_Hook(void);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
cli = (struct CommandLineInterface *) (pp->pr_CLI << 2);
|
||||||
|
cp = (UBYTE *) (cli->cli_CommandName << 2);
|
||||||
|
_arg_len = cp[0] + alen + 2;
|
||||||
|
if (!(_arg_lin = AllocMem((long) _arg_len, 0L)))
|
||||||
|
return;
|
||||||
|
c = cp[0];
|
||||||
|
strncpy(_arg_lin, cp + 1, c);
|
||||||
|
_arg_lin[c] = 0;
|
||||||
|
for (cp = _arg_lin + c + 1; alen && (*aptr < '\n' || *aptr > '\r'); alen--)
|
||||||
|
*cp++ = *aptr++;
|
||||||
|
*cp = 0;
|
||||||
|
aptr = cp = _arg_lin + c + 1;
|
||||||
|
for (_argc = 1; ; _argc++) {
|
||||||
|
while (*cp == ' ' || *cp == '\t')
|
||||||
|
cp++;
|
||||||
|
if (!*cp)
|
||||||
|
break;
|
||||||
|
if (*cp == '"') {
|
||||||
|
cp++;
|
||||||
|
while (c = *cp++) {
|
||||||
|
if (c == '"' && !starred) {
|
||||||
|
*aptr++ = 0;
|
||||||
|
starred = 0;
|
||||||
|
break;
|
||||||
|
} else if (c == '\\' && !starred)
|
||||||
|
starred = 1;
|
||||||
|
else {
|
||||||
|
*aptr++ = c;
|
||||||
|
starred = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while ((c = *cp++) && c != ' ' && c != '\t')
|
||||||
|
*aptr++ = c;
|
||||||
|
*aptr++ = 0;
|
||||||
|
}
|
||||||
|
if (c == 0)
|
||||||
|
--cp;
|
||||||
|
}
|
||||||
|
*aptr = 0;
|
||||||
|
if (!(_argv = AllocMem((_argc + 1) * sizeof(*_argv), 0L))) {
|
||||||
|
_argc = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (c = 0, cp = _arg_lin; c < _argc; c++) {
|
||||||
|
_argv[c] = cp;
|
||||||
|
cp += strlen(cp) + 1;
|
||||||
|
}
|
||||||
|
_argv[c] = NULL;
|
||||||
|
# ifdef PRESTART_HOOK
|
||||||
|
Prestart_Hook();
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* AZTEC_C */
|
||||||
|
|
||||||
|
#endif /* __amiga_stat_c */
|
95
unzip/unzip-5.52/amiga/z-stat.h
Normal file
95
unzip/unzip-5.52/amiga/z-stat.h
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
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 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 __amiga_z_stat_h
|
||||||
|
#define __amiga_z_stat_h
|
||||||
|
|
||||||
|
/* Since older versions of the Lattice C compiler for Amiga, and all current */
|
||||||
|
/* versions of the Manx Aztec C compiler for Amiga, either provide no stat() */
|
||||||
|
/* function or provide one inadequate for unzip (Aztec's has no st_mode */
|
||||||
|
/* field), we provide our own stat() function in stat.c by Paul Wells, and */
|
||||||
|
/* this fake stat.h file by Paul Kienitz. Paul Wells originally used the */
|
||||||
|
/* Lattice stat.h but that does not work for Aztec and is not distributable */
|
||||||
|
/* with this package, so I made a separate one. This has to be pulled into */
|
||||||
|
/* unzip.h when compiling an Amiga version, as "amiga/z-stat.h". */
|
||||||
|
|
||||||
|
/* We also provide here a "struct dirent" for use with opendir() & readdir() */
|
||||||
|
/* functions included in amiga/stat.c. If you use amiga/stat.c, this must */
|
||||||
|
/* be included wherever you use either readdir() or stat(). */
|
||||||
|
|
||||||
|
#ifdef AZTEC_C
|
||||||
|
# define __STAT_H
|
||||||
|
#else /* __SASC */
|
||||||
|
/* do not include the following header, replacement definitions are here */
|
||||||
|
# define _STAT_H /* do not include SAS/C <stat.h> */
|
||||||
|
# define _DIRENT_H /* do not include SAS/C <dirent.h> */
|
||||||
|
# define _SYS_DIR_H /* do not include SAS/C <sys/dir.h> */
|
||||||
|
# define _COMMIFMT_H /* do not include SAS/C <sys/commifmt.h> */
|
||||||
|
# include <dos.h>
|
||||||
|
#endif
|
||||||
|
#include <libraries/dos.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
|
struct stat {
|
||||||
|
unsigned short st_mode;
|
||||||
|
time_t st_ctime, st_atime, st_mtime;
|
||||||
|
long st_size;
|
||||||
|
long st_ino;
|
||||||
|
long st_blocks;
|
||||||
|
short st_attr, st_dev, st_nlink, st_uid, st_gid, st_rdev;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define S_IFDIR (1<<11)
|
||||||
|
#define S_IFREG (1<<10)
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* these values here are totally random: */
|
||||||
|
# define S_IFLNK (1<<14)
|
||||||
|
# define S_IFSOCK (1<<13)
|
||||||
|
# define S_IFCHR (1<<8)
|
||||||
|
# define S_IFIFO (1<<7)
|
||||||
|
# define S_IFMT (S_IFDIR|S_IFREG|S_IFCHR|S_IFLNK)
|
||||||
|
#else
|
||||||
|
# define S_IFMT (S_IFDIR|S_IFREG)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define S_IHIDDEN (1<<7)
|
||||||
|
#define S_ISCRIPT (1<<6)
|
||||||
|
#define S_IPURE (1<<5)
|
||||||
|
#define S_IARCHIVE (1<<4)
|
||||||
|
#define S_IREAD (1<<3)
|
||||||
|
#define S_IWRITE (1<<2)
|
||||||
|
#define S_IEXECUTE (1<<1)
|
||||||
|
#define S_IDELETE (1<<0)
|
||||||
|
|
||||||
|
int stat(const char *name, struct stat *buf);
|
||||||
|
int fstat(int handle, struct stat *buf); /* returns dummy values */
|
||||||
|
|
||||||
|
typedef struct dirent {
|
||||||
|
struct dirent *d_cleanuplink,
|
||||||
|
**d_cleanupparent;
|
||||||
|
BPTR d_parentlock;
|
||||||
|
struct FileInfoBlock d_fib;
|
||||||
|
} DIR;
|
||||||
|
#define d_name d_fib.fib_FileName
|
||||||
|
|
||||||
|
extern unsigned short disk_not_mounted; /* flag set by opendir() */
|
||||||
|
|
||||||
|
DIR *opendir(const char *);
|
||||||
|
void closedir(DIR *);
|
||||||
|
void close_leftover_open_dirs(void); /* call this if aborted in mid-run */
|
||||||
|
struct dirent *readdir(DIR *);
|
||||||
|
int umask(void);
|
||||||
|
|
||||||
|
#ifdef AZTEC_C
|
||||||
|
int rmdir(const char *);
|
||||||
|
int chmod(const char *filename, int bits);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __amiga_z_stat_h */
|
7
unzip/unzip-5.52/aosvs/Contents
Normal file
7
unzip/unzip-5.52/aosvs/Contents
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Contents of the "aosvs" subdirectory for UnZip 5.3 and later:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
README compilation notes, history, etc.
|
||||||
|
make_unz.cli command script to make UnZip only (not UnZipSFX or fUnZip)
|
||||||
|
aosvs.c AOS/VS-specific support routines
|
||||||
|
aosvs.h AOS/VS-specific typedefs and header stuff
|
145
unzip/unzip-5.52/aosvs/README
Normal file
145
unzip/unzip-5.52/aosvs/README
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
[e-mail excerpt from Dave Lovelace explaining AOS/VS port, compiler, etc.]
|
||||||
|
|
||||||
|
> From: Dave Lovelace <davel@cyberspace.org>
|
||||||
|
> Subject: Re: zip on Data General AOS/VS
|
||||||
|
> Date: Wed, 17 May 1995 11:02:03 -0400 (EDT)
|
||||||
|
>
|
||||||
|
> The diffs for zip & unzip are both in the same file. I've also included the
|
||||||
|
> extra source files which I wrote, the CLI macros which I used to compile
|
||||||
|
> & link the things, & my own history of what I did. Note that some of the
|
||||||
|
> changes I made reversed earlier changes, & this was written for my own
|
||||||
|
> use (or for others here if I leave or die or something). I hope it will help.
|
||||||
|
>
|
||||||
|
> This was compiled using DG's C compiler for AOS/VS, rev 4.10. It has been
|
||||||
|
> compiled only on an MV-5500 running AOS/VS rev 7.70, but the resulting
|
||||||
|
> programs have been distributed & run on several different MVs running various
|
||||||
|
> versions of AOS/VS, so it should be fairly independent of at least minor rev
|
||||||
|
> variations. To the best of my knowledge it has *not* been tested under
|
||||||
|
> AOS/VS II, & I really don't know anything about that environment; possibly
|
||||||
|
> the special AOS/VS file info I'm storing in the extra field will have some
|
||||||
|
> different format there.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[README/history info from Dave Lovelace]
|
||||||
|
|
||||||
|
In modifying this for use on AOS/VS, I found only a few changes
|
||||||
|
were needed for DG C 4.10:
|
||||||
|
|
||||||
|
2. There was a bug in the inflate() code, because memset()
|
||||||
|
was being called with a non-char pointer. Pretty obviously
|
||||||
|
the other systems where this was used do not have char pointers
|
||||||
|
different from other pointers. IT IS QUITE POSSIBLE THAT OTHER
|
||||||
|
BUGS OF THIS SORT EXIST. Testing did not uncover any.
|
||||||
|
3. In fileio.c, it appears that utime() is being called correctly,
|
||||||
|
but it does not set the file's time and always returns failure.
|
||||||
|
Since the AOS/VS tar and cpio programs provided by DG also suffer
|
||||||
|
from the fault of not setting file times, I must conclude that
|
||||||
|
this is by design. At any rate, I modified the code (with
|
||||||
|
compilation conditional on a macro AOS_VS) to not say "error"
|
||||||
|
when this occurs.
|
||||||
|
|
||||||
|
One change which I think would be desirable: if the filename isn't
|
||||||
|
already a relative or absolute pathname (specifying a unique location),
|
||||||
|
the program follows the searchlist under AOS/VS. It will unexpectedly
|
||||||
|
replace files anywhere in your searchlist. (If you don't use the
|
||||||
|
-o option, it will ask you first, but not tell you where the file
|
||||||
|
to be replaced resides.) I suspect this could be handled by prepending
|
||||||
|
./ to any filenames which don't already begin with /. (I haven't
|
||||||
|
checked how this would work inside the program. Possibly this
|
||||||
|
could be done in every case - I don't think PKZIP ever stores an
|
||||||
|
absolute pathname.)
|
||||||
|
|
||||||
|
To see the compile options I used, look at the file MAKE.AOS_VS.CLI
|
||||||
|
You may of course need to change the searchlist to use that macro.
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
15-dec-93
|
||||||
|
I fixed some of the above things, introducing new problems. It now
|
||||||
|
won't follow the searchlist - but the logic prevents it from creating
|
||||||
|
directories (if they aren't explicitly in the ZIP, anyway). But
|
||||||
|
UNZIP now sets the creation time to the time stored in the ZIP, and
|
||||||
|
ZIP now stores that instead of the TLM. I had to introduce an
|
||||||
|
extra module, with some code of my own and some other public domain
|
||||||
|
code, to accomplish this.
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
1-jun-94
|
||||||
|
I found an additional bug: the header was causing void to be #define'd
|
||||||
|
as int, and prototypes weren't being used. I changed UNZIP.H and
|
||||||
|
added a define of PROTO to the MAKE.AOS_VS.CLI and REMAKE.CLI macros.
|
||||||
|
|
||||||
|
I found and fixed the bug that prevented the (creation) times from
|
||||||
|
being set on files with explicit paths. (The Unix-style paths didn't
|
||||||
|
work as inputs to the AOS/VS ?CREATE system call.)
|
||||||
|
|
||||||
|
Additional known bugs:
|
||||||
|
|
||||||
|
1. I have not yet located the source of the bug that prevents the
|
||||||
|
date/time from being set (also ACLs etc.) when an existing file
|
||||||
|
is overwritten. For some reason the call to delete & recreate
|
||||||
|
the file is not being reached.
|
||||||
|
|
||||||
|
2. We need to do something in ZIP to store (as comments?) the file's
|
||||||
|
type and ACL, and then here in UNZIP extract these and apply
|
||||||
|
them. This is not going to be trivial to make foolproof, but
|
||||||
|
it's badly needed.
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
2-jun-94
|
||||||
|
I fixed #1 above. The compiler was checking whether UNIX was defined,
|
||||||
|
and it wasn't. It appears that *some* of the places UNIX is used are
|
||||||
|
things we can't get along with, so I changed the code to check for
|
||||||
|
AOS_VS as well. It seems to work just fine.
|
||||||
|
|
||||||
|
I also introduced a function zvs_credir() to create a directory
|
||||||
|
(as opposed to a CPD, though it can create CPDs to with the proper
|
||||||
|
file-type parameter). Directories in a path which are being created
|
||||||
|
will now be directories instead of CPDs.
|
||||||
|
|
||||||
|
The big change that's needed now is to have ZIP store (somehow)
|
||||||
|
the file's ACL and file type, and then to have UNZIP use this
|
||||||
|
information to recreate the file as it was before ZIPping. Ideally,
|
||||||
|
ZIP should also store links and CPD max-block info as well. Planned
|
||||||
|
strategy: either in the name field but after the name, or in a comment,
|
||||||
|
store the packet returned by ?FSTAT (using sys_fstat()), and then
|
||||||
|
use this packet for the ?CREATE call in zvs_create().
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
22-Jul-94
|
||||||
|
The changes to use the extra-field field for AOS/VS file info are in
|
||||||
|
place. In general, if a ZIPfile was created with the current rev of
|
||||||
|
ZIP.PR, the files should be restored with file type, ACL, etc. OK.
|
||||||
|
I didn't test to make sure element size & max index levels come
|
||||||
|
through OK, but I think they should.
|
||||||
|
|
||||||
|
Unix symbolic links are now UNZIPped OK, but ZIP.PR isn't yet able
|
||||||
|
to ZIP links. When it is, UNZIP should be ready.
|
||||||
|
|
||||||
|
In general UNZIP now ignores the searchlist fairly well, but not
|
||||||
|
perfectly. If the directory of a file you're UNZIPping can be
|
||||||
|
referenced elsewhere in the searchlist, UNZIP will find the file
|
||||||
|
there. (For example, if the file UDD/BBASIC/ZZPGSUBSET.SR is in
|
||||||
|
the ZIPfile, and : is in your searchlist, then UDD and UDD:BBASIC
|
||||||
|
will be created under your current directory, but UNZIP will still
|
||||||
|
find :UDD:BBASIC:ZZPGSUBSET.SR instead of =UDD:BBASIC:ZZPGSUBSET.SR.
|
||||||
|
|
||||||
|
Filenames (which are now stored in uppercase by ZIP.PR) must be
|
||||||
|
matched exactly if specified. This applies to Unix path structure
|
||||||
|
as well as case.
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
||||||
|
4-Aug-94
|
||||||
|
I fixed a bug which caused (for links only) the Unix pathname to
|
||||||
|
be put through ux_to_vs_name twice. The result was that a path
|
||||||
|
such as dir1/dir2/fname went first to :dir1:dir2:fname and
|
||||||
|
then to dir1?dir2?fname.
|
||||||
|
|
||||||
|
I also added the /NOSEA switch to the cc/link lines in the macros
|
||||||
|
MAKE.AOS_VS.CLI and REMAKE.CLI. This should prevent any confusion
|
||||||
|
over whether a file exists somewhere other than relative to the current
|
||||||
|
dir. This would disable calls to system() from using the searchlist,
|
||||||
|
but in this program I think they're all useless & hopefully inactive
|
||||||
|
anyway.
|
||||||
|
|
||||||
|
------------------------------------------------------------------
|
1557
unzip/unzip-5.52/aosvs/aosvs.c
Normal file
1557
unzip/unzip-5.52/aosvs/aosvs.c
Normal file
File diff suppressed because it is too large
Load Diff
66
unzip/unzip-5.52/aosvs/aosvs.h
Normal file
66
unzip/unzip-5.52/aosvs/aosvs.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
aosvs.h
|
||||||
|
|
||||||
|
AOS/VS-specific header file for use with Info-ZIP's UnZip 5.2 and later.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
/* stuff to set up for system calls (?FSTAT & ?SACL) and the extra field */
|
||||||
|
|
||||||
|
#include <paru.h> /* parameter definitions */
|
||||||
|
#include <packets/filestatus.h> /* AOS/VS ?FSTAT packet defs */
|
||||||
|
#include <packets/create.h> /* AOS/VS ?CREATE packet defs */
|
||||||
|
#include <sys_calls.h> /* AOS/VS system call interface */
|
||||||
|
|
||||||
|
#define ZEXTRA_HEADID "VS"
|
||||||
|
#define ZEXTRA_SENTINEL "FCI"
|
||||||
|
#define ZEXTRA_REV ((uch)10) /* change/use this in later revs */
|
||||||
|
|
||||||
|
|
||||||
|
/* functions defined in zvs_create.c */
|
||||||
|
|
||||||
|
extern int zvs_create(ZCONST char *fname, long cretim, long modtim,
|
||||||
|
long acctim, char *pacl, int ftyp, int eltsize,
|
||||||
|
int maxindlev);
|
||||||
|
extern int zvs_credir(ZCONST char *dname, long cretim, long modtim,
|
||||||
|
long acctim, char *pacl, int ftyp, long maxblocks,
|
||||||
|
int hashfsize, int maxindlev);
|
||||||
|
extern long dgdate(short mm, short dd, short yy);
|
||||||
|
extern char *ux_to_vs_name(char *outname, ZCONST char *inname);
|
||||||
|
|
||||||
|
|
||||||
|
/* could probably avoid the unions - all elements in each one are the same
|
||||||
|
* size, and we're going to assume this */
|
||||||
|
|
||||||
|
typedef union zvsfstat_stru {
|
||||||
|
P_FSTAT norm_fstat_packet; /* normal fstat packet */
|
||||||
|
P_FSTAT_DIR dir_fstat_packet; /* DIR/CPD fstat packet */
|
||||||
|
P_FSTAT_UNIT unit_fstat_packet; /* unit (device) fstat packet */
|
||||||
|
P_FSTAT_IPC ipc_fstat_packet; /* IPC file fstat packet */
|
||||||
|
} ZVSFSTAT_STRU;
|
||||||
|
|
||||||
|
typedef union zvscreate_stru {
|
||||||
|
P_CREATE norm_create_packet; /* normal create packet */
|
||||||
|
P_CREATE_DIR dir_create_packet; /* DIR/CPD create packet */
|
||||||
|
P_CREATE_IPC ipc_create_packet; /* IPC file create packet */
|
||||||
|
} ZVSCREATE_STRU;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct zextrafld {
|
||||||
|
char extra_header_id[2]; /* set to VS - in theory, an int */
|
||||||
|
char extra_data_size[2]; /* size of rest (little-endian) */
|
||||||
|
char extra_sentinel[4]; /* set to FCI w/ trailing null */
|
||||||
|
uch extra_rev; /* set to 10 for rev 1.0 */
|
||||||
|
ZVSFSTAT_STRU fstat_packet; /* the fstat packet */
|
||||||
|
char aclbuf[$MXACL]; /* the raw ACL */
|
||||||
|
} ZEXTRAFLD;
|
5
unzip/unzip-5.52/aosvs/make_unz.cli
Normal file
5
unzip/unzip-5.52/aosvs/make_unz.cli
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
push
|
||||||
|
prompt pop
|
||||||
|
searchlist :c_4.10 :c_4.10:lang_rt [!searchlist]
|
||||||
|
cc/link/NOUNX/NOSEA SYSV/DEFINE TERMIO/DEFINE AOS_VS/DEFINE=1 PROTO/DEFINE S_IFLNK/DEFINE=0120000 TIME.H/INCLUDE <unzip crc32 crctab crypt envargs explode extract fileio globals inflate list match process ttyio unreduce unshrink zipinfo aosvs>.c
|
||||||
|
pop
|
648
unzip/unzip-5.52/api.c
Normal file
648
unzip/unzip-5.52/api.c
Normal file
@ -0,0 +1,648 @@
|
|||||||
|
/*
|
||||||
|
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 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:
|
||||||
|
|
||||||
|
UzpVer *UzpVersion(void);
|
||||||
|
void UzpVersion2(UzpVer2 *version)
|
||||||
|
int UzpMain(int argc, char *argv[]);
|
||||||
|
int UzpAltMain(int argc, char *argv[], UzpInit *init);
|
||||||
|
int UzpValidate(char *archive, int AllCodes);
|
||||||
|
void UzpFreeMemBuffer(UzpBuffer *retstr);
|
||||||
|
int UzpUnzipToMemory(char *zip, char *file, UzpOpts *optflgs,
|
||||||
|
UzpCB *UsrFuncts, UzpBuffer *retstr);
|
||||||
|
|
||||||
|
non-WINDLL only (a special WINDLL variant is defined in windll/windll.c):
|
||||||
|
int UzpGrep(char *archive, char *file, char *pattern, int cmd, int SkipBin,
|
||||||
|
UzpCB *UsrFuncts);
|
||||||
|
|
||||||
|
OS/2 only (for now):
|
||||||
|
int UzpFileTree(char *name, cbList(callBack), char *cpInclude[],
|
||||||
|
char *cpExclude[]);
|
||||||
|
|
||||||
|
You must define `DLL' in order to include the API extensions.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef OS2
|
||||||
|
# define INCL_DOSMEMMGR
|
||||||
|
# include <os2.h>
|
||||||
|
#endif
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "unzip.h"
|
||||||
|
#ifdef WINDLL
|
||||||
|
# ifdef POCKET_UNZIP
|
||||||
|
# include "wince/intrface.h"
|
||||||
|
# else
|
||||||
|
# include "windll/windll.h"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#include "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
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
UzpVer * UZ_EXP UzpVersion() /* should be pointer to const struct */
|
||||||
|
{
|
||||||
|
static UzpVer version; /* doesn't change between calls */
|
||||||
|
|
||||||
|
|
||||||
|
version.structlen = UZPVER_LEN;
|
||||||
|
|
||||||
|
#ifdef BETA
|
||||||
|
version.flag = 1;
|
||||||
|
#else
|
||||||
|
version.flag = 0;
|
||||||
|
#endif
|
||||||
|
version.betalevel = UZ_BETALEVEL;
|
||||||
|
version.date = UZ_VERSION_DATE;
|
||||||
|
|
||||||
|
#ifdef ZLIB_VERSION
|
||||||
|
version.zlib_version = ZLIB_VERSION;
|
||||||
|
version.flag |= 2;
|
||||||
|
#else
|
||||||
|
version.zlib_version = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* someday each of these may have a separate patchlevel: */
|
||||||
|
version.unzip.major = UZ_MAJORVER;
|
||||||
|
version.unzip.minor = UZ_MINORVER;
|
||||||
|
version.unzip.patchlevel = 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;
|
||||||
|
|
||||||
|
return &version;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UZ_EXP UzpVersion2(UzpVer2 *version)
|
||||||
|
{
|
||||||
|
|
||||||
|
version->structlen = UZPVER_LEN;
|
||||||
|
|
||||||
|
#ifdef BETA
|
||||||
|
version->flag = 1;
|
||||||
|
#else
|
||||||
|
version->flag = 0;
|
||||||
|
#endif
|
||||||
|
strcpy(version->betalevel, 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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];
|
||||||
|
|
||||||
|
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 */
|
||||||
|
|
||||||
|
|
||||||
|
int redirect_outfile(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
if (G.redirect_size != 0 || G.redirect_buffer != NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
#ifndef NO_SLIDE_REDIR
|
||||||
|
G.redirect_slide = !G.pInfo->textmode;
|
||||||
|
#endif
|
||||||
|
#if (lenEOL != 1)
|
||||||
|
if (G.pInfo->textmode) {
|
||||||
|
G.redirect_size = G.lrec.ucsize * lenEOL;
|
||||||
|
if (G.redirect_size < G.lrec.ucsize)
|
||||||
|
G.redirect_size = ((G.lrec.ucsize > (ulg)-2L) ?
|
||||||
|
G.lrec.ucsize : (ulg)-2L);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
G.redirect_size = G.lrec.ucsize;
|
||||||
|
}
|
||||||
|
#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 wild card to be meaningful
|
||||||
|
pattern = string to search for
|
||||||
|
cmd = 0 - case-insensitive search
|
||||||
|
1 - case-sensitve search
|
||||||
|
2 - case-insensitive, whole words only
|
||||||
|
3 - case-sensitive, whole words only
|
||||||
|
SkipBin = if true, skip any files that have control
|
||||||
|
characters other than CR, LF, or tab in the first
|
||||||
|
100 characters.
|
||||||
|
|
||||||
|
Returns: TRUE if a match is found
|
||||||
|
FALSE if no match is found
|
||||||
|
-1 on error
|
||||||
|
|
||||||
|
Comments: This does not pretend to be as useful as the standard
|
||||||
|
Unix grep, which returns the strings associated with a
|
||||||
|
particular pattern, nor does it search past the first
|
||||||
|
matching occurrence of the pattern.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int UZ_EXP UzpGrep(char *archive, char *file, char *pattern, int cmd,
|
||||||
|
int SkipBin, UzpCB *UsrFuncts)
|
||||||
|
{
|
||||||
|
int retcode = FALSE, compare;
|
||||||
|
ulg i, j, patternLen, buflen;
|
||||||
|
char * sz, *p;
|
||||||
|
UzpOpts flgopts;
|
||||||
|
UzpBuffer retstr;
|
||||||
|
|
||||||
|
memzero(&flgopts, sizeof(UzpOpts)); /* no special options */
|
||||||
|
|
||||||
|
if (!UzpUnzipToMemory(archive, file, &flgopts, UsrFuncts, &retstr)) {
|
||||||
|
return -1; /* not enough memory, file not found, or other error */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SkipBin) {
|
||||||
|
if (retstr.strlength < 100)
|
||||||
|
buflen = retstr.strlength;
|
||||||
|
else
|
||||||
|
buflen = 100;
|
||||||
|
for (i = 0; i < buflen; i++) {
|
||||||
|
if (iscntrl(retstr.strptr[i])) {
|
||||||
|
if ((retstr.strptr[i] != 0x0A) &&
|
||||||
|
(retstr.strptr[i] != 0x0D) &&
|
||||||
|
(retstr.strptr[i] != 0x09))
|
||||||
|
{
|
||||||
|
/* OK, we now think we have a binary file of some sort */
|
||||||
|
free(retstr.strptr);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
patternLen = strlen(pattern);
|
||||||
|
|
||||||
|
if (retstr.strlength < patternLen) {
|
||||||
|
free(retstr.strptr);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = malloc(patternLen + 3); /* add two in case doing whole words only */
|
||||||
|
if (cmd > 1) {
|
||||||
|
strcpy(sz, " ");
|
||||||
|
strcat(sz, pattern);
|
||||||
|
strcat(sz, " ");
|
||||||
|
} else
|
||||||
|
strcpy(sz, pattern);
|
||||||
|
|
||||||
|
if ((cmd == 0) || (cmd == 2)) {
|
||||||
|
for (i = 0; i < strlen(sz); i++)
|
||||||
|
sz[i] = toupper(sz[i]);
|
||||||
|
for (i = 0; i < retstr.strlength; i++)
|
||||||
|
retstr.strptr[i] = toupper(retstr.strptr[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < (retstr.strlength - patternLen); i++) {
|
||||||
|
p = &retstr.strptr[i];
|
||||||
|
compare = TRUE;
|
||||||
|
for (j = 0; j < patternLen; j++) {
|
||||||
|
/* We cannot do strncmp here, as we may be dealing with a
|
||||||
|
* "binary" file, such as a word processing file, or perhaps
|
||||||
|
* even a true executable of some sort. */
|
||||||
|
if (p[j] != sz[j]) {
|
||||||
|
compare = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (compare == TRUE) {
|
||||||
|
retcode = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(sz);
|
||||||
|
free(retstr.strptr);
|
||||||
|
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
#endif /* !WINDLL */
|
||||||
|
#endif /* !__16BIT__ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int UZ_EXP UzpValidate(char *archive, int AllCodes)
|
||||||
|
{
|
||||||
|
int retcode;
|
||||||
|
CONSTRUCTGLOBALS();
|
||||||
|
|
||||||
|
uO.jflag = 1;
|
||||||
|
uO.tflag = 1;
|
||||||
|
uO.overwrite_none = 0;
|
||||||
|
G.extract_flag = (!uO.zipinfo_mode &&
|
||||||
|
!uO.cflag && !uO.tflag && !uO.vflag && !uO.zflag
|
||||||
|
#ifdef TIMESTAMP
|
||||||
|
&& !uO.T_flag
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
uO.qflag = 2; /* turn off all messages */
|
||||||
|
G.fValidate = TRUE;
|
||||||
|
G.pfnames = (char **)&fnames[0]; /* assign default filename vector */
|
||||||
|
#ifdef WINDLL
|
||||||
|
Wiz_NoPrinting(TRUE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (archive == NULL) { /* something is screwed up: no filename */
|
||||||
|
DESTROYGLOBALS();
|
||||||
|
return PK_NOZIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
G.wildzipfn = (char *)malloc(FILNAMSIZ + 1);
|
||||||
|
strcpy(G.wildzipfn, archive);
|
||||||
|
#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO))
|
||||||
|
_ISO_INTERN(G.wildzipfn);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
G.process_all_files = TRUE; /* for speed */
|
||||||
|
|
||||||
|
retcode = setjmp(dll_error_return);
|
||||||
|
|
||||||
|
if (retcode) {
|
||||||
|
#ifdef WINDLL
|
||||||
|
Wiz_NoPrinting(FALSE);
|
||||||
|
#endif
|
||||||
|
free(G.wildzipfn);
|
||||||
|
DESTROYGLOBALS();
|
||||||
|
return PK_BADERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
retcode = process_zipfiles(__G);
|
||||||
|
|
||||||
|
free(G.wildzipfn);
|
||||||
|
#ifdef WINDLL
|
||||||
|
Wiz_NoPrinting(FALSE);
|
||||||
|
#endif
|
||||||
|
DESTROYGLOBALS();
|
||||||
|
|
||||||
|
/* PK_WARN == 1 and PK_FIND == 11. When we are just looking at an
|
||||||
|
archive, we should still be able to see the files inside it,
|
||||||
|
even if we can't decode them for some reason.
|
||||||
|
|
||||||
|
We also still want to be able to get at files even if there is
|
||||||
|
something odd about the zip archive, hence allow PK_WARN,
|
||||||
|
PK_FIND, IZ_UNSUP as well as PK_ERR
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (AllCodes)
|
||||||
|
return retcode;
|
||||||
|
|
||||||
|
if ((retcode == PK_OK) || (retcode == PK_WARN) || (retcode == PK_ERR) ||
|
||||||
|
(retcode == IZ_UNSUP) || (retcode == PK_FIND))
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
#endif /* DLL */
|
155
unzip/unzip-5.52/apihelp.c
Normal file
155
unzip/unzip-5.52/apihelp.c
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
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 "unzip.h"
|
||||||
|
#include "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 */
|
12
unzip/unzip-5.52/atari/Contents
Normal file
12
unzip/unzip-5.52/atari/Contents
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Contents of the "atari" sub-archive for UnZip 5.3 and later:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
README.old old notes on compiling UnZip, from author of Atari port
|
||||||
|
Makefile.old makefile for GNU C compiler and MiNT libraries
|
||||||
|
Makefile newer, Unix-based makefile (lots of unnecessary baggage :-( )
|
||||||
|
make_unz.mup script file for invoking makefile(s)?
|
||||||
|
atari.c Atari-specific routines
|
||||||
|
|
||||||
|
The maintainers of the Atari port have fallen behind in their duties; the
|
||||||
|
code *probably* compiles, but it has not been tested recently. Feel free
|
||||||
|
to send zip-bugs e-mail about this sorry state of affairs.
|
300
unzip/unzip-5.52/atari/Makefile
Normal file
300
unzip/unzip-5.52/atari/Makefile
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
#==============================================================================
|
||||||
|
# Makefile for UnZip, UnZipSFX and fUnZip: Atari ("real" makes only)
|
||||||
|
# Version: 5.5 13 February 2001
|
||||||
|
#==============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
# INSTRUCTIONS (such as they are):
|
||||||
|
#
|
||||||
|
# "make" -- makes UnZip on a generic Atari
|
||||||
|
#
|
||||||
|
# CF are flags for the C compiler. LF are flags for the loader. LF2 are more
|
||||||
|
# flags for the loader, if they need to be at the end of the line instead of at
|
||||||
|
# the beginning (for example, some libraries). FL and FL2 are the corre-
|
||||||
|
# sponding flags for fUnZip. LOCAL_UNZIP is an environment variable that can
|
||||||
|
# be used to add default C flags to your compile without editing the Makefile
|
||||||
|
# (e.g., -DDEBUG_STRUC, or -FPi87 on PCs using Microsoft C).
|
||||||
|
#
|
||||||
|
# Be sure to test your new UnZip (and UnZipSFX and fUnZip); successful compila-
|
||||||
|
# tion does not always imply a working program.
|
||||||
|
|
||||||
|
|
||||||
|
#####################
|
||||||
|
# MACRO DEFINITIONS #
|
||||||
|
#####################
|
||||||
|
|
||||||
|
# Defaults most systems use (use LOCAL_UNZIP in environment to add flags,
|
||||||
|
# such as -DDOSWILD).
|
||||||
|
|
||||||
|
# UnZip flags
|
||||||
|
CC = gcc# try using "gcc" target rather than changing this (if you do,
|
||||||
|
LD = $(CC)# you MUST change LD, too--else "unresolved symbol: ___main")
|
||||||
|
LOC = $(LOCAL_UNZIP)
|
||||||
|
CF = $(CFLAGS) $(LOC)
|
||||||
|
LF = -o unzip$E
|
||||||
|
LF2 = -s
|
||||||
|
|
||||||
|
# UnZipSFX flags
|
||||||
|
SL = -o unzipsfx$E
|
||||||
|
SL2 = $(LF2)
|
||||||
|
|
||||||
|
# fUnZip flags
|
||||||
|
FL = -o funzip$E
|
||||||
|
FL2 = $(LF2)
|
||||||
|
|
||||||
|
# general-purpose stuff
|
||||||
|
CP = ln -s
|
||||||
|
LN = ln
|
||||||
|
RM = rm -f
|
||||||
|
CHMOD = chmod
|
||||||
|
STRIP = strip
|
||||||
|
E = .ttp
|
||||||
|
O = .o
|
||||||
|
M = atari
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
# object files
|
||||||
|
OBJS1 = unzip$O crc32$O crctab$O crypt$O envargs$O explode$O
|
||||||
|
OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O
|
||||||
|
OBJS3 = process$O ttyio$O unreduce$O unshrink$O zipinfo$O
|
||||||
|
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O
|
||||||
|
LOBJS = $(OBJS)
|
||||||
|
OBJSDLL = $(OBJS) api$O
|
||||||
|
OBJX = unzipsfx$O crc32$O crctab_$O crypt_$O extract_$O fileio_$O \
|
||||||
|
globals_$O inflate_$O match_$O process_$O ttyio_$O $M_$O
|
||||||
|
LOBJX = $(OBJX)
|
||||||
|
OBJF = funzip$O crc32$O cryptf$O globalsf$O inflatef$O ttyiof$O
|
||||||
|
#OBJS_OS2 = $(OBJS1:.o=.obj) $(OBJS2:.o=.obj) os2.obj
|
||||||
|
#OBJF_OS2 = $(OBJF:.o=.obj)
|
||||||
|
|
||||||
|
UNZIP_H = unzip.h unzpriv.h globals.h
|
||||||
|
|
||||||
|
# installation
|
||||||
|
INSTALL = cp# probably can change this to 'install' if you have it
|
||||||
|
# on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
|
||||||
|
manext = 1
|
||||||
|
prefix = /usr/local
|
||||||
|
BINDIR = $(prefix)/bin# where to install executables
|
||||||
|
MANDIR = $(prefix)/man/man$(manext)# where to install man pages
|
||||||
|
INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/zipinfo$E $(BINDIR)/unzipsfx$E \
|
||||||
|
$(BINDIR)/unzip$E
|
||||||
|
INSTALLEDMAN = $(MANDIR)/unzip.$(manext) $(MANDIR)/funzip.$(manext) \
|
||||||
|
$(MANDIR)/unzipsfx.$(manext) $(MANDIR)/zipinfo.$(manext)
|
||||||
|
#
|
||||||
|
UNZIPS = unzip$E funzip$E unzipsfx$E
|
||||||
|
# this is a little ugly...well, no, it's a lot ugly:
|
||||||
|
MANS = man/unzip.1 man/unzipsfx.1 man/zipinfo.1 man/funzip.1
|
||||||
|
DOCS = unzip.txt unzipsfx.txt zipinfo.txt funzip.txt
|
||||||
|
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# BASIC COMPILE INSTRUCTIONS AND DEPENDENCIES #
|
||||||
|
###############################################
|
||||||
|
|
||||||
|
# this is for GNU make; comment out and notify zip-bugs if it causes errors
|
||||||
|
.SUFFIXES: .c .o .obj
|
||||||
|
|
||||||
|
# yes, we should be able to use the $O macro to combine these two, but it
|
||||||
|
# fails on some brain-damaged makes (e.g., AIX's)...no big deal
|
||||||
|
.c.o:
|
||||||
|
$(CC) -c $(CF) $*.c
|
||||||
|
|
||||||
|
.c.obj:
|
||||||
|
$(CC) -c $(CF) $*.c
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
# DEFAULT HANDLING #
|
||||||
|
####################
|
||||||
|
|
||||||
|
|
||||||
|
all: unzips
|
||||||
|
unzips: $(UNZIPS)
|
||||||
|
docs: $(DOCS)
|
||||||
|
unzipsman: unzips docs
|
||||||
|
unzipsdocs: unzips docs
|
||||||
|
|
||||||
|
|
||||||
|
unzip$E: $(OBJS)
|
||||||
|
$(LD) $(LF) $(LOBJS) $(LF2)
|
||||||
|
|
||||||
|
unzipsfx$E: $(OBJX)
|
||||||
|
$(LD) $(SL) $(LOBJX) $(SL2)
|
||||||
|
|
||||||
|
funzip$E: $(OBJF)
|
||||||
|
$(LD) $(FL) $(OBJF) $(FL2)
|
||||||
|
|
||||||
|
|
||||||
|
crc32$O: crc32.c $(UNZIP_H) zip.h
|
||||||
|
crctab$O: crctab.c $(UNZIP_H) zip.h
|
||||||
|
crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
envargs$O: envargs.c $(UNZIP_H)
|
||||||
|
explode$O: explode.c $(UNZIP_H)
|
||||||
|
extract$O: extract.c $(UNZIP_H) crypt.h
|
||||||
|
fileio$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
funzip$O: funzip.c $(UNZIP_H) crypt.h ttyio.h tables.h
|
||||||
|
globals$O: globals.c $(UNZIP_H)
|
||||||
|
inflate$O: inflate.c inflate.h $(UNZIP_H)
|
||||||
|
list$O: list.c $(UNZIP_H)
|
||||||
|
match$O: match.c $(UNZIP_H)
|
||||||
|
process$O: process.c $(UNZIP_H)
|
||||||
|
ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
unreduce$O: unreduce.c $(UNZIP_H)
|
||||||
|
unshrink$O: unshrink.c $(UNZIP_H)
|
||||||
|
unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
||||||
|
zipinfo$O: zipinfo.c $(UNZIP_H)
|
||||||
|
|
||||||
|
crctab_$O: crctab.c $(UNZIP_H) zip.h # unzipsfx only
|
||||||
|
$(CP) crctab.c crctab_.c
|
||||||
|
$(CC) -c $(CF) -DSFX crctab_.c
|
||||||
|
$(RM) crctab_.c
|
||||||
|
|
||||||
|
crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) crypt.c crypt_.c
|
||||||
|
$(CC) -c $(CF) -DSFX crypt_.c
|
||||||
|
$(RM) crypt_.c
|
||||||
|
|
||||||
|
extract_$O: extract.c $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) extract.c extract_.c
|
||||||
|
$(CC) -c $(CF) -DSFX extract_.c
|
||||||
|
$(RM) extract_.c
|
||||||
|
|
||||||
|
fileio_$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h # unzipsfx only
|
||||||
|
$(CP) fileio.c fileio_.c
|
||||||
|
$(CC) -c $(CF) -DSFX fileio_.c
|
||||||
|
$(RM) fileio_.c
|
||||||
|
|
||||||
|
globals_$O: globals.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) globals.c globals_.c
|
||||||
|
$(CC) -c $(CF) -DSFX globals_.c
|
||||||
|
$(RM) globals_.c
|
||||||
|
|
||||||
|
inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) inflate.c inflate_.c
|
||||||
|
$(CC) -c $(CF) -DSFX inflate_.c
|
||||||
|
$(RM) inflate_.c
|
||||||
|
|
||||||
|
process_$O: process.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) process.c process_.c
|
||||||
|
$(CC) -c $(CF) -DSFX process_.c
|
||||||
|
$(RM) process_.c
|
||||||
|
|
||||||
|
match_$O: match.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) match.c match_.c
|
||||||
|
$(CC) -c $(CF) -DSFX match_.c
|
||||||
|
$(RM) match_.c
|
||||||
|
|
||||||
|
ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) ttyio.c ttyio_.c
|
||||||
|
$(CC) -c $(CF) -DSFX ttyio_.c
|
||||||
|
$(RM) ttyio_.c
|
||||||
|
|
||||||
|
unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h # unzipsfx only
|
||||||
|
$(CP) unzip.c unzipsfx.c
|
||||||
|
$(CC) -c $(CF) -DSFX unzipsfx.c
|
||||||
|
$(RM) unzipsfx.c
|
||||||
|
|
||||||
|
|
||||||
|
cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) crypt.c cryptf.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP cryptf.c
|
||||||
|
$(RM) cryptf.c
|
||||||
|
|
||||||
|
globalsf$O: globals.c $(UNZIP_H) # funzip only
|
||||||
|
$(CP) globals.c globalsf.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP globalsf.c
|
||||||
|
$(RM) globalsf.c
|
||||||
|
|
||||||
|
inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h # funzip only
|
||||||
|
$(CP) inflate.c inflatef.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP inflatef.c
|
||||||
|
$(RM) inflatef.c
|
||||||
|
|
||||||
|
ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) ttyio.c ttyiof.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP ttyiof.c
|
||||||
|
$(RM) ttyiof.c
|
||||||
|
|
||||||
|
atari$O: atari/atari.c $(UNZIP_H)
|
||||||
|
$(CC) -c $(CF) -DSFX atari/atari.c
|
||||||
|
|
||||||
|
atari_$O: atari/atari.c $(UNZIP_H)
|
||||||
|
$(CP) atari/atari.c atari_.c
|
||||||
|
$(CC) -c $(CF) -DSFX atari_.c
|
||||||
|
$(RM) atari_.c
|
||||||
|
|
||||||
|
|
||||||
|
# this really only works for Unix targets, unless specify E and O on cmd line
|
||||||
|
clean:
|
||||||
|
@echo ""
|
||||||
|
@echo ' This is a Unix-specific target. (Just so you know.)'
|
||||||
|
@echo ""
|
||||||
|
rm -f $(OBJS) api$O apihelp$O unzipstb$O $(OBJF) $(OBJX) $(UNZIPS)
|
||||||
|
|
||||||
|
install: $(UNZIPS) $(MANS)
|
||||||
|
$(INSTALL) $(UNZIPS) $(BINDIR)
|
||||||
|
$(RM) $(BINDIR)/zipinfo$E
|
||||||
|
$(LN) $(BINDIR)/unzip$E $(BINDIR)/zipinfo$E
|
||||||
|
$(INSTALL) man/unzip.1 $(MANDIR)/unzip.$(manext)
|
||||||
|
$(INSTALL) man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext)
|
||||||
|
$(INSTALL) man/zipinfo.1 $(MANDIR)/zipinfo.$(manext)
|
||||||
|
$(INSTALL) man/funzip.1 $(MANDIR)/funzip.$(manext)
|
||||||
|
$(CHMOD) 755 $(INSTALLEDBIN)
|
||||||
|
$(CHMOD) 644 $(INSTALLEDMAN)
|
||||||
|
|
||||||
|
# alternatively, could use zip method: -cd $(BINDIR); rm -f $(UNZIPS) [etc.]
|
||||||
|
uninstall:
|
||||||
|
rm -f $(INSTALLEDBIN) $(INSTALLEDMAN)
|
||||||
|
|
||||||
|
|
||||||
|
TESTZIP = testmake.zip # the test zipfile
|
||||||
|
|
||||||
|
# test some basic features of the build
|
||||||
|
test: check
|
||||||
|
|
||||||
|
check: unzips
|
||||||
|
@echo ' This is a Unix-specific target. (Just so you know.)'
|
||||||
|
if test ! -f $(TESTZIP); then \
|
||||||
|
echo " error: can't find test file $(TESTZIP)"; exit 1; fi
|
||||||
|
#
|
||||||
|
echo " testing extraction"
|
||||||
|
./unzip -b $(TESTZIP) testmake.zipinfo
|
||||||
|
if test $? ; then \
|
||||||
|
echo " error: file extraction from $(TESTZIP) failed"; exit 1; fi
|
||||||
|
#
|
||||||
|
echo ' testing zipinfo (unzip -Z)'
|
||||||
|
./unzip -Z $(TESTZIP) > testmake.unzip-Z
|
||||||
|
if diff testmake.unzip-Z testmake.zipinfo; then ;; else \
|
||||||
|
echo ' error: zipinfo output doesn't match stored version'; fi
|
||||||
|
$(RM) testmake.unzip-Z testmake.zipinfo
|
||||||
|
#
|
||||||
|
echo ' testing unzip -d exdir option'
|
||||||
|
./unzip -b $(TESTZIP) -d testun
|
||||||
|
cat testun/notes
|
||||||
|
#
|
||||||
|
echo ' testing unzip -o and funzip (ignore funzip warning)'
|
||||||
|
./unzip -boq $(TESTZIP) notes -d testun
|
||||||
|
./funzip < $(TESTZIP) > testun/notes2
|
||||||
|
if diff testun/notes testun/notes2; then ;; else \
|
||||||
|
echo 'error: funzip output disagrees with unzip'; fi
|
||||||
|
#
|
||||||
|
echo ' testing unzipsfx (self-extractor)'
|
||||||
|
cat unzipsfx $(TESTZIP) > testsfx
|
||||||
|
$(CHMOD) 0700 testsfx
|
||||||
|
./testsfx -b notes
|
||||||
|
if diff notes testun/notes; then ;; else \
|
||||||
|
echo ' error: unzipsfx file disagrees with unzip'; fi
|
||||||
|
$(RM) testsfx notes testun/notes testun/notes2
|
||||||
|
rmdir testun
|
||||||
|
#
|
||||||
|
echo ' testing complete.'
|
||||||
|
|
||||||
|
|
||||||
|
################################
|
||||||
|
# INDIVIDUAL MACHINE MAKERULES #
|
||||||
|
################################
|
||||||
|
|
||||||
|
# these are left over for backward compatibility/convenience
|
||||||
|
|
||||||
|
generic: unzips
|
||||||
|
atari: unzips
|
227
unzip/unzip-5.52/atari/Makefile.old
Normal file
227
unzip/unzip-5.52/atari/Makefile.old
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
#==============================================================================
|
||||||
|
# Makefile for UnZip, UnZipSFX & fUnZip: Atari ST Chris Herborth
|
||||||
|
# Version: UnZip 5.20+, MiNT, GNU C 13 February 2001
|
||||||
|
#==============================================================================
|
||||||
|
|
||||||
|
# Based on the original unix Makefile and modified by Chris Herborth
|
||||||
|
# (cherborth@semprini.waterloo-rdp.on.ca), Nov.13/93.
|
||||||
|
|
||||||
|
# Be sure to test your new UnZip (and UnZipSFX and fUnZip); successful com-
|
||||||
|
# pilation does not always imply a working program.
|
||||||
|
|
||||||
|
|
||||||
|
#####################
|
||||||
|
# MACRO DEFINITIONS #
|
||||||
|
#####################
|
||||||
|
|
||||||
|
# Defaults most systems use (use LOCAL_UNZIP in environment to add flags,
|
||||||
|
# such as -DDOSWILD).
|
||||||
|
|
||||||
|
# UnZip flags
|
||||||
|
# NOTE: 'cgcc' is my cross-compiler; you'll probably use 'gcc' instead.
|
||||||
|
CC = cgcc
|
||||||
|
LD = cgcc
|
||||||
|
LOC = $(LOCAL_UNZIP) -ansi -D__MINT__ -U__STRICT_ANSI__
|
||||||
|
|
||||||
|
CF = -mbaserel -mpcrel -O2 -fomit-frame-pointer -I. $(LOC)
|
||||||
|
# CF = -O -I. $(LOC)
|
||||||
|
# CF = -mbaserel -O -I. $(LOC)
|
||||||
|
LF = -mbaserel -mpcrel -o unzip.ttp
|
||||||
|
LF2 = -s -lbiio
|
||||||
|
|
||||||
|
# UnZipSFX flags
|
||||||
|
XC = -DSFX
|
||||||
|
XL = -mbaserel -mpcrel -o unzipsfx.ttp
|
||||||
|
XL2 = $(LF2)
|
||||||
|
|
||||||
|
# fUnZip flags
|
||||||
|
FC = -DFUNZIP
|
||||||
|
FL = -mbaserel -mpcrel -o funzip.ttp
|
||||||
|
FL2 = $(LF2)
|
||||||
|
|
||||||
|
# general-purpose stuff
|
||||||
|
CP = cp
|
||||||
|
LN = ln -s
|
||||||
|
RM = rm -f
|
||||||
|
E = .ttp
|
||||||
|
O = .o
|
||||||
|
M = atari
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
# object files
|
||||||
|
OBJS1 = unzip$O crc32$O crctab$O crypt$O envargs$O explode$O
|
||||||
|
OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O
|
||||||
|
OBJS3 = process$O ttyio$O unreduce$O unshrink$O zipinfo$O
|
||||||
|
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O
|
||||||
|
LOBJS = $(OBJS)
|
||||||
|
OBJX = unzipsfx$O crc32$O crctab_$O crypt_$O extract_$O fileio_$O \
|
||||||
|
globals_$O inflate_$O match_$O process_$O ttyio_$O $M_$O
|
||||||
|
OBJF = funzip$O crc32$O cryptf$O globalsf$O inflatef$O ttyiof$O
|
||||||
|
|
||||||
|
UNZIP_H = unzip.h unzpriv.h globals.h
|
||||||
|
|
||||||
|
# installation
|
||||||
|
INSTALL = cp# probably can change this to 'install' if you have it
|
||||||
|
# on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
|
||||||
|
manext = 1
|
||||||
|
MANDIR = /usr/local/man/man$(manext)# where to install man pages
|
||||||
|
BINDIR = /usr/local/bin# where to install executables
|
||||||
|
#
|
||||||
|
UNZIPS = unzip$E funzip$E unzipsfx$E zipinfo$E
|
||||||
|
MANS = unzip.$(manext) unzipsfx.$(manext) zipinfo.$(manext) funzip.$(manext)
|
||||||
|
DOCS = unzip.txt unzipsfx.txt zipinfo.txt funzip.txt
|
||||||
|
# this is a little ugly...
|
||||||
|
INSTALLED = $(BINDIR)/unzip$E $(BINDIR)/zipinfo$E $(BINDIR)/funzip$E \
|
||||||
|
$(BINDIR)/unzipsfx$E $(MANDIR)/unzipsfx.$(manext) \
|
||||||
|
$(MANDIR)/unzip.$(manext) $(MANDIR)/zipinfo.$(manext) \
|
||||||
|
$(MANDIR)/funzip.$(manext)
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# BASIC COMPILE INSTRUCTIONS AND DEPENDENCIES #
|
||||||
|
###############################################
|
||||||
|
|
||||||
|
.c$O:
|
||||||
|
$(CC) -c $(CF) $*.c
|
||||||
|
|
||||||
|
|
||||||
|
all: unzips
|
||||||
|
unzips: $(UNZIPS)
|
||||||
|
docs: $(DOCS)
|
||||||
|
unzipsman: unzips docs
|
||||||
|
unzipsdocs: unzips docs
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJS) $(OBJF) $(OBJX) $(UNZIPS)
|
||||||
|
|
||||||
|
install: $(UNZIPS) $(MANS)
|
||||||
|
$(INSTALL) $(UNZIPS) $(BINDIR)
|
||||||
|
$(LN) $(BINDIR)/unzip$E $(BINDIR)/zipinfo$E
|
||||||
|
$(INSTALL) man/unzip.1 $(MANDIR)/unzip.$(manext)
|
||||||
|
$(INSTALL) man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext)
|
||||||
|
$(INSTALL) man/zipinfo.1 $(MANDIR)/zipinfo.$(manext)
|
||||||
|
$(INSTALL) man/funzip.1 $(MANDIR)/funzip.$(manext)
|
||||||
|
|
||||||
|
# alternatively, could use zip method: -cd $(BINDIR); rm -f $(UNZIPS) [etc.]
|
||||||
|
uninstall:
|
||||||
|
rm -f $(INSTALLED)
|
||||||
|
|
||||||
|
|
||||||
|
unzip$E: $(OBJS) # add `&' if parallel makes supported
|
||||||
|
$(LD) $(LF) $(LOBJS) $(LF2)
|
||||||
|
|
||||||
|
unzipsfx$E: $(OBJX) # add `&' if parallel makes supported
|
||||||
|
$(LD) $(XL) $(OBJX) $(XL2)
|
||||||
|
|
||||||
|
funzip$E: $(OBJF) # add `&' if parallel makes supported
|
||||||
|
$(LD) $(FL) $(OBJF) $(FL2)
|
||||||
|
|
||||||
|
zipinfo$E: unzip$E
|
||||||
|
@echo\
|
||||||
|
' This is a Unix-inspired target. If your filesystem does not support'
|
||||||
|
@echo\
|
||||||
|
' symbolic links, copy unzip.ttp to zipinfo.ttp rather than linking it,'
|
||||||
|
@echo\
|
||||||
|
' or else invoke as "unzip -Z".'
|
||||||
|
$(LN) unzip$E zipinfo$E
|
||||||
|
|
||||||
|
|
||||||
|
crc32$O: crc32.c $(UNZIP_H) zip.h
|
||||||
|
crctab$O: crctab.c $(UNZIP_H) zip.h
|
||||||
|
crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
envargs$O: envargs.c $(UNZIP_H)
|
||||||
|
explode$O: explode.c $(UNZIP_H)
|
||||||
|
extract$O: extract.c $(UNZIP_H) crypt.h
|
||||||
|
fileio$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
funzip$O: funzip.c $(UNZIP_H) crypt.h ttyio.h tables.h
|
||||||
|
globals$O: globals.c $(UNZIP_H)
|
||||||
|
inflate$O: inflate.c inflate.h $(UNZIP_H)
|
||||||
|
list$O: list.c $(UNZIP_H)
|
||||||
|
match$O: match.c $(UNZIP_H)
|
||||||
|
process$O: process.c $(UNZIP_H)
|
||||||
|
ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
unreduce$O: unreduce.c $(UNZIP_H)
|
||||||
|
unshrink$O: unshrink.c $(UNZIP_H)
|
||||||
|
unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
||||||
|
zipinfo$O: zipinfo.c $(UNZIP_H)
|
||||||
|
|
||||||
|
crctab_$O: crctab.c $(UNZIP_H) zip.h
|
||||||
|
$(CP) crctab.c crctab_.c
|
||||||
|
$(CC) -c $(CF) $(XC) crctab_.c
|
||||||
|
$(RM) crctab_.c
|
||||||
|
|
||||||
|
crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) crypt.c crypt_.c
|
||||||
|
$(CC) -c $(CF) $(XC) crypt_.c
|
||||||
|
$(RM) crypt_.c
|
||||||
|
|
||||||
|
extract_$O: extract.c $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) extract.c extract_.c
|
||||||
|
$(CC) -c $(CF) $(XC) extract_.c
|
||||||
|
$(RM) extract_.c
|
||||||
|
|
||||||
|
fileio_$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
$(CP) fileio.c fileio_.c
|
||||||
|
$(CC) -c $(CF) $(XC) fileio_.c
|
||||||
|
$(RM) fileio_.c
|
||||||
|
|
||||||
|
globals_$O: globals.c $(UNZIP_H)
|
||||||
|
$(CP) globals.c globals_.c
|
||||||
|
$(CC) -c $(CF) $(XC) globals_.c
|
||||||
|
$(RM) globals_.c
|
||||||
|
|
||||||
|
inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) inflate.c inflate_.c
|
||||||
|
$(CC) -c $(CF) $(XC) inflate_.c
|
||||||
|
$(RM) inflate_.c
|
||||||
|
|
||||||
|
match_$O: match.c $(UNZIP_H)
|
||||||
|
$(CP) match.c match_.c
|
||||||
|
$(CC) -c $(CF) $(XC) match_.c
|
||||||
|
$(RM) match_.c
|
||||||
|
|
||||||
|
process_$O: process.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) process.c process_.c
|
||||||
|
$(CC) -c $(CF) $(XC) process_.c
|
||||||
|
$(RM) process_.c
|
||||||
|
|
||||||
|
ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) ttyio.c ttyio_.c
|
||||||
|
$(CC) -c $(CF) $(XC) ttyio_.c
|
||||||
|
$(RM) ttyio_.c
|
||||||
|
|
||||||
|
unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h # unzipsfx only
|
||||||
|
$(CP) unzip.c unzip_.c
|
||||||
|
$(CC) -c $(CF) $(XC) unzip_.c
|
||||||
|
$(RM) unzip_.c
|
||||||
|
|
||||||
|
|
||||||
|
cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) crypt.c cryptf.c
|
||||||
|
$(CC) -c $(CF) $(FC) cryptf.c
|
||||||
|
$(RM) cryptf.c
|
||||||
|
|
||||||
|
globalsf$O: globals.c $(UNZIP_H) # funzip only
|
||||||
|
$(CP) globals.c globalsf.c
|
||||||
|
$(CC) -c $(CF) $(FC) globalsf.c
|
||||||
|
$(RM) globalsf.c
|
||||||
|
|
||||||
|
inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h # funzip only
|
||||||
|
$(CP) inflate.c inflatef.c
|
||||||
|
$(CC) -c $(CF) $(FC) inflatef.c
|
||||||
|
$(RM) inflatef.c
|
||||||
|
|
||||||
|
ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) ttyio.c ttyiof.c
|
||||||
|
$(CC) -c $(CF) $(FC) ttyiof.c
|
||||||
|
$(RM) ttyiof.c
|
||||||
|
|
||||||
|
# atari$O: atari/atari.c $(UNZIP_H) # Atari only
|
||||||
|
# $(CC) -c $(CF) atari/atari.c
|
||||||
|
|
||||||
|
atari$O: atari.c $(UNZIP_H)
|
||||||
|
|
||||||
|
atari_$O: atari.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) atari.c atari_.c
|
||||||
|
$(CC) -c $(CF) $(XC) atari_.c
|
||||||
|
$(RM) atari_.c
|
43
unzip/unzip-5.52/atari/README.old
Normal file
43
unzip/unzip-5.52/atari/README.old
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Here it is... the UnZip 5.1 port for the Atari ST/TT/Falcon!
|
||||||
|
|
||||||
|
This took me longer than I expected thanks to a difference between the
|
||||||
|
MiNT library and most UNIX libraries... symlinks are 0x16000
|
||||||
|
instead of 0xa000... I'm told this isn't even defined in POSIX, so I
|
||||||
|
can't really complain. At least we've got a filesystem that can use
|
||||||
|
symlinks!
|
||||||
|
|
||||||
|
This port requires GNU C and allows you to build an unzip/zipinfo/funzip
|
||||||
|
that supports long filenames (on appropriate filesystems, thanks to the
|
||||||
|
MiNT library), as well as symlinks. It also does "proper" (ie, DOS-style)
|
||||||
|
translation of text-file end-of-line characters. The programs also build
|
||||||
|
as shared-text binaries, so you can start unzipping several files at once
|
||||||
|
in the background and only a small part of unzip will be duplicated in
|
||||||
|
memory.
|
||||||
|
|
||||||
|
I build unzip with the MiNT library, GNU C 2.5.8 (2.5.7 and lower have a
|
||||||
|
rather sever problem in the optimiser that affects 68000 code only; it
|
||||||
|
adds 68020-only instructions to the 68000 code). Oh, and I tested it
|
||||||
|
extensively under MiNT's minix filesystem as well as the bogus DOS
|
||||||
|
filesystem that "normal" Atari partitions have.
|
||||||
|
|
||||||
|
The Makefile won't need any editing if you want to built unzip et al. on
|
||||||
|
a minix filesystem; if you want to install it on a DOS filesystem, use
|
||||||
|
"cp" instead of "ln" for zipinfo. [Or, to save disk space, make a script/
|
||||||
|
command-file which invokes "unzip -Z ...". --CN] This is such a good
|
||||||
|
idea that I'm annoyed that Greg thought of it and I didn't... ;-) If
|
||||||
|
you're using a shell worth your while, you can alias zipinfo to
|
||||||
|
'unzip -Z' and then forget all about this paragraph.
|
||||||
|
|
||||||
|
If you want to compile this using Turbo C (aka Pure C in North America)
|
||||||
|
you're on your own... That's ok, I'll make a nice binary version of
|
||||||
|
unzip available as soon as the official 5.1 version is released (give or
|
||||||
|
take a few days).
|
||||||
|
|
||||||
|
Enjoy! Cave Newt should be given kudos for keeping this monster easy to
|
||||||
|
port... ;-) [Hah! But thanks anyway. :-) --CN]
|
||||||
|
|
||||||
|
PLEASE email me to tell me if you've uploaded the source or binary
|
||||||
|
versions of Unzip 5.x to any BBS systems or commercial online systems so
|
||||||
|
we can update the WHERE file!
|
||||||
|
|
||||||
|
-Chris Herborth-
|
976
unzip/unzip-5.52/atari/atari.c
Normal file
976
unzip/unzip-5.52/atari/atari.c
Normal file
@ -0,0 +1,976 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
atari.c
|
||||||
|
|
||||||
|
Atari-specific routines for use with Info-ZIP's UnZip 5.1 and later.
|
||||||
|
|
||||||
|
Contains: readdir()
|
||||||
|
do_wild() <-- generic enough to put in fileio.c?
|
||||||
|
mapattr()
|
||||||
|
mapname()
|
||||||
|
checkdir()
|
||||||
|
mkdir()
|
||||||
|
close_outfile()
|
||||||
|
stamp_file() [optional feature]
|
||||||
|
version()
|
||||||
|
|
||||||
|
Due to the amazing MiNT library being very, very close to BSD unix's
|
||||||
|
library, I'm using the unix.c as a base for this. Note: If you're not
|
||||||
|
going to compile this with the MiNT libraries (for GNU C, Turbo C, Pure C,
|
||||||
|
Lattice C, or Heat & Serve C), you're going to be in for some nasty work.
|
||||||
|
Most of the modifications in this file were made by Chris Herborth
|
||||||
|
(cherborth@semprini.waterloo-rdp.on.ca) and /should/ be marked with [cjh].
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "unzip.h"
|
||||||
|
#include <dirent.h> /* MiNTlibs has dirent [cjh] */
|
||||||
|
|
||||||
|
static int created_dir; /* used in mapname(), checkdir() */
|
||||||
|
static int renamed_fullpath; /* ditto */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
char *do_wild(__G__ wildspec)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *wildspec; /* only used first time on a given dir */
|
||||||
|
{
|
||||||
|
static DIR *wild_dir = (DIR *)NULL;
|
||||||
|
static ZCONST char *wildname;
|
||||||
|
static char *dirname, matchname[FILNAMSIZ];
|
||||||
|
static int notfirstcall=FALSE, have_dirname, dirnamelen;
|
||||||
|
struct dirent *file;
|
||||||
|
|
||||||
|
/* Even when we're just returning wildspec, we *always* do so in
|
||||||
|
* matchname[]--calling routine is allowed to append four characters
|
||||||
|
* to the returned string, and wildspec may be a pointer to argv[].
|
||||||
|
*/
|
||||||
|
if (!notfirstcall) { /* first call: must initialize everything */
|
||||||
|
notfirstcall = TRUE;
|
||||||
|
|
||||||
|
if (!iswild(wildspec)) {
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
have_dirname = FALSE;
|
||||||
|
dir = NULL;
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* break the wildspec into a directory part and a wildcard filename */
|
||||||
|
if ((wildname = strrchr(wildspec, '/')) == (ZCONST char *)NULL) {
|
||||||
|
dirname = ".";
|
||||||
|
dirnamelen = 1;
|
||||||
|
have_dirname = FALSE;
|
||||||
|
wildname = wildspec;
|
||||||
|
} else {
|
||||||
|
++wildname; /* point at character after '/' */
|
||||||
|
dirnamelen = wildname - wildspec;
|
||||||
|
if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) {
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: cannot allocate wildcard buffers\n"));
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
return matchname; /* but maybe filespec was not a wildcard */
|
||||||
|
}
|
||||||
|
strncpy(dirname, wildspec, dirnamelen);
|
||||||
|
dirname[dirnamelen] = '\0'; /* terminate for strcpy below */
|
||||||
|
have_dirname = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((wild_dir = opendir(dirname)) != (DIR *)NULL) {
|
||||||
|
while ((file = readdir(wild_dir)) != (struct dirent *)NULL) {
|
||||||
|
Trace((stderr, "do_wild: readdir returns %s\n", file->d_name));
|
||||||
|
if (file->d_name[0] == '.' && wildname[0] != '.')
|
||||||
|
continue; /* Unix: '*' and '?' do not match leading dot */
|
||||||
|
/* Need something here for TOS filesystem? [cjh] */
|
||||||
|
if (match(file->d_name, wildname, 0 WISEP) && /* 0=case sens.*/
|
||||||
|
/* skip "." and ".." directory entries */
|
||||||
|
strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) {
|
||||||
|
Trace((stderr, "do_wild: match() succeeds\n"));
|
||||||
|
if (have_dirname) {
|
||||||
|
strcpy(matchname, dirname);
|
||||||
|
strcpy(matchname+dirnamelen, file->d_name);
|
||||||
|
} else
|
||||||
|
strcpy(matchname, file->d_name);
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* if we get to here directory is exhausted, so close it */
|
||||||
|
closedir(wild_dir);
|
||||||
|
wild_dir = (DIR *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return the raw wildspec in case that works (e.g., directory not
|
||||||
|
* searchable, but filespec was not wild and file is readable) */
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* last time through, might have failed opendir but returned raw wildspec */
|
||||||
|
if (wild_dir == (DIR *)NULL) {
|
||||||
|
notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */
|
||||||
|
if (have_dirname)
|
||||||
|
free(dirname);
|
||||||
|
return (char *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we've gotten this far, we've read and matched at least one entry
|
||||||
|
* successfully (in a previous call), so dirname has been copied into
|
||||||
|
* matchname already.
|
||||||
|
*/
|
||||||
|
while ((file = readdir(wild_dir)) != (struct dirent *)NULL) {
|
||||||
|
/* May need special TOS handling here. [cjh] */
|
||||||
|
Trace((stderr, "do_wild: readdir returns %s\n", file->d_name));
|
||||||
|
if (file->d_name[0] == '.' && wildname[0] != '.')
|
||||||
|
continue; /* Unix: '*' and '?' do not match leading dot */
|
||||||
|
if (match(file->d_name, wildname, 0 WISEP)) { /* 0 = case sens. */
|
||||||
|
Trace((stderr, "do_wild: match() succeeds\n"));
|
||||||
|
if (have_dirname) {
|
||||||
|
/* strcpy(matchname, dirname); */
|
||||||
|
strcpy(matchname+dirnamelen, file->d_name);
|
||||||
|
} else
|
||||||
|
strcpy(matchname, file->d_name);
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(wild_dir); /* have read at least one entry; nothing left */
|
||||||
|
wild_dir = (DIR *)NULL;
|
||||||
|
notfirstcall = FALSE; /* reset for new wildspec */
|
||||||
|
if (have_dirname)
|
||||||
|
free(dirname);
|
||||||
|
return (char *)NULL;
|
||||||
|
|
||||||
|
} /* end function do_wild() */
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function mapattr() */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
int mapattr(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
ulg tmp = G.crec.external_file_attributes;
|
||||||
|
|
||||||
|
switch (G.pInfo->hostnum) {
|
||||||
|
case AMIGA_:
|
||||||
|
tmp = (unsigned)(tmp>>17 & 7); /* Amiga RWE bits */
|
||||||
|
G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp);
|
||||||
|
break;
|
||||||
|
case THEOS_:
|
||||||
|
tmp &= 0xF1FFFFFFL;
|
||||||
|
if ((tmp & 0xF0000000L) != 0x40000000L)
|
||||||
|
tmp &= 0x01FFFFFFL; /* not a dir, mask all ftype bits */
|
||||||
|
else
|
||||||
|
tmp &= 0x41FFFFFFL; /* leave directory bit as set */
|
||||||
|
/* fall through! */
|
||||||
|
case UNIX_:
|
||||||
|
case VMS_:
|
||||||
|
case ACORN_:
|
||||||
|
case ATARI_:
|
||||||
|
case ATHEOS_:
|
||||||
|
case BEOS_:
|
||||||
|
case QDOS_:
|
||||||
|
case TANDEM_:
|
||||||
|
G.pInfo->file_attr = (unsigned)(tmp >> 16);
|
||||||
|
if (G.pInfo->file_attr != 0 || !G.extra_field) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
/* Some (non-Info-ZIP) implementations of Zip for Unix and
|
||||||
|
VMS (and probably others ??) leave 0 in the upper 16-bit
|
||||||
|
part of the external_file_attributes field. Instead, they
|
||||||
|
store file permission attributes in some extra field.
|
||||||
|
As a work-around, we search for the presence of one of
|
||||||
|
these extra fields and fall back to the MSDOS compatible
|
||||||
|
part of external_file_attributes if one of the known
|
||||||
|
e.f. types has been detected.
|
||||||
|
Later, we might implement extraction of the permission
|
||||||
|
bits from the VMS extra field. But for now, the work-around
|
||||||
|
should be sufficient to provide "readable" extracted files.
|
||||||
|
(For ASI Unix e.f., an experimental remap of the e.f.
|
||||||
|
mode value IS already provided!)
|
||||||
|
*/
|
||||||
|
ush ebID;
|
||||||
|
unsigned ebLen;
|
||||||
|
uch *ef = G.extra_field;
|
||||||
|
unsigned ef_len = G.crec.extra_field_length;
|
||||||
|
int r = FALSE;
|
||||||
|
|
||||||
|
while (!r && ef_len >= EB_HEADSIZE) {
|
||||||
|
ebID = makeword(ef);
|
||||||
|
ebLen = (unsigned)makeword(ef+EB_LEN);
|
||||||
|
if (ebLen > (ef_len - EB_HEADSIZE))
|
||||||
|
/* discoverd some e.f. inconsistency! */
|
||||||
|
break;
|
||||||
|
switch (ebID) {
|
||||||
|
case EF_ASIUNIX:
|
||||||
|
if (ebLen >= (EB_ASI_MODE+2)) {
|
||||||
|
G.pInfo->file_attr =
|
||||||
|
(unsigned)makeword(ef+(EB_HEADSIZE+EB_ASI_MODE));
|
||||||
|
/* force stop of loop: */
|
||||||
|
ef_len = (ebLen + EB_HEADSIZE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* else: fall through! */
|
||||||
|
case EF_PKVMS:
|
||||||
|
/* "found nondecypherable e.f. with perm. attr" */
|
||||||
|
r = TRUE;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ef_len -= (ebLen + EB_HEADSIZE);
|
||||||
|
ef += (ebLen + EB_HEADSIZE);
|
||||||
|
}
|
||||||
|
if (!r)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* fall through! */
|
||||||
|
/* all remaining cases: expand MSDOS read-only bit into write perms */
|
||||||
|
case FS_FAT_:
|
||||||
|
/* PKWARE's PKZip for Unix marks entries as FS_FAT_, but stores the
|
||||||
|
* Unix attributes in the upper 16 bits of the external attributes
|
||||||
|
* field, just like Info-ZIP's Zip for Unix. We try to use that
|
||||||
|
* value, after a check for consistency with the MSDOS attribute
|
||||||
|
* bits (see below).
|
||||||
|
*/
|
||||||
|
G.pInfo->file_attr = (unsigned)(tmp >> 16);
|
||||||
|
/* fall through! */
|
||||||
|
case FS_HPFS_:
|
||||||
|
case FS_NTFS_:
|
||||||
|
case MAC_:
|
||||||
|
case TOPS20_:
|
||||||
|
default:
|
||||||
|
/* Ensure that DOS subdir bit is set when the entry's name ends
|
||||||
|
* in a '/'. Some third-party Zip programs fail to set the subdir
|
||||||
|
* bit for directory entries.
|
||||||
|
*/
|
||||||
|
if ((tmp & 0x10) == 0) {
|
||||||
|
extent fnlen = strlen(G.filename);
|
||||||
|
if (fnlen > 0 && G.filename[fnlen-1] == '/')
|
||||||
|
tmp |= 0x10;
|
||||||
|
}
|
||||||
|
/* read-only bit --> write perms; subdir bit --> dir exec bit */
|
||||||
|
tmp = !(tmp & 1) << 1 | (tmp & 0x10) >> 4;
|
||||||
|
if ((G.pInfo->file_attr & 0700) == (unsigned)(0400 | tmp<<6))
|
||||||
|
/* keep previous G.pInfo->file_attr setting, when its "owner"
|
||||||
|
* part appears to be consistent with DOS attribute flags!
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp);
|
||||||
|
break;
|
||||||
|
} /* end switch (host-OS-created-by) */
|
||||||
|
|
||||||
|
/* for originating systems with no concept of "group," "other," "system": */
|
||||||
|
umask( (int)(tmp=umask(0)) ); /* apply mask to expanded r/w(/x) perms */
|
||||||
|
G.pInfo->file_attr &= ~tmp;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} /* end function mapattr() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function mapname() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
int mapname(__G__ renamed)
|
||||||
|
__GDEF
|
||||||
|
int renamed;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - caution (truncated filename)
|
||||||
|
* MPN_INF_SKIP - info "skip entry" (dir doesn't exist)
|
||||||
|
* MPN_ERR_SKIP - error -> skip entry
|
||||||
|
* MPN_ERR_TOOLONG - error -> path is too long
|
||||||
|
* MPN_NOMEM - error (memory allocation failed) -> skip entry
|
||||||
|
* [also MPN_VOL_LABEL, MPN_CREATED_DIR]
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
char pathcomp[FILNAMSIZ]; /* path-component buffer */
|
||||||
|
char *pp, *cp=(char *)NULL; /* character pointers */
|
||||||
|
char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */
|
||||||
|
#ifdef ACORN_FTYPE_NFS
|
||||||
|
char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */
|
||||||
|
RO_extra_block *ef_spark; /* pointer Acorn FTYPE ef block */
|
||||||
|
#endif
|
||||||
|
int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */
|
||||||
|
int error = MPN_OK;
|
||||||
|
register unsigned workch; /* hold the character being tested */
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Initialize various pointers and counters and stuff.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (G.pInfo->vollabel)
|
||||||
|
return MPN_VOL_LABEL; /* can't set disk volume labels on Atari */
|
||||||
|
|
||||||
|
/* can create path as long as not just freshening, or if user told us */
|
||||||
|
G.create_dirs = (!uO.fflag || renamed);
|
||||||
|
|
||||||
|
created_dir = FALSE; /* not yet */
|
||||||
|
|
||||||
|
/* user gave full pathname: don't prepend rootpath */
|
||||||
|
renamed_fullpath = (renamed && (*G.filename == '/'));
|
||||||
|
|
||||||
|
if (checkdir(__G__ (char *)NULL, INIT) == MPN_NOMEM)
|
||||||
|
return MPN_NOMEM; /* initialize path buffer, unless no memory */
|
||||||
|
|
||||||
|
*pathcomp = '\0'; /* initialize translation buffer */
|
||||||
|
pp = pathcomp; /* point to translation buffer */
|
||||||
|
if (uO.jflag) /* junking directories */
|
||||||
|
cp = (char *)strrchr(G.filename, '/');
|
||||||
|
if (cp == (char *)NULL) /* no '/' or not junking dirs */
|
||||||
|
cp = G.filename; /* point to internal zipfile-member pathname */
|
||||||
|
else
|
||||||
|
++cp; /* point to start of last component of path */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Begin main loop through characters in filename.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
while ((workch = (uch)*cp++) != 0) {
|
||||||
|
|
||||||
|
switch (workch) {
|
||||||
|
case '/': /* can assume -j flag not given */
|
||||||
|
*pp = '\0';
|
||||||
|
if (strcmp(pathcomp, ".") == 0) {
|
||||||
|
/* don't bother appending "./" to the path */
|
||||||
|
*pathcomp = '\0';
|
||||||
|
} else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) {
|
||||||
|
/* "../" dir traversal detected, skip over it */
|
||||||
|
*pathcomp = '\0';
|
||||||
|
killed_ddot = TRUE; /* set "show message" flag */
|
||||||
|
}
|
||||||
|
/* when path component is not empty, append it now */
|
||||||
|
if (*pathcomp != '\0' &&
|
||||||
|
((error = checkdir(__G__ pathcomp, APPEND_DIR))
|
||||||
|
& MPN_MASK) > MPN_INF_TRUNC)
|
||||||
|
return error;
|
||||||
|
pp = pathcomp; /* reset conversion buffer for next piece */
|
||||||
|
lastsemi = (char *)NULL; /* leave direct. semi-colons alone */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ';': /* VMS version (or DEC-20 attrib?) */
|
||||||
|
lastsemi = pp;
|
||||||
|
*pp++ = ';'; /* keep for now; remove VMS ";##" */
|
||||||
|
break; /* later, if requested */
|
||||||
|
|
||||||
|
#ifdef ACORN_FTYPE_NFS
|
||||||
|
case ',': /* NFS filetype extension */
|
||||||
|
lastcomma = pp;
|
||||||
|
*pp++ = ','; /* keep for now; may need to remove */
|
||||||
|
break; /* later, if requested */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MTS
|
||||||
|
case ' ': /* change spaces to underscore under */
|
||||||
|
*pp++ = '_'; /* MTS; leave as spaces under Unix */
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* allow European characters in filenames: */
|
||||||
|
if (isprint(workch) || (128 <= workch && workch <= 254))
|
||||||
|
*pp++ = (char)workch;
|
||||||
|
} /* end switch */
|
||||||
|
|
||||||
|
} /* end while loop */
|
||||||
|
|
||||||
|
/* Show warning when stripping insecure "parent dir" path components */
|
||||||
|
if (killed_ddot && QCOND2) {
|
||||||
|
Info(slide, 0, ((char *)slide,
|
||||||
|
"warning: skipped \"../\" path component(s) in %s\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
if (!(error & ~MPN_MASK))
|
||||||
|
error = (error & MPN_MASK) | PK_WARN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Report if directory was created (and no file to create: filename ended
|
||||||
|
in '/'), check name to be sure it exists, and combine path and name be-
|
||||||
|
fore exiting.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (G.filename[strlen(G.filename) - 1] == '/') {
|
||||||
|
checkdir(__G__ G.filename, GETPATH);
|
||||||
|
if (created_dir) {
|
||||||
|
if (QCOND2) {
|
||||||
|
Info(slide, 0, ((char *)slide, " creating: %s\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
}
|
||||||
|
/* set dir time (note trailing '/') */
|
||||||
|
return (error & ~MPN_MASK) | MPN_CREATED_DIR;
|
||||||
|
}
|
||||||
|
/* dir existed already; don't look for data to extract */
|
||||||
|
return (error & ~MPN_MASK) | MPN_INF_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pp = '\0'; /* done with pathcomp: terminate it */
|
||||||
|
|
||||||
|
/* if not saving them, remove VMS version numbers (appended ";###") */
|
||||||
|
if (!uO.V_flag && lastsemi) {
|
||||||
|
pp = lastsemi + 1;
|
||||||
|
while (isdigit((uch)(*pp)))
|
||||||
|
++pp;
|
||||||
|
if (*pp == '\0') /* only digits between ';' and end: nuke */
|
||||||
|
*lastsemi = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ACORN_FTYPE_NFS
|
||||||
|
/* translate Acorn filetype information if asked to do so */
|
||||||
|
if (uO.acorn_nfs_ext &&
|
||||||
|
(ef_spark = (RO_extra_block *)
|
||||||
|
getRISCOSexfield(G.extra_field, G.lrec.extra_field_length))
|
||||||
|
!= (RO_extra_block *)NULL)
|
||||||
|
{
|
||||||
|
/* file *must* have a RISC OS extra field */
|
||||||
|
long ft = (long)makelong(ef_spark->loadaddr);
|
||||||
|
/*32-bit*/
|
||||||
|
if (lastcomma) {
|
||||||
|
pp = lastcomma + 1;
|
||||||
|
while (isxdigit((uch)(*pp))) ++pp;
|
||||||
|
if (pp == lastcomma+4 && *pp == '\0') *lastcomma='\0'; /* nuke */
|
||||||
|
}
|
||||||
|
if ((ft & 1<<31)==0) ft=0x000FFD00;
|
||||||
|
sprintf(pathcomp+strlen(pathcomp), ",%03x", (int)(ft>>8) & 0xFFF);
|
||||||
|
}
|
||||||
|
#endif /* ACORN_FTYPE_NFS */
|
||||||
|
|
||||||
|
if (*pathcomp == '\0') {
|
||||||
|
Info(slide, 1, ((char *)slide, "mapname: conversion of %s failed\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
return (error & ~MPN_MASK) | MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */
|
||||||
|
checkdir(__G__ G.filename, GETPATH);
|
||||||
|
|
||||||
|
return error;
|
||||||
|
|
||||||
|
} /* end function mapname() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0 /*========== NOTES ==========*/
|
||||||
|
|
||||||
|
extract-to dir: a:path/
|
||||||
|
buildpath: path1/path2/ ... (NULL-terminated)
|
||||||
|
pathcomp: filename
|
||||||
|
|
||||||
|
mapname():
|
||||||
|
loop over chars in zipfile member name
|
||||||
|
checkdir(path component, COMPONENT | CREATEDIR) --> map as required?
|
||||||
|
(d:/tmp/unzip/) (disk:[tmp.unzip.)
|
||||||
|
(d:/tmp/unzip/jj/) (disk:[tmp.unzip.jj.)
|
||||||
|
(d:/tmp/unzip/jj/temp/) (disk:[tmp.unzip.jj.temp.)
|
||||||
|
finally add filename itself and check for existence? (could use with rename)
|
||||||
|
(d:/tmp/unzip/jj/temp/msg.outdir) (disk:[tmp.unzip.jj.temp]msg.outdir)
|
||||||
|
checkdir(name, GETPATH) --> copy path to name and free space
|
||||||
|
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************/
|
||||||
|
/* Function checkdir() */
|
||||||
|
/***********************/
|
||||||
|
|
||||||
|
int checkdir(__G__ pathcomp, flag)
|
||||||
|
__GDEF
|
||||||
|
char *pathcomp;
|
||||||
|
int flag;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - (on APPEND_NAME) truncated filename
|
||||||
|
* MPN_INF_SKIP - path doesn't exist, not allowed to create
|
||||||
|
* MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path
|
||||||
|
* exists and is not a directory, but is supposed to be
|
||||||
|
* MPN_ERR_TOOLONG - path is too long
|
||||||
|
* MPN_NOMEM - can't allocate memory for filename buffers
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
static int rootlen = 0; /* length of rootpath */
|
||||||
|
static char *rootpath; /* user's "extract-to" directory */
|
||||||
|
static char *buildpath; /* full path (so far) to extracted file */
|
||||||
|
static char *end; /* pointer to end of buildpath ('\0') */
|
||||||
|
|
||||||
|
# define FN_MASK 7
|
||||||
|
# define FUNCTION (flag & FN_MASK)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
APPEND_DIR: append the path component to the path being built and check
|
||||||
|
for its existence. If doesn't exist and we are creating directories, do
|
||||||
|
so for this one; else signal success or error as appropriate.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == APPEND_DIR) {
|
||||||
|
int too_long = FALSE;
|
||||||
|
/* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */
|
||||||
|
#ifdef SHORT_NAMES
|
||||||
|
char *old_end = end;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp)));
|
||||||
|
while ((*end = *pathcomp++) != '\0')
|
||||||
|
++end;
|
||||||
|
/* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */
|
||||||
|
#ifdef SHORT_NAMES /* path components restricted to 14 chars, typically */
|
||||||
|
if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */
|
||||||
|
*(end = old_end + FILENAME_MAX) = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GRR: could do better check, see if overrunning buffer as we go:
|
||||||
|
* check end-buildpath after each append, set warning variable if
|
||||||
|
* within 20 of FILNAMSIZ; then if var set, do careful check when
|
||||||
|
* appending. Clear variable when begin new path. */
|
||||||
|
|
||||||
|
if ((end-buildpath) > FILNAMSIZ-3) /* need '/', one-char name, '\0' */
|
||||||
|
too_long = TRUE; /* check if extracting directory? */
|
||||||
|
if (stat(buildpath, &G.statbuf)) { /* path doesn't exist */
|
||||||
|
if (!G.create_dirs) { /* told not to create (freshening) */
|
||||||
|
free(buildpath);
|
||||||
|
return MPN_INF_SKIP; /* path doesn't exist: nothing to do */
|
||||||
|
}
|
||||||
|
if (too_long) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: path too long: %s\n",
|
||||||
|
FnFilter1(buildpath)));
|
||||||
|
free(buildpath);
|
||||||
|
/* no room for filenames: fatal */
|
||||||
|
return MPN_ERR_TOOLONG;
|
||||||
|
}
|
||||||
|
if (mkdir(buildpath, 0777) == -1) { /* create the directory */
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: cannot create %s\n\
|
||||||
|
unable to process %s.\n",
|
||||||
|
FnFilter2(buildpath), FnFilter1(G.filename)));
|
||||||
|
free(buildpath);
|
||||||
|
/* path didn't exist, tried to create, failed */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
created_dir = TRUE;
|
||||||
|
} else if (!S_ISDIR(G.statbuf.st_mode)) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: %s exists but is not directory\n\
|
||||||
|
unable to process %s.\n",
|
||||||
|
FnFilter2(buildpath), FnFilter(G.filename)));
|
||||||
|
free(buildpath);
|
||||||
|
/* path existed but wasn't dir */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
if (too_long) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir error: path too long: %s\n", FnFilter1(buildpath)));
|
||||||
|
free(buildpath);
|
||||||
|
/* no room for filenames: fatal */
|
||||||
|
return MPN_ERR_TOOLONG;
|
||||||
|
}
|
||||||
|
*end++ = '/';
|
||||||
|
*end = '\0';
|
||||||
|
Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath)));
|
||||||
|
return MPN_OK;
|
||||||
|
|
||||||
|
} /* end if (FUNCTION == APPEND_DIR) */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
GETPATH: copy full path to the string pointed at by pathcomp, and free
|
||||||
|
buildpath.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == GETPATH) {
|
||||||
|
strcpy(pathcomp, buildpath);
|
||||||
|
Trace((stderr, "getting and freeing path [%s]\n",
|
||||||
|
FnFilter1(pathcomp)));
|
||||||
|
free(buildpath);
|
||||||
|
buildpath = end = (char *)NULL;
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
APPEND_NAME: assume the path component is the filename; append it and
|
||||||
|
return without checking for existence.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == APPEND_NAME) {
|
||||||
|
/* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */
|
||||||
|
#ifdef SHORT_NAMES
|
||||||
|
char *old_end = end;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp)));
|
||||||
|
while ((*end = *pathcomp++) != '\0') {
|
||||||
|
++end;
|
||||||
|
/* SHORT_NAMES required for TOS, but it has to co-exist for minix fs... [cjh] */
|
||||||
|
#ifdef SHORT_NAMES /* truncate name at 14 characters, typically */
|
||||||
|
if ((end-old_end) > FILENAME_MAX) /* GRR: proper constant? */
|
||||||
|
*(end = old_end + FILENAME_MAX) = '\0';
|
||||||
|
#endif
|
||||||
|
if ((end-buildpath) >= FILNAMSIZ) {
|
||||||
|
*--end = '\0';
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"checkdir warning: path too long; truncating\n\
|
||||||
|
%s\n -> %s\n",
|
||||||
|
FnFilter1(G.filename), FnFilter2(buildpath)));
|
||||||
|
return MPN_INF_TRUNC; /* filename truncated */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath)));
|
||||||
|
/* could check for existence here, prompt for new name... */
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
INIT: allocate and initialize buffer space for the file currently being
|
||||||
|
extracted. If file was renamed with an absolute path, don't prepend the
|
||||||
|
extract-to path.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* GRR: for VMS and TOPS-20, add up to 13 to strlen */
|
||||||
|
|
||||||
|
if (FUNCTION == INIT) {
|
||||||
|
Trace((stderr, "initializing buildpath to "));
|
||||||
|
#ifdef ACORN_FTYPE_NFS
|
||||||
|
if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+
|
||||||
|
(uO.acorn_nfs_ext ? 5 : 1)))
|
||||||
|
#else
|
||||||
|
if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+1))
|
||||||
|
#endif
|
||||||
|
== (char *)NULL)
|
||||||
|
return MPN_NOMEM;
|
||||||
|
if ((rootlen > 0) && !renamed_fullpath) {
|
||||||
|
strcpy(buildpath, rootpath);
|
||||||
|
end = buildpath + rootlen;
|
||||||
|
} else {
|
||||||
|
*buildpath = '\0';
|
||||||
|
end = buildpath;
|
||||||
|
}
|
||||||
|
Trace((stderr, "[%s]\n", FnFilter1(buildpath)));
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
ROOT: if appropriate, store the path in rootpath and create it if
|
||||||
|
necessary; else assume it's a zipfile member and return. This path
|
||||||
|
segment gets used in extracting all members from every zipfile specified
|
||||||
|
on the command line.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if (!defined(SFX) || defined(SFX_EXDIR))
|
||||||
|
if (FUNCTION == ROOT) {
|
||||||
|
Trace((stderr, "initializing root path to [%s]\n", pathcomp));
|
||||||
|
if (pathcomp == (char *)NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
if (rootlen > 0) /* rootpath was already set, nothing to do */
|
||||||
|
return MPN_OK;
|
||||||
|
if ((rootlen = strlen(pathcomp)) > 0) {
|
||||||
|
char *tmproot;
|
||||||
|
|
||||||
|
if ((tmproot = (char *)malloc(rootlen+2)) == (char *)NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_NOMEM;
|
||||||
|
}
|
||||||
|
strcpy(tmproot, pathcomp);
|
||||||
|
if (tmproot[rootlen-1] == '/') {
|
||||||
|
tmproot[--rootlen] = '\0';
|
||||||
|
}
|
||||||
|
if (rootlen > 0 && (stat(tmproot, &G.statbuf) ||
|
||||||
|
!S_ISDIR(G.statbuf.st_mode)))
|
||||||
|
{ /* path does not exist */
|
||||||
|
if (!G.create_dirs /* || iswild(tmproot) */ ) {
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
/* skip (or treat as stored file) */
|
||||||
|
return MPN_INF_SKIP;
|
||||||
|
}
|
||||||
|
/* create the directory (could add loop here scanning tmproot
|
||||||
|
* to create more than one level, but why really necessary?) */
|
||||||
|
if (mkdir(tmproot, 0777) == -1) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
"checkdir: cannot create extraction directory: %s\n",
|
||||||
|
FnFilter1(tmproot)));
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
/* path didn't exist, tried to create, and failed: */
|
||||||
|
/* file exists, or 2+ subdir levels required */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tmproot[rootlen++] = '/';
|
||||||
|
tmproot[rootlen] = '\0';
|
||||||
|
if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) {
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_NOMEM;
|
||||||
|
}
|
||||||
|
Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath)));
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
#endif /* !SFX || SFX_EXDIR */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
END: free rootpath, immediately prior to program exit.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == END) {
|
||||||
|
Trace((stderr, "freeing rootpath\n"));
|
||||||
|
if (rootlen > 0) {
|
||||||
|
free(rootpath);
|
||||||
|
rootlen = 0;
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MPN_INVALID; /* should never reach */
|
||||||
|
|
||||||
|
} /* end function checkdir() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* Function close_outfile() */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
|
void close_outfile(__G) /* GRR: change to return PK-style warning level */
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
unsigned eb_izux_flg;
|
||||||
|
iztimes zt;
|
||||||
|
#endif
|
||||||
|
ztimbuf tp;
|
||||||
|
|
||||||
|
fclose(G.outfile);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
If symbolic links are supported, allocate storage for a symlink control
|
||||||
|
structure, put the uncompressed "data" and other required info in it, and
|
||||||
|
add the structure to the "deferred symlinks" chain. Since we know it's a
|
||||||
|
symbolic link to start with, we shouldn't have to worry about overflowing
|
||||||
|
unsigned ints with unsigned longs.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* symlinks allowed on minix filesystems [cjh]
|
||||||
|
* Hopefully this will work properly... We won't bother to try if
|
||||||
|
* MiNT isn't present; the symlink should fail if we're on a TOS
|
||||||
|
* filesystem.
|
||||||
|
* BUG: should we copy the original file to the "symlink" if the
|
||||||
|
* link fails?
|
||||||
|
*/
|
||||||
|
if (G.symlnk) {
|
||||||
|
unsigned ucsize = (unsigned)G.lrec.ucsize;
|
||||||
|
extent slnk_entrysize = sizeof(slinkentry) + ucsize +
|
||||||
|
strlen(G.filename);
|
||||||
|
slinkentry *slnk_entry;
|
||||||
|
|
||||||
|
if ((unsigned)slnk_entrysize < ucsize) {
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: symbolic link (%s) failed: mem alloc overflow\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) {
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: symbolic link (%s) failed: no mem\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
slnk_entry->next = NULL;
|
||||||
|
slnk_entry->targetlen = ucsize;
|
||||||
|
slnk_entry->attriblen = 0; /* don't set attributes for symlinks */
|
||||||
|
slnk_entry->target = slnk_entry->buf;
|
||||||
|
slnk_entry->fname = slnk_entry->target + ucsize + 1;
|
||||||
|
strcpy(slnk_entry->fname, G.filename);
|
||||||
|
|
||||||
|
/* reopen the "link data" file for reading */
|
||||||
|
G.outfile = fopen(G.filename, FOPR);
|
||||||
|
|
||||||
|
if (!G.outfile ||
|
||||||
|
fread(slnk_entry->target, 1, ucsize, G.outfile) != (int)ucsize)
|
||||||
|
{
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: symbolic link (%s) failed\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
free(slnk_entry);
|
||||||
|
fclose(G.outfile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fclose(G.outfile); /* close "link" file for good... */
|
||||||
|
slnk_entry->target[ucsize] = '\0';
|
||||||
|
if (QCOND2)
|
||||||
|
Info(slide, 0, ((char *)slide, "-> %s ",
|
||||||
|
FnFilter1(slnk_entry->target)));
|
||||||
|
/* add this symlink record to the list of deferred symlinks */
|
||||||
|
if (G.slink_last != NULL)
|
||||||
|
G.slink_last->next = slnk_entry;
|
||||||
|
else
|
||||||
|
G.slink_head = slnk_entry;
|
||||||
|
G.slink_last = slnk_entry;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Convert from MSDOS-format local time and date to Unix-format 32-bit GMT
|
||||||
|
time: adjust base year from 1980 to 1970, do usual conversions from
|
||||||
|
yy/mm/dd hh:mm:ss to elapsed seconds, and account for timezone and day-
|
||||||
|
light savings time differences.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
eb_izux_flg = (G.extra_field
|
||||||
|
#ifdef IZ_CHECK_TZ
|
||||||
|
&& G.tz_is_valid
|
||||||
|
#endif
|
||||||
|
? ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length,
|
||||||
|
0, G.lrec.last_mod_dos_datetime, &zt, NULL)
|
||||||
|
: 0);
|
||||||
|
if (eb_izux_flg & EB_UT_FL_MTIME) {
|
||||||
|
tp.modtime = zt.mtime;
|
||||||
|
TTrace((stderr, "\nclose_outfile: Unix e.f. modif. time = %ld\n",
|
||||||
|
tp.modtime));
|
||||||
|
} else {
|
||||||
|
tp.modtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime);
|
||||||
|
}
|
||||||
|
if (eb_izux_flg & EB_UT_FL_ATIME) {
|
||||||
|
tp.actime = zt.atime;
|
||||||
|
TTrace((stderr, "close_outfile: Unix e.f. access time = %ld\n",
|
||||||
|
tp.actime));
|
||||||
|
} else {
|
||||||
|
tp.actime = tp.modtime;
|
||||||
|
TTrace((stderr, "\nclose_outfile: modification/access times = %ld\n",
|
||||||
|
tp.modtime));
|
||||||
|
}
|
||||||
|
#else /* !USE_EF_UT_TIME */
|
||||||
|
tp.actime = tp.modtime = dos_to_unix_time(G.lrec.last_mod_dos_datetime);
|
||||||
|
|
||||||
|
TTrace((stderr, "\nclose_outfile: modification/access times = %ld\n",
|
||||||
|
tp.modtime));
|
||||||
|
#endif /* ?USE_EF_UT_TIME */
|
||||||
|
|
||||||
|
/* set the file's access and modification times */
|
||||||
|
if (utime(G.filename, &tp))
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: cannot set the time for %s\n", FnFilter1(G.filename)));
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Change the file permissions from default ones to those stored in the
|
||||||
|
zipfile.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef NO_CHMOD
|
||||||
|
if (chmod(G.filename, 0xffff & G.pInfo->file_attr))
|
||||||
|
perror("chmod (file attributes) error");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} /* end function close_outfile() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TIMESTAMP
|
||||||
|
|
||||||
|
/***************************/
|
||||||
|
/* Function stamp_file() */
|
||||||
|
/***************************/
|
||||||
|
|
||||||
|
int stamp_file(fname, modtime)
|
||||||
|
ZCONST char *fname;
|
||||||
|
time_t modtime;
|
||||||
|
{
|
||||||
|
ztimbuf tp;
|
||||||
|
|
||||||
|
tp.modtime = tp.actime = modtime;
|
||||||
|
return (utime(fname, &tp));
|
||||||
|
|
||||||
|
} /* end function stamp_file() */
|
||||||
|
|
||||||
|
#endif /* TIMESTAMP */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function version() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
void version(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
#ifdef __TURBOC__
|
||||||
|
char buf[40];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
sprintf((char *)slide, LoadFarString(CompiledWith),
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
"gcc ", __VERSION__,
|
||||||
|
#else
|
||||||
|
# if 0
|
||||||
|
"cc ", (sprintf(buf, " version %d", _RELEASE), buf),
|
||||||
|
# else
|
||||||
|
# ifdef __TURBOC__
|
||||||
|
"Turbo C", (sprintf(buf, " (0x%04x = %d)", __TURBOC__, __TURBOC__), buf),
|
||||||
|
# else
|
||||||
|
"unknown compiler", "",
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MINT__
|
||||||
|
"Atari TOS/MiNT",
|
||||||
|
#else
|
||||||
|
"Atari TOS",
|
||||||
|
#endif
|
||||||
|
|
||||||
|
" (Atari ST/TT/Falcon030)",
|
||||||
|
|
||||||
|
#ifdef __DATE__
|
||||||
|
" on ", __DATE__
|
||||||
|
#else
|
||||||
|
"", ""
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
(*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0);
|
||||||
|
|
||||||
|
} /* end function version() */
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
8
unzip/unzip-5.52/atari/make_unz.mup
Normal file
8
unzip/unzip-5.52/atari/make_unz.mup
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#rm -f *.o *.ttp *.sym
|
||||||
|
#make370 SHELL=/bin/mupfel.ttp CFLAGS=" -O -DATARI" unzips
|
||||||
|
make370 SHELL=/bin/mupfel.ttp CFLAGS="-g -D__NO_INLINE__ -DATARI" E=.ttp unzip.ttp LF2=
|
||||||
|
make370 SHELL=/bin/mupfel.ttp CFLAGS="-g -D__NO_INLINE__ -DATARI" E=.sym unzip.sym LF2="-B/bin/sym-"
|
||||||
|
#make370 SHELL=/bin/mupfel.ttp CFLAGS="-O -DATARI" -n unzips > make_all.mup
|
||||||
|
#fixstk 32K pgp.ttp
|
||||||
|
prgflags 017 007 *.ttp
|
||||||
|
|
10
unzip/unzip-5.52/atheos/Contents
Normal file
10
unzip/unzip-5.52/atheos/Contents
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Contents of the "atheos" sub-directory for UnZip 5.52 and later:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
README notes from the author of the AtheOS port
|
||||||
|
Makefile makefile for building UnZip
|
||||||
|
athcfg.h AtheOS-specific configuration settings
|
||||||
|
atheos.c AtheOS-specific routines (similar to the BeOS/Unix ones)
|
||||||
|
atheos.h structures for the AtheOS extra field
|
||||||
|
|
||||||
|
- Ruslan Nickolaev (nruslan@hotbox.ru)
|
308
unzip/unzip-5.52/atheos/Makefile
Normal file
308
unzip/unzip-5.52/atheos/Makefile
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# Makefile for Info-ZIP's unzip, unzipsfx, and funzip on AtheOS
|
||||||
|
# Version 5.52
|
||||||
|
#
|
||||||
|
# Copyright (C) 1998-2001 Info-ZIP
|
||||||
|
# Chris Herborth (chrish@qnx.com)
|
||||||
|
# Copyright (C) 2004 Nikolaev Ruslan (nruslan@hotbox.ru)
|
||||||
|
#
|
||||||
|
# To automatically install the fresh new unzip, use the "install" target:
|
||||||
|
# make -f atheos/Makefile install
|
||||||
|
######################################################################
|
||||||
|
SHELL = /bin/bash
|
||||||
|
|
||||||
|
# Punish those of you not running on SMP hardware...
|
||||||
|
MAKE = make -j 4 -f atheos/Makefile
|
||||||
|
|
||||||
|
# UnZipSFX flags
|
||||||
|
SL = -o unzipsfx
|
||||||
|
SL2 = $(LF2)
|
||||||
|
|
||||||
|
# fUnZip flags
|
||||||
|
FL = -o funzip
|
||||||
|
FL2 = $(LF2)
|
||||||
|
|
||||||
|
# general-purpose stuff
|
||||||
|
CP = cp
|
||||||
|
AS = as
|
||||||
|
RM = rm -f
|
||||||
|
LN = ln -sf
|
||||||
|
CHMOD = chmod
|
||||||
|
E =
|
||||||
|
O = .o
|
||||||
|
M = atheos
|
||||||
|
|
||||||
|
OSDEP_H = atheos/athcfg.h
|
||||||
|
|
||||||
|
# define
|
||||||
|
|
||||||
|
# object files
|
||||||
|
OBJS1 = unzip$O crc_i386$O crctab$O crypt$O envargs$O explode$O
|
||||||
|
OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O
|
||||||
|
OBJS3 = process$O ttyio$O unreduce$O unshrink$O zipinfo$O
|
||||||
|
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O
|
||||||
|
LOBJS = $(OBJS)
|
||||||
|
OBJSDLL = $(OBJS) api$O
|
||||||
|
OBJX = unzipsfx$O crc_i386$O crctab_$O crypt_$O extract_$O fileio_$O globals_$O inflate_$O match_$O process_$O ttyio_$O $M_$O
|
||||||
|
LOBJX = $(OBJX)
|
||||||
|
OBJF = funzip$O crc_i386$O cryptf$O globalsf$O inflatef$O ttyiof$O
|
||||||
|
UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H)
|
||||||
|
|
||||||
|
# installation
|
||||||
|
INSTALL = install
|
||||||
|
manext = 1
|
||||||
|
prefix = /usr
|
||||||
|
BINDIR = $(prefix)/bin
|
||||||
|
MANDIR = $(prefix)/man/man$(manext)
|
||||||
|
INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/zipinfo$E $(BINDIR)/unzipsfx$E $(BINDIR)/unzip$E
|
||||||
|
INSTALLEDMAN = $(MANDIR)/unzip.$(manext) $(MANDIR)/funzip.$(manext) $(MANDIR)/unzipsfx.$(manext) $(MANDIR)/zipinfo.$(manext)
|
||||||
|
#
|
||||||
|
UNZIPS = unzip$E funzip$E unzipsfx$E zipinfo$E
|
||||||
|
# this is a little ugly...well, no, it's a lot ugly:
|
||||||
|
MANS = man/unzip.1 man/unzipsfx.1 man/zipinfo.1 man/funzip.1 man/zipgrep.1
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
CC=gcc
|
||||||
|
LD=gcc
|
||||||
|
CF=-O3 -march=i586 -Wall -I. -DPASSWD_FROM_STDIN -DASM_CRC -DUSE_UNSHRINK $(LOCAL_UNZIP)
|
||||||
|
LF=-o unzip
|
||||||
|
LF2=
|
||||||
|
TARGET=$(UNZIPS)
|
||||||
|
######################################################################
|
||||||
|
# Helpful targets
|
||||||
|
all:
|
||||||
|
@echo 'TARGET = $(TARGET)'
|
||||||
|
@echo 'CC = $(CC)'
|
||||||
|
if [ -n "$(TARGET)" ] ; then \
|
||||||
|
$(MAKE) CC=$(CC) CF="$(CF)" LD="$(LD)" \
|
||||||
|
LF="$(LF)" LF2="$(LF2)" CCPP="$(CC)" CPPF="$(CF)" \
|
||||||
|
OBJS="$(OBJS)" LOBJS="$(LOBJS)" OBJX="$(OBJX)" \
|
||||||
|
LOBJX="$(LOBJX)" $(TARGET) ; \
|
||||||
|
else \
|
||||||
|
$(MAKE) help ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo ''
|
||||||
|
@echo "This Makefile lets you build Info-ZIP's zip."
|
||||||
|
@echo ''
|
||||||
|
@echo 'To build zip for this computer using the default compiler, just do:'
|
||||||
|
@echo ''
|
||||||
|
@echo ' make -f atheos/Makefile'
|
||||||
|
@echo ''
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Basic compile instructions and dependencies
|
||||||
|
|
||||||
|
# this is for GNU make; comment out and notify zip-bugs if it causes errors
|
||||||
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
|
# default for compiling C files
|
||||||
|
.c.o:
|
||||||
|
$(CC) -c $(CF) $*.c
|
||||||
|
|
||||||
|
|
||||||
|
unzips: $(UNZIPS)
|
||||||
|
objs: $(OBJS)
|
||||||
|
objsdll: $(OBJSDLL)
|
||||||
|
unzipsman: unzips
|
||||||
|
|
||||||
|
|
||||||
|
unzip$E: $(OBJS)
|
||||||
|
$(LD) $(LF) $(LOBJS) $(LF2)
|
||||||
|
$(CHMOD) +x unzip$E
|
||||||
|
|
||||||
|
unzipsfx$E: $(OBJX)
|
||||||
|
$(LD) $(SL) $(LOBJX) $(SL2)
|
||||||
|
$(CHMOD) +x unzipsfx$E
|
||||||
|
|
||||||
|
funzip$E: $(OBJF)
|
||||||
|
$(LD) $(FL) $(OBJF) $(FL2)
|
||||||
|
$(CHMOD) +x funzip$E
|
||||||
|
|
||||||
|
zipinfo$E: unzip$E
|
||||||
|
$(LN) unzip$E zipinfo$E
|
||||||
|
|
||||||
|
crctab$O: crctab.c $(UNZIP_H) zip.h
|
||||||
|
crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
envargs$O: envargs.c $(UNZIP_H)
|
||||||
|
explode$O: explode.c $(UNZIP_H)
|
||||||
|
extract$O: extract.c $(UNZIP_H) crypt.h
|
||||||
|
fileio$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
funzip$O: funzip.c $(UNZIP_H) crypt.h ttyio.h tables.h
|
||||||
|
globals$O: globals.c $(UNZIP_H)
|
||||||
|
inflate$O: inflate.c inflate.h $(UNZIP_H)
|
||||||
|
list$O: list.c $(UNZIP_H)
|
||||||
|
match$O: match.c $(UNZIP_H)
|
||||||
|
process$O: process.c $(UNZIP_H)
|
||||||
|
ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
unreduce$O: unreduce.c $(UNZIP_H)
|
||||||
|
unshrink$O: unshrink.c $(UNZIP_H)
|
||||||
|
unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
||||||
|
zipinfo$O: zipinfo.c $(UNZIP_H)
|
||||||
|
|
||||||
|
crc_i386$O: crc_i386.S
|
||||||
|
$(CC) -E crc_i386.S > crc_i386s.s
|
||||||
|
$(AS) -o $@ crc_i386s.s
|
||||||
|
$(RM) crc_i386s.s
|
||||||
|
|
||||||
|
unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h # unzipsfx only
|
||||||
|
$(CP) unzip.c unzipsfx.c
|
||||||
|
$(CC) -c $(CF) -DSFX unzipsfx.c
|
||||||
|
$(RM) unzipsfx.c
|
||||||
|
|
||||||
|
match_$O: match.c # unzipsfx only
|
||||||
|
$(CP) match.c match_.c
|
||||||
|
$(CC) -c $(CF) -DSFX match_.c
|
||||||
|
$(RM) match_.c
|
||||||
|
|
||||||
|
crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) crypt.c crypt_.c
|
||||||
|
$(CC) -c $(CF) -DSFX crypt_.c
|
||||||
|
$(RM) crypt_.c
|
||||||
|
|
||||||
|
crctab_$O: crctab.c $(UNZIP_H) zip.h # unzipsfx only
|
||||||
|
$(CP) crctab.c crctab_.c
|
||||||
|
$(CC) -c $(CF) -DSFX crctab_.c
|
||||||
|
$(RM) crctab_.c
|
||||||
|
|
||||||
|
fileio_$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h # unzipsfx only
|
||||||
|
$(CP) fileio.c fileio_.c
|
||||||
|
$(CC) -c $(CF) -DSFX fileio_.c
|
||||||
|
$(RM) fileio_.c
|
||||||
|
|
||||||
|
extract_$O: extract.c $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) extract.c extract_.c
|
||||||
|
$(CC) -c $(CF) -DSFX extract_.c
|
||||||
|
$(RM) extract_.c
|
||||||
|
|
||||||
|
globals_$O: globals.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) globals.c globals_.c
|
||||||
|
$(CC) -c $(CF) -DSFX globals_.c
|
||||||
|
$(RM) globals_.c
|
||||||
|
|
||||||
|
inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) inflate.c inflate_.c
|
||||||
|
$(CC) -c $(CF) -DSFX inflate_.c
|
||||||
|
$(RM) inflate_.c
|
||||||
|
|
||||||
|
process_$O: process.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) process.c process_.c
|
||||||
|
$(CC) -c $(CF) -DSFX process_.c
|
||||||
|
$(RM) process_.c
|
||||||
|
|
||||||
|
ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) ttyio.c ttyio_.c
|
||||||
|
$(CC) -c $(CF) -DSFX ttyio_.c
|
||||||
|
$(RM) ttyio_.c
|
||||||
|
|
||||||
|
cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) crypt.c cryptf.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP cryptf.c
|
||||||
|
$(RM) cryptf.c
|
||||||
|
|
||||||
|
globalsf$O: globals.c $(UNZIP_H) # funzip only
|
||||||
|
$(CP) globals.c globalsf.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP globalsf.c
|
||||||
|
$(RM) globalsf.c
|
||||||
|
|
||||||
|
inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h # funzip only
|
||||||
|
$(CP) inflate.c inflatef.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP inflatef.c
|
||||||
|
$(RM) inflatef.c
|
||||||
|
|
||||||
|
ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) ttyio.c ttyiof.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP ttyiof.c
|
||||||
|
$(RM) ttyiof.c
|
||||||
|
|
||||||
|
atheos$O: atheos/atheos.c $(UNZIP_H) unzvers.h atheos/atheos.h # AtheOS only
|
||||||
|
$(CC) -c $(CF) atheos/atheos.c
|
||||||
|
|
||||||
|
# version() not used by unzipsfx, so no unzvers.h dependency
|
||||||
|
atheos_$O: atheos/atheos.c $(UNZIP_H) atheos/atheos.h # unzipsfx only
|
||||||
|
$(CP) atheos/atheos.c atheos_.c
|
||||||
|
$(CC) -c $(CF) -Iatheos -DSFX atheos_.c
|
||||||
|
$(RM) atheos_.c
|
||||||
|
|
||||||
|
# this really only works for Unix targets, unless E and O specified on cmd line
|
||||||
|
clean:
|
||||||
|
$(RM) $(UNZIPS) $(OBJS) $(OBJF) $(OBJX) api$O apihelp$O crc_gcc$O unzipstb$O
|
||||||
|
|
||||||
|
install: all
|
||||||
|
$(INSTALL) -m 755 $(UNZIPS) $(BINDIR)
|
||||||
|
$(RM) $(BINDIR)/zipinfo$E
|
||||||
|
$(LN) unzip$E $(BINDIR)/zipinfo$E
|
||||||
|
$(RM) $(BINDIR)/zipgrep$E
|
||||||
|
$(INSTALL) -m 755 unix/zipgrep $(BINDIR)/zipgrep$E
|
||||||
|
$(INSTALL) -m 644 man/unzip.1 $(MANDIR)/unzip.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/zipinfo.1 $(MANDIR)/zipinfo.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/funzip.1 $(MANDIR)/funzip.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/zipgrep.1 $(MANDIR)/zipgrep.$(manext)
|
||||||
|
|
||||||
|
# alternatively, could use zip method: -cd $(BINDIR); $(RM) $(UNZIPS) [etc.]
|
||||||
|
uninstall:
|
||||||
|
$(RM) $(INSTALLEDBIN) $(INSTALLEDMAN)
|
||||||
|
|
||||||
|
|
||||||
|
TESTZIP = testmake.zip # the test zipfile
|
||||||
|
|
||||||
|
# test some basic features of the build
|
||||||
|
test: check
|
||||||
|
|
||||||
|
check:
|
||||||
|
@echo '##### This is a Unix-specific target. (Just so you know.)'
|
||||||
|
@echo '##### Make sure unzip, funzip and unzipsfx are compiled and'
|
||||||
|
@echo '##### in this directory.'
|
||||||
|
@if test ! -f ./unzip; then \
|
||||||
|
echo "##### ERROR: can't find ./unzip"; exit 1; fi
|
||||||
|
@if test ! -f ./funzip; then \
|
||||||
|
echo "##### ERROR: can't find ./funzip"; exit 1; fi
|
||||||
|
@if test ! -f ./unzipsfx; then \
|
||||||
|
echo "##### ERROR: can't find ./unzipsfx"; exit 1; fi
|
||||||
|
#
|
||||||
|
@if test ! -f $(TESTZIP); then \
|
||||||
|
echo "##### ERROR: can't find test file $(TESTZIP)"; exit 1; fi
|
||||||
|
#
|
||||||
|
@echo "##### testing extraction"
|
||||||
|
@./unzip -bo $(TESTZIP) testmake.zipinfo
|
||||||
|
@if test ! -f testmake.zipinfo ; then \
|
||||||
|
echo "##### ERROR: file extraction from $(TESTZIP) failed"; \
|
||||||
|
exit 1; fi
|
||||||
|
#
|
||||||
|
@echo '##### testing zipinfo (unzip -Z)'
|
||||||
|
@./unzip -Z $(TESTZIP) > testmake.unzip-Z
|
||||||
|
@if diff testmake.unzip-Z testmake.zipinfo; then echo "OK."; else \
|
||||||
|
echo "##### WARNING: zipinfo output doesn't match stored version"; \
|
||||||
|
echo '##### (If the only difference is the file times, compare your'; \
|
||||||
|
echo '##### timezone with the Central European timezone, which is one'; \
|
||||||
|
echo '##### hour east of Greenwich but effectively 2 hours east'; \
|
||||||
|
echo '##### during summer Daylight Savings Time. The upper two'; \
|
||||||
|
echo '##### lines should correspond to your local time when the'; \
|
||||||
|
echo '##### files were created, on 19 November 1998 at 10:46pm CET.'; \
|
||||||
|
echo '##### If the times are consistent, please ignore this warning.)'; \
|
||||||
|
fi
|
||||||
|
@$(RM) testmake.unzip-Z testmake.zipinfo
|
||||||
|
#
|
||||||
|
@echo '##### testing unzip -d exdir option'
|
||||||
|
@./unzip -bo $(TESTZIP) -d testun notes
|
||||||
|
@cat testun/notes
|
||||||
|
#
|
||||||
|
@echo '##### testing unzip -o and funzip (ignore funzip warning)'
|
||||||
|
@./unzip -boq $(TESTZIP) notes -d testun
|
||||||
|
@./funzip < $(TESTZIP) > testun/notes2
|
||||||
|
@if diff testun/notes testun/notes2; then true; else \
|
||||||
|
echo '##### ERROR: funzip output disagrees with unzip'; fi
|
||||||
|
#
|
||||||
|
@echo '##### testing unzipsfx (self-extractor)'
|
||||||
|
@cat unzipsfx $(TESTZIP) > testsfx
|
||||||
|
@$(CHMOD) 0700 testsfx
|
||||||
|
@./testsfx -bo notes
|
||||||
|
@if diff notes testun/notes; then true; else \
|
||||||
|
echo '##### ERROR: unzipsfx file disagrees with unzip'; fi
|
||||||
|
@$(RM) testsfx notes testun/notes testun/notes2
|
||||||
|
@rmdir testun
|
||||||
|
#
|
||||||
|
@echo '##### testing complete.'
|
16
unzip/unzip-5.52/atheos/README
Normal file
16
unzip/unzip-5.52/atheos/README
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
UnZip 5.51 for AtheOS/Syllable
|
||||||
|
|
||||||
|
This port is based on both BeOS and UNIX versions.
|
||||||
|
As BeOS version it can extract specific file attributes.
|
||||||
|
|
||||||
|
TODO
|
||||||
|
----
|
||||||
|
There is only one thing to be fixed:
|
||||||
|
write_attr() should return count of bytes written. However that's a bug
|
||||||
|
related with AFS only.
|
||||||
|
|
||||||
|
Please report any bugs to Zip-Bugs@lists.wku.edu.
|
||||||
|
If this bug related with AtheOS/Syllable only, you can mail me directly:
|
||||||
|
nruslan@hotbox.ru.
|
||||||
|
- Ruslan Nickolaev (nruslan@hotbox.ru)
|
||||||
|
Sep 06/2004
|
70
unzip/unzip-5.52/atheos/athcfg.h
Normal file
70
unzip/unzip-5.52/atheos/athcfg.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
AtheOS/Syllable specific configuration section:
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __athcfg_h
|
||||||
|
#define __athcfg_h
|
||||||
|
|
||||||
|
/* ensure that Unix-specific code portions are excluded */
|
||||||
|
#ifdef UNIX
|
||||||
|
# undef UNIX
|
||||||
|
#endif
|
||||||
|
#include <sys/types.h> /* off_t, time_t, dev_t, ... */
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <fcntl.h> /* O_BINARY for open() w/o CR/LF translation */
|
||||||
|
#include <limits.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <utime.h>
|
||||||
|
|
||||||
|
#define GOT_UTIMBUF
|
||||||
|
#define DIRENT
|
||||||
|
#if (!defined(HAVE_STRNICMP) & !defined(NO_STRNICMP))
|
||||||
|
# define NO_STRNICMP
|
||||||
|
#endif
|
||||||
|
#define INT_SPRINTF
|
||||||
|
#define SYMLINKS
|
||||||
|
|
||||||
|
#ifndef DATE_FORMAT
|
||||||
|
# define DATE_FORMAT DF_MDY /* GRR: customize with locale.h somehow? */
|
||||||
|
#endif
|
||||||
|
#define lenEOL 1
|
||||||
|
#define PutNativeEOL *q++ = native(LF);
|
||||||
|
#define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols)
|
||||||
|
#define SCREENWIDTH 80
|
||||||
|
#define SCREENLWRAP 1
|
||||||
|
#if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME))
|
||||||
|
# define USE_EF_UT_TIME
|
||||||
|
#endif
|
||||||
|
#define SET_SYMLINK_ATTRIBS
|
||||||
|
#define SET_DIR_ATTRIB
|
||||||
|
#if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
|
||||||
|
# define TIMESTAMP
|
||||||
|
#endif
|
||||||
|
#define RESTORE_UIDGID
|
||||||
|
|
||||||
|
/* 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(). */
|
||||||
|
|
||||||
|
#endif /* !__athcfg_h */
|
1376
unzip/unzip-5.52/atheos/atheos.c
Normal file
1376
unzip/unzip-5.52/atheos/atheos.c
Normal file
File diff suppressed because it is too large
Load Diff
53
unzip/unzip-5.52/atheos/atheos.h
Normal file
53
unzip/unzip-5.52/atheos/atheos.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/* atheos.h -- A few handy things for the AtheOS port
|
||||||
|
*
|
||||||
|
* (c) 1997 Chris Herborth (chrish@qnx.com) - BeOS port
|
||||||
|
* (c) 2004 Ruslan Nickolaev (nruslan@hotbox.ru) - AtheOS port
|
||||||
|
*
|
||||||
|
* This is covered under the usual Info-ZIP copyright
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ATHEOS_H_
|
||||||
|
#define _ATHEOS_H_
|
||||||
|
|
||||||
|
#define EB_BE_FL_BADBITS 0xfe /* bits currently undefined */
|
||||||
|
|
||||||
|
/*
|
||||||
|
AtheOS 'At' extra-field layout:
|
||||||
|
(same structure as the BeOS 'Be' e.f. layout, only signature and internal
|
||||||
|
conventions of the file attribute data are different...)
|
||||||
|
|
||||||
|
'At' - signature
|
||||||
|
ef_size - size of data in this EF (little-endian unsigned short)
|
||||||
|
full_size - uncompressed data size (little-endian unsigned long)
|
||||||
|
flag - flags (byte)
|
||||||
|
flags & EB_BE_FL_UNCMPR = the data is not compressed
|
||||||
|
flags & EB_BE_FL_BADBITS = the data is corrupted or we
|
||||||
|
can't handle it properly
|
||||||
|
data - compressed or uncompressed file attribute data
|
||||||
|
|
||||||
|
If flag & EB_BE_FL_UNCMPR, the data is not compressed; this optimisation is
|
||||||
|
necessary to prevent wasted space for files with small attributes. In this
|
||||||
|
case, there should be (ef_size - EB_BEOS_HLEN) bytes of data, and full_size
|
||||||
|
should equal (ef_size - EB_BEOS_HLEN).
|
||||||
|
|
||||||
|
If the data is compressed, there will be (ef_size - EB_BEOS_HLEN) bytes of
|
||||||
|
compressed data, and full_size bytes of uncompressed data.
|
||||||
|
|
||||||
|
If a file has absolutely no attributes, there will not be a 'At' extra field.
|
||||||
|
|
||||||
|
The uncompressed data is arranged like this:
|
||||||
|
|
||||||
|
attr_name\0 - C string
|
||||||
|
struct attr_info (fields in little-endian format)
|
||||||
|
attr_data (length in attr_info.ai_size)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* _ATHEOS_H_ */
|
15
unzip/unzip-5.52/beos/Contents
Normal file
15
unzip/unzip-5.52/beos/Contents
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
Contents of the "beos" sub-directory for UnZip 5.52 and later:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
README notes from the author of the BeOS port
|
||||||
|
Makefile makefile for building UnZip (sorry, no project files)
|
||||||
|
beocfg.h BeOS-specific configuration settings
|
||||||
|
beos.c BeOS-specific routines (similar to the Unix ones)
|
||||||
|
beos.h structures for the BeOS extra field
|
||||||
|
beosmain.cpp BeOS-specific C++ routines
|
||||||
|
unzip.rsc BeOS resources for UnZip
|
||||||
|
unzipsfx.rsc BeOS resources for UnZipSFX
|
||||||
|
|
||||||
|
This port supports both Metrowerks CodeWarrior (PowerPC and x86) and GNU C.
|
||||||
|
|
||||||
|
- Chris Herborth (chrish@qnx.com)
|
414
unzip/unzip-5.52/beos/Makefile
Normal file
414
unzip/unzip-5.52/beos/Makefile
Normal file
@ -0,0 +1,414 @@
|
|||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# Makefile for Info-ZIP's unzip, unzipsfx, and funzip on BeOS
|
||||||
|
#
|
||||||
|
# Copyright (c) 1998-2004 Info-ZIP
|
||||||
|
# Chris Herborth (chrish@qnx.com)
|
||||||
|
#
|
||||||
|
# This is the new New and Improved Makefile for BeOS; it will:
|
||||||
|
#
|
||||||
|
# 1) automatically detect your platform (PowerPC or x86) if none is
|
||||||
|
# specified; the default compiler is CodeWarrior for PowerPC, or
|
||||||
|
# gcc for x86
|
||||||
|
#
|
||||||
|
# 2) let you cross-compile for the other platform (PowerPC or x86), in
|
||||||
|
# theory
|
||||||
|
#
|
||||||
|
# 3) let you use Metrowerks CodeWarrior (default) or GNU C to build with
|
||||||
|
# for either platfor, in theory
|
||||||
|
#
|
||||||
|
# To choose a specific architecture, define the ARCH environment
|
||||||
|
# variable on the make command-line:
|
||||||
|
#
|
||||||
|
# ARCH=what make -f beos/Makefile
|
||||||
|
#
|
||||||
|
# where "what" can be "powerpc" or "x86".
|
||||||
|
#
|
||||||
|
# To choose a specific compiler, define the CC environment variable on
|
||||||
|
# the make command-line:
|
||||||
|
#
|
||||||
|
# CC=compiler make -f beos/Makefile
|
||||||
|
#
|
||||||
|
# where "compiler" can be "mwcc" or "x86".
|
||||||
|
#
|
||||||
|
# Of course, you can combine these two:
|
||||||
|
#
|
||||||
|
# ARCH=powerpc CC=mwcc make -f beos/Makefile
|
||||||
|
#
|
||||||
|
# or:
|
||||||
|
#
|
||||||
|
# CC=gcc ARCH=x86 make -f beos/Makefile
|
||||||
|
#
|
||||||
|
# To automatically install the fresh new unzip, use the "install" target:
|
||||||
|
#
|
||||||
|
# make -f beos/Makefile install
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Things that don't change:
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
# Punish those of you not running on SMP hardware...
|
||||||
|
MAKE = make -j 4 -f beos/Makefile
|
||||||
|
|
||||||
|
LOC=$(LOCAL_UNZIP) -DPASSWD_FROM_STDIN
|
||||||
|
AF=$(LOC)
|
||||||
|
|
||||||
|
# UnZipSfx flags
|
||||||
|
SL = -o unzipsfx
|
||||||
|
SL2 = $(LF2)
|
||||||
|
|
||||||
|
# fUnZip flags
|
||||||
|
FL = -o funzip
|
||||||
|
FL2 = $(LF2)
|
||||||
|
|
||||||
|
# general-purpose stuff
|
||||||
|
CP = cp
|
||||||
|
RM = rm -f
|
||||||
|
LN = ln -sf
|
||||||
|
E =
|
||||||
|
O = .o
|
||||||
|
M = beos
|
||||||
|
|
||||||
|
# defaults for crc32 stuff and system-dependent headers
|
||||||
|
CRC32 = crc32
|
||||||
|
OSDEP_H = beos/beocfg.h
|
||||||
|
|
||||||
|
# object files
|
||||||
|
OBJS1 = unzip$O $(CRC32)$O crctab$O crypt$O envargs$O explode$O
|
||||||
|
OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O
|
||||||
|
OBJS3 = process$O ttyio$O unreduce$O unshrink$O zipinfo$O
|
||||||
|
OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O $(BEOS_MAIN)
|
||||||
|
LOBJS = $(OBJS)
|
||||||
|
OBJSDLL = $(OBJS) api$O
|
||||||
|
OBJX = unzipsfx$O $(CRC32)$O crctab_$O crypt_$O extract_$O fileio_$O \
|
||||||
|
globals_$O inflate_$O match_$O process_$O ttyio_$O $M_$O $(BEOS_MAIN)
|
||||||
|
LOBJX = $(OBJX)
|
||||||
|
OBJF = funzip$O $(CRC32)$O cryptf$O globalsf$O inflatef$O ttyiof$O
|
||||||
|
UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H)
|
||||||
|
|
||||||
|
# installation
|
||||||
|
INSTALL = install
|
||||||
|
# on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
|
||||||
|
manext = 1
|
||||||
|
prefix = /boot/home/config
|
||||||
|
BINDIR = $(prefix)/bin# where to install executables
|
||||||
|
MANDIR = $(prefix)/man/man$(manext)# where to install man pages
|
||||||
|
INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/zipinfo$E $(BINDIR)/unzipsfx$E \
|
||||||
|
$(BINDIR)/unzip$E
|
||||||
|
INSTALLEDMAN = $(MANDIR)/unzip.$(manext) $(MANDIR)/funzip.$(manext) \
|
||||||
|
$(MANDIR)/unzipsfx.$(manext) $(MANDIR)/zipinfo.$(manext)
|
||||||
|
#
|
||||||
|
UNZIPS = unzip$E funzip$E unzipsfx$E zipinfo$E
|
||||||
|
# this is a little ugly...well, no, it's a lot ugly:
|
||||||
|
MANS = man/unzip.1 man/unzipsfx.1 man/zipinfo.1 man/funzip.1 man/zipgrep.1
|
||||||
|
DOCS = unzip.txt unzipsfx.txt zipinfo.txt funzip.txt zipgrep.txt
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Things that change:
|
||||||
|
|
||||||
|
# Select an architecture:
|
||||||
|
ifndef ARCH
|
||||||
|
MACHINE=$(shell uname -m)
|
||||||
|
ifeq "$(MACHINE)" "BePC"
|
||||||
|
ARCH=x86
|
||||||
|
CC=gcc
|
||||||
|
else
|
||||||
|
ARCH=powerpc
|
||||||
|
CC=mwcc
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Now select compiler flags and whatnot based on the ARCH and CC:
|
||||||
|
WHAT=$(ARCH)-$(CC)
|
||||||
|
|
||||||
|
ifeq "$(WHAT)" "powerpc-mwcc"
|
||||||
|
CC=mwccppc
|
||||||
|
LD=mwccppc
|
||||||
|
CF=-w9 -O7 -opt schedule604 -rostr -I. $(LOC)
|
||||||
|
LF=-o unzip
|
||||||
|
LF2=-warn -L/boot/develop/lib/ppc -lbe -lroot
|
||||||
|
BEOS_MAIN=beosmain$O
|
||||||
|
TARGET=$(UNZIPS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq "$(WHAT)" "powerpc-gcc"
|
||||||
|
CC=gcc
|
||||||
|
LD=gcc
|
||||||
|
CF=-O3 -mcpu=604 -Wall -ansi -I. -I/boot/develop/headers/be/support \
|
||||||
|
-I/boot/develop/headers/be/storage $(LOC)
|
||||||
|
LF=-o unzip
|
||||||
|
LF2=-L/boot/develop/lib/ppc -lbe -lroot
|
||||||
|
BEOS_MAIN=beosmain$O
|
||||||
|
TARGET=$(UNZIPS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# This isn't likely to happen for R4 or later...
|
||||||
|
ifeq "$(WHAT)" "x86-mwcc"
|
||||||
|
CC=mwccx86
|
||||||
|
LD=mwccx86
|
||||||
|
CF=-O2 -w9 -I. $(LOC)
|
||||||
|
LF=-o unzip
|
||||||
|
LF2=-warn -L/boot/develop/lib/x86 -lbe -lroot
|
||||||
|
BEOS_MAIN=beosmain$O
|
||||||
|
TARGET=$(UNZIPS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq "$(WHAT)" "x86-gcc"
|
||||||
|
CC=gcc
|
||||||
|
LD=gcc
|
||||||
|
CF=-O3 -mpentiumpro \
|
||||||
|
-Wall -Wno-multichar -Wno-trigraphs \
|
||||||
|
-ansi -I. -I/boot/develop/headers/be/support \
|
||||||
|
-I/boot/develop/headers/be/storage $(LOC)
|
||||||
|
LF=-o unzip
|
||||||
|
LF2=-L/boot/develop/lib/x86 -lbe -lroot
|
||||||
|
BEOS_MAIN=beosmain$O
|
||||||
|
TARGET=$(UNZIPS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifndef TARGET
|
||||||
|
TARGET=help
|
||||||
|
endif
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Helpful targets
|
||||||
|
all:
|
||||||
|
@echo 'TARGET = $(TARGET)'
|
||||||
|
@echo 'ARCH = $(ARCH)'
|
||||||
|
@echo 'CC = $(CC)'
|
||||||
|
if [ -n "$(TARGET)" ] ; then \
|
||||||
|
$(MAKE) CC=$(CC) CF="$(CF)" LD="$(LD)" \
|
||||||
|
LF="$(LF)" LF2="$(LF2)" CCPP="$(CC)" CPPF="$(CF)" \
|
||||||
|
OBJS="$(OBJS)" LOBJS="$(LOBJS)" OBJX="$(OBJX)" \
|
||||||
|
LOBJX="$(LOBJX)" $(TARGET) ; \
|
||||||
|
else \
|
||||||
|
$(MAKE) help ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo ''
|
||||||
|
@echo "This Makefile lets you build Info-ZIP's zip."
|
||||||
|
@echo ''
|
||||||
|
@echo 'To build zip for this computer using the default compiler, just do:'
|
||||||
|
@echo ''
|
||||||
|
@echo ' make -f beos/Makefile'
|
||||||
|
@echo ''
|
||||||
|
@echo 'To build zip for a specific architecture using a specific'
|
||||||
|
@echo 'compiler, do:'
|
||||||
|
@echo ''
|
||||||
|
@echo ' ARCH=cpu CC=compiler make -f beos/Makefile'
|
||||||
|
@echo ''
|
||||||
|
@echo 'Where:'
|
||||||
|
@echo ' cpu is either "powerpc" or "x86"'
|
||||||
|
@echo ' compiler is either "mwcc" or "gcc"'
|
||||||
|
@echo ''
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Basic compile instructions and dependencies
|
||||||
|
|
||||||
|
# this is for GNU make; comment out and notify zip-bugs if it causes errors
|
||||||
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
|
# default for compiling C files
|
||||||
|
.c.o:
|
||||||
|
$(CC) -c $(CF) $*.c
|
||||||
|
|
||||||
|
|
||||||
|
unzips: $(UNZIPS)
|
||||||
|
objs: $(OBJS)
|
||||||
|
objsdll: $(OBJSDLL)
|
||||||
|
docs: $(DOCS)
|
||||||
|
unzipsman: unzips docs
|
||||||
|
unzipsdocs: unzips docs
|
||||||
|
|
||||||
|
|
||||||
|
unzip$E: $(OBJS) beos/unzip.rsc
|
||||||
|
$(LD) $(LF) $(LOBJS) $(LF2)
|
||||||
|
chmod +x unzip$E
|
||||||
|
xres -o unzip$E beos/unzip.rsc
|
||||||
|
mimeset -f -all unzip$E
|
||||||
|
|
||||||
|
unzipsfx$E: $(OBJX) beos/unzipsfx.rsc
|
||||||
|
$(LD) $(SL) $(LOBJX) $(SL2)
|
||||||
|
chmod +x unzipsfx$E
|
||||||
|
xres -o unzipsfx$E beos/unzipsfx.rsc
|
||||||
|
mimeset -f -all unzipsfx
|
||||||
|
|
||||||
|
funzip$E: $(OBJF)
|
||||||
|
$(LD) $(FL) $(OBJF) $(FL2)
|
||||||
|
chmod +x funzip$E
|
||||||
|
|
||||||
|
zipinfo$E: unzip$E
|
||||||
|
$(LN) unzip$E zipinfo$E
|
||||||
|
|
||||||
|
|
||||||
|
crc32$O: crc32.c $(UNZIP_H) zip.h
|
||||||
|
crctab$O: crctab.c $(UNZIP_H) zip.h
|
||||||
|
crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
envargs$O: envargs.c $(UNZIP_H)
|
||||||
|
explode$O: explode.c $(UNZIP_H)
|
||||||
|
extract$O: extract.c $(UNZIP_H) crypt.h
|
||||||
|
fileio$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
||||||
|
funzip$O: funzip.c $(UNZIP_H) crypt.h ttyio.h tables.h
|
||||||
|
globals$O: globals.c $(UNZIP_H)
|
||||||
|
inflate$O: inflate.c inflate.h $(UNZIP_H)
|
||||||
|
list$O: list.c $(UNZIP_H)
|
||||||
|
match$O: match.c $(UNZIP_H)
|
||||||
|
process$O: process.c $(UNZIP_H)
|
||||||
|
ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
||||||
|
unreduce$O: unreduce.c $(UNZIP_H)
|
||||||
|
unshrink$O: unshrink.c $(UNZIP_H)
|
||||||
|
unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
||||||
|
zipinfo$O: zipinfo.c $(UNZIP_H)
|
||||||
|
|
||||||
|
unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h # unzipsfx only
|
||||||
|
$(CP) unzip.c unzipsfx.c
|
||||||
|
$(CC) -c $(CF) -DSFX unzipsfx.c
|
||||||
|
$(RM) unzipsfx.c
|
||||||
|
|
||||||
|
crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) crypt.c crypt_.c
|
||||||
|
$(CC) -c $(CF) -DSFX crypt_.c
|
||||||
|
$(RM) crypt_.c
|
||||||
|
|
||||||
|
crctab_$O: crctab.c $(UNZIP_H) zip.h # unzipsfx only
|
||||||
|
$(CP) crctab.c crctab_.c
|
||||||
|
$(CC) -c $(CF) -DSFX crctab_.c
|
||||||
|
$(RM) crctab_.c
|
||||||
|
|
||||||
|
fileio_$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h # unzipsfx only
|
||||||
|
$(CP) fileio.c fileio_.c
|
||||||
|
$(CC) -c $(CF) -DSFX fileio_.c
|
||||||
|
$(RM) fileio_.c
|
||||||
|
|
||||||
|
extract_$O: extract.c $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) extract.c extract_.c
|
||||||
|
$(CC) -c $(CF) -DSFX extract_.c
|
||||||
|
$(RM) extract_.c
|
||||||
|
|
||||||
|
globals_$O: globals.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) globals.c globals_.c
|
||||||
|
$(CC) -c $(CF) -DSFX globals_.c
|
||||||
|
$(RM) globals_.c
|
||||||
|
|
||||||
|
inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h # unzipsfx only
|
||||||
|
$(CP) inflate.c inflate_.c
|
||||||
|
$(CC) -c $(CF) -DSFX inflate_.c
|
||||||
|
$(RM) inflate_.c
|
||||||
|
|
||||||
|
process_$O: process.c $(UNZIP_H) # unzipsfx only
|
||||||
|
$(CP) process.c process_.c
|
||||||
|
$(CC) -c $(CF) -DSFX process_.c
|
||||||
|
$(RM) process_.c
|
||||||
|
|
||||||
|
ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
||||||
|
$(CP) ttyio.c ttyio_.c
|
||||||
|
$(CC) -c $(CF) -DSFX ttyio_.c
|
||||||
|
$(RM) ttyio_.c
|
||||||
|
|
||||||
|
cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) crypt.c cryptf.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP cryptf.c
|
||||||
|
$(RM) cryptf.c
|
||||||
|
|
||||||
|
globalsf$O: globals.c $(UNZIP_H) # funzip only
|
||||||
|
$(CP) globals.c globalsf.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP globalsf.c
|
||||||
|
$(RM) globalsf.c
|
||||||
|
|
||||||
|
inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h # funzip only
|
||||||
|
$(CP) inflate.c inflatef.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP inflatef.c
|
||||||
|
$(RM) inflatef.c
|
||||||
|
|
||||||
|
ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
||||||
|
$(CP) ttyio.c ttyiof.c
|
||||||
|
$(CC) -c $(CF) -DFUNZIP ttyiof.c
|
||||||
|
$(RM) ttyiof.c
|
||||||
|
|
||||||
|
beos$O: beos/beos.c $(UNZIP_H) unzvers.h beos/beos.h # BeOS only
|
||||||
|
$(CC) -c $(CF) beos/beos.c
|
||||||
|
|
||||||
|
beosmain$O: beos/beosmain.cpp $(UNZIP_H) unzvers.h # BeOS only
|
||||||
|
$(CCPP) -c $(CPPF) beos/beosmain.cpp
|
||||||
|
|
||||||
|
# version() not used by unzipsfx, so no unzvers.h dependency
|
||||||
|
beos_$O: beos/beos.c $(UNZIP_H) beos/beos.h # unzipsfx only
|
||||||
|
$(CP) beos/beos.c beos_.c
|
||||||
|
$(CC) -c $(CF) -Ibeos -DSFX beos_.c
|
||||||
|
$(RM) beos_.c
|
||||||
|
|
||||||
|
beosmain_$O: beos/beosmain.cpp $(UNZIP_H)
|
||||||
|
$(CP) beos/beosmain.cpp beosmain_.cpp
|
||||||
|
$(CCPP) -c $(CPPF) -Ibeos -DSFX beosmain_.cpp
|
||||||
|
$(RM) beosmain_.cpp
|
||||||
|
|
||||||
|
|
||||||
|
# this really only works for Unix targets, unless E and O specified on cmd line
|
||||||
|
clean:
|
||||||
|
-rm -f $(UNZIPS) $(OBJS) $(OBJF) $(OBJX) api$O apihelp$O crc_gcc$O \
|
||||||
|
unzipstb$O beosmain.o beosmain_.o
|
||||||
|
|
||||||
|
install: all
|
||||||
|
$(INSTALL) -m 755 $(UNZIPS) $(BINDIR)
|
||||||
|
mimeset -f -all $(BINDIR)/unzip
|
||||||
|
mimeset -f -all $(BINDIR)/unzipsfx
|
||||||
|
$(RM) $(BINDIR)/zipinfo$E
|
||||||
|
$(LN) unzip$E $(BINDIR)/zipinfo$E
|
||||||
|
$(RM) $(BINDIR)/zipgrep$E
|
||||||
|
$(INSTALL) -m 755 unix/zipgrep $(BINDIR)/zipgrep$E
|
||||||
|
$(INSTALL) -m 644 man/unzip.1 $(MANDIR)/unzip.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/zipinfo.1 $(MANDIR)/zipinfo.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/funzip.1 $(MANDIR)/funzip.$(manext)
|
||||||
|
$(INSTALL) -m 644 man/zipgrep.1 $(MANDIR)/zipgrep.$(manext)
|
||||||
|
$(INSTALL) -m 644 $(DOCS) $(MANDIR)
|
||||||
|
|
||||||
|
# alternatively, could use zip method: -cd $(BINDIR); rm -f $(UNZIPS) [etc.]
|
||||||
|
uninstall:
|
||||||
|
rm -f $(INSTALLEDBIN) $(INSTALLEDMAN)
|
||||||
|
|
||||||
|
|
||||||
|
TESTZIP = testmake.zip # the test zipfile
|
||||||
|
|
||||||
|
# test some basic features of the build
|
||||||
|
test: check
|
||||||
|
|
||||||
|
check: unzips
|
||||||
|
@echo ' This is a Unix-specific target. (Just so you know.)'
|
||||||
|
@echo ' (Should work ok on BeOS... [cjh])'
|
||||||
|
if test ! -f $(TESTZIP); then \
|
||||||
|
echo " error: can't find test file $(TESTZIP)"; exit 1; fi
|
||||||
|
#
|
||||||
|
echo " testing extraction"
|
||||||
|
./unzip -b $(TESTZIP) testmake.zipinfo
|
||||||
|
if test $? ; then \
|
||||||
|
echo " error: file extraction from $(TESTZIP) failed"; exit 1; fi
|
||||||
|
#
|
||||||
|
echo ' testing zipinfo (unzip -Z)'
|
||||||
|
./unzip -Z $(TESTZIP) > testmake.unzip-Z
|
||||||
|
if diff testmake.unzip-Z testmake.zipinfo; then ;; else \
|
||||||
|
echo ' error: zipinfo output doesn't match stored version'; fi
|
||||||
|
$(RM) testmake.unzip-Z testmake.zipinfo
|
||||||
|
#
|
||||||
|
echo ' testing unzip -d exdir option'
|
||||||
|
./unzip -b $(TESTZIP) -d testun
|
||||||
|
cat testun/notes
|
||||||
|
#
|
||||||
|
echo ' testing unzip -o and funzip (ignore funzip warning)'
|
||||||
|
./unzip -boq $(TESTZIP) notes -d testun
|
||||||
|
./funzip < $(TESTZIP) > testun/notes2
|
||||||
|
if diff testun/notes testun/notes2; then ;; else \
|
||||||
|
echo 'error: funzip output disagrees with unzip'; fi
|
||||||
|
#
|
||||||
|
echo ' testing unzipsfx (self-extractor)'
|
||||||
|
cat unzipsfx $(TESTZIP) > testsfx
|
||||||
|
$(CHMOD) 0700 testsfx
|
||||||
|
./testsfx -b notes
|
||||||
|
if diff notes testun/notes; then ;; else \
|
||||||
|
echo ' error: unzipsfx file disagrees with unzip'; fi
|
||||||
|
$(RM) testsfx notes testun/notes testun/notes2
|
||||||
|
rmdir testun
|
||||||
|
#
|
||||||
|
echo ' testing complete.'
|
77
unzip/unzip-5.52/beos/README
Normal file
77
unzip/unzip-5.52/beos/README
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
UnZip 5.4 for BeOS
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
|
||||||
|
If you want to build UnZip 5.4 or later from the source, you'll need to
|
||||||
|
have the "xres" tool installed (unless you remove the "xres" lines in the
|
||||||
|
beos/Makefile). This will cease to be a problem when BeOS R4 ships this
|
||||||
|
fall. Until then, you can get xres from
|
||||||
|
ftp://ftp.be.com/pub/experimental/tools/xres-102.zip.
|
||||||
|
|
||||||
|
HISTORY
|
||||||
|
|
||||||
|
UnZip 5.30 was the first official release of Info-ZIP's UnZip to support
|
||||||
|
the filesystem in BeOS.
|
||||||
|
|
||||||
|
UnZip 5.31 added support for the new filesystem that appeared in the
|
||||||
|
Advanced Access Preview (aka DR9) Release of BeOS.
|
||||||
|
|
||||||
|
UnZip 5.32 added several important bug fixes.
|
||||||
|
|
||||||
|
UnZip 5.4:
|
||||||
|
|
||||||
|
- supports BeOS on x86 hardware (and cross-compiling, if a compiler is
|
||||||
|
present)
|
||||||
|
|
||||||
|
- ask the Registrar to assign a file type to files that don't have one
|
||||||
|
|
||||||
|
- adds a new -J option on BeOS; this lets you extract the data for a file
|
||||||
|
without restoring its file attributes (handy if you stumble on really
|
||||||
|
old BeOS ZIP archives... from before BeOS Preview Release)
|
||||||
|
|
||||||
|
- will restore attributes properly on symbolic links (you'll need
|
||||||
|
zip 2.21 or later to create ZIP files that store attributes for
|
||||||
|
symbolic links)
|
||||||
|
|
||||||
|
*** WARNING ***
|
||||||
|
You may find some extremely old BeOS zip archives that store their
|
||||||
|
file attributes differently; these will be from DR8 and earlier (when
|
||||||
|
BeOS copied the MacOS type/creator fields instead of using the current
|
||||||
|
extremely flexible scheme).
|
||||||
|
|
||||||
|
You can still unpack the _data_ in older zip files, but you won't be
|
||||||
|
able to recover the file attributes in those archives. Use the -J option
|
||||||
|
with these files or you'll get "compressed EA data missing" and "zipfile
|
||||||
|
probably corrupt" errors, even though the data is intact!
|
||||||
|
|
||||||
|
The new scheme makes handling BeOS file attributes much more robust, and
|
||||||
|
allows for possible future expansion without another round of
|
||||||
|
incompatibilities.
|
||||||
|
|
||||||
|
That's life on the edge!
|
||||||
|
*** WARNING ***
|
||||||
|
|
||||||
|
The new filesystem allows for huge files (up to several terabytes!) with
|
||||||
|
huge amounts of meta-data (up to several terabytes!). The existing ZIP
|
||||||
|
format was designed when this much data on a personal computer was
|
||||||
|
science fiction; as a result, it's quite possible that large amounts of file
|
||||||
|
attributes (more than maybe 100+K bytes) could be truncated. Zip and UnZip
|
||||||
|
try to deal with this in a fairly sensible way, working on the assumption
|
||||||
|
that the data in the file is more important than the data in the file
|
||||||
|
attributes.
|
||||||
|
|
||||||
|
One way to run into this problem is to mount an HFS volume and zip
|
||||||
|
some Mac files that have large resources attached to them. This
|
||||||
|
happens more often than you'd expect; I've seen several 0-byte files that
|
||||||
|
had over four megabytes of resources. Even more stupid, these resources
|
||||||
|
were _data_ (sound for a game), and could have been easily stored as
|
||||||
|
data...
|
||||||
|
|
||||||
|
KNOWN BUGS
|
||||||
|
|
||||||
|
None! Yahoo!
|
||||||
|
|
||||||
|
Please report any bugs to Zip-Bugs@lists.wku.edu.
|
||||||
|
|
||||||
|
- Chris Herborth (chrish@qnx.com)
|
||||||
|
November 2/1998
|
60
unzip/unzip-5.52/beos/beocfg.h
Normal file
60
unzip/unzip-5.52/beos/beocfg.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
BeOS specific configuration section:
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __beocfg_h
|
||||||
|
#define __beocfg_h
|
||||||
|
|
||||||
|
#include <sys/types.h> /* [cjh]: This is pretty much a generic */
|
||||||
|
#include <sys/stat.h> /* POSIX 1003.1 system; see beos/ for */
|
||||||
|
#include <fcntl.h> /* extra code to deal with our extra file */
|
||||||
|
#include <sys/param.h> /* attributes. */
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <utime.h>
|
||||||
|
#define DIRENT
|
||||||
|
#include <time.h>
|
||||||
|
#ifndef DATE_FORMAT
|
||||||
|
# define DATE_FORMAT DF_MDY /* GRR: customize with locale.h somehow? */
|
||||||
|
#endif
|
||||||
|
#define lenEOL 1
|
||||||
|
#define PutNativeEOL *q++ = native(LF);
|
||||||
|
#define SCREENSIZE(ttrows, ttcols) screensize(ttrows, ttcols)
|
||||||
|
#define SCREENWIDTH 80
|
||||||
|
#if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME))
|
||||||
|
# define USE_EF_UT_TIME
|
||||||
|
#endif
|
||||||
|
#define SET_SYMLINK_ATTRIBS
|
||||||
|
#define SET_DIR_ATTRIB
|
||||||
|
#if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP))
|
||||||
|
# define TIMESTAMP
|
||||||
|
#endif
|
||||||
|
#define RESTORE_UIDGID
|
||||||
|
#define NO_STRNICMP /* not in the x86 headers at least */
|
||||||
|
#define INT_SPRINTF
|
||||||
|
#define SYMLINKS
|
||||||
|
#define MAIN main_stub /* now that we're using a wrapper... */
|
||||||
|
|
||||||
|
/* 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(). */
|
||||||
|
|
||||||
|
#endif /* !__beocfg_h */
|
1485
unzip/unzip-5.52/beos/beos.c
Normal file
1485
unzip/unzip-5.52/beos/beos.c
Normal file
File diff suppressed because it is too large
Load Diff
46
unzip/unzip-5.52/beos/beos.h
Normal file
46
unzip/unzip-5.52/beos/beos.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/* beos.h -- A few handy things for the BeOS port. */
|
||||||
|
/* (c) 1997 Chris Herborth (chrish@qnx.com) */
|
||||||
|
/* This is covered under the usual Info-ZIP copyright. */
|
||||||
|
|
||||||
|
/* "#define EF_BE_FL_UNCMPR 0x01" has been moved into unzpriv.h */
|
||||||
|
#define EB_BE_FL_BADBITS 0xfe /* bits currently undefined */
|
||||||
|
|
||||||
|
#define BEOS_ASSIGN_FILETYPE 1 /* call update_mime_info() */
|
||||||
|
|
||||||
|
/*
|
||||||
|
DR9 'Be' extra-field layout:
|
||||||
|
|
||||||
|
'Be' - signature
|
||||||
|
ef_size - size of data in this EF (little-endian unsigned short)
|
||||||
|
full_size - uncompressed data size (little-endian unsigned long)
|
||||||
|
flag - flags (byte)
|
||||||
|
flags & EB_BE_FL_UNCMPR = the data is not compressed
|
||||||
|
flags & EB_BE_FL_BADBITS = the data is corrupted or we
|
||||||
|
can't handle it properly
|
||||||
|
data - compressed or uncompressed file attribute data
|
||||||
|
|
||||||
|
If flag & EB_BE_FL_UNCMPR, the data is not compressed; this optimisation is
|
||||||
|
necessary to prevent wasted space for files with small attributes (which
|
||||||
|
appears to be quite common on the Advanced Access DR9 release). In this
|
||||||
|
case, there should be ( ef_size - EB_BEOS_HLEN ) bytes of data, and full_size
|
||||||
|
should equal ( ef_size - EB_BEOS_HLEN ).
|
||||||
|
|
||||||
|
If the data is compressed, there will be ( ef_size - EB_BEOS_HLEN ) bytes of
|
||||||
|
compressed data, and full_size bytes of uncompressed data.
|
||||||
|
|
||||||
|
If a file has absolutely no attributes, there will not be a 'Be' extra field.
|
||||||
|
|
||||||
|
The uncompressed data is arranged like this:
|
||||||
|
|
||||||
|
attr_name\0 - C string
|
||||||
|
struct attr_info (fields in big-endian format)
|
||||||
|
attr_data (length in attr_info.size)
|
||||||
|
*/
|
44
unzip/unzip-5.52/beos/beosmain.cpp
Normal file
44
unzip/unzip-5.52/beos/beosmain.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
//
|
||||||
|
// WARNING: This is C++, not C! GNU C is not supported here!
|
||||||
|
//
|
||||||
|
// beos_init.cpp
|
||||||
|
//
|
||||||
|
// BeOS-specific C++ routines for use with Info-ZIP's UnZip 5.30 or later.
|
||||||
|
//
|
||||||
|
// This is necessary because we need to have an app_server connection to be
|
||||||
|
// able to ask the system to assign a MIME type to an un-typed file. Strange
|
||||||
|
// but true (the update_mime_info() call needs to send/receive messages).
|
||||||
|
//
|
||||||
|
// If you're writing your own Zip application, you probably DO NOT want to
|
||||||
|
// include this file!
|
||||||
|
|
||||||
|
#include <app/Application.h>
|
||||||
|
|
||||||
|
#ifdef SFX
|
||||||
|
const static char *unzip_signature = "application/x-vnd.Info-ZIP.UnZipSFX";
|
||||||
|
#else
|
||||||
|
const static char *unzip_signature = "application/x-vnd.Info-ZIP.UnZip";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern "C" int main_stub( int argc, char *argv[] );
|
||||||
|
|
||||||
|
int main( int argc, char **argv )
|
||||||
|
{
|
||||||
|
BApplication app( unzip_signature );
|
||||||
|
|
||||||
|
int retval = main_stub( argc, argv );
|
||||||
|
|
||||||
|
app.PostMessage( B_QUIT_REQUESTED );
|
||||||
|
app.Run();
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
BIN
unzip/unzip-5.52/beos/unzip.rsc
Normal file
BIN
unzip/unzip-5.52/beos/unzip.rsc
Normal file
Binary file not shown.
BIN
unzip/unzip-5.52/beos/unzipsfx.rsc
Normal file
BIN
unzip/unzip-5.52/beos/unzipsfx.rsc
Normal file
Binary file not shown.
159
unzip/unzip-5.52/cmsmvs/INSTALL.CMS
Normal file
159
unzip/unzip-5.52/cmsmvs/INSTALL.CMS
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
-----------------------------------------------------------------------
|
||||||
|
[Installation notes for VM/CMS port of UNZIP 5.32 and ZIP 2.2]
|
||||||
|
Additional notes from Ian E. Gorman (4/98):
|
||||||
|
|
||||||
|
I have not fully tested ZIP and UNZIP in VM (for example, I have not
|
||||||
|
tried all the options), so ZIP 2.2 for VM and UNZIP 5.32 for VM
|
||||||
|
should be regarded as beta versions. Try them out before you decide
|
||||||
|
that you can depend on them.
|
||||||
|
|
||||||
|
Most of the work for the VM port has been done by others, but I have
|
||||||
|
made some changes and compiled on a more recent version of VM/CMS. It
|
||||||
|
is possible that I have introduced new problems or undone some of the
|
||||||
|
solutions found by previous authors.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
The executables are stored in CMS "PACK" format instead of being
|
||||||
|
stored in ZIP archives. This format takes a little longer to
|
||||||
|
download, but installation is slightly simpler.
|
||||||
|
|
||||||
|
|
||||||
|
Installing UNZIP
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The UNZIP executable is supplied as the binary file UNZIP.MOD, in the
|
||||||
|
CMS "PACK" format.
|
||||||
|
|
||||||
|
You must get the UNZIP.MOD file on to your system as a binary file in
|
||||||
|
fixed recording mode, block size 1024.
|
||||||
|
|
||||||
|
If you are using FTP in CMS, you can get the file in the correct
|
||||||
|
format with the LOCSITE and BINARY commands. Assuming that the UNZIP
|
||||||
|
executable is stored on the remote site as unz532vm.mod, you could
|
||||||
|
issue the following commands
|
||||||
|
|
||||||
|
FTP where.ever.com
|
||||||
|
<enter user id and password and other stuff>
|
||||||
|
BINARY
|
||||||
|
LOCSITE FIX 1024
|
||||||
|
GET unz532vm.mod
|
||||||
|
QUIT
|
||||||
|
|
||||||
|
If you are using a 3270 terminal session to upload from a PC, you can
|
||||||
|
upload the file in the correct format with the SEND command:
|
||||||
|
|
||||||
|
SEND unz532vm.mod A: unz532vm mod a1 (RECFM F LRECL 1024
|
||||||
|
|
||||||
|
If your 3270 emulator does not have the SEND command, but is a GUI
|
||||||
|
application, it may allow you to upload from the menu bar. If so,
|
||||||
|
set your options to binary, VM/CMS, fixed record length, and a length
|
||||||
|
of 1024 before you upload.
|
||||||
|
|
||||||
|
When you get the PACKed file on your CMS minidisk, you convert it to
|
||||||
|
an executable module by using the COPY command with the UNPACK option:
|
||||||
|
|
||||||
|
COPY unz532vm mod a unzip module a1 (UNPACK OLDDATE REPLACE
|
||||||
|
|
||||||
|
You can omit the OLDDATE and REPLACE options if you want to.
|
||||||
|
|
||||||
|
|
||||||
|
Installing ZIP
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The ZIP executable is supplied as the binary file ZIP.MOD, in the CMS
|
||||||
|
"PACK" format.
|
||||||
|
|
||||||
|
You must get the ZIP.MOD file on to your system as a binary file in
|
||||||
|
fixed recording mode, block size 1024. Assuming that the file is
|
||||||
|
stored as zip22vm.mod, you can get the file the same way you got the
|
||||||
|
UNZIP.MOD file:
|
||||||
|
|
||||||
|
Using FTP:
|
||||||
|
|
||||||
|
FTP where.ever.com
|
||||||
|
<enter user id and password and other stuff>
|
||||||
|
BINARY
|
||||||
|
LOCSITE FIX 1024
|
||||||
|
GET zip22vm.mod
|
||||||
|
QUIT
|
||||||
|
|
||||||
|
Using 3270 file transfer:
|
||||||
|
|
||||||
|
SEND unz532vm.mod A: unz532vm mod a1 (RECFM F LRECL 1024
|
||||||
|
|
||||||
|
When you get the PACKed file on your CMS minidisk, you convert it to
|
||||||
|
an executable module by using the COPY command with the UNPACK option:
|
||||||
|
|
||||||
|
COPY zip22vm mod a zip module a1 (UNPACK OLDDATE REPLACE
|
||||||
|
|
||||||
|
|
||||||
|
Installing Documentation
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Once you have UNZIP running, you can use it to extract documentation
|
||||||
|
from ZIP archives.
|
||||||
|
|
||||||
|
You can transfer the ZIP archives to VMV/CMS as a binary file with any
|
||||||
|
record length. A record length of 1 will work fine:
|
||||||
|
|
||||||
|
via FTP:
|
||||||
|
|
||||||
|
FTP where.ever.com
|
||||||
|
<enter user id and password and other stuff>
|
||||||
|
BINARY
|
||||||
|
LOCSITE FIX 1
|
||||||
|
GET zip22vm.zip zipdoc.zip
|
||||||
|
GET unz532vm.zip unzipdoc.zip
|
||||||
|
QUIT
|
||||||
|
|
||||||
|
via 3270 session:
|
||||||
|
|
||||||
|
SEND zip22vm.zip A: unzipdoc zip a1 (RECFM F LRECL 1
|
||||||
|
SEND unz532vm.zip A: zipdoc zip a1 (RECFM F LRECL 1
|
||||||
|
|
||||||
|
Once you have the ZIP archives, extract the documentation to the minidisk of
|
||||||
|
your choice by using the -d option:
|
||||||
|
|
||||||
|
unzip -a -d A2 unzipdoc.zip
|
||||||
|
unzip -a -d A2 zipdoc.zip
|
||||||
|
|
||||||
|
The "-a" option is required because the documents are archived as
|
||||||
|
ASCII text files, but they must be converted to EBCDIC to read them
|
||||||
|
in VM/CMS.
|
||||||
|
|
||||||
|
|
||||||
|
Notes
|
||||||
|
=====
|
||||||
|
|
||||||
|
Different EBCDIC Character Sets
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
The documentation may look strange on your system, because UNZIP
|
||||||
|
translates from ASCII to "Open Systems" EBCDIC (IBM-1047). Unless
|
||||||
|
you are a software developer, you are probably using a different
|
||||||
|
kind of EBCDIC (like US EBCDIC, IBM-037). This causes some character
|
||||||
|
codes to display as different characters. For example, the character
|
||||||
|
codes that display as square brackets in IBM-1047 will display as
|
||||||
|
e-acute and a-grave in IBM-037.
|
||||||
|
|
||||||
|
You can use the IBM ICONV utility to translate documents from one
|
||||||
|
character set to another:
|
||||||
|
|
||||||
|
ICONV old doc a new doc a1 (FROMCODE IBM-1047 TOCODE IBM-037
|
||||||
|
|
||||||
|
|
||||||
|
IND$FILE protocol
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
This is the method by which files are transferred via 3270 sessions
|
||||||
|
between PC and mainframe.
|
||||||
|
|
||||||
|
If you know how to transfer files via 3270 session between PC and
|
||||||
|
mainframe, you know as much as you need to know about IND$FILE.
|
||||||
|
|
||||||
|
If your mainframe has IND$FILE, and your 3270 emulator does file
|
||||||
|
transfers, you can use your emulator to transfer files between PC
|
||||||
|
and mainframe.
|
434
unzip/unzip-5.52/cmsmvs/README.CMS
Normal file
434
unzip/unzip-5.52/cmsmvs/README.CMS
Normal file
@ -0,0 +1,434 @@
|
|||||||
|
Using ZIP and UNZIP on VM/CMS
|
||||||
|
=============================
|
||||||
|
|
||||||
|
|
||||||
|
Installing executables
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The following CMS MODULEs are available:
|
||||||
|
ZIP
|
||||||
|
ZIPNOTE
|
||||||
|
ZIPCLOAK
|
||||||
|
ZIPSPLIT
|
||||||
|
UNZIP
|
||||||
|
|
||||||
|
In addition to these, each MODULE file also has an EXEC with the same
|
||||||
|
name. These EXECs are front-ends to the MODULES that will attempt to
|
||||||
|
set up the required runtime libraries before running the MODULE.
|
||||||
|
All the EXECs are identical. Only their names are different.
|
||||||
|
They are stored as plain text files.
|
||||||
|
|
||||||
|
The CMS MODULE files have been packed using the COPYFILE command to
|
||||||
|
allow their file format to be properly restored, since variable length
|
||||||
|
binary files will not currently unzip properly (see below for details).
|
||||||
|
The MODULEs are shipped with a filetype or extension of CMO (for CMS
|
||||||
|
MODULE). Their names may vary on the distribution disk to indicate
|
||||||
|
their level, etc.
|
||||||
|
|
||||||
|
To restore them to executable MODULEs on CMS, do the following:
|
||||||
|
1. Upload them to CMS with a Fixed record length with LRECL 1024.
|
||||||
|
Example, from a DOS or OS/2 window, type this:
|
||||||
|
SEND unzip.cmo A:unzip module a (RECFM F LRECL 1024
|
||||||
|
|
||||||
|
Example, using FTP from CMS, type this:
|
||||||
|
BINARY FIXED 1024
|
||||||
|
GET unzip.cmo unzip.module.a
|
||||||
|
|
||||||
|
Note: Replace "unzip.cmo" with the actual name.
|
||||||
|
|
||||||
|
2. Use COPYFILE to unpack the file.
|
||||||
|
Example, in CMS type this:
|
||||||
|
COPYFILE UNZIP MODULE A (UNPACK REPLACE OLDDATE
|
||||||
|
|
||||||
|
3. Repeat steps 1-2 for each of the programs.
|
||||||
|
|
||||||
|
4. Build the ZIPINFO module by typing this:
|
||||||
|
COPYFILE UNZIP MODULE A ZIPINFO MODULE A (OLDDATE
|
||||||
|
|
||||||
|
5. Upload the EXECs to CMS as text files (with ASCII-to-EBCDIC
|
||||||
|
translation).
|
||||||
|
Example, from a DOS or OS/2 window, type this:
|
||||||
|
SEND unzip.exc A:unzip exec a (CRLF
|
||||||
|
|
||||||
|
Example, using FTP from CMS, type this:
|
||||||
|
GET unzip.exc unzip.exec.a
|
||||||
|
|
||||||
|
6. Repeat steps 4 for each of the EXECs.
|
||||||
|
|
||||||
|
|
||||||
|
Preparing the environment
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
The executables provided were compiled with IBM C 3.1.0 and
|
||||||
|
require the the Language Environment (LE) runtime libraries.
|
||||||
|
|
||||||
|
To provide access to the runtime libraries:
|
||||||
|
1. Link to the disk containing the Language Environment files,
|
||||||
|
if necessary.
|
||||||
|
|
||||||
|
2. Use the command "GLOBAL LOADLIB SCEERUN"
|
||||||
|
|
||||||
|
These commands can be placed in your PROFILE EXEC.
|
||||||
|
|
||||||
|
Note: EXECs have been provided called ZIP, UNZIP, etc. that
|
||||||
|
issue the GLOBAL LOADLIB statement. This was done to alleviate
|
||||||
|
frustration of users that don't have the GLOBAL LOADLIB statement
|
||||||
|
in their PROFILE EXEC. These EXECs may require changing for
|
||||||
|
your system.
|
||||||
|
|
||||||
|
Unfortunately, there is no way, using IBM C, to produce a MODULE
|
||||||
|
that doesn't require a runtime library.
|
||||||
|
|
||||||
|
|
||||||
|
Testing
|
||||||
|
-------
|
||||||
|
|
||||||
|
To test the MODULEs, just type ZIP or UNZIP. They should
|
||||||
|
show help information on using the commands.
|
||||||
|
|
||||||
|
If you see something like this:
|
||||||
|
DMSLIO201W The following names are undefined:
|
||||||
|
CEEEV003
|
||||||
|
DMSABE155T User abend 4093 called from 00DCD298 reason code 000003EB
|
||||||
|
|
||||||
|
Then you don't have access to the proper runtime libraries, as
|
||||||
|
described above.
|
||||||
|
|
||||||
|
Here is additional information on the ZIP and UNZIP programs that
|
||||||
|
may assist support personnel:
|
||||||
|
- Compiled with IBM C V3R1M0 on VM/ESA 2.2.0 with
|
||||||
|
CMS level 13 Service Level 702.
|
||||||
|
|
||||||
|
- Require the SCEERUN LOADLIB runtime library. This is
|
||||||
|
part of the Language Environment (LE).
|
||||||
|
|
||||||
|
- Linked with options RMODE ANY AMODE ANY RLDSAVE.
|
||||||
|
|
||||||
|
If you continue to have trouble, report the problem to Zip-Bugs
|
||||||
|
(see the bottom of this document).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Compiling the source on VM/CMS
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
The source has been successfully compiled previously using
|
||||||
|
C/370 2.1 and 2.2. The source has been recently compiled using
|
||||||
|
IBM C 3.1.0 on VM/ESA 2.2.0 with CMS level 13. I don't have
|
||||||
|
access to an MVS system so the code hasn't been tested there
|
||||||
|
in a while.
|
||||||
|
|
||||||
|
1. Unzip the source files required for CMS. The root-level files
|
||||||
|
inside the ZIP file and the files in the CMSMVS subdirectory are
|
||||||
|
needed. Example (use both commands):
|
||||||
|
unzip -aj zip23.zip -x */* -dc
|
||||||
|
unzip -aj zip23.zip cmsmvs/* -dc
|
||||||
|
|
||||||
|
This example unzips the files to the C-disk, while translating
|
||||||
|
character data and ignoring paths.
|
||||||
|
|
||||||
|
If you don't already have a working UNZIP MODULE on CMS you will
|
||||||
|
have to unzip the files on another system and transport them
|
||||||
|
to CMS. All the required files are plain text so they can
|
||||||
|
be transferred with ASCII-to-EBCDIC translations.
|
||||||
|
|
||||||
|
2. Repeat step 1 with the zip file containing the UNZIP code.
|
||||||
|
Unzip the files to a different disk than the disk used for the ZIP
|
||||||
|
code.
|
||||||
|
|
||||||
|
3. To compile the ZIP code, run the supplied CCZIP EXEC.
|
||||||
|
To compile the UNZIP code, run the supplied CCUNZIP EXEC.
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
Some of the ZIP and UNZIP source files have the same name. It is
|
||||||
|
recommended that you keep the source from each on separate disks and
|
||||||
|
move the disk you are building from ahead of the other in the search
|
||||||
|
order.
|
||||||
|
|
||||||
|
For example, you may have a 192 disk with the ZIP source code and
|
||||||
|
a 193 disk with the UNZIP source code. To compile ZIP, access
|
||||||
|
the 192 disk as B, then run CCZIP. This will create the following
|
||||||
|
modules: ZIP, ZIPNOTE, ZIPSPLIT, ZIPCLOAK.
|
||||||
|
|
||||||
|
To compile UNZIP, access 193 as B, then run CCUNZIP. This will create
|
||||||
|
the following modules: UNZIP, ZIPINFO (a copy of UNZIP).
|
||||||
|
|
||||||
|
|
||||||
|
=========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
Using ZIP/UNZIP
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Documentation for the commands is in MANUAL NONAME (for ZIP) and in
|
||||||
|
UNZIP DOC UNZIP. INFOZIP DOC describes the use of the -Z option of
|
||||||
|
UNZIP.
|
||||||
|
|
||||||
|
The rest of this section explains special notes concerning the VM/CMS
|
||||||
|
version of ZIP and UNZIP.
|
||||||
|
|
||||||
|
|
||||||
|
Filenames and directories
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
1. Specifying filenames
|
||||||
|
|
||||||
|
a. When specifying CMS files, use filename.filetype.filemode format
|
||||||
|
(separate the three parts of the name with a period and use no
|
||||||
|
spaces). Example: profile.exec.a
|
||||||
|
|
||||||
|
Unfortunately, this prevents you from using ZIP from
|
||||||
|
FILELIST. To unzip a zip file, however, you can type something
|
||||||
|
like this next to it in FILELIST:
|
||||||
|
unzip /n -d c
|
||||||
|
|
||||||
|
This will unzip the contents of the current file to a C-disk.
|
||||||
|
|
||||||
|
b. It is possible to use DD names with ZIP and UNZIP on CMS, though
|
||||||
|
it can be cumbersome. Example:
|
||||||
|
filedef out disk myzip zip a
|
||||||
|
zip dd:out file1.txt file2.txt
|
||||||
|
|
||||||
|
While you can also use a DD name for the input files, ZIP
|
||||||
|
currently does not correctly resolve the filename and will
|
||||||
|
store something like "dd:in" inside the ZIP file. A file stored
|
||||||
|
in this manor cannot easily be unzipped, as "dd:in" is an invalid
|
||||||
|
filename.
|
||||||
|
|
||||||
|
c. In places where a directory name would be used on a PC, such as
|
||||||
|
for the ZIP -b (work path) option or the UNZIP -d (destination
|
||||||
|
path) options, use a filemode letter for CMS. For example,
|
||||||
|
to unzip files onto a C-disk, you might type something like this:
|
||||||
|
unzip myzip.zip -d c
|
||||||
|
|
||||||
|
Currently, ZIP uses the A-disk for work files. When zipping
|
||||||
|
large files, you may want to specify a larger disk for work files.
|
||||||
|
This example will use a C-disk for work files.
|
||||||
|
zip -b C myzip.zip.c test.dat.a
|
||||||
|
|
||||||
|
|
||||||
|
2. Filename conversions
|
||||||
|
|
||||||
|
a. Filemode letters are never stored into the zip file or take from
|
||||||
|
a zip file. Only the filename and filetype are used.
|
||||||
|
ZIP removes the filemode when storing the filename into the
|
||||||
|
zip file. UNZIP assumes "A" for the filemode unless the -d
|
||||||
|
option is used.
|
||||||
|
|
||||||
|
b. When unzipping, any path names are removed from the fileid
|
||||||
|
and the last two period-separated words are used as the
|
||||||
|
filename and filetype. These are truncated to a maximum of
|
||||||
|
eight characters, if necessary. If the filetype (extension)
|
||||||
|
is missing, then UNZIP uses "NONAME" for the filetype.
|
||||||
|
Any '(' or ')' characters are removed from the fileid.
|
||||||
|
|
||||||
|
c. All files are created in upper-case. Files in mixed-case
|
||||||
|
cannot currently be stored into a ZIP file.
|
||||||
|
|
||||||
|
d. Shared File System (SFS) directories are not supported.
|
||||||
|
Files are always accessed by fn.ft.fm. To use an SFS disk,
|
||||||
|
Assign it a filemode, then it can be used.
|
||||||
|
|
||||||
|
|
||||||
|
3. Wildcards in file names
|
||||||
|
|
||||||
|
a. Wildcards are not supported in the zip filename. The full
|
||||||
|
filename of the zip file must be given (but the .zip is not
|
||||||
|
necessary). So, you can't do this:
|
||||||
|
unzip -t *.zip
|
||||||
|
|
||||||
|
b. Wildcards CAN be used with UNZIP to select (or exclude) files
|
||||||
|
inside a zip file. Examples:
|
||||||
|
unzip myzip *.c - Unzip all .c files.
|
||||||
|
unzip myzip *.c -x z*.c - Unzip all .c files but those
|
||||||
|
starting with Z.
|
||||||
|
|
||||||
|
c. Wildcards cannot currently be used to select files with ZIP.
|
||||||
|
So, you can't do this:
|
||||||
|
zip -a myzip *.exec
|
||||||
|
|
||||||
|
I expect to fix this for CMS in the future.
|
||||||
|
|
||||||
|
|
||||||
|
4. File timestamps
|
||||||
|
|
||||||
|
a. The dates and times of files being zipped or unzipped are not
|
||||||
|
currently read or set. When a file is zipped, the timestamp
|
||||||
|
inside the zip file will always be the current system date and
|
||||||
|
time. Likewise, when unzipping, the date and time of files
|
||||||
|
being unzipped will always be the current system date/time.
|
||||||
|
|
||||||
|
b. Existing files are assumed to be newer than files inside a zip
|
||||||
|
file when using the -f freshen option of UNZIP. This will prevent
|
||||||
|
overwriting files that may be newer than the files inside the
|
||||||
|
zip file, but also effectively prevents the -f option from working.
|
||||||
|
|
||||||
|
|
||||||
|
5. ASCII, EBCDIC, and binary data
|
||||||
|
|
||||||
|
Background
|
||||||
|
----------
|
||||||
|
Most systems create data files as just a stream of bytes. Record
|
||||||
|
breaks happen when certain characters (new line and/or carriage
|
||||||
|
return characters) are encountered in the data. How to interpret
|
||||||
|
the data in a file is up to the user. The system must be told
|
||||||
|
to either notice new line characters in the data or to assume
|
||||||
|
that the data in the file is binary data and should be read or
|
||||||
|
written as-is.
|
||||||
|
|
||||||
|
CMS and MVS are record-based systems. All files are composed
|
||||||
|
of data records. These can be stored in fixed-length files or
|
||||||
|
in variable length files. With fixed-length files, each record
|
||||||
|
is the same length. The record breaks are implied by the
|
||||||
|
LRECL (logical record length) attribute associated with the file.
|
||||||
|
With variable-length files, each record contains the length of
|
||||||
|
that record. The separation of records are not part of the
|
||||||
|
data, but part of the file structure.
|
||||||
|
|
||||||
|
This means you can store any type of data in either type of file
|
||||||
|
structure without having to worry about the data being interpreted
|
||||||
|
as a record break. Fixed-length files may have padding at the
|
||||||
|
end of the file to make up a full record. Variable-length files
|
||||||
|
have no padding, but require extra record length data be stored
|
||||||
|
with the file data.
|
||||||
|
|
||||||
|
Storing fixed-length files into a zip file is simple, because all
|
||||||
|
the data can just be dumped into the zip file and the record
|
||||||
|
format (RECFM) and logical record length (LRECL) can be stored
|
||||||
|
in the extra data area of the zip file so they can be restored
|
||||||
|
when UNZIP is used.
|
||||||
|
|
||||||
|
Storing variable-length data is harder. There is no place to put
|
||||||
|
the record length data needed for each record of the file. This
|
||||||
|
data could be written to the zip file as the first two bytes of
|
||||||
|
each record and interpreted that way by UNZIP. That would make
|
||||||
|
the data unusable on systems other than CMS and MVS, though.
|
||||||
|
|
||||||
|
Currently, there isn't a solution to this problem. Each record is
|
||||||
|
written to the zip file and the record length information is
|
||||||
|
discarded. Binary data stored in variable-length files can't be put
|
||||||
|
into a zip file then later unzipped back into the proper records.
|
||||||
|
This is fine for binary data that will be read as a stream of bytes
|
||||||
|
but not OK where the records matter, such as with CMS MODULEs.
|
||||||
|
|
||||||
|
If the data is text (character data), there is a solution.
|
||||||
|
This data can be converted into ASCII when it's stored into
|
||||||
|
a zip file. The end of each record is now marked in the file
|
||||||
|
by new line characters. Another advantage of this method is
|
||||||
|
that the data is now accessible to non-EBCDIC systems. When
|
||||||
|
the data is unzipped on CMS or MVS, it is converted back into
|
||||||
|
EBCDIC and the records are recreated into a variable-length file.
|
||||||
|
|
||||||
|
|
||||||
|
So, here's what we have...
|
||||||
|
|
||||||
|
a. To store readable text data into a zip file that can be used
|
||||||
|
on other platforms, use the -a option with ZIP to convert the
|
||||||
|
data to ASCII. These files will unzip into variable-length
|
||||||
|
files on CMS and should not contain binary data or corruption
|
||||||
|
may occur.
|
||||||
|
|
||||||
|
b. Files that were zipped on an ASCII-based system will be
|
||||||
|
automatically translated to EBCDIC when unzipped. To prevent
|
||||||
|
this (to unzip binary data on CMS that was sent from an
|
||||||
|
ASCII-based system), use the -B option with UNZIP to force Binary
|
||||||
|
mode. To zip binary files on CMS, use the -B option with ZIP to
|
||||||
|
force Binary mode. This will prevent any data conversions from
|
||||||
|
taking place.
|
||||||
|
|
||||||
|
c. When using the ZIP program without specifying the "-a" or "-B"
|
||||||
|
option, ZIP defaults to "native" (EBCDIC) mode and tries to
|
||||||
|
preserve the file information (RECFM, LRECL, and BLKSIZE). So
|
||||||
|
when you unzip a file zipped with ZIP under CMS or MVS, UNZIP
|
||||||
|
restores the file info. The output will be fixed-length if the
|
||||||
|
original was fixed and variable-length if the original was
|
||||||
|
variable.
|
||||||
|
|
||||||
|
If UNZIP gives a "write error (disk full?)" message, you may be
|
||||||
|
trying to unzip a binary file that was zipped as a text file
|
||||||
|
(without using the -B option)
|
||||||
|
|
||||||
|
|
||||||
|
Summary
|
||||||
|
-------
|
||||||
|
Here's how to ZIP the different types of files.
|
||||||
|
|
||||||
|
RECFM F text
|
||||||
|
Use the -a option with ZIP to convert to ASCII for use with other
|
||||||
|
platforms or no options for use on EBCDIC systems only.
|
||||||
|
|
||||||
|
RECFM V text
|
||||||
|
Use the -a option with ZIP to convert to ASCII for use with other
|
||||||
|
platforms or no options for use on EBCDIC systems only.
|
||||||
|
|
||||||
|
|
||||||
|
RECFM F binary
|
||||||
|
Use the -B option with ZIP (upper-case "B").
|
||||||
|
|
||||||
|
RECFM V binary
|
||||||
|
Use the -B option with ZIP. Can be zipped OK but the record
|
||||||
|
structure is destroyed when unzipped. This is OK for data files
|
||||||
|
read as binary streams but not OK for files such as CMS MODULEs.
|
||||||
|
|
||||||
|
|
||||||
|
6. Character Sets
|
||||||
|
|
||||||
|
If you are used to running UNZIP on systems like UNIX, DOS, OS/2 or
|
||||||
|
Windows, you will may have some problems with differences in the
|
||||||
|
character set.
|
||||||
|
|
||||||
|
There are a number of different EBCDIC code pages, like there are a
|
||||||
|
number of different ASCII code pages. For example, there is a US
|
||||||
|
EBCDIC, a German EBCDIC, and a Swedish EBCDIC. As long as you are
|
||||||
|
working with other people who use the same EBCDIC code page, you
|
||||||
|
will have no trouble. If you work with people who use ASCII, or who
|
||||||
|
use a different EBCDIC code page, you may need to do some
|
||||||
|
translation.
|
||||||
|
|
||||||
|
UNZIP translates ASCII text files to and from Open Systems EBCDIC
|
||||||
|
(IBM-1047), which may not be the EBCDIC that you are using. For
|
||||||
|
example, US EBCDIC (IBM-037) uses different character codes for
|
||||||
|
square brackets. In such cases, you can use the ICONV utility
|
||||||
|
(supplied with IBM C) to translate between your EBCDIC character set
|
||||||
|
and IBM-1047.
|
||||||
|
|
||||||
|
If your installation does not use IBM-1047 EBCDIC, messages from
|
||||||
|
UNZIP may look a little odd. For example, in a US EBCDIC
|
||||||
|
installation, an opening square bracket will become an i-acute and a
|
||||||
|
closing square bracket will become a u-grave.
|
||||||
|
|
||||||
|
The supplied ZIP and UNZIP EXECs attempt to correct this by setting
|
||||||
|
CMS INPUT and OUTPUT translations to adjust the display of left and
|
||||||
|
right brackets. You may need to change this if brackets don't
|
||||||
|
display correctly on your system.
|
||||||
|
|
||||||
|
|
||||||
|
7. You can unzip using VM/CMS PIPELINES so unzip can be used as
|
||||||
|
a pipeline filter. Example:
|
||||||
|
'PIPE COMMAND UNZIP -p test.zip george.test | Count Lines | Cons'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Please report all bugs and problems to:
|
||||||
|
Zip-Bugs@lists.wku.edu
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
Original CMS/MVS port by George Petrov.
|
||||||
|
e-mail: c888090@nlevdpsb.snads.philips.nl
|
||||||
|
tel: +31-40-781155
|
||||||
|
|
||||||
|
Philips C&P
|
||||||
|
Eindhoven
|
||||||
|
The Netherlands
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
Additional fixes and README re-write (4/98) by Greg Hartwig.
|
||||||
|
e-mail: ghartwig@ix.netcom.com
|
||||||
|
ghartwig@vnet.ibm.com
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
Additional notes from Ian E. Gorman.
|
||||||
|
e-mail: ian@iosphere.net
|
||||||
|
|
169
unzip/unzip-5.52/cmsmvs/README.MVS
Normal file
169
unzip/unzip-5.52/cmsmvs/README.MVS
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
Thank you for trying this port of UNZIP for VM/CMS and MVS!
|
||||||
|
|
||||||
|
Using under MVS:
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
1. To use the Info-ZIP's UNZIP under MVS you need:
|
||||||
|
|
||||||
|
- C/370 ver 2.1 compiler or another compatible compiler supporting
|
||||||
|
long names for function/variable names.
|
||||||
|
|
||||||
|
2. To compile the program under MVS do :
|
||||||
|
|
||||||
|
- unzip all the files from unz54vm.zip file. They are stored as
|
||||||
|
ASCII format so you have to unzip them first on PC or other
|
||||||
|
system that already have UNZIP, and then upload them to the
|
||||||
|
mainframe with ASCII to EBCDIC conversion.
|
||||||
|
|
||||||
|
- Copy all the .C files in the PDS called USERID.UNZIP.C
|
||||||
|
|
||||||
|
- Copy all the .H files in the PDS called USERID.UNZIP.H
|
||||||
|
|
||||||
|
- adjust the job UNZMVSC.JOB to work on your site. Change USERID
|
||||||
|
to your userid. You might need to change the CEE dataset names
|
||||||
|
to match your OS/390 system.
|
||||||
|
|
||||||
|
- Preallocate PDS datasets named: USERID.UNZIP.OBJ and
|
||||||
|
USERID.UNZIP.LOAD
|
||||||
|
|
||||||
|
- execute the job UNZMVSC to compile and link all the sources.
|
||||||
|
|
||||||
|
- if everything is ok you will get an UNZIP MODULE
|
||||||
|
|
||||||
|
3. Using UNZIP
|
||||||
|
|
||||||
|
- Just read the UNZIP.TXT
|
||||||
|
|
||||||
|
- A few exceptions concerning MVS
|
||||||
|
|
||||||
|
3.0. There are different ways to invoke UNZIP.
|
||||||
|
|
||||||
|
- allocating UNZIP.LOAD dataset to your ISPLLIB if you
|
||||||
|
want to invoke UNZIP under ISPF.
|
||||||
|
Then just type UNZIP ...parms... to get it work
|
||||||
|
|
||||||
|
- You can also call it directly with :
|
||||||
|
TSO CALL 'userid.UNZIP.LOAD(UNZIP)' '...parms...'
|
||||||
|
(notice to quotes!)
|
||||||
|
|
||||||
|
- You can even call it from a batch job like:
|
||||||
|
|
||||||
|
//MYZIP JOB (account)
|
||||||
|
//STEP1 EXEC PGM=UNZIP,PARM='-l mytestz.zip *.c'
|
||||||
|
//STEPLIB DD DSN=userid.UNZIP.LOAD,DISP=SHR
|
||||||
|
//SYSPRINT DD SYSOUT=*
|
||||||
|
|
||||||
|
This will list all the .c files from the zip file mytestz.zip
|
||||||
|
|
||||||
|
3.1. If the ZIP file has been zipped on an ASCII based system
|
||||||
|
it will be automatically translated to EBCDIC
|
||||||
|
( I hope I got all those translation tables OK :-).
|
||||||
|
You can force ASCII to EBCDIC conversion with the -a flag.
|
||||||
|
|
||||||
|
3.2. The date/time of the output files is set to the
|
||||||
|
current system date/time - not according the date/time in
|
||||||
|
the zip file.
|
||||||
|
|
||||||
|
3.3. You can even unzip using TSO/E PIPELINES
|
||||||
|
so unzip can be used as pipeline filter:
|
||||||
|
|
||||||
|
'pipe cms unzip -p test.zip george.test | count lines | cons'
|
||||||
|
( we do also a lot of pipethinking here ;-)
|
||||||
|
|
||||||
|
3.4. If you got also the ZIP program (see ZIP21VM.ZIP) you can
|
||||||
|
do zipping and unzipping without translating to ASCII
|
||||||
|
the ZIP also preserves the file informations (LRECL,BLKSIZE..)
|
||||||
|
So when you UNZIP a file zipped with ZIP under MVS it
|
||||||
|
restores the file info.
|
||||||
|
|
||||||
|
There currently some problems with file with RECFM=V*
|
||||||
|
I don't save the length of each record yet :-)
|
||||||
|
|
||||||
|
3.5. No wildcards are supported in the input zip name you have
|
||||||
|
to give the real name (.zip is not necessary)
|
||||||
|
|
||||||
|
So you CAN'T use things like: unzip -t *.zip
|
||||||
|
|
||||||
|
3.6. But you CAN use wildcards as filename selection like:
|
||||||
|
unzip -t myzip *.c - OK or even
|
||||||
|
unzip -t myzip *.c -x z*.c - to exclude all files matching
|
||||||
|
z*.c
|
||||||
|
|
||||||
|
3.7. You can unzip to a PDS using the -d parameter,
|
||||||
|
for example:
|
||||||
|
|
||||||
|
unzip -dmyzip myzip *.c
|
||||||
|
|
||||||
|
This will unzip all .c files that are in the zip file in a
|
||||||
|
PDS directory called MYZIP.C
|
||||||
|
|
||||||
|
BE AWARE that the extension of every files is being placed as
|
||||||
|
last identifier on the PDS name, so if you have a file in the
|
||||||
|
zipfile called 'testp.doc' and you use '-d mypds' the PDS
|
||||||
|
name will become 'mypds.doc(testp)'
|
||||||
|
|
||||||
|
Depending on which options IBM chose for C this week, unzip
|
||||||
|
may or may not prefix output files with your userid and/or
|
||||||
|
TSO prefix. To prevent this, quote the filename to -d, for
|
||||||
|
example
|
||||||
|
|
||||||
|
//UNZIP EXEC PGM=UNZIP,
|
||||||
|
// PARM='/-a -o ''userid.zip'' -d ''hlq.test'' *'
|
||||||
|
//STEPLIB DD DSN=USERID.UNZIP.LOAD,DISP=SHR
|
||||||
|
//SYSPRINT DD SYSOUT=*
|
||||||
|
//SYSOUT DD SYSOUT=*
|
||||||
|
|
||||||
|
The above JCL converts from ASCII to EBCDIC (-a), always
|
||||||
|
overwrites existing members (-o), extracts from 'userid.zip',
|
||||||
|
writes to files starting with 'hlq.test', all members (*).
|
||||||
|
Note the double quotes because PARM= requires single quotes.
|
||||||
|
|
||||||
|
3.8. The rules for output DCBs are a little messy. If the output
|
||||||
|
file already exists (remember the -d option) then unzip uses
|
||||||
|
the existing DCB and space values.
|
||||||
|
|
||||||
|
If the output file does not exist and the input zip came from
|
||||||
|
MVS then unzip makes its best attempt at preserving the
|
||||||
|
original DCB. However there is not enough information stored
|
||||||
|
in the zip file to do this correctly for all file types, some
|
||||||
|
file types may be corrupted.
|
||||||
|
|
||||||
|
If the output file does not exist and the input zip does not
|
||||||
|
contain MVS DCB information then unzip uses RECFM=U,
|
||||||
|
LRECL=32760 for binary data, RECFM=V, LRECL=133 for text.
|
||||||
|
Text includes ASCII to EBCDIC conversion. As soon as the
|
||||||
|
output file is created, unzip uses the same output DCB for
|
||||||
|
all following members, even if the input is a mixture of text
|
||||||
|
and binary.
|
||||||
|
|
||||||
|
In all cases, unzip has no built in parameters for space.
|
||||||
|
For a preallocated file this is not a problem. If unzip
|
||||||
|
creates an output file you get a default space allocation
|
||||||
|
which is site dependent.
|
||||||
|
|
||||||
|
It is far better to preallocate the output files with the
|
||||||
|
correct space and DCB values then use the -d option to point
|
||||||
|
to those files.
|
||||||
|
|
||||||
|
3.9. All '+','_' or '-' signs are skipped from the filenames
|
||||||
|
|
||||||
|
|
||||||
|
Please repport all bugs and problems to :
|
||||||
|
Zip-Bugs@lists.wku.edu
|
||||||
|
|
||||||
|
That's all for now.
|
||||||
|
|
||||||
|
Have fun!
|
||||||
|
|
||||||
|
|
||||||
|
George Petrov
|
||||||
|
e-mail: c888090@nlevdpsb.snads.philips.nl
|
||||||
|
tel: +31-40-781155
|
||||||
|
|
||||||
|
Philips C&P
|
||||||
|
Eindhoven
|
||||||
|
The Netherlands
|
||||||
|
|
||||||
|
Updated by:
|
||||||
|
|
||||||
|
Keith Owens <kaos@ocs.com.au>
|
27
unzip/unzip-5.52/cmsmvs/WHATSNEW.CMS
Normal file
27
unzip/unzip-5.52/cmsmvs/WHATSNEW.CMS
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Important Changes made for ZIP 2.3b and UNZIP 5.33c executables:
|
||||||
|
|
||||||
|
1. WARNING: These executables have been compiled for the
|
||||||
|
Language Environment (LE). You must now have access to the file
|
||||||
|
SCEERUN LOADLIB in order to run ZIP and UNZIP on CMS. You no longer
|
||||||
|
need access to EDCLINK LOADLIB. The provided ZIP and UNZIP EXECs
|
||||||
|
have been changed to issue a new GLOBAL LOADLIB command. You may
|
||||||
|
need to modify these EXECs for your installation. You may want to
|
||||||
|
change any GLOBAL LOADLIB command you may have in your PROFILE EXEC.
|
||||||
|
|
||||||
|
Versions could be made available for the older EDCLINK LOADLIB
|
||||||
|
runtimes upon request.
|
||||||
|
|
||||||
|
2. ZIP files will now be variable length files rather than fixed
|
||||||
|
length files.
|
||||||
|
|
||||||
|
3. Help information for ZIP and UNZIP has been changed to show
|
||||||
|
"fm" rather than "path" on CMS with certain options.
|
||||||
|
|
||||||
|
4. README CMS has been entirely rewritten. It now contains all
|
||||||
|
information for ZIP and UNZIP.
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
Greg Hartwig, April 1998.
|
||||||
|
e-mail: ghartwig@ix.netcom.com
|
||||||
|
ghartwig@vnet.ibm.com
|
||||||
|
|
78
unzip/unzip-5.52/cmsmvs/ccunzip.exec
Normal file
78
unzip/unzip-5.52/cmsmvs/ccunzip.exec
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/* CCUNZIP EXEC Compile unzip 5.4 for VM/CMS */
|
||||||
|
/* Author: George Petrov, 11 Apr 1995 (VMCOMPIL EXEC) */
|
||||||
|
/* Modified for IBM C V3R1 by Ian E. Gorman, 2 Nov 1998
|
||||||
|
Facilities for compiling and testing were provided by
|
||||||
|
OmniMark Technologies Corporation, Ottawa, Canada
|
||||||
|
*/
|
||||||
|
Address Command
|
||||||
|
Signal On Error
|
||||||
|
|
||||||
|
/* Allow longnames, compile re-entrant code.
|
||||||
|
global.c and vmmvs.c require EXTENDED features */
|
||||||
|
CCopts = 'LONGNAME RENT LANGLVL(EXTENDED) NOEXECOPS'
|
||||||
|
|
||||||
|
/* UNZIP options -- VM_CMS, REENTRANT */
|
||||||
|
CCopts = CCopts 'DEFINE(VM_CMS,REENTRANT)'
|
||||||
|
|
||||||
|
/* Link the load module to run in more or less than 16MB memory */
|
||||||
|
LINKopts = 'AMODE ANY RMODE ANY RLDSAVE'
|
||||||
|
|
||||||
|
|
||||||
|
'GLOBAL TXTLIB SCEELKED CMSLIB'
|
||||||
|
'GLOBAL LOADLIB SCEERUN'
|
||||||
|
|
||||||
|
|
||||||
|
/* produce the TEXT (object) files */
|
||||||
|
linklist=''
|
||||||
|
modname='UNZIP'
|
||||||
|
Say 'Building' modname 'MODULE...'
|
||||||
|
Call Compile 'UNZIP'
|
||||||
|
Call Compile 'CRC32'
|
||||||
|
Call Compile 'CRCTAB'
|
||||||
|
Call Compile 'CRYPT'
|
||||||
|
Call Compile 'ENVARGS'
|
||||||
|
Call Compile 'EXPLODE'
|
||||||
|
Call Compile 'EXTRACT'
|
||||||
|
Call Compile 'FILEIO'
|
||||||
|
Call Compile 'GLOBALS'
|
||||||
|
Call Compile 'INFLATE'
|
||||||
|
Call Compile 'PROCESS'
|
||||||
|
Call Compile 'LIST'
|
||||||
|
Call Compile 'MATCH'
|
||||||
|
Call Compile 'TTYIO'
|
||||||
|
Call Compile 'UNREDUCE'
|
||||||
|
Call Compile 'UNSHRINK'
|
||||||
|
Call Compile 'ZIPINFO'
|
||||||
|
Call Compile 'VMMVS'
|
||||||
|
|
||||||
|
Say 'Linking...'
|
||||||
|
'EXEC CMOD' linklist '(MODNAME' modname LINKopts
|
||||||
|
Say modname 'built successfully.'
|
||||||
|
|
||||||
|
|
||||||
|
/* Make ZIPINFO from UNZIP */
|
||||||
|
modname = 'ZIPINFO'
|
||||||
|
'COPYFILE UNZIP MODULE A ZIPINFO MODULE A (OLDDATE REPLACE'
|
||||||
|
Say modname 'built successfully.'
|
||||||
|
Say 'Done.'
|
||||||
|
|
||||||
|
Exit rc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
error:
|
||||||
|
Say 'Error' rc 'during compilation!'
|
||||||
|
Say 'Error in line' sigl':'
|
||||||
|
Say ' 'Sourceline(sigl)
|
||||||
|
Exit rc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Compile: Procedure Expose CCopts LINKopts linklist
|
||||||
|
Parse arg filename filetype filemode .
|
||||||
|
If filetype='' Then filetype='C'
|
||||||
|
linklist = linklist filename
|
||||||
|
|
||||||
|
Say 'Compiling' filename filetype filemode '...'
|
||||||
|
'EXEC CC' filename filetype filemode '('CCopts
|
||||||
|
Return rc
|
85
unzip/unzip-5.52/cmsmvs/mc.exec
Normal file
85
unzip/unzip-5.52/cmsmvs/mc.exec
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/* MAKECPIP EXEC Make program to build a C/370 module */
|
||||||
|
/* Author: George Petrov, 29 Sep 1994 */
|
||||||
|
|
||||||
|
arg fn . '(' cparms /* Filter name */
|
||||||
|
'pipe (end ?) < 'fn' makefile', /* get all source files from */
|
||||||
|
'| frlab GLOBALS:'||,
|
||||||
|
'| drop',
|
||||||
|
'| strip',
|
||||||
|
'| var globals'
|
||||||
|
cparms = cparms globals
|
||||||
|
say ''
|
||||||
|
say 'Compile options : 'cparms
|
||||||
|
say ''
|
||||||
|
if pos('REB',cparms) > 0 then do
|
||||||
|
parse var cparms cp1 'REB' . ' ' cp2 /* REBuild options specified ? */
|
||||||
|
cparms = cp1||cp2
|
||||||
|
pipe1=,
|
||||||
|
'pipe (end ?) < 'fn' makefile', /* get all source files from */
|
||||||
|
'| nfind *'||, /* the makefile and compile */
|
||||||
|
'| frlab TEXT:'||, /* only the those who are */
|
||||||
|
'| r: tolab MODULE:'||, /* changed or never compiled */
|
||||||
|
'| drop',
|
||||||
|
'| o: fanout',
|
||||||
|
'| chop before str /(/',
|
||||||
|
'| statew',
|
||||||
|
'| c: fanout', /* compiled */
|
||||||
|
'| specs /Compiling / 1 w1-3 n / .../ n',
|
||||||
|
'| cons'
|
||||||
|
end
|
||||||
|
else do
|
||||||
|
pipe1=,
|
||||||
|
'pipe (end ?) < 'fn' makefile', /* get all source files from */
|
||||||
|
'| nfind *'||, /* the makefile and compile */
|
||||||
|
'| frlab TEXT:'||, /* only the those who are */
|
||||||
|
'| r: tolab MODULE:'||, /* changed or never compiled */
|
||||||
|
'| drop',
|
||||||
|
'| o: fanout',
|
||||||
|
'| specs w1 1 /C/ nw w3 nw write w1 1 /TEXT A/ nw',
|
||||||
|
'| chop before str /(/',
|
||||||
|
'| statew',
|
||||||
|
'| change (57 66) / /0/',
|
||||||
|
'| sort 1.8 d', /* sort the date and time */
|
||||||
|
'| uniq 1-17 singles', /* if the first is a source */
|
||||||
|
'| sort 1.8 d 64.2 d 57.2 d 60.2 d 66.8 d', /* sort the date */
|
||||||
|
'| uniq 1-8 first', /* if the first is a source */
|
||||||
|
'| locate 9.8 /C /', /* program then it has to be */
|
||||||
|
'| c: fanout', /* compiled */
|
||||||
|
'| specs /Compiling / 1 w1-3 n / .../ n',
|
||||||
|
'| cons'
|
||||||
|
end
|
||||||
|
pipe2= '?',
|
||||||
|
'r:',
|
||||||
|
'| drop',
|
||||||
|
'| specs w1 1', /* save the module name in var */
|
||||||
|
'| var module',
|
||||||
|
'?',
|
||||||
|
'o:',
|
||||||
|
'| specs w1 1',
|
||||||
|
'| join * / /',
|
||||||
|
'| var texts', /* save all the text file names */
|
||||||
|
'?', /* for later include */
|
||||||
|
'c:',
|
||||||
|
'| specs /CC / 1 w1-3 n /(NOTERM 'cparms'/ nw', /* compile! */
|
||||||
|
'| err: cms | cons',
|
||||||
|
'?',
|
||||||
|
'err:',
|
||||||
|
'| nfind 0'||,
|
||||||
|
'| var err',
|
||||||
|
'| specs /----> Errors found! RC=/ 1 1-* n',
|
||||||
|
'| cons'
|
||||||
|
/* '| g: gate'*/
|
||||||
|
pipe1 pipe2
|
||||||
|
say ''
|
||||||
|
if symbol('err') = 'VAR' & err ^= 0 then do
|
||||||
|
say 'Errors found in source files - link aborted! RC = 'err
|
||||||
|
exit err
|
||||||
|
end
|
||||||
|
say 'Generating module 'module
|
||||||
|
'pipe cms cmod' fn texts' | > 'fn' LINK A'
|
||||||
|
exit rc
|
||||||
|
error:
|
||||||
|
say 'Error in REXX detected!'
|
||||||
|
Say 'Syntax error on line' Sigl':' Sourceline(Sigl)
|
||||||
|
Say 'Error was:' Errortext(RC)
|
||||||
|
return rc
|
154
unzip/unzip-5.52/cmsmvs/mvs.mki
Normal file
154
unzip/unzip-5.52/cmsmvs/mvs.mki
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
# Makefile for the MVS (OS/390 Base) version of UNZIP 5.4
|
||||||
|
# Produced for C/C++ V3R2 in OS/390 1.2.0 by Ian E. Gorman, 2 Nov 1998
|
||||||
|
# Facilities for compiling and testing were made available by
|
||||||
|
# OmniMark Technologies Corporation, Ottawa, Canada
|
||||||
|
|
||||||
|
# NOTES
|
||||||
|
#
|
||||||
|
# The only tabs in this file are in the first character of each recipe
|
||||||
|
# line, where they are required by make.
|
||||||
|
#
|
||||||
|
# Run this makefile in OpenMVS (OS/390 POSIX) using source files in the
|
||||||
|
# HFS file system. You can write the load module to either HFS file
|
||||||
|
# system or to a PDS in the native MVS file system. The PDS must have
|
||||||
|
# sufficient free space to hold the load module.
|
||||||
|
#
|
||||||
|
# To compile to a member of a PDS:
|
||||||
|
# make
|
||||||
|
# or
|
||||||
|
# make unzip.mvs
|
||||||
|
#
|
||||||
|
# To compile a test version into the HFS file system:
|
||||||
|
# make hfs
|
||||||
|
|
||||||
|
# UNZIP options -- MVS, REENTRANT
|
||||||
|
ZIPOPTS=-DMVS
|
||||||
|
|
||||||
|
# directories
|
||||||
|
|
||||||
|
# generic source code
|
||||||
|
SRC=..
|
||||||
|
SRC_P=$(SRC)/
|
||||||
|
|
||||||
|
# source code for MVS
|
||||||
|
CMSMVS=../cmsmvs
|
||||||
|
CMSMVS_P=$(CMSMVS)/
|
||||||
|
|
||||||
|
# include files
|
||||||
|
INCLS=-I$(SRC) -I$(CMSMVS)
|
||||||
|
|
||||||
|
# object files and load modules
|
||||||
|
BLD_P=../mvs/
|
||||||
|
|
||||||
|
# Other options
|
||||||
|
|
||||||
|
# Suffixes (E and O must be different)
|
||||||
|
E=
|
||||||
|
O=.o
|
||||||
|
|
||||||
|
# Need EXTENDED features for global.c and vmvms.c, so not using c89
|
||||||
|
CC=cc
|
||||||
|
CFLAGS=-D_OPEN_SYS $(ZIPOPTS) $(INCLS)
|
||||||
|
|
||||||
|
LD=cc
|
||||||
|
LDFLAGS=
|
||||||
|
|
||||||
|
# Files
|
||||||
|
|
||||||
|
# object (TEXT) files
|
||||||
|
OBJECTS= $(BLD_P)unzip$(O) $(BLD_P)crc32$(O) $(BLD_P)crctab$(O) \
|
||||||
|
$(BLD_P)crypt$(O) $(BLD_P)envargs$(O) $(BLD_P)explode$(O) \
|
||||||
|
$(BLD_P)extract$(O) $(BLD_P)fileio$(O) $(BLD_P)globals$(O) \
|
||||||
|
$(BLD_P)inflate$(O) $(BLD_P)process$(O) $(BLD_P)list$(O) \
|
||||||
|
$(BLD_P)match$(O) $(BLD_P)ttyio$(O) $(BLD_P)unreduce$(O) \
|
||||||
|
$(BLD_P)unshrink$(O) $(BLD_P)zipinfo$(O) $(BLD_P)vmmvs$(O)
|
||||||
|
|
||||||
|
# Header files
|
||||||
|
HFILES= $(SRC_P)consts.h $(SRC_P)crypt.h $(SRC_P)ebcdic.h \
|
||||||
|
$(SRC_P)globals.h $(SRC_P)inflate.h $(SRC_P)tables.h \
|
||||||
|
$(SRC_P)ttyio.h $(SRC_P)unzip.h $(SRC_P)unzpriv.h \
|
||||||
|
$(SRC_P)unzvers.h $(SRC_P)zip.h $(CMSMVS_P)vmmvs.h \
|
||||||
|
$(CMSMVS_P)vmstat.h
|
||||||
|
|
||||||
|
# Rules
|
||||||
|
|
||||||
|
all: $(BLD_P)unzip.mvs$(E)
|
||||||
|
hfs: $(BLD_P)unzip$(E)
|
||||||
|
|
||||||
|
# link
|
||||||
|
|
||||||
|
$(BLD_P)unzip.mvs$(E): $(OBJECTS)
|
||||||
|
$(LD) -o "//INFOZIP.LOAD(UNZIP)" $(LDFLAGS) $^
|
||||||
|
echo "tso call \"infozip(unzip)\" \"'\"\"""$$""@""\"\"'\"" > $%
|
||||||
|
chmod a+x $%
|
||||||
|
|
||||||
|
$(BLD_P)unzip$(E): $(OBJECTS)
|
||||||
|
$(LD) -o $% $(LDFLAGS) $^
|
||||||
|
|
||||||
|
# compile
|
||||||
|
|
||||||
|
$(BLD_P)api$(O): $(SRC_P)api.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)api.c
|
||||||
|
|
||||||
|
$(BLD_P)apihelp$(O): $(SRC_P)apihelp.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)apihelp.c
|
||||||
|
|
||||||
|
$(BLD_P)crc32$(O): $(SRC_P)crc32.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)crc32.c
|
||||||
|
|
||||||
|
$(BLD_P)crctab$(O): $(SRC_P)crctab.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)crctab.c
|
||||||
|
|
||||||
|
$(BLD_P)crypt$(O): $(SRC_P)crypt.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)crypt.c
|
||||||
|
|
||||||
|
$(BLD_P)envargs$(O): $(SRC_P)envargs.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)envargs.c
|
||||||
|
|
||||||
|
$(BLD_P)explode$(O): $(SRC_P)explode.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)explode.c
|
||||||
|
|
||||||
|
$(BLD_P)extract$(O): $(SRC_P)extract.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)extract.c
|
||||||
|
|
||||||
|
$(BLD_P)fileio$(O): $(SRC_P)fileio.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)fileio.c
|
||||||
|
|
||||||
|
$(BLD_P)funzip$(O): $(SRC_P)funzip.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)funzip.c
|
||||||
|
|
||||||
|
$(BLD_P)globals$(O): $(SRC_P)globals.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)globals.c
|
||||||
|
|
||||||
|
$(BLD_P)inflate$(O): $(SRC_P)inflate.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)inflate.c
|
||||||
|
|
||||||
|
$(BLD_P)list$(O): $(SRC_P)list.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)list.c
|
||||||
|
|
||||||
|
$(BLD_P)match$(O): $(SRC_P)match.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)match.c
|
||||||
|
|
||||||
|
$(BLD_P)process$(O): $(SRC_P)process.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)process.c
|
||||||
|
|
||||||
|
$(BLD_P)ttyio$(O): $(SRC_P)ttyio.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)ttyio.c
|
||||||
|
|
||||||
|
$(BLD_P)unreduce$(O): $(SRC_P)unreduce.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)unreduce.c
|
||||||
|
|
||||||
|
$(BLD_P)unshrink$(O): $(SRC_P)unshrink.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)unshrink.c
|
||||||
|
|
||||||
|
$(BLD_P)unzip$(O): $(SRC_P)unzip.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)unzip.c
|
||||||
|
|
||||||
|
$(BLD_P)unzipstb$(O): $(SRC_P)unzipstb.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)unzipstb.c
|
||||||
|
|
||||||
|
$(BLD_P)zipinfo$(O): $(SRC_P)zipinfo.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(SRC_P)zipinfo.c
|
||||||
|
|
||||||
|
$(BLD_P)vmmvs$(O): $(CMSMVS_P)vmmvs.c $(HFILES)
|
||||||
|
$(CC) -c -o $% $(CFLAGS) $(CMSMVS_P)vmmvs.c
|
66
unzip/unzip-5.52/cmsmvs/unzip.exec
Normal file
66
unzip/unzip-5.52/cmsmvs/unzip.exec
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/***********************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Front-end EXEC to set up linkage to the C runtime libraries */
|
||||||
|
/* before executing a MODULE generated from C code. */
|
||||||
|
/* */
|
||||||
|
/* Copy this file as an EXEC with a filename matching the C MODULE. */
|
||||||
|
/* */
|
||||||
|
/* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */
|
||||||
|
/* */
|
||||||
|
/***********************************************************************/
|
||||||
|
Address Command
|
||||||
|
Parse Arg argstring
|
||||||
|
Parse Source . . myname .
|
||||||
|
|
||||||
|
/* Set output and input character translation so brackets show up */
|
||||||
|
'SET OUTPUT AD' 'BA'x
|
||||||
|
'SET OUTPUT BD' 'BB'x
|
||||||
|
'SET INPUT BA AD'
|
||||||
|
'SET INPUT BB BD'
|
||||||
|
|
||||||
|
Call CLIB
|
||||||
|
If rc<>0 Then Do
|
||||||
|
Say 'The required C runtime libraries don''t appear to be available.'
|
||||||
|
Say myname 'can not run.'
|
||||||
|
Exit 12
|
||||||
|
End
|
||||||
|
|
||||||
|
/* Run the command */
|
||||||
|
myname argstring
|
||||||
|
Exit rc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Contents of the CLIB EXEC, modified for RC checking. */
|
||||||
|
/* Removed TXTLIB setting. Only LOADLIB needed for execution. */
|
||||||
|
CLIB:
|
||||||
|
/***************************************************/
|
||||||
|
/* SET UP LIBRARIES FOR LE for MVS & VM */
|
||||||
|
/***************************************************/
|
||||||
|
Address COMMAND
|
||||||
|
|
||||||
|
loadlib ='EDCLINK' /* C/370 runtime */
|
||||||
|
loadlib ='SCEERUN' /* LE runtime */
|
||||||
|
|
||||||
|
|
||||||
|
theirs=queued() /* old stack contentsM068*/
|
||||||
|
'QUERY LOADLIB ( LIFO' /* old setting M068*/
|
||||||
|
LoadlibList='' /* init list M068*/
|
||||||
|
rc=0
|
||||||
|
Do while queued()^=theirs /* all lines from cmdM068*/
|
||||||
|
Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/
|
||||||
|
LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/
|
||||||
|
End /*M068*/
|
||||||
|
If loadlibList='NONE' ,
|
||||||
|
Then Do
|
||||||
|
'GLOBAL LOADLIB' Loadlib /* enforce what we need */
|
||||||
|
End
|
||||||
|
Else Do
|
||||||
|
Do xx=1 to Words(loadlib)
|
||||||
|
If Find(loadliblist,word(loadlib,xx)) = 0 ,
|
||||||
|
then loadliblist = loadliblist word(loadlib,xx)
|
||||||
|
End
|
||||||
|
'GLOBAL LOADLIB' loadliblist /* enforce what we need */
|
||||||
|
End
|
||||||
|
Return
|
26
unzip/unzip-5.52/cmsmvs/unzip.makefile
Normal file
26
unzip/unzip-5.52/cmsmvs/unzip.makefile
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
* This is a comment
|
||||||
|
* this makefile compiles filter UNZIP
|
||||||
|
|
||||||
|
GLOBALS:
|
||||||
|
long def(VM_CMS)
|
||||||
|
TEXT:
|
||||||
|
unzip c
|
||||||
|
crc32 c
|
||||||
|
crctab c
|
||||||
|
crypt c
|
||||||
|
envargs c
|
||||||
|
explode c
|
||||||
|
extract c
|
||||||
|
fileio c
|
||||||
|
globals c
|
||||||
|
inflate c
|
||||||
|
list c
|
||||||
|
match c
|
||||||
|
process c
|
||||||
|
ttyio c
|
||||||
|
unreduce c
|
||||||
|
unshrink c
|
||||||
|
zipinfo c
|
||||||
|
vmmvs c
|
||||||
|
MODULE:
|
||||||
|
unzip module
|
137
unzip/unzip-5.52/cmsmvs/unzmvsc.job
Normal file
137
unzip/unzip-5.52/cmsmvs/unzmvsc.job
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
//*
|
||||||
|
//* LE COMPILE FOR UNZIP541.
|
||||||
|
//* ALL STEPS SHOULD GET COND CODE 0 EXCEPT FOR PLINK.PLKED WHICH GETS 4.
|
||||||
|
//*
|
||||||
|
//CBC JCLLIB ORDER=CBC.SCBCPRC
|
||||||
|
//UNZIP EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(UNZIP)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(UNZIP),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//CRC32 EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(CRC32)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(CRC32),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//CRCTAB EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(CRCTAB)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(CRCTAB),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//CRYPT EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(CRYPT)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(CRYPT),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//ENVARGS EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(ENVARGS)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(ENVARGS),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//EXPLODE EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(EXPLODE)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(EXPLODE),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//EXTRACT EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(EXTRACT)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(EXTRACT),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//FILEIO EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(FILEIO)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(FILEIO),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//GLOBALS EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(GLOBALS)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(GLOBALS),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//INFLATE EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(INFLATE)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(INFLATE),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//LIST EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(LIST)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(LIST),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//MATCH EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(MATCH)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(MATCH),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//PROCESS EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(PROCESS)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(PROCESS),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//TTYIO EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(TTYIO)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(TTYIO),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//UNREDUCE EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(UNREDUCE)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(UNREDUCE),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//UNSHRINK EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(UNSHRINK)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(UNSHRINK),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//ZIPINFO EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(ZIPINFO)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(ZIPINFO),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//VMMVS EXEC EDCC,COND=(0,NE),CREGSIZ='0M',
|
||||||
|
// INFILE='USERID.UNZIP.C(VMMVS)',
|
||||||
|
// OUTFILE='USERID.UNZIP.OBJ(VMMVS),DISP=SHR',
|
||||||
|
// CPARM='LONG,NOTERM,LIST,XREF,SOURCE',
|
||||||
|
// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT'
|
||||||
|
//COMPILE.USERLIB DD DSN=USERID.UNZIP.H,DISP=SHR
|
||||||
|
//PLINK EXEC PROC=EDCPL,COND=(4,LT),
|
||||||
|
// OUTFILE='USERID.UNZIP.LOAD(UNZIP),DISP=SHR',
|
||||||
|
// PPARM='NONCAL,MAP,MEMORY',
|
||||||
|
// LPARM='LIST,MAP,XREF'
|
||||||
|
//SYSPRINT DD SYSOUT=*
|
||||||
|
//PLKED.SYSIN DD DSN=USERID.UNZIP.OBJ(UNZIP),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(CRC32),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(CRCTAB),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(CRYPT),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(ENVARGS),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(EXPLODE),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(EXTRACT),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(FILEIO),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(GLOBALS),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(INFLATE),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(LIST),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(MATCH),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(PROCESS),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(TTYIO),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(UNREDUCE),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(UNSHRINK),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(ZIPINFO),DISP=SHR
|
||||||
|
// DD DSN=USERID.UNZIP.OBJ(VMMVS),DISP=SHR
|
||||||
|
//LKED.SYSLIB DD DISP=SHR,DSN=CEE.SCEELKED
|
58
unzip/unzip-5.52/cmsmvs/unzvmc.exec
Normal file
58
unzip/unzip-5.52/cmsmvs/unzvmc.exec
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/* VMCOMPIL EXEC Unzip compile for VM/CMS */
|
||||||
|
/* Author : George Petrov, 11 Apr 1995 */
|
||||||
|
|
||||||
|
signal on error
|
||||||
|
|
||||||
|
parms = '(long def(VM_CMS)'
|
||||||
|
/* Add local options */
|
||||||
|
/* "TARGET(COMPAT)" is required for V2.2 compiler */
|
||||||
|
parms = parms 'TARGET(COMPAT) SOURCE'
|
||||||
|
|
||||||
|
|
||||||
|
say 'Compiling UNZIP C...'
|
||||||
|
'cc unzip c 'parms
|
||||||
|
say 'Compiling CRC32 C...'
|
||||||
|
'cc crc32 c 'parms
|
||||||
|
say 'Compiling CRCTAB C...'
|
||||||
|
'cc crctab c 'parms
|
||||||
|
say 'Compiling CRYPT C...'
|
||||||
|
'cc crypt c 'parms
|
||||||
|
say 'Compiling ENVARGS C...'
|
||||||
|
'cc envargs c 'parms
|
||||||
|
say 'Compiling EXPLODE C...'
|
||||||
|
'cc explode c 'parms
|
||||||
|
say 'Compiling EXTRACT C...'
|
||||||
|
'cc extract c 'parms
|
||||||
|
say 'Compiling FILEIO C...'
|
||||||
|
'cc fileio c 'parms
|
||||||
|
say 'Compiling GLOBALS C...'
|
||||||
|
'cc globals c 'parms
|
||||||
|
say 'Compiling INFLATE C...'
|
||||||
|
'cc inflate c 'parms
|
||||||
|
say 'Compiling PROCESS C...'
|
||||||
|
'cc process c 'parms
|
||||||
|
say 'Compiling LIST C...'
|
||||||
|
'cc list c 'parms
|
||||||
|
say 'Compiling MATCH C...'
|
||||||
|
'cc match c 'parms
|
||||||
|
say 'Compiling TTYIO C...'
|
||||||
|
'cc ttyio c 'parms
|
||||||
|
say 'Compiling UNREDUCE C...'
|
||||||
|
'cc unreduce c 'parms
|
||||||
|
say 'Compiling UNSHRINK C...'
|
||||||
|
'cc unshrink c 'parms
|
||||||
|
say 'Compiling ZIPINFO C...'
|
||||||
|
'cc zipinfo c 'parms
|
||||||
|
say 'Compiling VMMVS C...'
|
||||||
|
'cc vmmvs c 'parms
|
||||||
|
|
||||||
|
say 'Linking all files...'
|
||||||
|
'cmod unzip unzip crc32 crctab crypt envargs explode extract fileio globals',
|
||||||
|
'inflate list match process ttyio unreduce unshrink zipinfo vmmvs'
|
||||||
|
say 'All Done!'
|
||||||
|
say "To run enter : UNZIP parms"
|
||||||
|
exit rc
|
||||||
|
|
||||||
|
error:
|
||||||
|
say 'Error during compilation!'
|
||||||
|
exit rc
|
683
unzip/unzip-5.52/cmsmvs/vmmvs.c
Normal file
683
unzip/unzip-5.52/cmsmvs/vmmvs.c
Normal file
@ -0,0 +1,683 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
vmmvs.c (for both VM/CMS and MVS)
|
||||||
|
|
||||||
|
Contains: vmmvs_open_infile()
|
||||||
|
open_outfile()
|
||||||
|
close_outfile()
|
||||||
|
close_infile()
|
||||||
|
getVMMVSexfield()
|
||||||
|
do_wild()
|
||||||
|
mapattr()
|
||||||
|
mapname()
|
||||||
|
checkdir()
|
||||||
|
check_for_newer()
|
||||||
|
stat()
|
||||||
|
version()
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define __VMMVS_C /* identifies this source module */
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "unzip.h"
|
||||||
|
|
||||||
|
|
||||||
|
/********************************/
|
||||||
|
/* Function vmmvs_open_infile() */
|
||||||
|
/********************************/
|
||||||
|
|
||||||
|
FILE *vmmvs_open_infile(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
FILE *fzip;
|
||||||
|
|
||||||
|
G.tempfn = NULL;
|
||||||
|
|
||||||
|
fzip = fopen(G.zipfn, FOPR);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Let's try it without the convert for a while -- RG Hartwig */
|
||||||
|
|
||||||
|
if ((fzip = fopen(G.zipfn,"rb,recfm=fb")) == NULL) {
|
||||||
|
size_t cnt;
|
||||||
|
char *buf;
|
||||||
|
FILE *in, *out;
|
||||||
|
|
||||||
|
if ((buf = (char *)malloc(32768)) == NULL) return NULL;
|
||||||
|
if ((G.tempfn = tmpnam(NULL)) == NULL) return NULL;
|
||||||
|
if ((in = fopen(G.zipfn,"rb")) != NULL &&
|
||||||
|
(out = fopen(G.tempfn,"wb,recfm=fb,lrecl=1")) != NULL) {
|
||||||
|
Trace((stdout,"Converting ZIP file to fixed record format...\n"));
|
||||||
|
while (!feof(in)) {
|
||||||
|
cnt = fread(buf,1,32768,in);
|
||||||
|
if (cnt) fwrite(buf,1,cnt,out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
free(buf);
|
||||||
|
fclose(out);
|
||||||
|
fclose(in);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
free(buf);
|
||||||
|
fclose(out);
|
||||||
|
fclose(in);
|
||||||
|
|
||||||
|
fzip = fopen(G.tempfn,"rb,recfm=fb");
|
||||||
|
if (fzip == NULL) return NULL;
|
||||||
|
|
||||||
|
/* Update the G.ziplen value since it might have changed after
|
||||||
|
the reformatting copy. */
|
||||||
|
fseek(fzip,0L,SEEK_SET);
|
||||||
|
fseek(fzip,0L,SEEK_END);
|
||||||
|
G.ziplen = ftell(fzip);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return fzip;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***************************/
|
||||||
|
/* Function open_outfile() */
|
||||||
|
/***************************/
|
||||||
|
|
||||||
|
int open_outfile(__G) /* return 1 if fail */
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
char type[100];
|
||||||
|
char *mode = NULL;
|
||||||
|
#ifdef MVS
|
||||||
|
/* Check if the output file already exists and do not overwrite its DCB */
|
||||||
|
char basefilename[PATH_MAX], *p;
|
||||||
|
FILE *exists;
|
||||||
|
|
||||||
|
/* Get the base file name, without any member name */
|
||||||
|
strcpy(basefilename, G.filename);
|
||||||
|
if ((p = strchr(basefilename, '(')) != NULL) {
|
||||||
|
if (basefilename[0] == '\'')
|
||||||
|
*p++ = '\'';
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
exists = fopen(basefilename, FOPR);
|
||||||
|
if (exists) {
|
||||||
|
if (G.pInfo->textmode)
|
||||||
|
mode = FOPWTE; /* Text file, existing */
|
||||||
|
else
|
||||||
|
mode = FOPWE; /* Binary file, existing */
|
||||||
|
fclose(exists);
|
||||||
|
}
|
||||||
|
else /* continued on next line */
|
||||||
|
#endif /* MVS */
|
||||||
|
if (G.pInfo->textmode) {
|
||||||
|
if (mode == NULL)
|
||||||
|
mode = FOPWT;
|
||||||
|
} else if (G.lrec.extra_field_length > 0 && G.extra_field != NULL) {
|
||||||
|
unsigned lef_len = (unsigned)(G.lrec.extra_field_length);
|
||||||
|
uch *lef_buf = G.extra_field;
|
||||||
|
|
||||||
|
while (lef_len > EB_HEADSIZE) {
|
||||||
|
unsigned eb_id = makeword(&lef_buf[EB_ID]);
|
||||||
|
unsigned eb_dlen = makeword(&lef_buf[EB_LEN]);
|
||||||
|
|
||||||
|
if (eb_dlen > (lef_len - EB_HEADSIZE)) {
|
||||||
|
/* Discovered some extra field inconsistency! */
|
||||||
|
TTrace((stderr,
|
||||||
|
"open_outfile: block length %u > rest lef_size %u\n",
|
||||||
|
eb_dlen, lef_len - EB_HEADSIZE));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((eb_id == EF_VMCMS || eb_id == EF_MVS) &&
|
||||||
|
(getVMMVSexfield(type, lef_buf, eb_dlen) > 0)) {
|
||||||
|
mode = type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip this extra field block */
|
||||||
|
lef_buf += (eb_dlen + EB_HEADSIZE);
|
||||||
|
lef_len -= (eb_dlen + EB_HEADSIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mode == NULL) mode = FOPW;
|
||||||
|
|
||||||
|
Trace((stderr, "Output file='%s' opening with '%s'\n", G.filename, mode));
|
||||||
|
if ((G.outfile = fopen(G.filename, mode)) == NULL) {
|
||||||
|
Info(slide, 0x401, ((char *)slide, "\nerror: cannot create %s\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
Trace((stderr, "error %d: '%s'\n", errno, strerror(errno)));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} /* end function open_outfile() */
|
||||||
|
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* Function close_outfile() */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
|
void close_outfile(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
fclose(G.outfile);
|
||||||
|
} /* end function close_outfile() */
|
||||||
|
|
||||||
|
|
||||||
|
/***************************/
|
||||||
|
/* Function close_infile() */
|
||||||
|
/***************************/
|
||||||
|
|
||||||
|
void close_infile(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
fclose(G.zipfd);
|
||||||
|
|
||||||
|
/* If we're working from a temp file, erase it now */
|
||||||
|
if (G.tempfn)
|
||||||
|
remove(G.tempfn);
|
||||||
|
|
||||||
|
} /* end function close_infile() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************/
|
||||||
|
/* Function getVMMVSexfield() */
|
||||||
|
/******************************/
|
||||||
|
|
||||||
|
extent getVMMVSexfield(type, ef_block, datalen)
|
||||||
|
char *type;
|
||||||
|
uch *ef_block;
|
||||||
|
unsigned datalen;
|
||||||
|
{
|
||||||
|
fldata_t *fdata = (fldata_t *) &ef_block[4];
|
||||||
|
|
||||||
|
if (datalen < sizeof(fldata_t))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
strcpy(type, "w");
|
||||||
|
strcat(type, fdata->__openmode == __TEXT ? ""
|
||||||
|
:fdata->__openmode == __BINARY ? "b"
|
||||||
|
:fdata->__openmode == __RECORD ? "b,type=record"
|
||||||
|
: "");
|
||||||
|
strcat(type, ",recfm=");
|
||||||
|
strcat(type, fdata->__recfmF? "F"
|
||||||
|
:fdata->__recfmV? "V"
|
||||||
|
:fdata->__recfmU? "U"
|
||||||
|
: "?");
|
||||||
|
if (fdata->__recfmBlk) strcat(type, "B");
|
||||||
|
if (fdata->__recfmS) strcat(type, "S");
|
||||||
|
if (fdata->__recfmASA) strcat(type, "A");
|
||||||
|
if (fdata->__recfmM) strcat(type, "M");
|
||||||
|
sprintf(type+strlen(type), ",lrecl=%ld", fdata->__recfmV
|
||||||
|
? fdata->__maxreclen+4
|
||||||
|
: fdata->__maxreclen);
|
||||||
|
#ifdef VM_CMS
|
||||||
|
/* For CMS, use blocksize for FB files only */
|
||||||
|
if (fdata->__recfmBlk)
|
||||||
|
sprintf(type+strlen(type), ",blksize=%ld", fdata->__blksize);
|
||||||
|
#else
|
||||||
|
/* For MVS, always use blocksize */
|
||||||
|
sprintf(type+strlen(type), ",blksize=%ld", fdata->__blksize);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return strlen(type);
|
||||||
|
} /* end function getVMMVSexfield() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function do_wild() */ /* for porting: dir separator; match(ignore_case) */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
char *do_wild(__G__ wld)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *wld; /* only used first time on a given dir */
|
||||||
|
{
|
||||||
|
static int First = 0;
|
||||||
|
static char filename[256];
|
||||||
|
|
||||||
|
if (First == 0) {
|
||||||
|
First = 1;
|
||||||
|
strncpy(filename, wld, sizeof(filename));
|
||||||
|
filename[sizeof(filename)-1] = '\0';
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return (char *)NULL;
|
||||||
|
|
||||||
|
} /* end function do_wild() */
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function mapattr() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
int mapattr(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function mapname() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
int mapname(__G__ renamed)
|
||||||
|
__GDEF
|
||||||
|
int renamed;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - caution (truncated filename)
|
||||||
|
* MPN_INF_SKIP - info "skip entry" (dir doesn't exist)
|
||||||
|
* MPN_ERR_SKIP - error -> skip entry
|
||||||
|
* MPN_ERR_TOOLONG - error -> path is too long
|
||||||
|
* MPN_NOMEM - error (memory allocation failed) -> skip entry
|
||||||
|
* [also MPN_VOL_LABEL, MPN_CREATED_DIR]
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
char newname[FILNAMSIZ], *lbar;
|
||||||
|
#ifdef MVS
|
||||||
|
char *pmember;
|
||||||
|
#endif
|
||||||
|
int name_changed = MPN_OK;
|
||||||
|
|
||||||
|
if (G.pInfo->vollabel)
|
||||||
|
return MPN_VOL_LABEL; /* can't set disk volume labels in CMS_MVS */
|
||||||
|
|
||||||
|
#ifdef MVS
|
||||||
|
/* Remove bad characters for MVS from the filename */
|
||||||
|
while ((lbar = strpbrk(G.filename, "_+-")) != NULL) {
|
||||||
|
/* Must use memmove() here because data overlaps. */
|
||||||
|
/* strcpy() gives undefined behavior in this case. */
|
||||||
|
memmove(lbar, lbar+1, strlen(lbar));
|
||||||
|
name_changed = MPN_INF_TRUNC;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Remove bad characters for MVS/CMS from the filename */
|
||||||
|
while ((lbar = strpbrk(G.filename, "()")) != NULL) {
|
||||||
|
memmove(lbar, lbar+1, strlen(lbar));
|
||||||
|
name_changed = MPN_INF_TRUNC;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VM_CMS
|
||||||
|
if ((lbar = strrchr(G.filename, '/')) != NULL) {
|
||||||
|
strcpy(newname, lbar+1);
|
||||||
|
Trace((stderr, "File '%s' renamed to '%s'\n", G.filename, newname));
|
||||||
|
strcpy(G.filename, newname);
|
||||||
|
name_changed = MPN_INF_TRUNC;
|
||||||
|
}
|
||||||
|
#else /* MVS */
|
||||||
|
if ((pmember = strrchr(G.filename, '/')) == NULL)
|
||||||
|
pmember = G.filename;
|
||||||
|
else
|
||||||
|
pmember++;
|
||||||
|
|
||||||
|
/* search for extension in file name */
|
||||||
|
if ((lbar = strrchr(pmember, '.')) != NULL) {
|
||||||
|
*lbar++ = '\0';
|
||||||
|
strcpy(newname, pmember);
|
||||||
|
strcpy(pmember, lbar);
|
||||||
|
strcat(pmember, "(");
|
||||||
|
strcat(pmember, newname);
|
||||||
|
strcat(pmember, ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove all 'internal' dots '.', to prevent false consideration as
|
||||||
|
* MVS path delimiters! */
|
||||||
|
while ((lbar = strrchr(G.filename, '.')) != NULL) {
|
||||||
|
memmove(lbar, lbar+1, strlen(lbar));
|
||||||
|
name_changed = MPN_INF_TRUNC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finally, convert path delimiters from internal '/' to external '.' */
|
||||||
|
while ((lbar = strchr(G.filename, '/')) != NULL)
|
||||||
|
*lbar = '.';
|
||||||
|
#endif /* ?VM_CMS */
|
||||||
|
|
||||||
|
#ifndef MVS
|
||||||
|
if ((lbar = strchr(G.filename, '.')) == NULL) {
|
||||||
|
printf("WARNING: file '%s' has no extension - renamed to '%s.NONAME'\n"\
|
||||||
|
,G.filename, G.filename);
|
||||||
|
strcat(G.filename, ".NONAME");
|
||||||
|
name_changed = MPN_INF_TRUNC;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
checkdir(__G__ G.filename, GETPATH);
|
||||||
|
|
||||||
|
return name_changed;
|
||||||
|
|
||||||
|
} /* end function mapname() */
|
||||||
|
|
||||||
|
|
||||||
|
int checkdir(__G__ pathcomp, flag)
|
||||||
|
__GDEF
|
||||||
|
char *pathcomp;
|
||||||
|
int flag;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - (on APPEND_NAME) truncated filename
|
||||||
|
* MPN_INF_SKIP - path doesn't exist, not allowed to create
|
||||||
|
* MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path
|
||||||
|
* exists and is not a directory, but is supposed to be
|
||||||
|
* MPN_ERR_TOOLONG - path is too long
|
||||||
|
* MPN_NOMEM - can't allocate memory for filename buffers
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
static int rootlen = 0; /* length of rootpath */
|
||||||
|
static char *rootpath; /* user's "extract-to" directory */
|
||||||
|
|
||||||
|
# define FN_MASK 7
|
||||||
|
# define FUNCTION (flag & FN_MASK)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
ROOT: if appropriate, store the path in rootpath and create it if neces-
|
||||||
|
sary; else assume it's a zipfile member and return. This path segment
|
||||||
|
gets used in extracting all members from every zipfile specified on the
|
||||||
|
command line. Note that under OS/2 and MS-DOS, if a candidate extract-to
|
||||||
|
directory specification includes a drive letter (leading "x:"), it is
|
||||||
|
treated just as if it had a trailing '/'--that is, one directory level
|
||||||
|
will be created if the path doesn't exist, unless this is otherwise pro-
|
||||||
|
hibited (e.g., freshening).
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if (!defined(SFX) || defined(SFX_EXDIR))
|
||||||
|
if (FUNCTION == ROOT) {
|
||||||
|
Trace((stderr, "initializing root path to [%s]\n",
|
||||||
|
FnFilter1(pathcomp)));
|
||||||
|
if (pathcomp == (char *)NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
}
|
||||||
|
else if ((rootlen = strlen(pathcomp)) > 0) {
|
||||||
|
if ((rootpath = (char *)malloc(rootlen+1)) == NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_NOMEM;
|
||||||
|
}
|
||||||
|
strcpy(rootpath, pathcomp);
|
||||||
|
Trace((stderr, "rootpath now = [%s]\n", rootpath));
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
#endif /* !SFX || SFX_EXDIR */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
GETPATH: copy full path to the string pointed at by pathcomp, and free
|
||||||
|
buildpath.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == GETPATH) {
|
||||||
|
if (rootlen > 0) {
|
||||||
|
#ifdef VM_CMS /* put the exdir after the filename */
|
||||||
|
strcat(pathcomp, "."); /* used as minidisk to be save on */
|
||||||
|
strcat(pathcomp, rootpath);
|
||||||
|
#else /* MVS */
|
||||||
|
char newfilename[PATH_MAX];
|
||||||
|
char *start_fname;
|
||||||
|
int quoted = 0;
|
||||||
|
|
||||||
|
strcpy(newfilename, rootpath);
|
||||||
|
if (newfilename[0] == '\'') {
|
||||||
|
quoted = strlen(newfilename) - 1;
|
||||||
|
if (newfilename[quoted] == '\'')
|
||||||
|
newfilename[quoted] = '\0';
|
||||||
|
else
|
||||||
|
quoted = 0;
|
||||||
|
}
|
||||||
|
if (strchr(pathcomp, '(') == NULL) {
|
||||||
|
if ((start_fname = strrchr(pathcomp, '.')) == NULL) {
|
||||||
|
start_fname = pathcomp;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*start_fname++ = '\0';
|
||||||
|
strcat(newfilename, ".");
|
||||||
|
strcat(newfilename, pathcomp);
|
||||||
|
}
|
||||||
|
strcat(newfilename, "(");
|
||||||
|
strcat(newfilename, start_fname);
|
||||||
|
strcat(newfilename, ")");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcat(newfilename, ".");
|
||||||
|
strcat(newfilename, pathcomp);
|
||||||
|
}
|
||||||
|
if (quoted)
|
||||||
|
strcat(newfilename, "'");
|
||||||
|
Trace((stdout, "new dataset : %s\n", newfilename));
|
||||||
|
strcpy(pathcomp, newfilename);
|
||||||
|
#endif /* ?VM_CMS */
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
END: free rootpath, immediately prior to program exit.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == END) {
|
||||||
|
Trace((stderr, "freeing rootpath\n"));
|
||||||
|
if (rootlen > 0) {
|
||||||
|
free(rootpath);
|
||||||
|
rootlen = 0;
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MPN_INVALID; /* should never reach */
|
||||||
|
|
||||||
|
} /* end function checkdir() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************/
|
||||||
|
/* Function check_for_newer() */ /* used for overwriting/freshening/updating */
|
||||||
|
/******************************/
|
||||||
|
|
||||||
|
int check_for_newer(__G__ filename) /* return 1 if existing file is newer */
|
||||||
|
__GDEF /* or equal; 0 if older; -1 if doesn't */
|
||||||
|
char *filename; /* exist yet */
|
||||||
|
{
|
||||||
|
FILE *stream;
|
||||||
|
|
||||||
|
if ((stream = fopen(filename, FOPR)) != NULL) {
|
||||||
|
fclose(stream);
|
||||||
|
/* File exists, assume it is "newer" than archive entry. */
|
||||||
|
return EXISTS_AND_NEWER;
|
||||||
|
}
|
||||||
|
/* File does not exist. */
|
||||||
|
return DOES_NOT_EXIST;
|
||||||
|
} /* end function check_for_newer() */
|
||||||
|
|
||||||
|
|
||||||
|
/*********************/
|
||||||
|
/* Function stat() */
|
||||||
|
/*********************/
|
||||||
|
|
||||||
|
int stat(const char *path, struct stat *buf)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char fname[PATH_MAX];
|
||||||
|
time_t ltime;
|
||||||
|
|
||||||
|
if ((fp = fopen(path, FOPR)) != NULL) {
|
||||||
|
fldata_t fdata;
|
||||||
|
if (fldata( fp, fname, &fdata ) == 0) {
|
||||||
|
buf->st_dev = fdata.__device;
|
||||||
|
buf->st_mode = *(short *)(&fdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine file size by seeking to EOF */
|
||||||
|
fseek(fp,0L,SEEK_END);
|
||||||
|
buf->st_size = ftell(fp);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* set time fields in stat buf to current time. */
|
||||||
|
time(<ime);
|
||||||
|
buf->st_atime =
|
||||||
|
buf->st_mtime =
|
||||||
|
buf->st_ctime = ltime;
|
||||||
|
|
||||||
|
/* File exists, return success */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef STAND_ALONE
|
||||||
|
/***************************/
|
||||||
|
/* Function main_vmmvs() */
|
||||||
|
/***************************/
|
||||||
|
|
||||||
|
/* This function is called as main() to parse arguments */
|
||||||
|
/* into argc and argv. This is required for stand-alone */
|
||||||
|
/* execution. This calls the "real" main() when done. */
|
||||||
|
|
||||||
|
int MAIN_VMMVS(void)
|
||||||
|
{
|
||||||
|
int argc=0;
|
||||||
|
char *argv[50];
|
||||||
|
|
||||||
|
int iArgLen;
|
||||||
|
char argstr[256];
|
||||||
|
char **pEPLIST, *pCmdStart, *pArgStart, *pArgEnd;
|
||||||
|
|
||||||
|
/* Get address of extended parameter list from S/370 Register 0 */
|
||||||
|
pEPLIST = (char **)__xregs(0);
|
||||||
|
|
||||||
|
/* Null-terminate the argument string */
|
||||||
|
pCmdStart = *(pEPLIST+0);
|
||||||
|
pArgStart = *(pEPLIST+1);
|
||||||
|
pArgEnd = *(pEPLIST+2);
|
||||||
|
iArgLen = pArgEnd - pCmdStart + 1;
|
||||||
|
|
||||||
|
/* Make a copy of the command string */
|
||||||
|
memcpy(argstr, pCmdStart, iArgLen);
|
||||||
|
argstr[iArgLen] = '\0'; /* Null-terminate */
|
||||||
|
|
||||||
|
/* Store first token (cmd) */
|
||||||
|
argv[argc++] = strtok(argstr, " ");
|
||||||
|
|
||||||
|
/* Store the rest (args) */
|
||||||
|
while (argv[argc-1])
|
||||||
|
argv[argc++] = strtok(NULL, " ");
|
||||||
|
argc--; /* Back off last NULL entry */
|
||||||
|
|
||||||
|
/* Call "real" main() function */
|
||||||
|
return MAIN(argc, argv);
|
||||||
|
}
|
||||||
|
#endif /* STAND_ALONE */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function version() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
void version(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char liblvlmsg [50+1];
|
||||||
|
char *compiler = "?";
|
||||||
|
char *platform = "?";
|
||||||
|
char complevel[64];
|
||||||
|
|
||||||
|
/* Map the runtime library level information */
|
||||||
|
union {
|
||||||
|
unsigned int iVRM;
|
||||||
|
struct {
|
||||||
|
unsigned int pd:4; /* Product designation */
|
||||||
|
unsigned int vv:4; /* Version */
|
||||||
|
unsigned int rr:8; /* Release */
|
||||||
|
unsigned int mm:16; /* Modification level */
|
||||||
|
} xVRM;
|
||||||
|
} VRM;
|
||||||
|
|
||||||
|
|
||||||
|
/* Break down the runtime library level */
|
||||||
|
VRM.iVRM = __librel();
|
||||||
|
sprintf(liblvlmsg, "Using runtime library level %s V%dR%dM%d",
|
||||||
|
(VRM.xVRM.pd==1 ? "LE" : "CE"),
|
||||||
|
VRM.xVRM.vv, VRM.xVRM.rr, VRM.xVRM.mm);
|
||||||
|
/* Note: LE = Language Environment, CE = Common Env. (C/370). */
|
||||||
|
/* This refers ONLY to the current runtimes, not the compiler. */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VM_CMS
|
||||||
|
platform = "VM/CMS";
|
||||||
|
#ifdef __IBMC__
|
||||||
|
compiler = "IBM C";
|
||||||
|
#else
|
||||||
|
compiler = "C/370";
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MVS
|
||||||
|
platform = "MVS";
|
||||||
|
#ifdef __IBMC__
|
||||||
|
compiler = "IBM C/C++";
|
||||||
|
#else
|
||||||
|
compiler = "C/370";
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __COMPILER_VER__
|
||||||
|
VRM.iVRM = __COMPILER_VER__;
|
||||||
|
sprintf(complevel," V%dR%dM%d",
|
||||||
|
VRM.xVRM.vv, VRM.xVRM.rr, VRM.xVRM.mm);
|
||||||
|
#else
|
||||||
|
#ifdef __IBMC__
|
||||||
|
sprintf(complevel," V%dR%d", __IBMC__ / 100, (__IBMC__ % 100)/10);
|
||||||
|
#else
|
||||||
|
complevel[0] = '\0';
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Output is in the form "Compiled with %s%s for %s%s%s%s." */
|
||||||
|
len = sprintf((char *)slide, LoadFarString(CompiledWith),
|
||||||
|
|
||||||
|
/* Add compiler name and level */
|
||||||
|
compiler, complevel,
|
||||||
|
|
||||||
|
/* Add compile environment */
|
||||||
|
platform,
|
||||||
|
|
||||||
|
/* Add timestamp */
|
||||||
|
#ifdef __DATE__
|
||||||
|
" on " __DATE__
|
||||||
|
#ifdef __TIME__
|
||||||
|
" at " __TIME__
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
".\n", "",
|
||||||
|
liblvlmsg
|
||||||
|
);
|
||||||
|
|
||||||
|
(*G.message)((zvoid *)&G, slide, (ulg)len, 0);
|
||||||
|
|
||||||
|
} /* end function version() */
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
97
unzip/unzip-5.52/cmsmvs/vmmvs.h
Normal file
97
unzip/unzip-5.52/cmsmvs/vmmvs.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/* vmmvs.h: include file for both VM/CMS and MVS ports of UnZip */
|
||||||
|
#ifndef __vmmvs_h /* prevent multiple inclusions */
|
||||||
|
#define __vmmvs_h
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
# define NULL (zvoid *)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MVS
|
||||||
|
# define _POSIX_SOURCE /* tell MVS we want full definitions */
|
||||||
|
# define NO_STRNICMP /* MVS has no strnicmp() */
|
||||||
|
# include <features.h>
|
||||||
|
/* MVS complains if a function has the same name as a csect. */
|
||||||
|
# if defined(__UNZIP_C)
|
||||||
|
# pragma csect(STATIC,"unzip_s")
|
||||||
|
# elif defined(__CRC32_C)
|
||||||
|
# pragma csect(STATIC,"crc32_s")
|
||||||
|
# elif defined(__ENVARGS_C)
|
||||||
|
# pragma csect(STATIC,"envarg_s")
|
||||||
|
# elif defined(__EXPLODE_C)
|
||||||
|
# pragma csect(STATIC,"explod_s")
|
||||||
|
# elif defined(__INFLATE_C)
|
||||||
|
# pragma csect(STATIC,"inflat_s")
|
||||||
|
# elif defined(__MATCH_C)
|
||||||
|
# pragma csect(STATIC,"match_s")
|
||||||
|
# elif defined(__UNREDUCE_C)
|
||||||
|
# pragma csect(STATIC,"unredu_s")
|
||||||
|
# elif defined(__UNSHRINK_C)
|
||||||
|
# pragma csect(STATIC,"unshri_s")
|
||||||
|
# elif defined(__ZIPINFO_C)
|
||||||
|
# pragma csect(STATIC,"zipinf_s")
|
||||||
|
# endif
|
||||||
|
#endif /* MVS */
|
||||||
|
|
||||||
|
#include <time.h> /* the usual non-BSD time functions */
|
||||||
|
#ifdef VM_CMS
|
||||||
|
# include "vmstat.h"
|
||||||
|
#endif
|
||||||
|
#ifdef MVS
|
||||||
|
# include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PASSWD_FROM_STDIN
|
||||||
|
/* Kludge until we know how to open a non-echo tty channel */
|
||||||
|
|
||||||
|
#define EBCDIC
|
||||||
|
#define __EBCDIC 2 /* treat EBCDIC as binary! */
|
||||||
|
/* In the context of Info-ZIP, a portable "text" mode file implies the use of
|
||||||
|
an ASCII-compatible (ISO 8859-1, or other extended ASCII) code page. */
|
||||||
|
|
||||||
|
#ifdef MORE
|
||||||
|
# undef MORE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Workarounds for missing RTL functionality */
|
||||||
|
#define isatty(t) 1
|
||||||
|
|
||||||
|
#ifdef UNZIP /* definitions for UNZIP */
|
||||||
|
|
||||||
|
#define INBUFSIZ 8192
|
||||||
|
|
||||||
|
#define USE_STRM_INPUT
|
||||||
|
#define USE_FWRITE
|
||||||
|
|
||||||
|
#define PATH_MAX 128
|
||||||
|
|
||||||
|
#ifndef QUERY_TRNEWLN
|
||||||
|
# define QUERY_TRNEWLN /* terminate interaction queries with '\n' */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DATE_FORMAT
|
||||||
|
# define DATE_FORMAT DF_MDY
|
||||||
|
#endif
|
||||||
|
#define lenEOL 1
|
||||||
|
/* The use of "ebcdic[LF]" is not reliable; VM/CMS C/370 uses the
|
||||||
|
* EBCDIC specific "NL" ('NewLine') control character (and not the EBCDIC
|
||||||
|
* equivalent of the ASCII "LF" ('LineFeed')) as line terminator!
|
||||||
|
* To work around this problem, we explicitely emit the C compiler's native
|
||||||
|
* '\n' line terminator.
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
|
#define PutNativeEOL *q++ = native(LF);
|
||||||
|
#else
|
||||||
|
#define PutNativeEOL *q++ = '\n';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* UNZIP */
|
||||||
|
|
||||||
|
#endif /* !__vmmvs_h */
|
57
unzip/unzip-5.52/cmsmvs/vmstat.h
Normal file
57
unzip/unzip-5.52/cmsmvs/vmstat.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
#ifndef __vmstat_h
|
||||||
|
#define __vmstat_h
|
||||||
|
|
||||||
|
/* stat.h definitions */
|
||||||
|
|
||||||
|
#ifndef _INO_T_DEFINED
|
||||||
|
typedef unsigned short ino_t; /* i-node number (not used on DOS) */
|
||||||
|
#define _INO_T_DEFINED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _DEV_T_DEFINED
|
||||||
|
typedef short dev_t; /* device code */
|
||||||
|
#define _DEV_T_DEFINED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _OFF_T_DEFINED
|
||||||
|
typedef long off_t; /* file offset value */
|
||||||
|
#define _OFF_T_DEFINED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _STAT_DEFINED
|
||||||
|
struct stat {
|
||||||
|
dev_t st_dev;
|
||||||
|
ino_t st_ino;
|
||||||
|
short st_mode;
|
||||||
|
short st_nlink;
|
||||||
|
int st_uid;
|
||||||
|
int st_gid;
|
||||||
|
off_t st_size;
|
||||||
|
time_t st_atime;
|
||||||
|
time_t st_mtime;
|
||||||
|
time_t st_ctime;
|
||||||
|
};
|
||||||
|
#define _STAT_DEFINED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int stat(const char *path, struct stat *buf);
|
||||||
|
int fstat(int fd, struct stat *buf);
|
||||||
|
|
||||||
|
#define S_IFMT 0xFFFF
|
||||||
|
#define _FLDATA(m) (*(fldata_t *) &m)
|
||||||
|
#define S_ISDIR(m) (_FLDATA(m).__dsorgPDSdir)
|
||||||
|
#define S_ISREG(m) (_FLDATA(m).__dsorgPO | \
|
||||||
|
_FLDATA(m).__dsorgPDSmem | \
|
||||||
|
_FLDATA(m).__dsorgPS)
|
||||||
|
#define S_ISBLK(m) (_FLDATA(m).__recfmBlk)
|
||||||
|
#define S_ISMEM(m) (_FLDATA(m).__dsorgMem)
|
||||||
|
|
||||||
|
#endif /* __vmstat_h */
|
66
unzip/unzip-5.52/cmsmvs/zipinfo.exec
Normal file
66
unzip/unzip-5.52/cmsmvs/zipinfo.exec
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/***********************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Front-end EXEC to set up linkage to the C runtime libraries */
|
||||||
|
/* before executing a MODULE generated from C code. */
|
||||||
|
/* */
|
||||||
|
/* Copy this file as an EXEC with a filename matching the C MODULE. */
|
||||||
|
/* */
|
||||||
|
/* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */
|
||||||
|
/* */
|
||||||
|
/***********************************************************************/
|
||||||
|
Address Command
|
||||||
|
Parse Arg argstring
|
||||||
|
Parse Source . . myname .
|
||||||
|
|
||||||
|
/* Set output and input character translation so brackets show up */
|
||||||
|
'SET OUTPUT AD' 'BA'x
|
||||||
|
'SET OUTPUT BD' 'BB'x
|
||||||
|
'SET INPUT BA AD'
|
||||||
|
'SET INPUT BB BD'
|
||||||
|
|
||||||
|
Call CLIB
|
||||||
|
If rc<>0 Then Do
|
||||||
|
Say 'The required C runtime libraries don''t appear to be available.'
|
||||||
|
Say myname 'can not run.'
|
||||||
|
Exit 12
|
||||||
|
End
|
||||||
|
|
||||||
|
/* Run the command */
|
||||||
|
myname argstring
|
||||||
|
Exit rc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Contents of the CLIB EXEC, modified for RC checking. */
|
||||||
|
/* Removed TXTLIB setting. Only LOADLIB needed for execution. */
|
||||||
|
CLIB:
|
||||||
|
/***************************************************/
|
||||||
|
/* SET UP LIBRARIES FOR LE for MVS & VM */
|
||||||
|
/***************************************************/
|
||||||
|
Address COMMAND
|
||||||
|
|
||||||
|
loadlib ='EDCLINK' /* C/370 runtime */
|
||||||
|
loadlib ='SCEERUN' /* LE runtime */
|
||||||
|
|
||||||
|
|
||||||
|
theirs=queued() /* old stack contentsM068*/
|
||||||
|
'QUERY LOADLIB ( LIFO' /* old setting M068*/
|
||||||
|
LoadlibList='' /* init list M068*/
|
||||||
|
rc=0
|
||||||
|
Do while queued()^=theirs /* all lines from cmdM068*/
|
||||||
|
Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/
|
||||||
|
LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/
|
||||||
|
End /*M068*/
|
||||||
|
If loadlibList='NONE' ,
|
||||||
|
Then Do
|
||||||
|
'GLOBAL LOADLIB' Loadlib /* enforce what we need */
|
||||||
|
End
|
||||||
|
Else Do
|
||||||
|
Do xx=1 to Words(loadlib)
|
||||||
|
If Find(loadliblist,word(loadlib,xx)) = 0 ,
|
||||||
|
then loadliblist = loadliblist word(loadlib,xx)
|
||||||
|
End
|
||||||
|
'GLOBAL LOADLIB' loadliblist /* enforce what we need */
|
||||||
|
End
|
||||||
|
Return
|
54
unzip/unzip-5.52/consts.h
Normal file
54
unzip/unzip-5.52/consts.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
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.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
/* 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
|
64
unzip/unzip-5.52/crc32.c
Normal file
64
unzip/unzip-5.52/crc32.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: crc32.c,v 1.5 1996/01/13 14:55:12 spc Exp $ */
|
||||||
|
|
||||||
|
#define __CRC32_C /* identifies this source module */
|
||||||
|
|
||||||
|
#include "zip.h"
|
||||||
|
|
||||||
|
#ifndef USE_ZLIB
|
||||||
|
#ifndef ASM_CRC
|
||||||
|
|
||||||
|
#ifndef ZCONST
|
||||||
|
# define ZCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CRC32
|
||||||
|
# undef CRC32
|
||||||
|
#endif
|
||||||
|
#define CRC32(c, b) (crc_table[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8))
|
||||||
|
#define DO1(buf) crc = CRC32(crc, *buf++)
|
||||||
|
#define DO2(buf) DO1(buf); DO1(buf)
|
||||||
|
#define DO4(buf) DO2(buf); DO2(buf)
|
||||||
|
#define DO8(buf) DO4(buf); DO4(buf)
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
ulg crc32(crc, buf, len)
|
||||||
|
register 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 ZCONST ulg near *crc_table;
|
||||||
|
|
||||||
|
if (buf == NULL) return 0L;
|
||||||
|
|
||||||
|
crc_table = get_crc_table();
|
||||||
|
|
||||||
|
crc = crc ^ 0xffffffffL;
|
||||||
|
#ifndef NO_UNROLLED_LOOPS
|
||||||
|
while (len >= 8) {
|
||||||
|
DO8(buf);
|
||||||
|
len -= 8;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (len) do {
|
||||||
|
DO1(buf);
|
||||||
|
} while (--len);
|
||||||
|
return crc ^ 0xffffffffL; /* (instead of ~c for 64-bit machines) */
|
||||||
|
}
|
||||||
|
#endif /* !ASM_CRC */
|
||||||
|
#endif /* !USE_ZLIB */
|
240
unzip/unzip-5.52/crc_i386.S
Normal file
240
unzip/unzip-5.52/crc_i386.S
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* crc_i386.S, optimized CRC calculation function for Zip and UnZip,
|
||||||
|
* created by Paul Kienitz and Christian Spieler. Last revised 16 Jan 2005.
|
||||||
|
*
|
||||||
|
* GRR 961110: incorporated Scott Field optimizations from win32/crc_i386.asm
|
||||||
|
* => overall 6% speedup in "unzip -tq" on 9MB zipfile (486-66)
|
||||||
|
*
|
||||||
|
* SPC 970402: revised for Rodney Brown's optimizations (32-bit-wide
|
||||||
|
* aligned reads for most of the data from buffer), can be
|
||||||
|
* disabled by defining the macro NO_32_BIT_LOADS
|
||||||
|
*
|
||||||
|
* SPC 971012: added Rodney Brown's additional tweaks for 32-bit-optimized
|
||||||
|
* CPUs (like the Pentium Pro, Pentium II, and probably some
|
||||||
|
* Pentium clones). This optimization is controlled by the
|
||||||
|
* preprocessor switch "__686" and is disabled by default.
|
||||||
|
* (This default is based on the assumption that most users
|
||||||
|
* do not yet work on a Pentium Pro or Pentium II machine ...)
|
||||||
|
*
|
||||||
|
* COS 050116: Enabled the 686 build by default, because there are hardly any
|
||||||
|
* pre-686 CPUs in serious use nowadays. (See SPC 970402 above.)
|
||||||
|
*
|
||||||
|
* FLAT memory model assumed. Calling interface:
|
||||||
|
* - args are pushed onto the stack from right to left,
|
||||||
|
* - return value is given in the EAX register,
|
||||||
|
* - all other registers (with exception of EFLAGS) are preserved. (With
|
||||||
|
* GNU C 2.7.x, %edx and %ecx are `scratch' registers, but preserving
|
||||||
|
* them nevertheless adds only 4 single byte instructions.)
|
||||||
|
*
|
||||||
|
* This source generates the function
|
||||||
|
* ulg crc32(ulg crc, ZCONST uch *buf, extent len).
|
||||||
|
*
|
||||||
|
* Loop unrolling can be disabled by defining the macro NO_UNROLLED_LOOPS.
|
||||||
|
* This results in shorter code at the expense of reduced performance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This file is NOT used in conjunction with zlib. */
|
||||||
|
#ifndef USE_ZLIB
|
||||||
|
|
||||||
|
/* Preprocess with -DNO_UNDERLINE if your C compiler does not prefix
|
||||||
|
* external symbols with an underline character '_'.
|
||||||
|
*/
|
||||||
|
#if defined(NO_UNDERLINE) || defined(__ELF__)
|
||||||
|
# define _crc32 crc32
|
||||||
|
# define _get_crc_table get_crc_table
|
||||||
|
#endif
|
||||||
|
/* Use 16-byte alignment if your assembler supports it. Warning: gas
|
||||||
|
* uses a log(x) parameter (.align 4 means 16-byte alignment). On SVR4
|
||||||
|
* the parameter is a number of bytes.
|
||||||
|
*/
|
||||||
|
#ifndef ALIGNMENT
|
||||||
|
# define ALIGNMENT .align 4,0x90
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(i386) || defined(_i386) || defined(_I386) || defined(__i386)
|
||||||
|
|
||||||
|
/* This version is for 386 Unix, OS/2, MSDOS in 32 bit mode (gcc & gas).
|
||||||
|
* Warning: it uses the AT&T syntax: mov source,dest
|
||||||
|
* This file is only optional. If you want to use the C version,
|
||||||
|
* remove -DASM_CRC from CFLAGS in Makefile and set OBJA to an empty string.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.file "crc_i386.S"
|
||||||
|
|
||||||
|
#if !defined(PRE_686) && !defined(__686)
|
||||||
|
/* Optimize for Pentium Pro and compatible CPUs by default. */
|
||||||
|
# define __686
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(NO_STD_STACKFRAME) && defined(USE_STD_STACKFRAME)
|
||||||
|
# undef USE_STACKFRAME
|
||||||
|
#else
|
||||||
|
/* The default is to use standard stack frame entry, because it
|
||||||
|
* results in smaller code!
|
||||||
|
*/
|
||||||
|
# ifndef USE_STD_STACKFRAME
|
||||||
|
# define USE_STD_STACKFRAME
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_STD_STACKFRAME
|
||||||
|
# define _STD_ENTRY pushl %ebp ; movl %esp,%ebp
|
||||||
|
# define arg1 8(%ebp)
|
||||||
|
# define arg2 12(%ebp)
|
||||||
|
# define arg3 16(%ebp)
|
||||||
|
# define _STD_LEAVE popl %ebp
|
||||||
|
#else /* !USE_STD_STACKFRAME */
|
||||||
|
# define _STD_ENTRY
|
||||||
|
# define arg1 24(%esp)
|
||||||
|
# define arg2 28(%esp)
|
||||||
|
# define arg3 32(%esp)
|
||||||
|
# define _STD_LEAVE
|
||||||
|
#endif /* ?USE_STD_STACKFRAME */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These two (three) macros make up the loop body of the CRC32 cruncher.
|
||||||
|
* registers modified:
|
||||||
|
* eax : crc value "c"
|
||||||
|
* esi : pointer to next data byte (or lword) "buf++"
|
||||||
|
* registers read:
|
||||||
|
* edi : pointer to base of crc_table array
|
||||||
|
* scratch registers:
|
||||||
|
* ebx : index into crc_table array
|
||||||
|
* (requires upper three bytes = 0 when __686 is undefined)
|
||||||
|
*/
|
||||||
|
#ifndef __686 /* optimize for 386, 486, Pentium */
|
||||||
|
#define Do_CRC /* c = (c >> 8) ^ table[c & 0xFF] */\
|
||||||
|
movb %al, %bl ;/* tmp = c & 0xFF */\
|
||||||
|
shrl $8, %eax ;/* c = (c >> 8) */\
|
||||||
|
xorl (%edi, %ebx, 4), %eax ;/* c ^= table[tmp] */
|
||||||
|
#else /* __686 : optimize for Pentium Pro and compatible CPUs */
|
||||||
|
#define Do_CRC /* c = (c >> 8) ^ table[c & 0xFF] */\
|
||||||
|
movzbl %al, %ebx ;/* tmp = c & 0xFF */\
|
||||||
|
shrl $8, %eax ;/* c = (c >> 8) */\
|
||||||
|
xorl (%edi, %ebx, 4), %eax ;/* c ^=table[tmp] */
|
||||||
|
#endif /* ?__686 */
|
||||||
|
|
||||||
|
#define Do_CRC_byte /* c = (c >> 8) ^ table[(c^*buf++)&0xFF] */\
|
||||||
|
xorb (%esi), %al ;/* c ^= *buf */\
|
||||||
|
incl %esi ;/* buf++ */\
|
||||||
|
Do_CRC
|
||||||
|
|
||||||
|
#ifndef NO_32_BIT_LOADS
|
||||||
|
#define Do_CRC_lword \
|
||||||
|
xorl (%esi), %eax ;/* c ^= *(ulg *)buf */\
|
||||||
|
addl $4, %esi ;/* ((ulg *)buf)++ */\
|
||||||
|
Do_CRC \
|
||||||
|
Do_CRC \
|
||||||
|
Do_CRC \
|
||||||
|
Do_CRC
|
||||||
|
#endif /* !NO_32_BIT_LOADS */
|
||||||
|
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
.globl _crc32
|
||||||
|
|
||||||
|
_crc32: /* ulg crc32(ulg crc, uch *buf, extent len) */
|
||||||
|
_STD_ENTRY
|
||||||
|
pushl %edi
|
||||||
|
pushl %esi
|
||||||
|
pushl %ebx
|
||||||
|
pushl %edx
|
||||||
|
pushl %ecx
|
||||||
|
|
||||||
|
movl arg2, %esi /* 2nd arg: uch *buf */
|
||||||
|
subl %eax, %eax /* > if (!buf) */
|
||||||
|
testl %esi, %esi /* > return 0; */
|
||||||
|
jz .L_fine /* > else { */
|
||||||
|
call _get_crc_table
|
||||||
|
movl %eax, %edi
|
||||||
|
movl arg1, %eax /* 1st arg: ulg crc */
|
||||||
|
#ifndef __686
|
||||||
|
subl %ebx, %ebx /* ebx=0; bl usable as dword */
|
||||||
|
#endif
|
||||||
|
movl arg3, %ecx /* 3rd arg: extent len */
|
||||||
|
notl %eax /* > c = ~crc; */
|
||||||
|
|
||||||
|
testl %ecx, %ecx
|
||||||
|
#ifndef NO_UNROLLED_LOOPS
|
||||||
|
jz .L_bail
|
||||||
|
# ifndef NO_32_BIT_LOADS
|
||||||
|
/* Assert now have positive length */
|
||||||
|
.L_align_loop:
|
||||||
|
testl $3, %esi /* Align buf on lword boundary */
|
||||||
|
jz .L_aligned_now
|
||||||
|
Do_CRC_byte
|
||||||
|
decl %ecx
|
||||||
|
jnz .L_align_loop
|
||||||
|
.L_aligned_now:
|
||||||
|
# endif /* !NO_32_BIT_LOADS */
|
||||||
|
movl %ecx, %edx /* save len in edx */
|
||||||
|
shrl $3, %ecx /* ecx = len / 8 */
|
||||||
|
jz .L_No_Eights
|
||||||
|
/* align loop head at start of 486 internal cache line !! */
|
||||||
|
ALIGNMENT
|
||||||
|
.L_Next_Eight:
|
||||||
|
# ifndef NO_32_BIT_LOADS
|
||||||
|
/* Do_CRC_lword */
|
||||||
|
xorl (%esi), %eax ;/* c ^= *(ulg *)buf */
|
||||||
|
addl $4, %esi ;/* ((ulg *)buf)++ */
|
||||||
|
Do_CRC
|
||||||
|
Do_CRC
|
||||||
|
Do_CRC
|
||||||
|
Do_CRC
|
||||||
|
/* Do_CRC_lword */
|
||||||
|
xorl (%esi), %eax ;/* c ^= *(ulg *)buf */
|
||||||
|
addl $4, %esi ;/* ((ulg *)buf)++ */
|
||||||
|
Do_CRC
|
||||||
|
Do_CRC
|
||||||
|
Do_CRC
|
||||||
|
Do_CRC
|
||||||
|
# else /* NO_32_BIT_LOADS */
|
||||||
|
Do_CRC_byte
|
||||||
|
Do_CRC_byte
|
||||||
|
Do_CRC_byte
|
||||||
|
Do_CRC_byte
|
||||||
|
Do_CRC_byte
|
||||||
|
Do_CRC_byte
|
||||||
|
Do_CRC_byte
|
||||||
|
Do_CRC_byte
|
||||||
|
# endif /* ?NO_32_BIT_LOADS */
|
||||||
|
decl %ecx
|
||||||
|
jnz .L_Next_Eight
|
||||||
|
|
||||||
|
.L_No_Eights:
|
||||||
|
movl %edx, %ecx
|
||||||
|
andl $7, %ecx /* ecx = len % 8 */
|
||||||
|
#endif /* !NO_UNROLLED_LOOPS */
|
||||||
|
jz .L_bail /* > if (len) */
|
||||||
|
/* align loop head at start of 486 internal cache line !! */
|
||||||
|
ALIGNMENT
|
||||||
|
.L_loupe: /* > do { */
|
||||||
|
Do_CRC_byte /* c = CRC32(c, *buf++); */
|
||||||
|
decl %ecx /* > } while (--len); */
|
||||||
|
jnz .L_loupe
|
||||||
|
|
||||||
|
.L_bail: /* > } */
|
||||||
|
notl %eax /* > return ~c; */
|
||||||
|
.L_fine:
|
||||||
|
popl %ecx
|
||||||
|
popl %edx
|
||||||
|
popl %ebx
|
||||||
|
popl %esi
|
||||||
|
popl %edi
|
||||||
|
_STD_LEAVE
|
||||||
|
ret
|
||||||
|
|
||||||
|
#else
|
||||||
|
error: this asm version is for 386 only
|
||||||
|
#endif /* i386 || _i386 || _I386 || __i386 */
|
||||||
|
|
||||||
|
#endif /* !USE_ZLIB */
|
227
unzip/unzip-5.52/crctab.c
Normal file
227
unzip/unzip-5.52/crctab.c
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
/*
|
||||||
|
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 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
|
||||||
|
*/
|
||||||
|
/* crctab.c -- supply the CRC table needed for CRC-32 calculations.
|
||||||
|
* Copyright (C) 1995 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: crctab.c,v 1.4 1996/01/08 14:55:12 jloup Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Generate a table 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 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __CRCTAB_C /* identifies this source module */
|
||||||
|
|
||||||
|
#include "zip.h"
|
||||||
|
|
||||||
|
#if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
|
||||||
|
|
||||||
|
#ifndef ZCONST
|
||||||
|
# define ZCONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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[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 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 (i = 0; i < sizeof(p)/sizeof(uch); i++)
|
||||||
|
xor |= 1L << (31 - p[i]);
|
||||||
|
#else
|
||||||
|
# define xor 0xedb88320L
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
crctab_p = (ulg near *) nearmalloc (256*sizeof(ulg));
|
||||||
|
if (crctab_p == NULL) {
|
||||||
|
ziperr(ZE_MEM, "crc_table allocation");
|
||||||
|
}
|
||||||
|
#endif /* DYNALLOC_CRCTAB */
|
||||||
|
|
||||||
|
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] = c;
|
||||||
|
}
|
||||||
|
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[256] = {
|
||||||
|
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
|
||||||
|
};
|
||||||
|
#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 (ZCONST ulg near *)crc_table;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DYNALLOC_CRCTAB
|
||||||
|
void free_crc_table()
|
||||||
|
{
|
||||||
|
if (!CRC_TABLE_IS_EMPTY)
|
||||||
|
{
|
||||||
|
nearfree((ulg near *)crc_table);
|
||||||
|
MARK_CRCTAB_EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !USE_ZLIB || USE_OWN_CRCTAB */
|
583
unzip/unzip-5.52/crypt.c
Normal file
583
unzip/unzip-5.52/crypt.c
Normal file
@ -0,0 +1,583 @@
|
|||||||
|
/*
|
||||||
|
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 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]
|
||||||
|
|
||||||
|
This encryption/decryption source code for Info-Zip software was
|
||||||
|
originally written in Europe. The whole source package can be
|
||||||
|
freely distributed, including from the USA. (Prior to January 2000,
|
||||||
|
re-export from the US was a violation of US law.)
|
||||||
|
|
||||||
|
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 "zip.h"
|
||||||
|
#include "crypt.h"
|
||||||
|
#include "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.
|
||||||
|
*/
|
||||||
|
# include <time.h> /* time() function supplies first part of crypt seed */
|
||||||
|
/* "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 */
|
||||||
|
local ulg 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
|
||||||
|
|
||||||
|
#ifndef CRC_32_TAB
|
||||||
|
# define CRC_32_TAB crc_32_tab
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CRC32(c, b) (CRC_32_TAB[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8))
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* 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);
|
||||||
|
GLOBAL(keys[1]) += GLOBAL(keys[0]) & 0xff;
|
||||||
|
GLOBAL(keys[1]) = GLOBAL(keys[1]) * 134775813L + 1;
|
||||||
|
{
|
||||||
|
register int keyshift = (int)(GLOBAL(keys[1]) >> 24);
|
||||||
|
GLOBAL(keys[2]) = CRC32(GLOBAL(keys[2]), keyshift);
|
||||||
|
}
|
||||||
|
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 */
|
||||||
|
{
|
||||||
|
GLOBAL(keys[0]) = 305419896L;
|
||||||
|
GLOBAL(keys[1]) = 591751049L;
|
||||||
|
GLOBAL(keys[2]) = 878082192L;
|
||||||
|
while (*passwd != '\0') {
|
||||||
|
update_keys(__G__ (int)*passwd);
|
||||||
|
passwd++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#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 */
|
||||||
|
int ztemp; /* temporary for zencoded value */
|
||||||
|
uch header[RAND_HEAD_LEN-2]; /* 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++) {
|
||||||
|
ztemp = zencode(header[n], t);
|
||||||
|
putc(ztemp, zfile);
|
||||||
|
}
|
||||||
|
ztemp = zencode((int)(crc >> 16) & 0xff, t);
|
||||||
|
putc(ztemp, zfile);
|
||||||
|
ztemp = zencode((int)(crc >> 24) & 0xff, t);
|
||||||
|
putc(ztemp, zfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#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;
|
||||||
|
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 */
|
||||||
|
{
|
||||||
|
int c0, c1; /* last two input bytes */
|
||||||
|
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--) {
|
||||||
|
c0 = c1;
|
||||||
|
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
|
||||||
|
c0++; /* avoid warning on unused variable */
|
||||||
|
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;
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
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 */
|
175
unzip/unzip-5.52/crypt.h
Normal file
175
unzip/unzip-5.52/crypt.h
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
crypt.h (full version) by Info-ZIP. Last revised: [see CR_VERSION_DATE]
|
||||||
|
|
||||||
|
This encryption/decryption source code for Info-Zip software was
|
||||||
|
originally written in Europe. The whole source package can be
|
||||||
|
freely distributed, including from the USA. (Prior to January 2000,
|
||||||
|
re-export from the US was a violation of US law.)
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
#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 9
|
||||||
|
#ifdef CR_BETA
|
||||||
|
# define CR_BETA_VER "a BETA"
|
||||||
|
# define CR_VERSION_DATE "05 May 2000" /* last real code change */
|
||||||
|
#else
|
||||||
|
# define CR_BETA_VER ""
|
||||||
|
# define CR_VERSION_DATE "05 May 2000" /* 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 */
|
||||||
|
#ifndef CRC_32_TAB /* UnZip provides this in globals.h */
|
||||||
|
# if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
|
||||||
|
extern ZCONST ulg near *crc_32_tab;
|
||||||
|
# else
|
||||||
|
extern ZCONST ulg Far *crc_32_tab;
|
||||||
|
# endif
|
||||||
|
#endif /* !CRC_32_TAB */
|
||||||
|
|
||||||
|
/* 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 */
|
284
unzip/unzip-5.52/ebcdic.h
Normal file
284
unzip/unzip-5.52/ebcdic.h
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
/*
|
||||||
|
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 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[] = {
|
||||||
|
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[] = {
|
||||||
|
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 */
|
||||||
|
|
||||||
|
#if defined(THEOS) || defined(THEOS_SUPPORT)
|
||||||
|
# include "theos/charconv.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ebcdic_h */
|
317
unzip/unzip-5.52/envargs.c
Normal file
317
unzip/unzip-5.52/envargs.c
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
/*
|
||||||
|
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 "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 "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__ */
|
||||||
|
|
||||||
|
#ifndef RISCOS
|
||||||
|
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 */
|
615
unzip/unzip-5.52/explode.c
Normal file
615
unzip/unzip-5.52/explode.c
Normal file
@ -0,0 +1,615 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/* explode.c -- by Mark Adler
|
||||||
|
version c15, 6 July 1996 */
|
||||||
|
|
||||||
|
|
||||||
|
/* 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)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
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 "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));
|
||||||
|
int explode OF((__GPRO));
|
||||||
|
|
||||||
|
|
||||||
|
/* 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). */
|
||||||
|
{
|
||||||
|
ulg 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 > (ulg)n ? s - (ulg)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). */
|
||||||
|
{
|
||||||
|
ulg 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 > (ulg)n ? s - (ulg)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
|
2403
unzip/unzip-5.52/extract.c
Normal file
2403
unzip/unzip-5.52/extract.c
Normal file
File diff suppressed because it is too large
Load Diff
2396
unzip/unzip-5.52/extract.c.orig
Normal file
2396
unzip/unzip-5.52/extract.c.orig
Normal file
File diff suppressed because it is too large
Load Diff
10
unzip/unzip-5.52/file_id.diz
Normal file
10
unzip/unzip-5.52/file_id.diz
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Info-ZIP's UnZip 5.52: generic C sources
|
||||||
|
Complete C source code for Info-ZIP's
|
||||||
|
PKUNZIP-compatible .zip extractor, for
|
||||||
|
all supported compilers and platforms
|
||||||
|
(Unix, OS/2, MS-DOS, NT, VMS, Amiga,
|
||||||
|
Atari, Mac, Acorn, VM/CMS, etc.), plus
|
||||||
|
lots of pretty decent documentation.
|
||||||
|
This is FREE (but copyrighted) software.
|
||||||
|
See LICENSE for details on distribution
|
||||||
|
and reuse.
|
2575
unzip/unzip-5.52/fileio.c
Normal file
2575
unzip/unzip-5.52/fileio.c
Normal file
File diff suppressed because it is too large
Load Diff
8
unzip/unzip-5.52/flexos/Contents
Normal file
8
unzip/unzip-5.52/flexos/Contents
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
Contents of the "flexos" subdirectory for UnZip 5.32 and later:
|
||||||
|
|
||||||
|
Contents this file
|
||||||
|
README notes about limitations and assumptions of the FlexOS port
|
||||||
|
flexos.c OS-dependent UnZip routines for FlexOS
|
||||||
|
flxcfg.h OS-dependent configuration, included by unzpriv.h
|
||||||
|
hc.pro profile for MetaWare High C
|
||||||
|
makefile makefile for MetaWare High C, PAMAKE
|
39
unzip/unzip-5.52/flexos/README
Normal file
39
unzip/unzip-5.52/flexos/README
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
This should be considered an initial port - there will probably be some
|
||||||
|
bugs and non-functioning features.
|
||||||
|
|
||||||
|
The only functionality that has had any real testing is "unzip filename",
|
||||||
|
anything else is basically untested.
|
||||||
|
|
||||||
|
This has been cross-compiled from DOS using Metaware's High C compiler
|
||||||
|
and the DOS version of pamake (v3.0). It should compile with the FlexOS
|
||||||
|
hosted version of HighC, and the makefile could be converted to work
|
||||||
|
with the native FlexOS make.
|
||||||
|
|
||||||
|
The following considerations apply:
|
||||||
|
|
||||||
|
)Compiled against and linked with portlib.
|
||||||
|
)Used on FlexOS 286 v2.32
|
||||||
|
)Volume labels are not supported - this is due to the way FlexOS decides
|
||||||
|
if a drive has case-sensitive filenames based upon the contents of the
|
||||||
|
volume label.
|
||||||
|
)No special handling for case-sensitive media (see above).
|
||||||
|
)Not using the PORTLIB wildarg routine (i.e., UnZip does its own globbing).
|
||||||
|
)Based upon the MSDOS port.
|
||||||
|
)Filenames are in FAT format.
|
||||||
|
)The current version of getch is a cheat (simply using getchar()). I
|
||||||
|
should interrogate stdin and if it's a FlexOS console use special code
|
||||||
|
to turn off echo and just read one char.
|
||||||
|
)Only the basic MSDOS FAT file attributes are saved/restored. There is
|
||||||
|
currently no support for the FlexOS extended file attributes.
|
||||||
|
)There is some code that should attempt to do the correct thing when a
|
||||||
|
pathspec with a logical name definition is used (e.g., "system:path/to/it");
|
||||||
|
however it again has not been stress-tested.
|
||||||
|
)There is no special handling for floppy drives, there probably should
|
||||||
|
be.
|
||||||
|
)The dateformat is compiled in as DMY (shoot me I'm British), I'm not
|
||||||
|
sure if there is actually a way to get locale info.
|
||||||
|
)The assembler speedups haven't yet been ported to ASM86 (should simply
|
||||||
|
be a change of syntax)
|
||||||
|
|
||||||
|
--
|
||||||
|
D.Fawcus 17 July 1997
|
932
unzip/unzip-5.52/flexos/flexos.c
Normal file
932
unzip/unzip-5.52/flexos/flexos.c
Normal file
@ -0,0 +1,932 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
flexos.c
|
||||||
|
|
||||||
|
FlexOS-specific routines for use with Info-ZIP's UnZip 5.2 and later.
|
||||||
|
|
||||||
|
Based upon the MSDOS version of this file (msdos/msdos.c)
|
||||||
|
|
||||||
|
Contains: do_wild()
|
||||||
|
mapattr()
|
||||||
|
mapname()
|
||||||
|
map2fat()
|
||||||
|
checkdir()
|
||||||
|
close_outfile()
|
||||||
|
dateformat()
|
||||||
|
version()
|
||||||
|
_wildarg()
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define UNZIP_INTERNAL
|
||||||
|
#include "unzip.h"
|
||||||
|
|
||||||
|
#include <flexif.h>
|
||||||
|
|
||||||
|
/* The following should really be a static declaration, but the compiler
|
||||||
|
complains (crappy compiler can't cope with a static forward declaration).
|
||||||
|
*/
|
||||||
|
extern void map2fat OF((char *pathcomp, char *last_dot));
|
||||||
|
|
||||||
|
static int created_dir; /* used by mapname(), checkdir() */
|
||||||
|
static int renamed_fullpath; /* ditto */
|
||||||
|
|
||||||
|
/*****************************/
|
||||||
|
/* Strings used in flexos.c */
|
||||||
|
/*****************************/
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
static ZCONST char Far CantAllocateWildcard[] =
|
||||||
|
"warning: cannot allocate wildcard buffers\n";
|
||||||
|
#endif
|
||||||
|
static ZCONST char Far WarnDirTraversSkip[] =
|
||||||
|
"warning: skipped \"../\" path component(s) in %s\n";
|
||||||
|
static ZCONST char Far Creating[] = " creating: %s\n";
|
||||||
|
static ZCONST char Far ConversionFailed[] =
|
||||||
|
"mapname: conversion of %s failed\n";
|
||||||
|
static ZCONST char Far PathTooLong[] = "checkdir error: path too long: %s\n";
|
||||||
|
static ZCONST char Far CantCreateDir[] = "checkdir error: cannot create %s\n\
|
||||||
|
unable to process %s.\n";
|
||||||
|
static ZCONST char Far DirIsntDirectory[] =
|
||||||
|
"checkdir error: %s exists but is not directory\n\
|
||||||
|
unable to process %s.\n";
|
||||||
|
static ZCONST char Far PathTooLongTrunc[] =
|
||||||
|
"checkdir warning: path too long; truncating\n %s\n\
|
||||||
|
-> %s\n";
|
||||||
|
#if (!defined(SFX) || defined(SFX_EXDIR))
|
||||||
|
static ZCONST char Far CantCreateExtractDir[] =
|
||||||
|
"checkdir: cannot create extraction directory: %s\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function do_wild() */ /* identical to OS/2 version */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
char *do_wild(__G__ wildspec)
|
||||||
|
__GDEF
|
||||||
|
ZCONST char *wildspec; /* only used first time on a given dir */
|
||||||
|
{
|
||||||
|
static DIR *wild_dir = (DIR *)NULL;
|
||||||
|
static ZCONST char *wildname;
|
||||||
|
static char *dirname, matchname[FILNAMSIZ];
|
||||||
|
static int notfirstcall=FALSE, have_dirname, dirnamelen;
|
||||||
|
char *fnamestart;
|
||||||
|
struct dirent *file;
|
||||||
|
|
||||||
|
/* Even when we're just returning wildspec, we *always* do so in
|
||||||
|
* matchname[]--calling routine is allowed to append four characters
|
||||||
|
* to the returned string, and wildspec may be a pointer to argv[].
|
||||||
|
*/
|
||||||
|
if (!notfirstcall) { /* first call: must initialize everything */
|
||||||
|
notfirstcall = TRUE;
|
||||||
|
|
||||||
|
if (!iswild(wildspec)) {
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
have_dirname = FALSE;
|
||||||
|
dir = NULL;
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* break the wildspec into a directory part and a wildcard filename */
|
||||||
|
if ((wildname = strrchr(wildspec, '/')) == (ZCONST char *)NULL &&
|
||||||
|
(wildname = strrchr(wildspec, ':')) == (ZCONST char *)NULL) {
|
||||||
|
dirname = ".";
|
||||||
|
dirnamelen = 1;
|
||||||
|
have_dirname = FALSE;
|
||||||
|
wildname = wildspec;
|
||||||
|
} else {
|
||||||
|
++wildname; /* point at character after '/' or ':' */
|
||||||
|
dirnamelen = (int)(wildname - wildspec);
|
||||||
|
if ((dirname = (char *)malloc(dirnamelen+1)) == (char *)NULL) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
LoadFarString(CantAllocateWildcard)));
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
return matchname; /* but maybe filespec was not a wildcard */
|
||||||
|
}
|
||||||
|
/* GRR: cannot strip trailing char for opendir since might be "d:/" or "d:"
|
||||||
|
* (would have to check for "./" at end--let opendir handle it instead) */
|
||||||
|
strncpy(dirname, wildspec, dirnamelen);
|
||||||
|
dirname[dirnamelen] = '\0'; /* terminate for strcpy below */
|
||||||
|
have_dirname = TRUE;
|
||||||
|
}
|
||||||
|
Trace((stderr, "do_wild: dirname = [%s]\n", FnFilter1(dirname)));
|
||||||
|
|
||||||
|
if ((wild_dir = opendir(dirname)) != (DIR *)NULL) {
|
||||||
|
if (have_dirname) {
|
||||||
|
strcpy(matchname, dirname);
|
||||||
|
fnamestart = matchname + dirnamelen;
|
||||||
|
} else
|
||||||
|
fnamestart = matchname;
|
||||||
|
while ((file = readdir(wild_dir)) != (struct dirent *)NULL) {
|
||||||
|
Trace((stderr, "do_wild: readdir returns %s\n",
|
||||||
|
FnFilter1(file->d_name)));
|
||||||
|
strcpy(fnamestart, file->d_name);
|
||||||
|
if (strrchr(fnamestart, '.') == (char *)NULL)
|
||||||
|
strcat(fnamestart, ".");
|
||||||
|
if (match(fnamestart, wildname, 1 WISEP) && /* 1=ignore case */
|
||||||
|
/* skip "." and ".." directory entries */
|
||||||
|
strcmp(fnamestart, ".") && strcmp(fnamestart, "..")) {
|
||||||
|
Trace((stderr, "do_wild: match() succeeds\n"));
|
||||||
|
/* remove trailing dot */
|
||||||
|
fnamestart += strlen(fnamestart) - 1;
|
||||||
|
if (*fnamestart == '.')
|
||||||
|
*fnamestart = '\0';
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* if we get to here directory is exhausted, so close it */
|
||||||
|
closedir(wild_dir);
|
||||||
|
wild_dir = (DIR *)NULL;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
else {
|
||||||
|
Trace((stderr, "do_wild: opendir(%s) returns NULL\n",
|
||||||
|
FnFilter1(dirname)));
|
||||||
|
}
|
||||||
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
/* return the raw wildspec in case that works (e.g., directory not
|
||||||
|
* searchable, but filespec was not wild and file is readable) */
|
||||||
|
strncpy(matchname, wildspec, FILNAMSIZ);
|
||||||
|
matchname[FILNAMSIZ-1] = '\0';
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* last time through, might have failed opendir but returned raw wildspec */
|
||||||
|
if (wild_dir == (DIR *)NULL) {
|
||||||
|
notfirstcall = FALSE; /* nothing left to try--reset for new wildspec */
|
||||||
|
if (have_dirname)
|
||||||
|
free(dirname);
|
||||||
|
return (char *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we've gotten this far, we've read and matched at least one entry
|
||||||
|
* successfully (in a previous call), so dirname has been copied into
|
||||||
|
* matchname already.
|
||||||
|
*/
|
||||||
|
if (have_dirname) {
|
||||||
|
/* strcpy(matchname, dirname); */
|
||||||
|
fnamestart = matchname + dirnamelen;
|
||||||
|
} else
|
||||||
|
fnamestart = matchname;
|
||||||
|
while ((file = readdir(wild_dir)) != (struct dirent *)NULL) {
|
||||||
|
Trace((stderr, "do_wild: readdir returns %s\n",
|
||||||
|
FnFilter1(file->d_name)));
|
||||||
|
strcpy(fnamestart, file->d_name);
|
||||||
|
if (strrchr(fnamestart, '.') == (char *)NULL)
|
||||||
|
strcat(fnamestart, ".");
|
||||||
|
if (match(fnamestart, wildname, 1 WISEP)) { /* 1 == ignore case */
|
||||||
|
Trace((stderr, "do_wild: match() succeeds\n"));
|
||||||
|
/* remove trailing dot */
|
||||||
|
fnamestart += strlen(fnamestart) - 1;
|
||||||
|
if (*fnamestart == '.')
|
||||||
|
*fnamestart = '\0';
|
||||||
|
return matchname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(wild_dir); /* have read at least one entry; nothing left */
|
||||||
|
wild_dir = (DIR *)NULL;
|
||||||
|
notfirstcall = FALSE; /* reset for new wildspec */
|
||||||
|
if (have_dirname)
|
||||||
|
free(dirname);
|
||||||
|
return (char *)NULL;
|
||||||
|
|
||||||
|
} /* end function do_wild() */
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function mapattr() */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
int mapattr(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
/* set archive bit (file is not backed up): */
|
||||||
|
G.pInfo->file_attr = (unsigned)(G.crec.external_file_attributes & 7) | 32;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function mapname() */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
int mapname(__G__ renamed)
|
||||||
|
__GDEF
|
||||||
|
int renamed;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - caution (truncated filename)
|
||||||
|
* MPN_INF_SKIP - info "skip entry" (dir doesn't exist)
|
||||||
|
* MPN_ERR_SKIP - error -> skip entry
|
||||||
|
* MPN_ERR_TOOLONG - error -> path is too long
|
||||||
|
* MPN_NOMEM - error (memory allocation failed) -> skip entry
|
||||||
|
* [also MPN_VOL_LABEL, MPN_CREATED_DIR]
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
char pathcomp[FILNAMSIZ]; /* path-component buffer */
|
||||||
|
char *pp, *cp=(char *)NULL; /* character pointers */
|
||||||
|
char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */
|
||||||
|
char *last_dot=(char *)NULL; /* last dot not converted to underscore */
|
||||||
|
int dotname = FALSE; /* path component begins with dot? */
|
||||||
|
int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */
|
||||||
|
int error = MPN_OK;
|
||||||
|
register unsigned workch; /* hold the character being tested */
|
||||||
|
|
||||||
|
|
||||||
|
if (G.pInfo->vollabel)
|
||||||
|
return MPN_VOL_LABEL; /* Cannot set disk volume labels in FlexOS */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Initialize various pointers and counters and stuff.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* can create path as long as not just freshening, or if user told us */
|
||||||
|
G.create_dirs = (!uO.fflag || renamed);
|
||||||
|
|
||||||
|
created_dir = FALSE; /* not yet */
|
||||||
|
renamed_fullpath = FALSE;
|
||||||
|
|
||||||
|
if (renamed) {
|
||||||
|
cp = G.filename - 1; /* point to beginning of renamed name... */
|
||||||
|
while (*++cp)
|
||||||
|
if (*cp == '\\') /* convert backslashes to forward */
|
||||||
|
*cp = '/';
|
||||||
|
cp = G.filename;
|
||||||
|
/* use temporary rootpath if user gave full pathname */
|
||||||
|
if (G.filename[0] == '/') {
|
||||||
|
renamed_fullpath = TRUE;
|
||||||
|
pathcomp[0] = '/'; /* copy the '/' and terminate */
|
||||||
|
pathcomp[1] = '\0';
|
||||||
|
++cp;
|
||||||
|
} else if (isalpha((uch)G.filename[0]) && G.filename[1] == ':') {
|
||||||
|
renamed_fullpath = TRUE;
|
||||||
|
pp = pathcomp;
|
||||||
|
*pp++ = *cp++; /* copy the "d:" (+ '/', possibly) */
|
||||||
|
*pp++ = *cp++;
|
||||||
|
if (*cp == '/')
|
||||||
|
*pp++ = *cp++; /* otherwise add "./"? */
|
||||||
|
*pp = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pathcomp is ignored unless renamed_fullpath is TRUE: */
|
||||||
|
if ((error = checkdir(__G__ pathcomp, INIT)) != 0) /* initialize path buf */
|
||||||
|
return error; /* ...unless no mem or vol label on hard disk */
|
||||||
|
|
||||||
|
*pathcomp = '\0'; /* initialize translation buffer */
|
||||||
|
pp = pathcomp; /* point to translation buffer */
|
||||||
|
if (!renamed) { /* cp already set if renamed */
|
||||||
|
if (uO.jflag) /* junking directories */
|
||||||
|
cp = (char *)strrchr(G.filename, '/');
|
||||||
|
if (cp == (char *)NULL) /* no '/' or not junking dirs */
|
||||||
|
cp = G.filename; /* point to internal zipfile-member pathname */
|
||||||
|
else
|
||||||
|
++cp; /* point to start of last component of path */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Begin main loop through characters in filename.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
while ((workch = (uch)*cp++) != 0) {
|
||||||
|
|
||||||
|
switch (workch) {
|
||||||
|
case '/': /* can assume -j flag not given */
|
||||||
|
*pp = '\0';
|
||||||
|
map2fat(pathcomp, last_dot); /* 8.3 truncation (in place) */
|
||||||
|
last_dot = (char *)NULL;
|
||||||
|
if (strcmp(pathcomp, ".") == 0) {
|
||||||
|
/* don't bother appending "./" to the path */
|
||||||
|
*pathcomp = '\0';
|
||||||
|
} else if (!uO.ddotflag && strcmp(pathcomp, "..") == 0) {
|
||||||
|
/* "../" dir traversal detected, skip over it */
|
||||||
|
*pathcomp = '\0';
|
||||||
|
killed_ddot = TRUE; /* set "show message" flag */
|
||||||
|
}
|
||||||
|
/* when path component is not empty, append it now */
|
||||||
|
if (*pathcomp != '\0' &&
|
||||||
|
((error = checkdir(__G__ pathcomp, APPEND_DIR))
|
||||||
|
& MPN_MASK) > MPN_INF_TRUNC)
|
||||||
|
return error;
|
||||||
|
pp = pathcomp; /* reset conversion buffer for next piece */
|
||||||
|
lastsemi = (char *)NULL; /* leave direct. semi-colons alone */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '.':
|
||||||
|
if (pp == pathcomp) { /* nothing appended yet... */
|
||||||
|
if (*cp == '.' && cp[1] == '/') { /* "../" */
|
||||||
|
*pp++ = '.'; /* add first dot, unchanged... */
|
||||||
|
++cp; /* skip second dot, since it will */
|
||||||
|
} else { /* be "added" at end of if-block */
|
||||||
|
*pp++ = '_'; /* FAT doesn't allow null filename */
|
||||||
|
dotname = TRUE; /* bodies, so map .exrc -> _.exrc */
|
||||||
|
} /* (extra '_' now, "dot" below) */
|
||||||
|
} else if (dotname) { /* found a second dot, but still */
|
||||||
|
dotname = FALSE; /* have extra leading underscore: */
|
||||||
|
*pp = '\0'; /* remove it by shifting chars */
|
||||||
|
pp = pathcomp + 1; /* left one space (e.g., .p1.p2: */
|
||||||
|
while (pp[1]) { /* __p1 -> _p1_p2 -> _p1.p2 when */
|
||||||
|
*pp = pp[1]; /* finished) [opt.: since first */
|
||||||
|
++pp; /* two chars are same, can start */
|
||||||
|
} /* shifting at second position] */
|
||||||
|
}
|
||||||
|
last_dot = pp; /* point at last dot so far... */
|
||||||
|
*pp++ = '_'; /* convert dot to underscore for now */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* drive names are not stored in zipfile, so no colons allowed;
|
||||||
|
* no brackets or most other punctuation either (all of which
|
||||||
|
* can appear in Unix-created archives; backslash is particularly
|
||||||
|
* bad unless all necessary directories exist) */
|
||||||
|
case '[': /* these punctuation characters forbidden */
|
||||||
|
case ']': /* only on plain FAT file systems */
|
||||||
|
case '+':
|
||||||
|
case ',':
|
||||||
|
case '=':
|
||||||
|
case ':': /* special shell characters of command.com */
|
||||||
|
case '\\': /* (device and directory limiters, wildcard */
|
||||||
|
case '"': /* characters, stdin/stdout redirection and */
|
||||||
|
case '<': /* pipe indicators and the quote sign) are */
|
||||||
|
case '>': /* never allowed in filenames on (V)FAT */
|
||||||
|
case '|':
|
||||||
|
case '*':
|
||||||
|
case '?':
|
||||||
|
*pp++ = '_';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ';': /* start of VMS version? */
|
||||||
|
lastsemi = pp;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ' ': /* change spaces to underscores */
|
||||||
|
if (uO.sflag) /* only if requested */
|
||||||
|
*pp++ = '_';
|
||||||
|
else
|
||||||
|
*pp++ = (char)workch;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* allow ASCII 255 and European characters in filenames: */
|
||||||
|
if (isprint(workch) || workch >= 127)
|
||||||
|
*pp++ = (char)workch;
|
||||||
|
|
||||||
|
} /* end switch */
|
||||||
|
} /* end while loop */
|
||||||
|
|
||||||
|
/* Show warning when stripping insecure "parent dir" path components */
|
||||||
|
if (killed_ddot && QCOND2) {
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(WarnDirTraversSkip),
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
if (!(error & ~MPN_MASK))
|
||||||
|
error = (error & MPN_MASK) | PK_WARN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Report if directory was created (and no file to create: filename ended
|
||||||
|
in '/'), check name to be sure it exists, and combine path and name be-
|
||||||
|
fore exiting.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (G.filename[strlen(G.filename) - 1] == '/') {
|
||||||
|
checkdir(__G__ G.filename, GETPATH);
|
||||||
|
if (created_dir) {
|
||||||
|
if (QCOND2) {
|
||||||
|
Info(slide, 0, ((char *)slide, LoadFarString(Creating),
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
}
|
||||||
|
/* set dir time (note trailing '/') */
|
||||||
|
return (error & ~MPN_MASK) | MPN_CREATED_DIR;
|
||||||
|
}
|
||||||
|
/* dir existed already; don't look for data to extract */
|
||||||
|
return (error & ~MPN_MASK) | MPN_INF_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pp = '\0'; /* done with pathcomp: terminate it */
|
||||||
|
|
||||||
|
/* if not saving them, remove VMS version numbers (appended ";###") */
|
||||||
|
if (!uO.V_flag && lastsemi) {
|
||||||
|
pp = lastsemi; /* semi-colon was omitted: expect all #'s */
|
||||||
|
while (isdigit((uch)(*pp)))
|
||||||
|
++pp;
|
||||||
|
if (*pp == '\0') /* only digits between ';' and end: nuke */
|
||||||
|
*lastsemi = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
map2fat(pathcomp, last_dot); /* 8.3 truncation (in place) */
|
||||||
|
|
||||||
|
if (*pathcomp == '\0') {
|
||||||
|
Info(slide, 1, ((char *)slide, LoadFarString(ConversionFailed),
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
return (error & ~MPN_MASK) | MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
checkdir(__G__ pathcomp, APPEND_NAME); /* returns 1 if truncated: care? */
|
||||||
|
checkdir(__G__ G.filename, GETPATH);
|
||||||
|
|
||||||
|
return error;
|
||||||
|
|
||||||
|
} /* end function mapname() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Function map2fat() */
|
||||||
|
/**********************/
|
||||||
|
|
||||||
|
static void map2fat(pathcomp, last_dot)
|
||||||
|
char *pathcomp, *last_dot;
|
||||||
|
{
|
||||||
|
char *pEnd = pathcomp + strlen(pathcomp);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Case 1: filename has no dot, so figure out if we should add one. Note
|
||||||
|
that the algorithm does not try to get too fancy: if there are no dots
|
||||||
|
already, the name either gets truncated at 8 characters or the last un-
|
||||||
|
derscore is converted to a dot (only if more characters are saved that
|
||||||
|
way). In no case is a dot inserted between existing characters.
|
||||||
|
|
||||||
|
GRR: have problem if filename is volume label??
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* pEnd = pathcomp + strlen(pathcomp); */
|
||||||
|
if (last_dot == (char *)NULL) { /* no dots: check for underscores... */
|
||||||
|
char *plu = strrchr(pathcomp, '_'); /* pointer to last underscore */
|
||||||
|
|
||||||
|
if (plu == (char *)NULL) { /* no dots, no underscores: truncate at */
|
||||||
|
if (pEnd > pathcomp+8) /* 8 chars (could insert '.' and keep 11) */
|
||||||
|
*(pEnd = pathcomp+8) = '\0';
|
||||||
|
} else if (MIN(plu - pathcomp, 8) + MIN(pEnd - plu - 1, 3) > 8) {
|
||||||
|
last_dot = plu; /* be lazy: drop through to next if-block */
|
||||||
|
} else if ((pEnd - pathcomp) > 8) /* more fits into just basename */
|
||||||
|
pathcomp[8] = '\0'; /* than if convert last underscore to dot */
|
||||||
|
/* else whole thing fits into 8 chars or less: no change */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Case 2: filename has dot in it, so truncate first half at 8 chars (shift
|
||||||
|
extension if necessary) and second half at three.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (last_dot != (char *)NULL) { /* one dot (or two, in the case of */
|
||||||
|
*last_dot = '.'; /* "..") is OK: put it back in */
|
||||||
|
|
||||||
|
if ((last_dot - pathcomp) > 8) {
|
||||||
|
char *p=last_dot, *q=pathcomp+8;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; (i < 4) && *p; ++i) /* too many chars in basename: */
|
||||||
|
*q++ = *p++; /* shift extension left and */
|
||||||
|
*q = '\0'; /* truncate/terminate it */
|
||||||
|
} else if ((pEnd - last_dot) > 4)
|
||||||
|
last_dot[4] = '\0'; /* too many chars in extension */
|
||||||
|
/* else filename is fine as is: no change */
|
||||||
|
}
|
||||||
|
} /* end function map2fat() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************/
|
||||||
|
/* Function checkdir() */
|
||||||
|
/***********************/
|
||||||
|
|
||||||
|
int checkdir(__G__ pathcomp, flag)
|
||||||
|
__GDEF
|
||||||
|
char *pathcomp;
|
||||||
|
int flag;
|
||||||
|
/*
|
||||||
|
* returns:
|
||||||
|
* MPN_OK - no problem detected
|
||||||
|
* MPN_INF_TRUNC - (on APPEND_NAME) truncated filename
|
||||||
|
* MPN_INF_SKIP - path doesn't exist, not allowed to create
|
||||||
|
* MPN_ERR_SKIP - path doesn't exist, tried to create and failed; or path
|
||||||
|
* exists and is not a directory, but is supposed to be
|
||||||
|
* MPN_ERR_TOOLONG - path is too long
|
||||||
|
* MPN_NOMEM - can't allocate memory for filename buffers
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
static int rootlen = 0; /* length of rootpath */
|
||||||
|
static char *rootpath; /* user's "extract-to" directory */
|
||||||
|
static char *buildpath; /* full path (so far) to extracted file */
|
||||||
|
static char *end; /* pointer to end of buildpath ('\0') */
|
||||||
|
|
||||||
|
# define FN_MASK 7
|
||||||
|
# define FUNCTION (flag & FN_MASK)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
APPEND_DIR: append the path component to the path being built and check
|
||||||
|
for its existence. If doesn't exist and we are creating directories, do
|
||||||
|
so for this one; else signal success or error as appropriate.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == APPEND_DIR) {
|
||||||
|
int too_long = FALSE;
|
||||||
|
|
||||||
|
Trace((stderr, "appending dir segment [%s]\n", FnFilter1(pathcomp)));
|
||||||
|
while ((*end = *pathcomp++) != '\0')
|
||||||
|
++end;
|
||||||
|
|
||||||
|
/* GRR: could do better check, see if overrunning buffer as we go:
|
||||||
|
* check end-buildpath after each append, set warning variable if
|
||||||
|
* within 20 of FILNAMSIZ; then if var set, do careful check when
|
||||||
|
* appending. Clear variable when begin new path. */
|
||||||
|
|
||||||
|
if ((end-buildpath) > FILNAMSIZ-3) /* need '/', one-char name, '\0' */
|
||||||
|
too_long = TRUE; /* check if extracting directory? */
|
||||||
|
if (stat(buildpath, &G.statbuf)) /* path doesn't exist */
|
||||||
|
{
|
||||||
|
if (!G.create_dirs) { /* told not to create (freshening) */
|
||||||
|
free(buildpath);
|
||||||
|
return MPN_INF_SKIP; /* path doesn't exist: nothing to do */
|
||||||
|
}
|
||||||
|
if (too_long) {
|
||||||
|
Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong),
|
||||||
|
FnFilter1(buildpath)));
|
||||||
|
free(buildpath);
|
||||||
|
/* no room for filenames: fatal */
|
||||||
|
return MPN_ERR_TOOLONG;
|
||||||
|
}
|
||||||
|
if (mkdir(buildpath, 0777) == -1) { /* create the directory */
|
||||||
|
Info(slide, 1, ((char *)slide, LoadFarString(CantCreateDir),
|
||||||
|
FnFilter2(buildpath), FnFilter1(G.filename)));
|
||||||
|
free(buildpath);
|
||||||
|
/* path didn't exist, tried to create, failed */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
created_dir = TRUE;
|
||||||
|
} else if (!S_ISDIR(G.statbuf.st_mode)) {
|
||||||
|
Info(slide, 1, ((char *)slide, LoadFarString(DirIsntDirectory),
|
||||||
|
FnFilter2(buildpath), FnFilter1(G.filename)));
|
||||||
|
free(buildpath);
|
||||||
|
/* path existed but wasn't dir */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
if (too_long) {
|
||||||
|
Info(slide, 1, ((char *)slide, LoadFarString(PathTooLong),
|
||||||
|
FnFilter1(buildpath)));
|
||||||
|
free(buildpath);
|
||||||
|
/* no room for filenames: fatal */
|
||||||
|
return MPN_ERR_TOOLONG;
|
||||||
|
}
|
||||||
|
*end++ = '/';
|
||||||
|
*end = '\0';
|
||||||
|
Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath)));
|
||||||
|
return MPN_OK;
|
||||||
|
|
||||||
|
} /* end if (FUNCTION == APPEND_DIR) */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
GETPATH: copy full path to the string pointed at by pathcomp, and free
|
||||||
|
buildpath.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == GETPATH) {
|
||||||
|
strcpy(pathcomp, buildpath);
|
||||||
|
Trace((stderr, "getting and freeing path [%s]\n",
|
||||||
|
FnFilter1(pathcomp)));
|
||||||
|
free(buildpath);
|
||||||
|
buildpath = end = (char *)NULL;
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
APPEND_NAME: assume the path component is the filename; append it and
|
||||||
|
return without checking for existence.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == APPEND_NAME) {
|
||||||
|
Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp)));
|
||||||
|
while ((*end = *pathcomp++) != '\0') {
|
||||||
|
++end;
|
||||||
|
if ((end-buildpath) >= FILNAMSIZ) {
|
||||||
|
*--end = '\0';
|
||||||
|
Info(slide, 1, ((char *)slide, LoadFarString(PathTooLongTrunc),
|
||||||
|
FnFilter1(G.filename), FnFilter2(buildpath)));
|
||||||
|
return MPN_INF_TRUNC; /* filename truncated */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Trace((stderr, "buildpath now = [%s]\n", FnFilter1(buildpath)));
|
||||||
|
/* could check for existence here, prompt for new name... */
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
INIT: allocate and initialize buffer space for the file currently being
|
||||||
|
extracted. If file was renamed with an absolute path, don't prepend the
|
||||||
|
extract-to path.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == INIT) {
|
||||||
|
Trace((stderr, "initializing buildpath to "));
|
||||||
|
/* allocate space for full filename, root path, and maybe "./" */
|
||||||
|
if ((buildpath = (char *)malloc(strlen(G.filename)+rootlen+3)) ==
|
||||||
|
(char *)NULL)
|
||||||
|
return MPN_NOMEM;
|
||||||
|
if (renamed_fullpath) { /* pathcomp = valid data */
|
||||||
|
end = buildpath;
|
||||||
|
while ((*end = *pathcomp++) != '\0')
|
||||||
|
++end;
|
||||||
|
} else if (rootlen > 0) {
|
||||||
|
strcpy(buildpath, rootpath);
|
||||||
|
end = buildpath + rootlen;
|
||||||
|
} else {
|
||||||
|
*buildpath = '\0';
|
||||||
|
end = buildpath;
|
||||||
|
}
|
||||||
|
Trace((stderr, "[%s]\n", FnFilter1(buildpath)));
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
ROOT: if appropriate, store the path in rootpath and create it if neces-
|
||||||
|
sary; else assume it's a zipfile member and return. This path segment
|
||||||
|
gets used in extracting all members from every zipfile specified on the
|
||||||
|
command line. Note that under FlexOS, if a candidate extract-to
|
||||||
|
directory specification includes a drive letter (leading "x:"), it is
|
||||||
|
treated just as if it had a trailing '/'--that is, one directory level
|
||||||
|
will be created if the path doesn't exist, unless this is otherwise pro-
|
||||||
|
hibited (e.g., freshening).
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if (!defined(SFX) || defined(SFX_EXDIR))
|
||||||
|
if (FUNCTION == ROOT) {
|
||||||
|
Trace((stderr, "initializing root path to [%s]\n",
|
||||||
|
FnFilter1(pathcomp)));
|
||||||
|
if (pathcomp == (char *)NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
if (rootlen > 0) /* rootpath was already set, nothing to do */
|
||||||
|
return MPN_OK;
|
||||||
|
if ((rootlen = strlen(pathcomp)) > 0) {
|
||||||
|
int had_trailing_pathsep=FALSE, add_dot=FALSE;
|
||||||
|
char *tmproot;
|
||||||
|
|
||||||
|
if ((tmproot = (char *)malloc(rootlen+3)) == (char *)NULL) {
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_NOMEM;
|
||||||
|
}
|
||||||
|
strcpy(tmproot, pathcomp);
|
||||||
|
if (tmproot[rootlen-1] == '/' || tmproot[rootlen-1] == '\\') {
|
||||||
|
tmproot[--rootlen] = '\0';
|
||||||
|
had_trailing_pathsep = TRUE;
|
||||||
|
}
|
||||||
|
if (tmproot[rootlen-1] == ':') {
|
||||||
|
if (!had_trailing_pathsep) /* i.e., original wasn't "xxx:/" */
|
||||||
|
add_dot = TRUE; /* relative path: add '.' before '/' */
|
||||||
|
} else if (rootlen > 0) && /* need not check "xxx:." and "xxx:/" */
|
||||||
|
(SSTAT(tmproot, &G.statbuf) ||
|
||||||
|
!S_ISDIR(G.statbuf.st_mode))
|
||||||
|
{
|
||||||
|
/* path does not exist */
|
||||||
|
if (!G.create_dirs /* || iswild(tmproot) */ ) {
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
/* treat as stored file */
|
||||||
|
return MPN_INF_SKIP;
|
||||||
|
}
|
||||||
|
/* GRR: scan for wildcard characters? OS-dependent...
|
||||||
|
* if find any, return MPN_INF_SKIP: treat as stored file(s) */
|
||||||
|
/* create directory (could add loop here scanning tmproot
|
||||||
|
* to create more than one level, but really necessary?) */
|
||||||
|
if (mkdir(tmproot, 0777) == -1) {
|
||||||
|
Info(slide, 1, ((char *)slide,
|
||||||
|
LoadFarString(CantCreateExtractDir),
|
||||||
|
FnFilter1(tmproot)));
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
/* path didn't exist, tried to create, and failed: */
|
||||||
|
/* file exists, or 2+ subdir levels required */
|
||||||
|
return MPN_ERR_SKIP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (add_dot) /* had just "x:", make "x:." */
|
||||||
|
tmproot[rootlen++] = '.';
|
||||||
|
tmproot[rootlen++] = '/';
|
||||||
|
tmproot[rootlen] = '\0';
|
||||||
|
if ((rootpath = (char *)realloc(tmproot, rootlen+1)) == NULL) {
|
||||||
|
free(tmproot);
|
||||||
|
rootlen = 0;
|
||||||
|
return MPN_NOMEM;
|
||||||
|
}
|
||||||
|
Trace((stderr, "rootpath now = [%s]\n", FnFilter1(rootpath)));
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
#endif /* !SFX || SFX_EXDIR */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
END: free rootpath, immediately prior to program exit.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (FUNCTION == END) {
|
||||||
|
Trace((stderr, "freeing rootpath\n"));
|
||||||
|
if (rootlen > 0) {
|
||||||
|
free(rootpath);
|
||||||
|
rootlen = 0;
|
||||||
|
}
|
||||||
|
return MPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MPN_INVALID; /* should never reach */
|
||||||
|
|
||||||
|
} /* end function checkdir() */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* Function close_outfile() */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
|
void close_outfile(__G)
|
||||||
|
__GDEF
|
||||||
|
/*
|
||||||
|
* FlexOS VERSION
|
||||||
|
*
|
||||||
|
* Set the output file date/time stamp according to information from the
|
||||||
|
* zipfile directory record for this member, then close the file and set
|
||||||
|
* its permissions (archive, hidden, read-only, system). Aside from closing
|
||||||
|
* the file, this routine is optional (but most compilers support it).
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
DISKFILE df;
|
||||||
|
LONG fnum;
|
||||||
|
|
||||||
|
struct { /* date and time words */
|
||||||
|
union { /* DOS file modification time word */
|
||||||
|
ush ztime;
|
||||||
|
struct {
|
||||||
|
unsigned zt_se : 5;
|
||||||
|
unsigned zt_mi : 6;
|
||||||
|
unsigned zt_hr : 5;
|
||||||
|
} _tf;
|
||||||
|
} _t;
|
||||||
|
union { /* DOS file modification date word */
|
||||||
|
ush zdate;
|
||||||
|
struct {
|
||||||
|
unsigned zd_dy : 5;
|
||||||
|
unsigned zd_mo : 4;
|
||||||
|
unsigned zd_yr : 7;
|
||||||
|
} _df;
|
||||||
|
} _d;
|
||||||
|
} zt;
|
||||||
|
|
||||||
|
#ifdef USE_EF_UT_TIME
|
||||||
|
iztimes z_utime;
|
||||||
|
struct tm *t;
|
||||||
|
#endif /* ?USE_EF_UT_TIME */
|
||||||
|
|
||||||
|
fclose(G.outfile);
|
||||||
|
|
||||||
|
if ((fnum = s_open(A_SET, G.filename)) < 0) {
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: cannot open %s to set the time\n",
|
||||||
|
FnFilter1(G.filename)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s_get(T_FILE, fnum, &df, DSKFSIZE) < 0) {
|
||||||
|
s_close(0, fnum);
|
||||||
|
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: cannot get info on %s\n", FnFilter1(G.filename)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Copy and/or convert time and date variables, if necessary; then fill in
|
||||||
|
the file time/date.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#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.lrec.extra_field_length, 0,
|
||||||
|
G.lrec.last_mod_dos_datetime, &z_utime, NULL) & EB_UT_FL_MTIME))
|
||||||
|
{
|
||||||
|
TTrace((stderr, "close_outfile: Unix e.f. modif. time = %ld\n",
|
||||||
|
z_utime.mtime));
|
||||||
|
t = localtime(&(z_utime.mtime));
|
||||||
|
} else
|
||||||
|
t = (struct tm *)NULL;
|
||||||
|
if (t != (struct tm *)NULL) {
|
||||||
|
if (t->tm_year < 80) {
|
||||||
|
df.df_modyear = 1980;
|
||||||
|
df.df_modmonth = 1;
|
||||||
|
df.df_modday = 1;
|
||||||
|
df.df_modhr = 0;
|
||||||
|
df.df_modmin = 0;
|
||||||
|
df.df_modsec = 0;
|
||||||
|
} else {
|
||||||
|
df.df_modyear = t->tm_year + 1900;
|
||||||
|
df.df_modmonth = t->tm_mon + 1;
|
||||||
|
df.df_modday = t->tm_mday;
|
||||||
|
df.df_modhr = t->tm_hour;
|
||||||
|
df.df_modmin = t->tm_min;
|
||||||
|
df.df_modsec = t->tm_sec;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif /* ?USE_EF_UX_TIME */
|
||||||
|
{
|
||||||
|
zt._t.ztime = (ush)(G.lrec.last_mod_dos_datetime) & 0xffff;
|
||||||
|
zt._d.zdate = (ush)(G.lrec.last_mod_dos_datetime >> 16);
|
||||||
|
|
||||||
|
df.df_modyear = 1980 + zt._d._df.zd_yr;
|
||||||
|
df.df_modmonth = zt._d._df.zd_mo;
|
||||||
|
df.df_modday = zt._d._df.zd_dy;
|
||||||
|
df.df_modhr = zt._t._tf.zt_hr;
|
||||||
|
df.df_modmin = zt._t._tf.zt_mi;
|
||||||
|
df.df_modsec = zt._t._tf.zt_se << 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Fill in the file attributes.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
df.df_attr1 = (UBYTE)G.pInfo->file_attr;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
Now we try to set the attributes & date/time.
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
if (s_set(T_FILE, fnum, &df, DSKFSIZE) < 0)
|
||||||
|
Info(slide, 0x201, ((char *)slide,
|
||||||
|
"warning: cannot set info for %s\n", FnFilter1(G.filename)));
|
||||||
|
|
||||||
|
s_close(0, fnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef SFX
|
||||||
|
|
||||||
|
/*************************/
|
||||||
|
/* Function dateformat() */
|
||||||
|
/*************************/
|
||||||
|
|
||||||
|
int dateformat()
|
||||||
|
{
|
||||||
|
return DF_DMY; /* default for systems without locale info */
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function version() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
void version(__G)
|
||||||
|
__GDEF
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = sprintf((char *)slide, LoadFarString(CompiledWith),
|
||||||
|
"MetaWare High C",
|
||||||
|
"",
|
||||||
|
"FlexOS",
|
||||||
|
" (16-bit, big)",
|
||||||
|
|
||||||
|
#ifdef __DATE__
|
||||||
|
" on ", __DATE__
|
||||||
|
#else
|
||||||
|
"", ""
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
(*G.message)((zvoid *)&G, slide, (ulg)len, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !SFX */
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Function _wildarg() */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
/* This prevents the PORTLIB startup code from preforming argument globbing */
|
||||||
|
|
||||||
|
_wildarg() {}
|
30
unzip/unzip-5.52/flexos/flxcfg.h
Normal file
30
unzip/unzip-5.52/flexos/flxcfg.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
FlexOS specific configuration section:
|
||||||
|
---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __flxcfg_h
|
||||||
|
#define __flxcfg_h
|
||||||
|
|
||||||
|
#define __16BIT__
|
||||||
|
#define MED_MEM
|
||||||
|
#define EXE_EXTENSION ".286"
|
||||||
|
|
||||||
|
#ifndef nearmalloc
|
||||||
|
# define nearmalloc malloc
|
||||||
|
# define nearfree free
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CRTL_CP_IS_OEM
|
||||||
|
|
||||||
|
#define near
|
||||||
|
#define far
|
||||||
|
|
||||||
|
#endif /* !__flxcfg_h */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user