Path: utzoo!attcan!uunet!allbery From: kirsch@usasoc.soc.mil (David Kirschbaum) Newsgroups: comp.sources.misc Subject: v14i105: Portable UnZIP 3.1 (part 2 of 3) Message-ID: <105582@uunet.UU.NET> Date: 20 Sep 90 23:05:09 GMT Sender: allbery@uunet.UU.NET Lines: 1764 Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Posting-number: Volume 14, Issue 105 Submitted-by: kirsch@usasoc.soc.mil (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 '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%itnsg1.cineca.it@CUNYVM.CUNY.EDU (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 # rmccask@seas.gwu.edu 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, steiner@pica.army.mil Xvaxbsd: _defaults # VAX 11-780, BSD 4.3 David Kirschbaum X_defaults: X make unzip X X#From Mark Adler, madler@tybalt.caltech.edu: 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: jpd@usl.edu 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: root@itnsg1.cineca.it 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 (davidsen@crdos1.crd.ge.com) 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 /* v2.0g Chitra says MTS needs this for O_BINARY */ 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 /* for structure ftime */ X#include /* for setftime(), dup(), creat() */ X#include /* for memcpy() */ X#include /* for S_IWRITE, S_IREAD */ 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 /* for S_IWRITE, S_IREAD v3.03 */ 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: <4867.9005181430.lena@lena.uucp> XTo: kirsch@usasoc.soc.mil 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 /* for printf() */ X X--- 33,39 ----- X #include X #include X #include X+ #endif X X #ifdef __TURBOC__ /* v2.0b */ X #include /* for printf() */ 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 /* for setftime(), dup(), creat() */ X+ #include /* for S_IWRITE, S_IREAD */ X+ #include /* for memcpy() */ 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 /* for memcpy() */ 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:mike@ee.leeds.ac.uk XUUCP: ...!mcsun!ukc!lena!mike or mike@lena.uucp 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 Brought to you by Virtually Fun