Category : UNIX Files
Archive   : UNZIP310.ZIP
Filename : UNZIP.SH2
Posting-number: Volume 14, Issue 105
Submitted-by: [email protected] (David Kirschbaum)
Archive-name: unzip-3.1/part02
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh
# "End of archive 2 (of 3)."
# Contents: Makefile file_io.c unimplod.c unzip.h unzip.os2
# Wrapped by [email protected] on Fri Aug 31 11:37:51 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(7578 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Makefile for unzip
X# v3.07+ Added Amdahl (IBM) mainframe
X# Removed casual suggestion to define NOTINT16 if in doubt.
X# Turns out we can't be all THAT casual about it!
X# v3.07+ Added IBM RT 6150 under AIX 2.2.1
X# v3.06+ Changed "make sun4_110" back to "make sun4" (to match SYSTEMS list
X# and since we don't have any other sun4 arguments yet).
X# v3.06+ Added VAX 8600/Ultrix, DEC 5820/Ultrix test v4.0
X# v3.05 And better yet, thanks to Bill Davidsen's fixes.
X# v3.04 A better way for multiple systems, thanks to Warner Losh and
X# Bill Davidsen.
X# foo1: common
X# foo2: common
X# common: $(MAKE) unzip whateverflags...
X#
X# Nice .. makes sense .. however don't work worth beans on my vaxbsd
X# system! ("Don't know how to make make" or some such)
X# Added Silicon Graphics system, thanks to
X# root%[email protected] (Root (Valter Cavecchia))
X#
X# v3.0 Added HP-UX
X# Consolidated some system makerules
X# ******** INSTRUCTIONS (such as they are) ********
X#
X# "make vaxbsd" -- makes unzip on a VAX 11-780 BSD 4.3 in current directory
X# "make" -- uses environment variable SYSTEM to set the type
X# system to compile for.
X# "make wombat" -- Chokes and dies if you haven't added the specifics
X# for your Wombat 68000 (or whatever) to the systems list.
X#
X# CFLAGS are flags for the C compiler. LDFLAGS are flags for the loader.
X#
X# My host (a VAX 11-780 running BSD 4.3) is hereafter referred to as
X# "my host."
X#
X# My host's /usr/include/sys/param.h defines BSD for me.
X# You may have to add "-DBSD" to the list of CFLAGS for your system.
X#
X# You MAY need to define "-DNOTINT16" if the program produces crc errors
X# during a "-t" run or extraction. (This involves structure alignment.)
X#
X# If your host is "big-endian" (as in the 68000 family) and does NOT order
X# its integers and long integers in Intel fashion (low .. high), you should
X# define "-DHIGH_LOW". This insures key structure values will be "swapped"
X# low end for high end.
X# Some mainframes DO require this.
X#
X# Some systems have a shell-defined "$MAKE" (my host did not). If not,
X# use "make" instead of the "$MAKE" or "$(MAKE)" in your system's makerule.
X# Or try adding the following line to your .login file:
X# setenv MAKE "make"
X# (It didn't help on my host.)
X#
X# zmemcpy has been added to the list of required files for some systems.
X# memcpy() is a normal C function that works just fine in Turbo C
X# and some Unix systems, but has a problem in others (producing CRC errors).
X#
X# You can try a compile without zmemcpy.c, and if it works .. fine.
X# (To do this, you may have to remove zmemcpy.o from your system's list
X# of required OBJS files, and the "-DZMEM" from the list of CFLAGS defines.)
X#
X# Else use the included zmemcpy.c.
X# (Again, you may have to add zmemcpy.o to your system's list of required
X# OBJS files, and the "-DZMEM" to the list of CFLAGS defines.)
X
X# To test your nice new unzip, insure your zip file includes some LARGE
X# members. Many systems ran just fine with zip file members <512 bytes,
X# but failed with larger ones.
X#
X
X# Defaults most systems use
XCFLAGS = -O -DUNIX
X
XCC=cc
X
XSHELL = /bin/sh
X
X.c.o :
X $(CC) -c $(CFLAGS) $*.c
X
X# Defaults everybody uses
XOBJS = unzip.o crc32.o match.o ascebc.o mapname.o
XSRCS = unzip.c crc32.c match.c ascebc.c mapname.c
X
X# You'll need these also if you include "-DZMEM" in your CFLAGS
XZMEMS = zmemset.o zmemcpy.o
X
X# list of supported systems in this version
XSYSTEMS =xenix386 ultrix sun3 sun4 encore stellar convex\
X vaxbsd next vaxsysV hp_ux pyramid sgi diab\
X dec5820 vax8600 rtaix amdahl
X
X# The below will try to use your shell variable "SYSTEM"
X# as the type system to use (e.g., if you command:
X# make
X# at the command line).
X
Xdefault:
X if test -z "$(SYSTEM)";\
X then make ERROR;\
X else make $(SYSTEM);\
X fi
X
XERROR:
X @echo "Must make one of $(SYSTEMS)"
X @echo "or set shell variable SYSTEM to a legal value"
X
Xunzip: $(OBJS)
X cc $(LDFLAGS) -o unzip $(OBJS)
X
Xunzip.o: unzip.c
X
Xcrc32.o: crc32.c
X
Xmatch.o: match.c
X
Xascebc.o: ascebc.c
X
Xzmemcpy.o: zmemcpy.c
X
Xzmemset.o: zmemset.c
X
Xmapname.o: mapname.c
X#
X# these are the makerules for various systems
X# TABS ARE REQUIRED FOR SOME VERSIONS OF make!
X# DO NOT DE-TABIFY THIS FILE!
X# Example:
X# wombat:^I# wombat 68000
X# ^this is an ASCII 9 tab char, NOT a bunch of spaces!
X#^I$(MAKE) unzip CFLAGS="$(CFLAGS) -DNOTINT16 -DZMEM" \
X#^IOBJS="$(OBJS) $(ZMEMS)"
X#^these indentations are an ASCII 9 tab char!
X
X# ********
Xxenix386: _zmem # Xenix/386 (tested on 2.3.1)
XvaxsysV: _zmem # from Forrest Gehrke
Xencore: _zmem # Multimax
X_zmem:
X $(MAKE) unzip CFLAGS="$(CFLAGS) -DZMEM" \
X OBJS="$(OBJS) $(ZMEMS)"
X
X# ********
Xconvex: _16zmem # C200/C400
Xstellar: _16zmem # gs-2000
Xsun4: _16zmem # Sun 4/110, SunOS 4.0.3c
Xhp_ux: _16zmem # HP 9000-835 SE, HP-UX Release A.B3.10 Ver D
X # Thanks to Randy McCaskile,
X # [email protected]
Xdec5820: _16zmem # DEC 5820 (RISC), Test version of Ultrix v4.0
X # thanks to "Moby" Dick O'Connor
Xrtaix: _16zmem # IBM RT 6150 under AIX 2.2.1
X # thanks to Erik-Jan Vens
X
X_16zmem:
X $(MAKE) unzip CFLAGS="$(CFLAGS) -DNOTINT16 -DZMEM" \
X OBJS="$(OBJS) $(ZMEMS)"
X
X# ********
Xdiab: _mc68k # 680X0, DIAB dnix 5.2/5.3 (a Swedish System V clone)
Xsun3: _mc68k # 68020, SunOS 4.0.3
Xamdahl: _mc68k # Amdahl (IBM) mainframe, UTS (SysV) 1.2.4 and 2.0.1
X # thanks to Kim DeVaughn via Greg Roelofs (Cave Newt)
X #
X_mc68k:
X $(MAKE) unzip CFLAGS="$(CFLAGS) -DHIGH_LOW -DZMEM" \
X OBJS="$(OBJS) $(ZMEMS)"
X
X# Toad Hall: My Vax doesn't know anything about "$(MAKE)".
X# I tried adding 'setenv MAKE "make" to my .login
X# but it still wouldn't. Unix wizards, to the rescue!
X# v3.04 and the new flashy common system fix don't work on my vax either!
X# Well .. maybe it will for the Ultrix system and others.
X
Xultrix: _defaults # per Greg Flint
Xvax8600: _defaults # also for VAX8600 w/Ultrix OS
X # per Jim Steiner, [email protected]
Xvaxbsd: _defaults # VAX 11-780, BSD 4.3 David Kirschbaum
X_defaults:
X make unzip
X
X#From Mark Adler, [email protected]:
X# I used "make stellar" on the NeXT and the resulting unzip
X# worked fine on all my zip test files. Not willing to leave
X# well enough alone, I tried it without the zmem* routines by
X# adding the following to the Makefile:
X
Xnext: # 68030 BSD 4.3+Mach
X $(MAKE) unzip CFLAGS="$(CFLAGS) -DNOTINT16" \
X OBJS="$(OBJS)"
X
X# and using "make next". This also worked fine, and presumably
X# is faster since the native memcpy and memset routines are
X# optimized assembler.
X# ***
X#I have finished porting unzip 3.0 to the Pyramid 90X under OSX4.1.
X#The biggest problem was the default structure alignment yielding two
X#extra bytes. The compiler has the -q option to pack structures, and
X#this was all that was needed. So, I changed the Makefile, adding "pyramid"
X#to the SYSTEMS list, and inserting the following lines:
X#James Dugal, Internet: [email protected]
X
Xpyramid: # Pyramid 90X, probably all, under >= OSx4.1, BSD universe
X make unzip CFLAGS="$(CFLAGS) -q -DBSD -DNOTINT16 -DZMEM" \
X OBJS="$(OBJS) $(ZMEMS)"
X
X#I successfully compiled and tested the unzip program (v30) for the
X#Silicon Graphics environment (Personal Iris 4D20/G with IRIX v3.2.2)
X#
X# Valter V. Cavecchia | Bitnet: cavecchi@itncisca
X# Centro di Fisica del C.N.R. | Internet: [email protected]
X# I-38050 Povo (TN) - Italy | Decnet: itnvax::cavecchia (37.65)
X
Xsgi: # Silicon Graphics (tested on Personal Iris 4D20)
X $(MAKE) unzip \
X CFLAGS="$(CFLAGS) -I/usr/include/bsd -DZMEM -DBSD -DNOTINT16" \
X OBJS="$(OBJS) $(ZMEMS)" \
X LDFLAGS="-lbsd"
END_OF_FILE
if test 7578 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'file_io.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'file_io.c'\"
else
echo shar: Extracting \"'file_io.c'\" \(9601 characters\)
sed "s/^X//" >'file_io.c' <<'END_OF_FILE'
X/* v3.05 File related functions for unzip.c */
X
X/*
X * input file variables
X *
X */
X
X#define INBUFSIZ BUFSIZ /* same as stdio uses */
Xbyte *inbuf; /* input file buffer - any size is legal */
Xbyte *inptr;
X
Xint incnt;
XUWORD bitbuf;
Xint bits_left;
Xboolean zipeof;
X
Xint zipfd;
Xchar zipfn[STRSIZ];
Xlocal_file_header lrec;
X
X/* ----------------------------------------------------------- */
X/*
X * output stream variables
X *
X */
X
X#define OUTBUFSIZ 0x2000 /* unImplode needs power of 2, >= 0x2000 */
Xbyte *outbuf; /* buffer for rle look-back */
Xbyte *outptr;
Xbyte *outout; /* Scratch pad for ascebc trans v2.0g */
X
Xlongint outpos; /* absolute position in outfile */
Xint outcnt; /* current position in outbuf */
X
Xint outfd;
Xchar filename[STRSIZ];
Xchar extra[STRSIZ];
Xchar comment[STRSIZ]; /* v2.0b made it global for displays */
X
X
Xvoid set_file_time()
X /*
X * set the output file date/time stamp according to information from the
X * zipfile directory record for this file
X */
X{
X#ifndef UNIX
X union {
X struct ftime ft; /* system file time record */
X struct {
X UWORD ztime; /* date and time words */
X UWORD zdate; /* .. same format as in .ZIP file */
X } zt;
X } td;
X
X /*
X * set output file date and time - this is optional and can be
X * deleted if your compiler does not easily support setftime()
X */
X
X td.zt.ztime = lrec.last_mod_file_time;
X td.zt.zdate = lrec.last_mod_file_date;
X
X setftime(outfd, &td.ft);
X
X#else /* UNIX */
X
X time_t times[2];
X struct tm *tmbuf;
X long m_time;
X int yr, mo, dy, hh, mm, ss, leap, days = 0;
X#ifdef BSD
X struct timeval tv;
X struct timezone tz;
X#endif
X
X /*
X * These date conversions look a little wierd, so I'll explain.
X * UNIX bases all file modification times on the number of seconds
X * elapsed since Jan 1, 1970, 00:00:00 GMT. Therefore, to maintain
X * compatibility with MS-DOS archives, which date from Jan 1, 1980,
X * with NO relation to GMT, the following conversions must be made:
X * the Year (yr) must be incremented by 10;
X * the Date (dy) must be decremented by 1;
X * and the whole mess must be adjusted by TWO factors:
X * relationship to GMT (ie.,Pacific Time adds 8 hrs.),
X * and whether or not it is Daylight Savings Time.
X * Also, the usual conversions must take place to account for leap years,
X * etc.
X * C. Seaman
X */
X
X yr = (((lrec.last_mod_file_date >> 9) & 0x7f) + 10); /* dissect date */
X mo = ((lrec.last_mod_file_date >> 5) & 0x0f);
X dy = ((lrec.last_mod_file_date & 0x1f) - 1);
X
X hh = ((lrec.last_mod_file_time >> 11) & 0x1f); /* dissect time */
X mm = ((lrec.last_mod_file_time >> 5) & 0x3f);
X ss = ((lrec.last_mod_file_time & 0x1f) * 2);
X
X /* leap = # of leap years from 1970 up to but not including
X the current year */
X
X leap = ((yr+1969)/4); /* Leap year base factor */
X
X /* How many days from 1970 to this year? */
X days = (yr * 365) + (leap - 492);
X
X switch(mo) /* calculate expired days this year */
X {
X case 12:
X days += 30;
X case 11:
X days += 31;
X case 10:
X days += 30;
X case 9:
X days += 31;
X case 8:
X days += 31;
X case 7:
X days += 30;
X case 6:
X days += 31;
X case 5:
X days += 30;
X case 4:
X days += 31;
X case 3:
X days += 28; /* account for leap years */
X if (((yr+1970) % 4 == 0) && (yr+1970) != 2000)
X ++days;
X case 2:
X days += 31;
X }
X
X /* convert date & time to seconds relative to 00:00:00, 01/01/1970 */
X m_time = ((days + dy) * 86400) + (hh * 3600) + (mm * 60) + ss;
X
X#ifdef BSD
X gettimeofday(&tv, &tz);
X/* This program is TOO smart about daylight savings time.
X * Adjusting for it throws our file times off by one hour if it's true.
X * Remming it out.
X *
X * if (tz.tz_dsttime != 0)
X * m_time -= 3600;
X */
X m_time += tz.tz_minuteswest * 60; /* account for timezone differences */
X#else /* !BSD */
X tmbuf = localtime(&m_time);
X hh = tmbuf->tm_hour;
X tmbuf = gmtime(&m_time);
X hh = tmbuf->tm_hour - hh;
X if (hh < 0)
X hh += 24;
X m_time += (hh * 3600); /* account for timezone differences */
X#endif
X
X times[0] = m_time; /* set the stamp on the file */
X times[1] = m_time;
X utime(filename, times);
X#endif /* UNIX */
X}
X
X
Xint create_output_file()
X /* return non-0 if creat failed */
X{ /* create the output file with READ and WRITE permissions */
X static int do_all = 0;
X char answerbuf[10];
X UWORD holder;
X
X if (cflag) { /* output to stdout (a copy of it, really) */
X outfd = dup(1);
X return 0;
X }
X CR_flag = 0; /* Hack to get CR at end of buffer working. */
X
X /*
X * check if the file exists, unless do_all
X * ask before overwrite code by Bill Davidsen ([email protected])
X */
X if (!do_all) {
X outfd = open(filename, 0);
X if (outfd >= 0) {
X /* first close it, before you forget! */
X close(outfd);
X
X /* ask the user before blowing it away */
X fprintf(stderr, "replace %s, y-yes, n-no, a-all: ", filename);
X fgets(answerbuf, 9, stdin);
X
X switch (answerbuf[0]) {
X case 'y':
X case 'Y':
X break;
X case 'a':
X case 'A':
X do_all = 1;
X break;
X case 'n':
X case 'N':
X default:
X while(ReadByte(&holder));
X return 1; /* it's done! */
X }
X }
X }
X
X#ifndef UNIX
X outfd = creat(filename, S_IWRITE | S_IREAD);
X#else
X outfd = creat(filename, 0666); /* let umask strip unwanted perm's */
X#endif
X
X if (outfd < 1) {
X fprintf(stderr, "Can't create output: %s\n", filename);
X return 1;
X }
X
X /*
X * close the newly created file and reopen it in BINARY mode to
X * disable all CR/LF translations
X */
X#ifndef UNIX
X close(outfd);
X outfd = open(filename, O_RDWR | O_BINARY);
X#endif
X return 0;
X}
X
X
Xint open_input_file()
X /* return non-0 if open failed */
X{
X /*
X * open the zipfile for reading and in BINARY mode to prevent cr/lf
X * translation, which would corrupt the bitstreams
X */
X
X#ifndef UNIX
X zipfd = open(zipfn, O_RDONLY | O_BINARY);
X#else
X zipfd = open(zipfn, O_RDONLY);
X#endif
X if (zipfd < 1) {
X fprintf(stderr, "Can't open input file: %s\n", zipfn);
X return (1);
X }
X return 0;
X}
X
X/* ============================================================= */
X
Xint readbuf(fd, buf, size)
Xint fd;
Xchar *buf;
Xregister unsigned size;
X{
X register int count;
X int n;
X
X n = size;
X while (size) {
X if (incnt == 0) {
X if ((incnt = read(fd, inbuf, INBUFSIZ)) <= 0)
X return(incnt);
X inptr = inbuf;
X }
X count = min(size, incnt);
X zmemcpy(buf, inptr, count);
X buf += count;
X inptr += count;
X incnt -= count;
X size -= count;
X }
X return(n);
X}
X
Xint ReadByte(x)
XUWORD *x;
X /* read a byte; return 8 if byte available, 0 if not */
X{
X if (csize-- <= 0)
X return 0;
X if (incnt == 0) {
X if ((incnt = read(zipfd, inbuf, INBUFSIZ)) <= 0)
X return 0;
X inptr = inbuf;
X }
X *x = *inptr++;
X --incnt;
X return 8;
X}
X
X
X/* ------------------------------------------------------------- */
Xstatic UWORD mask_bits[] =
X {0, 0x0001, 0x0003, 0x0007, 0x000f,
X 0x001f, 0x003f, 0x007f, 0x00ff,
X 0x01ff, 0x03ff, 0x07ff, 0x0fff,
X 0x1fff, 0x3fff, 0x7fff, 0xffff
X };
X
X
Xint FillBitBuffer(bits)
Xregister int bits;
X{
X /* get the bits that are left and read the next UWORD */
X register int result = bitbuf;
X UWORD temp;
X int sbits = bits_left;
X bits -= bits_left;
X
X /* read next UWORD of input */
X bits_left = ReadByte(&bitbuf);
X bits_left += ReadByte(&temp);
X
X bitbuf |= (temp << 8);
X if (bits_left == 0)
X zipeof = 1;
X
X /* get the remaining bits */
X result = result | (int) ((bitbuf & mask_bits[bits]) << sbits);
X bitbuf >>= bits;
X bits_left -= bits;
X return result;
X}
X
X/* ------------------------------------------------------------- */
X
Xint dos2unix (buf, len)
Xunsigned char *buf;
Xint len;
X{
X int new_len;
X int i;
X unsigned char *walker;
X
X new_len = len;
X walker = outout;
X if (CR_flag && *buf != LF)
X *walker++ = ascii_to_native(CR);
X CR_flag = buf[len - 1] == CR;
X for (i = 0; i < len; i += 1) {
X *walker++ = *buf;
X if (*buf++ == CR && *buf == LF) {
X new_len--;
X walker[-1] = ascii_to_native(*buf++);
X i++;
X }
X }
X /*
X * If the last character is a CR, then "ignore it" for now...
X */
X if (walker[-1] == CR)
X new_len--;
X return new_len;
X}
X
Xvoid WriteBuffer(fd, buf, len)
Xint fd;
Xunsigned char *buf;
Xint len;
X{
X if (aflag)
X len = dos2unix (buf, len);
X if (write (fd, outout, len) != len) {
X fprintf (stderr, "Fatal write error.\n");
X exit (1);
X }
X}
X
X
X/* ------------------------------------------------------------- */
X
Xvoid FlushOutput()
X /* flush contents of output buffer */
X{
X if (outcnt) {
X UpdateCRC(outbuf, outcnt);
X
X if (!tflag)
X WriteBuffer(outfd, outbuf, outcnt);
X
X outpos += outcnt;
X outcnt = 0;
X outptr = outbuf;
X }
X}
X
END_OF_FILE
if test 9601 -ne `wc -c <'file_io.c'`; then
echo shar: \"'file_io.c'\" unpacked with wrong size!
fi
# end of 'file_io.c'
fi
if test -f 'unimplod.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'unimplod.c'\"
else
echo shar: Extracting \"'unimplod.c'\" \(8228 characters\)
sed "s/^X//" >'unimplod.c' <<'END_OF_FILE'
X/* ------------------------------------------------------------- */
X/*
X * Imploding
X * ---------
X *
X * The Imploding algorithm is actually a combination of two distinct
X * algorithms. The first algorithm compresses repeated byte sequences
X * using a sliding dictionary. The second algorithm is used to compress
X * the encoding of the sliding dictionary ouput, using multiple
X * Shannon-Fano trees.
X *
X */
X
X#define LITVALS 256
X#define DISTVALS 64
X#define LENVALS 64
X#define MAXSF LITVALS
X
X typedef struct sf_entry {
X byte Value;
X byte BitLength;
X } sf_entry;
X
X typedef struct sf_tree { /* a shannon-fano "tree" (table) */
X sf_entry entry[MAXSF];
X int entries;
X int MaxLength;
X } sf_tree;
X
X typedef sf_tree *sf_treep;
X
X typedef struct sf_node { /* node in a true shannon-fano tree */
X UWORD left; /* 0 means leaf node */
X UWORD right; /* or value if leaf node */
X } sf_node;
X
X sf_tree lit_tree;
X sf_tree length_tree;
X sf_tree distance_tree;
X /* s-f storage is shared with that used by other comp. methods */
X sf_node *lit_nodes = (sf_node *) followers; /* 2*LITVALS nodes */
X sf_node *length_nodes = (sf_node *) suffix_of; /* 2*LENVALS nodes */
X sf_node *distance_nodes = (sf_node *) stack; /* 2*DISTVALS nodes */
X boolean lit_tree_present;
X boolean eightK_dictionary;
X int minimum_match_length;
X int dict_bits;
X
X#ifdef __TURBOC__
X/* v2.0b More local prototypes */
Xvoid ReadLengths(sf_tree *tree);
Xvoid SortLengths(sf_tree *tree);
Xvoid GenerateTrees(sf_tree *tree, sf_node *nodes);
Xvoid LoadTree(sf_tree *tree, int treesize, sf_node *nodes);
Xvoid LoadTrees(void);
Xvoid ReadTree(register sf_node *nodes, int *dest);
X#endif
X
Xvoid SortLengths(tree)
Xsf_tree *tree;
X /* Sort the Bit Lengths in ascending order, while retaining the order
X of the original lengths stored in the file */
X{
X register sf_entry *ejm1; /* entry[j - 1] */
X register int j;
X register sf_entry *entry;
X register int i;
X sf_entry tmp;
X int entries;
X unsigned a, b;
X
X entry = &tree->entry[0];
X entries = tree->entries;
X
X for (i = 0; ++i < entries; ) {
X tmp = entry[i];
X b = tmp.BitLength;
X j = i;
X while ((j > 0)
X && ((a = (ejm1 = &entry[j - 1])->BitLength) >= b)) {
X if ((a == b) && (ejm1->Value <= tmp.Value))
X break;
X *(ejm1 + 1) = *ejm1; /* entry[j] = entry[j - 1] */
X --j;
X }
X entry[j] = tmp;
X }
X}
X
X
X/* ----------------------------------------------------------- */
X
Xvoid ReadLengths(tree)
Xsf_tree *tree;
X{
X int treeBytes;
X int i;
X int num, len;
X
X /* get number of bytes in compressed tree */
X READBIT(8,treeBytes);
X treeBytes++;
X i = 0;
X
X tree->MaxLength = 0;
X
X/* High 4 bits: Number of values at this bit length + 1. (1 - 16)
X * Low 4 bits: Bit Length needed to represent value + 1. (1 - 16)
X */
X while (treeBytes > 0) {
X READBIT(4,len); len++;
X READBIT(4,num); num++;
X
X while (num > 0) {
X if (len > tree->MaxLength)
X tree->MaxLength = len;
X tree->entry[i].BitLength = len;
X tree->entry[i].Value = i;
X i++;
X num--;
X }
X
X treeBytes--;
X }
X}
X
X
X/* ----------------------------------------------------------- */
X
Xvoid GenerateTrees(tree, nodes)
Xsf_tree *tree;
Xsf_node *nodes;
X /* Generate the Shannon-Fano trees */
X{
X int codelen, i, j, lvlstart, next, parents;
X
X i = tree->entries - 1; /* either 255 or 63 */
X lvlstart = next = 1;
X
X /* believe it or not, there may be a 1-bit code */
X
X for (codelen = tree->MaxLength; codelen >= 1; --codelen) {
X
X /* create leaf nodes at level
X
X while ((i >= 0) && (tree->entry[i].BitLength == codelen)) {
X nodes[next].left = 0;
X nodes[next].right = tree->entry[i].Value;
X ++next;
X --i;
X }
X
X /* create parent nodes for all nodes at level
X but don't create the root node here */
X
X parents = next;
X if (codelen > 1) {
X for (j = lvlstart; j <= parents-2; j += 2) {
X nodes[next].left = j;
X nodes[next].right = j + 1;
X ++next;
X }
X }
X lvlstart = parents;
X }
X
X /* create root node */
X
X nodes[0].left = next - 2;
X nodes[0].right = next - 1;
X}
X
X
X/* ----------------------------------------------------------- */
X
Xvoid LoadTree(tree, treesize, nodes)
Xsf_tree *tree;
Xint treesize;
Xsf_node *nodes;
X /* allocate and load a shannon-fano tree from the compressed file */
X{
X tree->entries = treesize;
X ReadLengths(tree);
X SortLengths(tree);
X GenerateTrees(tree, nodes);
X}
X
X
X/* ----------------------------------------------------------- */
X
Xvoid LoadTrees()
X{
X eightK_dictionary = (lrec.general_purpose_bit_flag & 0x02) != 0; /* bit 1 */
X lit_tree_present = (lrec.general_purpose_bit_flag & 0x04) != 0; /* bit 2 */
X
X if (eightK_dictionary)
X dict_bits = 7;
X else
X dict_bits = 6;
X
X if (lit_tree_present) {
X minimum_match_length = 3;
X LoadTree(&lit_tree,256,lit_nodes);
X }
X else
X minimum_match_length = 2;
X
X LoadTree(&length_tree,64,length_nodes);
X LoadTree(&distance_tree,64,distance_nodes);
X}
X
X
X/* ----------------------------------------------------------- */
X
X#ifndef ASM
X
Xvoid ReadTree(nodes, dest)
Xregister sf_node *nodes;
Xint *dest;
X /* read next byte using a shannon-fano tree */
X{
X register int cur;
X register int left;
X UWORD b;
X
X for (cur = 0; ; ) {
X if ((left = nodes[cur].left) == 0) {
X *dest = nodes[cur].right;
X return;
X }
X READBIT(1, b);
X cur = (b ? nodes[cur].right : left);
X }
X}
X
X#endif
X
X/* ----------------------------------------------------------- */
X
Xvoid unImplode()
X /* expand imploded data */
X{
X register int srcix;
X register int Length;
X register int limit;
X int lout;
X int Distance;
X
X LoadTrees();
X
X#ifdef DEBUG
X printf("\n");
X#endif
X while ((!zipeof) && ((outpos+outcnt) < ucsize)) {
X READBIT(1,lout);
X
X if (lout != 0) { /* encoded data is literal data */
X if (lit_tree_present) /* use Literal Shannon-Fano tree */ {
X ReadTree(lit_nodes,&lout);
X#ifdef DEBUG
X printf("lit=%d\n", lout);
X#endif
X }
X else
X READBIT(8,lout);
X
X OUTB(lout);
X }
X else { /* encoded data is sliding dictionary match */
X READBIT(dict_bits,Distance);
X
X ReadTree(distance_nodes,&lout);
X#ifdef DEBUG
X printf("d=%5d (%2d,%3d)", (lout << dict_bits) | Distance, lout,
X Distance);
X#endif
X Distance |= (lout << dict_bits);
X /* using the Distance Shannon-Fano tree, read and decode the
X upper 6 bits of the Distance value */
X
X ReadTree(length_nodes,&lout);
X Length = lout;
X#ifdef DEBUG
X printf("\tl=%3d\n", Length);
X#endif
X /* using the Length Shannon-Fano tree, read and decode the
X Length value */
X
X if (Length == 63) {
X READBIT(8,lout);
X Length += lout;
X }
X Length += minimum_match_length;
X
X /* move backwards Distance+1 bytes in the output stream, and copy
X Length characters from this position to the output stream.
X (if this position is before the start of the output stream,
X then assume that all the data before the start of the output
X stream is filled with zeros. Requires initializing outbuf
X for each file.) */
X
X srcix = (outcnt - (Distance + 1)) & (OUTBUFSIZ-1);
X limit = OUTBUFSIZ - Length;
X if ((srcix <= limit) && (outcnt < limit)) {
X zmemcpy(outptr, &outbuf[srcix], Length);
X outptr += Length;
X outcnt += Length;
X }
X else {
X while (Length--) {
X OUTB(outbuf[srcix++]);
X srcix &= OUTBUFSIZ-1;
X }
X }
X }
X }
X}
X
END_OF_FILE
if test 8228 -ne `wc -c <'unimplod.c'`; then
echo shar: \"'unimplod.c'\" unpacked with wrong size!
fi
# end of 'unimplod.c'
fi
if test -f 'unzip.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'unzip.h'\"
else
echo shar: Extracting \"'unzip.h'\" \(10690 characters\)
sed "s/^X//" >'unzip.h' <<'END_OF_FILE'
X/*
X * unzip.c was getting TOO big, so I split out a bunch of likely
X * defines and constants into a separate file.
X * David Kirschbaum
X * Toad Hall
X */
X
X#define VERSION "UnZip: Zipfile Extract v3.10 (C) of 08-16-90; (C) 1989 Samuel H. Smith"
X
X/* #define NOSKIP 1 */ /* v3.04 Enable if you do NOT want
X * skip_to_signature() enabled */
X
Xtypedef unsigned char byte; /* code assumes UNSIGNED bytes */
Xtypedef long longint;
Xtypedef unsigned short UWORD;
Xtypedef char boolean;
X
X/* v2.0g Allan Bjorklund added this. Confirm it doesn't make your system
X * choke and die! (Could be it belongs down in the !__STDC__ section
X * along with *malloc()
X */
X#ifdef MTS /* v2.0h No one else seems to want it tho... */
X#include
X#endif
X
X#define STRSIZ 256
X
X#include
X /* this is your standard header for all C compiles */
X#include
X
X#ifdef __TURBOC__ /* v2.0b */
X#include
X#include
X#include
X#include
X#endif
X
X#ifdef __STDC__
X
X#include
X /* this include defines various standard library prototypes */
X
X#else
X
Xchar *malloc(); /* who knows WHERE this is prototyped... */
X
X#endif
X
X#define min(a,b) ((a) < (b) ? (a) : (b))
X
X#ifndef ZMEM /* v2.0f use your system's stuff */
X#define zmemcpy memcpy
X#define zmemset memset
X#endif
X
X/* ----------------------------------------------------------- */
X/*
X * Zipfile layout declarations
X *
X */
X
X/* Macros for accessing the longint header fields. These fields
X are defined as array of char to prevent a 32-bit compiler from
X padding the struct so that longints start on a 4-byte boundary.
X This will not work on a machine that can access longints only
X if they start on a 4-byte boundary.
X*/
X
X#ifndef NOTINT16 /* v2.0c */
X#define LONGIP(l) ((longint *) &((l)[0]))
X#define LONGI(l) (*(LONGIP(l)))
X#else /* Have to define, since used for HIGH_LOW */
X#define LONGIP(I) &I
X#define LONGI(I) I
X#endif
X
Xtypedef longint signature_type;
X
X#define LOCAL_FILE_HEADER_SIGNATURE 0x04034b50L
X
X#ifndef NOTINT16 /* v2.0c */
Xtypedef struct local_file_header {
X UWORD version_needed_to_extract;
X UWORD general_purpose_bit_flag;
X UWORD compression_method;
X UWORD last_mod_file_time;
X UWORD last_mod_file_date;
X byte crc32[4];
X byte compressed_size[4];
X byte uncompressed_size[4];
X UWORD filename_length;
X UWORD extra_field_length;
X} local_file_header;
X
X#else /* NOTINT16 */
Xtypedef struct local_file_header {
X UWORD version_needed_to_extract;
X UWORD general_purpose_bit_flag;
X UWORD compression_method;
X UWORD last_mod_file_time;
X UWORD last_mod_file_date;
X longint crc32; /* v2.0e */
X longint compressed_size;
X longint uncompressed_size; /* v2.0e */
X UWORD filename_length;
X UWORD extra_field_length;
X} local_file_header;
X
Xtypedef struct local_byte_header {
X byte version_needed_to_extract[2];
X byte general_purpose_bit_flag[2];
X byte compression_method[2];
X byte last_mod_file_time[2];
X byte last_mod_file_date[2];
X byte crc32[4];
X byte compressed_size[4];
X byte uncompressed_size[4];
X byte filename_length[2];
X byte extra_field_length[2];
X} local_byte_header;
X#endif
X
X#define CENTRAL_FILE_HEADER_SIGNATURE 0x02014b50L
X
X#ifndef NOTINT16 /* v2.0c */
Xtypedef struct central_directory_file_header {
X UWORD version_made_by;
X UWORD version_needed_to_extract;
X UWORD general_purpose_bit_flag;
X UWORD compression_method;
X UWORD last_mod_file_time;
X UWORD last_mod_file_date;
X byte crc32[4];
X byte compressed_size[4];
X byte uncompressed_size[4];
X UWORD filename_length;
X UWORD extra_field_length;
X UWORD file_comment_length;
X UWORD disk_number_start;
X UWORD internal_file_attributes;
X byte external_file_attributes[4];
X byte relative_offset_local_header[4];
X} central_directory_file_header;
X
X#else /* NOTINT16 */
Xtypedef struct central_directory_file_header {
X UWORD version_made_by;
X UWORD version_needed_to_extract;
X UWORD general_purpose_bit_flag;
X UWORD compression_method;
X UWORD last_mod_file_time;
X UWORD last_mod_file_date;
X longint crc32; /* v2.0e */
X longint compressed_size; /* v2.0e */
X longint uncompressed_size; /* v2.0e */
X UWORD filename_length;
X UWORD extra_field_length;
X UWORD file_comment_length;
X UWORD disk_number_start;
X UWORD internal_file_attributes;
X longint external_file_attributes; /* v2.0e */
X longint relative_offset_local_header; /* v2.0e */
X} central_directory_file_header;
X
Xtypedef struct central_directory_byte_header {
X byte version_made_by[2];
X byte version_needed_to_extract[2];
X byte general_purpose_bit_flag[2];
X byte compression_method[2];
X byte last_mod_file_time[2];
X byte last_mod_file_date[2];
X byte crc32[4];
X byte compressed_size[4];
X byte uncompressed_size[4];
X byte filename_length[2];
X byte extra_field_length[2];
X byte file_comment_length[2];
X byte disk_number_start[2];
X byte internal_file_attributes[2];
X byte external_file_attributes[4];
X byte relative_offset_local_header[4];
X} central_directory_byte_header;
X#endif
X
X#define END_CENTRAL_DIR_SIGNATURE 0x06054b50L
X
X#ifndef NOTINT16 /* v2.0c */
Xtypedef struct end_central_dir_record {
X UWORD number_this_disk;
X UWORD number_disk_with_start_central_directory;
X UWORD total_entries_central_dir_on_this_disk;
X UWORD total_entries_central_dir;
X byte size_central_directory[4];
X byte offset_start_central_directory[4];
X UWORD zipfile_comment_length;
X} end_central_dir_record;
X
X#else /* NOTINT16 */
Xtypedef struct end_central_dir_record {
X UWORD number_this_disk;
X UWORD number_disk_with_start_central_directory;
X UWORD total_entries_central_dir_on_this_disk;
X UWORD total_entries_central_dir;
X longint size_central_directory; /* v2.0e */
X longint offset_start_central_directory; /* v2.0e */
X UWORD zipfile_comment_length;
X} end_central_dir_record;
X
Xtypedef struct end_central_byte_record {
X byte number_this_disk[2];
X byte number_disk_with_start_central_directory[2];
X byte total_entries_central_dir_on_this_disk[2];
X byte total_entries_central_dir[2];
X byte size_central_directory[4];
X byte offset_start_central_directory[4];
X byte zipfile_comment_length[2];
X} end_central_byte_record;
X#endif /* NOTINT16 */
X
X#define DLE 144
X
X#define max_bits 13
X#define init_bits 9
X#define hsize 8192
X#define first_ent 257
X#define clear 256
X
X/* ============================================================= */
X/*
X * Host operating system details
X *
X */
X
X#ifdef UNIX
X
X/* On some systems the contents of sys/param.h duplicates the
X contents of sys/types.h, so you don't need (and can't use)
X sys/types.h. */
X
X#include
X#include
X
X#define ZSUFX ".zip"
X#ifndef BSIZE
X#define BSIZE DEV_BSIZE /* v2.0c assume common for all Unix systems */
X#endif
X
X#ifndef BSD /* v2.0b */
X#include
Xstruct tm *gmtime(), *localtime();
X#else /* BSD */
X#include
X#endif
X
X#else /* !UNIX */
X
X#define BSIZE 512 /* disk block size */
X#define ZSUFX ".ZIP"
X
X#endif
X
X#if defined(V7) || defined(BSD)
X
X#define strchr index
X#define strrchr rindex
X
X#endif
X
X/* v3.03 Everybody seems to need this.
X * this include file defines
X * #define S_IREAD 0x0100 (* owner may read *)
X * #define S_IWRITE 0x0080 (* owner may write *)
X * as used in the creat() standard function
X */
X#ifndef __TURBOC__ /* it's already included */
X#include
X#endif
X
X#ifdef __STDC__
X
X#include
X /* this include defines strcpy, strcmp, etc. */
X
X#else
X
Xchar *strchr(), *strrchr();
X
X#endif
X
Xlong lseek();
X
X#define SEEK_SET 0
X#define SEEK_CUR 1
X#define SEEK_END 2
X
X#ifdef V7
X
X#define O_RDONLY 0
X#define O_WRONLY 1
X#define O_RDWR 2
X
X#else /* !V7 */
X
X#include
X /*
X * this include file defines
X * #define O_BINARY 0x8000 (* no cr-lf translation *)
X * as used in the open() standard function
X */
X
X#endif /* V7 */
X
X#ifdef __TURBOC__
X/* v2.0b Local Prototypes */
X /* In CRC32.C */
Xextern void UpdateCRC(register unsigned char *s, register int len);
X /* In MATCH.C */
Xextern int match(char *string, char *pattern);
X /* v2.0j in mapname.c */
Xextern int mapped_name(void);
X
X#ifdef NOTINT16 /* v2.0c */
X/* The next two are only prototyped here for debug testing on my PC
X * with Turbo C.
X */
X
XUWORD makeword(byte *b);
Xlongint makelong(byte *sig); /* v2.0e */
X#endif /* NOTINT16 */
X
Xint ReadByte(UWORD *x);
Xint FillBitBuffer(register int bits);
Xvoid LoadFollowers(void);
Xvoid FlushOutput(void);
Xvoid partial_clear(void);
Xint create_output_file(void);
Xvoid unShrink(void);
Xvoid unReduce(void);
Xvoid unImplode(void);
Xvoid set_file_time(void);
Xint readbuf(int fd, char *buf, register unsigned size);
Xvoid get_string(int len, char *s);
Xvoid dir_member(void);
Xvoid extract_member(void);
Xvoid skip_member(void);
Xvoid process_local_file_header(char **fnamev);
Xvoid process_central_file_header(void);
Xvoid process_end_central_dir(void);
Xint open_input_file(void);
Xvoid process_headers(void);
Xvoid usage(void);
Xvoid process_zipfile(void);
X#endif /* __TURBOC__ */
X
X/* ------------------------------------------------------------- */
X
X/* v3.05 Deleting crc32.h and incorporating its two lines right here */
X/* #include "crc32.h" */
X
Xunsigned long crc32val;
X#ifndef __TURBOC__ /* it's already been prototyped above */
Xvoid UpdateCRC();
X#endif
X
X#define LF 10 /* '\n' on ascii machines. Must be 10 due to EBCDIC */
X#define CR 13 /* '\r' on ascii machines. Must be 13 due to EBCDIC */
X
X#ifdef EBCDIC
Xextern unsigned char ebcdic [];
X#define ascii_to_native(c) ebcdic[(c)]
X#else
X#define ascii_to_native(c) (c)
X#endif
X
X#define OUTB(intc) { *outptr++=intc; if (++outcnt==OUTBUFSIZ) FlushOutput(); }
X
X/*
X * macro OUTB(intc)
X * {
X * *outptr++=intc;
X * if (++outcnt==OUTBUFSIZ)
X * FlushOutput();
X * }
X *
X */
X
X#define READBIT(nbits,zdest) { if (nbits <= bits_left) { zdest = (int)(bitbuf & mask_bits[nbits]); bitbuf >>= nbits; bits_left -= nbits; } else zdest = FillBitBuffer(nbits);}
X
X/*
X * macro READBIT(nbits,zdest)
X * {
X * if (nbits <= bits_left) {
X * zdest = (int)(bitbuf & mask_bits[nbits]);
X * bitbuf >>= nbits;
X * bits_left -= nbits;
X * } else
X * zdest = FillBitBuffer(nbits);
X * }
X *
X */
END_OF_FILE
if test 10690 -ne `wc -c <'unzip.h'`; then
echo shar: \"'unzip.h'\" unpacked with wrong size!
fi
# end of 'unzip.h'
fi
if test -f 'unzip.os2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'unzip.os2'\"
else
echo shar: Extracting \"'unzip.os2'\" \(9658 characters\)
sed "s/^X//" >'unzip.os2' <<'END_OF_FILE'
X[These patches have NOT been installed as of v3.10.
X David Kirschbaum
X Info-ZIP Coordinator
X]
X
XReceived: by mcsun.EU.net via EUnet; Fri, 18 May 90 20:50:40 +0200 (MET)
XReceived: from lena by kestrel.Ukc.AC.UK with UUCP id aa00758;
X 18 May 90 18:19 BST
XReceived: by lena with netmail(8.73); Fri May 18 14:30:13 BST 1990
XDate: Fri May 18 14:30:13 BST 1990
XX-Mailer: Mail User's Shell (7.0.4 1/26/90)
XFrom: Mike O'Carroll
XMessage-Id: <[email protected]>
XTo: [email protected]
XSubject: unzip30
X
XI'm not sure if anyone else has done this, but I have made a Dos & OS/2
Xversion of unzip. The cdiffs are below. The supplied makefile (unzip)
Xgenerates a family program which executes in both Dos and OS/2 modes.
XI can supply the .exe if required (31K).
X
XThe mods took 15 minutes, and the result has undergone 35 seconds
Xtesting (:-) ; I had one .ZIP file to unzip, and it worked OK, but no
Xgreat confidence yet.
X
XBTW, can I get a corresponding ZIP from somewhere? Simtel20?
X
XRegards,
X Mike
X
X-------------------------
X# This is a shell archive.
X# Remove everything above and including the cut line.
X# Then run the rest of the file through sh.
X#-----cut here-----cut here-----cut here-----cut here-----
X#!/bin/sh
X# shar: Shell Archiver
X# Run the following text with /bin/sh to create:
X# match.dif
X# unzip.dif
X# unzip
X# This archive created: Fri May 18 14:20:18 BST 1990
Xif [ -f 'match.dif' ] ; then
Xecho shar: will not overwrite existing file \'match.dif\' >&2
Xelse
Xcat << \SHAR_EOF >'match.dif'
X*** match.c Fri May 18 13:54:07 1990
X--- Dmatch.c Fri May 18 13:54:15 1990
X***************
X*** 10,15
X * 11/13/89 C. Mascott adapt for use with unzip
X * 01/25/90 J. Cowan match case-insensitive
X * 03/17/90 D. Kirschbaum Prototypes, other tweaks for Turbo C.
X *
X */
X
X
X--- 10,16 -----
X * 11/13/89 C. Mascott adapt for use with unzip
X * 01/25/90 J. Cowan match case-insensitive
X * 03/17/90 D. Kirschbaum Prototypes, other tweaks for Turbo C.
X+ * 18-may-90 M. O'Carroll Dos & OS/2 family version
X *
X */
X
X***************
X*** 24,29
X * This file contains service routines needed to maintain an archive.
X */
X
X #include
X #include
X #include
X
X--- 25,31 -----
X * This file contains service routines needed to maintain an archive.
X */
X
X+ #ifdef MSC
X #include
X #include
X #include
X***************
X*** 25,30
X */
X
X #include
X #include
X #include
X
X
X--- 27,36 -----
X
X #ifdef MSC
X #include
X+ #include
X+ #include
X+ #else
X+ #include
X #include
X #include
X #endif
X***************
X*** 27,32
X #include
X #include
X #include
X
X #ifdef __TURBOC__ /* v2.0b */
X #include
X
X--- 33,39 -----
X #include
X #include
X #include
X+ #endif
X
X #ifdef __TURBOC__ /* v2.0b */
X #include
XSHAR_EOF
Xfi
Xif [ -f 'unzip.dif' ] ; then
Xecho shar: will not overwrite existing file \'unzip.dif\' >&2
Xelse
Xcat << \SHAR_EOF >'unzip.dif'
X*** unzip.c Fri May 18 13:52:51 1990
X--- Dunzip.c Fri May 18 13:53:00 1990
X***************
X*** 63,68
X
X #endif
X
X #define min(a,b) ((a) < (b) ? (a) : (b))
X
X #ifndef ZMEM /* v2.0f use your system's stuff */
X
X--- 63,77 -----
X
X #endif
X
X+ /* Added stuff for MSC Dos & OS/2 family version - Mike O'Carroll, 18-May-90
X+ */
X+ #ifdef MSC
X+ #include
X+ #include
X+ #include
X+ #include
X+ #include
X+ #else
X #define min(a,b) ((a) < (b) ? (a) : (b))
X #endif /* MSC */
X
X***************
X*** 64,69
X #endif
X
X #define min(a,b) ((a) < (b) ? (a) : (b))
X
X #ifndef ZMEM /* v2.0f use your system's stuff */
X #define zmemcpy memcpy
X
X--- 73,79 -----
X #include
X #else
X #define min(a,b) ((a) < (b) ? (a) : (b))
X+ #endif /* MSC */
X
X #ifndef ZMEM /* v2.0f use your system's stuff */
X #define zmemcpy memcpy
X***************
X*** 473,478
X */
X {
X #ifndef UNIX
X union {
X struct ftime ft; /* system file time record */
X struct {
X
X--- 483,489 -----
X */
X {
X #ifndef UNIX
X+ # ifdef MSC
X union {
X FDATE fd; /* system file date record */
X UWORD zdate; /* date word */
X***************
X*** 474,479
X {
X #ifndef UNIX
X union {
X struct ftime ft; /* system file time record */
X struct {
X UWORD ztime; /* date and time words */
X
X--- 485,511 -----
X #ifndef UNIX
X # ifdef MSC
X union {
X+ FDATE fd; /* system file date record */
X+ UWORD zdate; /* date word */
X+ } ud;
X+
X+ union {
X+ FTIME ft; /* system file time record */
X+ UWORD ztime; /* time word */
X+ } ut;
X+
X+ FILESTATUS fs;
X+
X+ DosQFileInfo(outfd, 1, &fs, sizeof(fs));
X+ ud.zdate = lrec.last_mod_file_date;
X+ fs.fdateLastWrite = ud.fd;
X+ ut.ztime = lrec.last_mod_file_time;
X+ fs.ftimeLastWrite = ut.ft;
X+ DosSetFileInfo(outfd, 1, &fs, sizeof(fs));
X+
X+ # else /* MSC */
X+
X+ union {
X struct ftime ft; /* system file time record */
X struct {
X UWORD ztime; /* date and time words */
X***************
X*** 490,495
X td.zt.zdate = lrec.last_mod_file_date;
X
X setftime(outfd, &td.ft);
X
X #else /* UNIX */
X
X
X--- 522,529 -----
X td.zt.zdate = lrec.last_mod_file_date;
X
X setftime(outfd, &td.ft);
X+
X+ # endif /* MSC */
X
X #else /* UNIX */
X
XSHAR_EOF
Xfi
Xif [ -f 'unzip' ] ; then
Xecho shar: will not overwrite existing file \'unzip\' >&2
Xelse
Xcat << \SHAR_EOF >'unzip'
X# For MSC brian damaged (:-) make. To generate Dos & OS/2 version, type
X# "make unzip"
X#
X# I used Microsoft C V5.1, with the SDK.
X#
X# The following comments come from the Unix Makefile, and most may
X# well be irrelevant to the Dos version.
X# Mike O'Carroll 18-May-90
X# -----------------------------------------------------------------------
X#
X# "make vaxbsd" -- makes unzip on a VAX 11-780 BSD 4.3 in current directory
X# "make" -- uses environment variable SYSTEM to set the type
X# system to compile for.
X# "make wombat" -- Chokes and dies if you haven't added the specifics
X# for your Wombat 68000 (or whatever) to the systems list.
X#
X# CFLAGS are flags for the C compiler. LDFLAGS are flags for the loader.
X#
X# My host (a VAX 11-780 running BSD 4.3) is hereafter referred to as
X# "my host."
X#
X# My host's /usr/include/sys/param.h defines BSD for me.
X# You may have to add "-DBSD" to the list of CFLAGS for your system.
X#
X# You MAY need to define "-DNOTINT16" if the program produces crc errors
X# during a "-t" run or extraction. (This involves structure alignment.)
X# It won't HURT to define "-dNOTINT16" anyway .. but if you don't need it,
X# why add to the program size, complexity, etc.?
X#
X# If your host is "big-endian" (as in the 68000 family) and does NOT order
X# its integers and long integers in Intel fashion (low .. high), you should
X# define "-DHIGH_LOW". This insures key structure values will be "swapped"
X# low end for high end.
X# Some mainframes DO require this.
X#
X# Some systems have a shell-defined "$MAKE" (my host did not). If not,
X# use "make" instead of the "$MAKE" or "$(MAKE)" in your system's makerule.
X# Or try adding the following line to your .login file:
X# setenv MAKE "make"
X# (It didn't help on my host.)
X#
X# zmemcpy has been added to the list of required files for some systems.
X# memcpy() is a normal C function that works just fine in Turbo C
X# and some Unix systems, but has a problem in others (producing CRC errors).
X#
X# You can try a compile without zmemcpy.c, and if it works .. fine.
X# (To do this, you may have to remove zmemcpy.o from your system's list
X# of required OBJS files, and the "-DZMEM" from the list of CFLAGS defines.)
X#
X# Else use the included zmemcpy.c.
X# (Again, you may have to add zmemcpy.o to your system's list of required
X# OBJS files, and the "-DZMEM" to the list of CFLAGS defines.)
X
X# To test, insure your zip file includes some LARGE members. Many systems
X# ran just fine with zip file members <512 bytes, but failed with larger ones.
X#
X
XCC = cl
XCFLAGS = -DMSC
XLD = link
XLDFLAGS = /NOI
XRM = del
XLIBC = c:\m5\lib\p\slibce
XLIBD = c:\m5\lib\doscalls.lib
XLIBA = c:\m5\lib\api.lib
XINCL = -Ic:\m5\include
X
XOBJ1 = unzip.obj crc32.obj match.obj ascebc.obj mapname.obj
XOBJ2 = zmemset.obj zmemcpy.obj
X
X.c.obj:
X $(CC) -c $(CFLAGS) $(INCL) $*.c
X
Xunzip.obj: unzip.c
X
Xcrc32.obj: crc32.c
X
Xmatch.obj: match.c
X
Xascebc.obj: ascebc.c
X
Xmapname.obj: mapname.c
X
Xzmemset.obj: zmemset.c
X
Xzmemcpy.obj: zmemcpy.c
X
Xunziptmp.exe: $(OBJ1) $(OBJ2)
X $(LD) $(LDFLAGS) $(OBJ1) $(OBJ2), $*.exe,,$(LIBC)+$(LIBD);
X
Xunzip.exe: unziptmp.exe
X bind unziptmp.exe $(LIBD) $(LIBA) -o unzip.exe
X $(RM) unziptmp.exe
X $(RM) *.obj
X $(RM) *.map
XSHAR_EOF
Xfi
X
X--
XMike O'Carroll, Microsystems Unit, University of Leeds, LS2 9JT, UK
XE-mail: @ukc.ac.uk:[email protected]
XUUCP: ...!mcsun!ukc!lena!mike or [email protected]
END_OF_FILE
if test 9658 -ne `wc -c <'unzip.os2'`; then
echo shar: \"'unzip.os2'\" unpacked with wrong size!
fi
# end of 'unzip.os2'
fi
echo shar: End of archive 2 \(of 3\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 3 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/