🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: vmsnet.sources
Article #88

Zip v1.9 & UnZip v5.0, part 15/22

#88
From: goathunter
Date: Tue, 01 Sep 1992 22:53
1212 lines
49929 bytes
Submitted-by: goathunter@wkuvx1.bitnet
Posting-number: Volume 3, Issue 137
Archive-name: zip_unzip/part15

-+-+-+-+-+-+-+-+ START OF PART 15 -+-+-+-+-+-+-+-+
X            workspace`5B4`5D = 'R';
X        if (xattr & S_IWGRP) `7B
X            workspace`5B5`5D = 'W';
X            workspace`5B7`5D = 'D';
X        `7D
X        if (xattr & S_IXGRP)
X            workspace`5B6`5D = 'E';
X        if (xattr & S_IROTH)
X            workspace`5B8`5D = 'R';
X        if (xattr & S_IWOTH) `7B
X            workspace`5B9`5D = 'W';
X            workspace`5B11`5D = 'D';
X        `7D
X        if (xattr & S_IXOTH)
X            workspace`5B10`5D = 'E';
X
X        *p++ = '(';
X        for (k = j = 0;  j < 3;  ++j) `7B    /* loop over groups of permissi
Vons */
X            for (i = 0;  i < 4;  ++i, ++k)  /* loop over perms within a grou
Vp */
X                if (workspace`5Bk`5D)
X                    *p++ = workspace`5Bk`5D;
X            *p++ = ',';                      /* group separator */
X            if (j == 0)
X                while ((*p++ = *q++) != ','); /* system, owner perms are sam
Ve */
X        `7D
X        *p-- = 0;
X        *p = ')';   /* overwrite last comma */
X        printf("  VMS file attributes (%06o octal):               %s\n",
X          xattr, attribs);
X
X    `7D else if ((hostnum != DOS_OS2_FAT_) && (hostnum != OS2_HPFS_)) `7B
X        /* assume Unix-like */
X        switch (xattr & S_IFMT) `7B
X            case S_IFREG:   attribs`5B0`5D = '-';  break;
X            case S_IFLNK:   attribs`5B0`5D = 'l';  break;
X            case S_IFBLK:   attribs`5B0`5D = 'b';  break;
X            case S_IFCHR:   attribs`5B0`5D = 'c';  break;
X            case S_IFIFO:   attribs`5B0`5D = 'p';  break;
X            case S_IFSOCK:  attribs`5B0`5D = 's';  break;
X            case S_IFDIR:   attribs`5B0`5D = 'd';  break;
X            default:        attribs`5B0`5D = '?';  break;
X        `7D
X        if (xattr & S_IRUSR)        /* no read-permission: user */
X            attribs`5B1`5D = 'r';
X        else
X            attribs`5B1`5D = '-';
X        if (xattr & S_IWUSR)        /* no write-permission: user */
X            attribs`5B2`5D = 'w';
X        else
X            attribs`5B2`5D = '-';
X        if (xattr & S_IXUSR)        /* no execute-permission: user */
X            if (xattr & S_ISUID)
X                attribs`5B3`5D = 's';
X            else
X                attribs`5B3`5D = 'x';
X        else
X            if (xattr & S_ISUID)
X                attribs`5B3`5D = 'S';   /* undefined state */
X            else
X                attribs`5B3`5D = '-';
X        if (xattr & S_IRGRP)        /* no read-permission: group */
X            attribs`5B4`5D = 'r';
X        else
X            attribs`5B4`5D = '-';
X        if (xattr & S_IWGRP)        /* no write-permission: group */
X            attribs`5B5`5D = 'w';
X        else
X            attribs`5B5`5D = '-';
X        if (xattr & S_IXGRP)        /* no execute-permission: group */
X            if (xattr & S_ISGID)
X                attribs`5B6`5D = 's';
X            else
X                attribs`5B6`5D = 'x';
X        else
X            if (xattr & S_ISGID)    /* or could use S_ENFMT (same) */
X                attribs`5B6`5D = 'l';
X            else
X                attribs`5B6`5D = '-';
X        if (xattr & S_IROTH)        /* no read-permission: other */
X            attribs`5B7`5D = 'r';
X        else
X            attribs`5B7`5D = '-';
X        if (xattr & S_IWOTH)        /* no write-permission: other */
X            attribs`5B8`5D = 'w';
X        else
X            attribs`5B8`5D = '-';
X        if (xattr & S_IXOTH)        /* no execute-permission: other */
X            if (xattr & S_ISVTX)    /* "sticky bit" */
X                attribs`5B9`5D = 't';
X            else
X                attribs`5B9`5D = 'x';
X        else
X            if (xattr & S_ISVTX)
X                attribs`5B9`5D = 'T';   /* undefined state */
X            else
X                attribs`5B9`5D = '-';
X        attribs`5B10`5D = 0;
X        printf("  Unix file attributes (%06o octal):              %s\n",
X          xattr, attribs);
X
X    `7D /* endif (hostnum: external attributes format) */
X
X    if ((xattr=(UWORD)(crec.external_file_attributes & 0xFF)) == 0)
X        printf("  MS-DOS file attributes (%02X hex):                  none\n
V",
X          xattr);
X    else if (xattr == 1)
X        printf(
X          "  MS-DOS file attributes (%02X hex):                  read-only\n
V",
X          xattr);
X    else
X        printf(
X         "  MS-DOS file attributes (%02X hex):                  %s%s%s%s%s%s
V\n",
X          xattr, (xattr&1)?"rdo ":"", (xattr&2)?"hid ":"", (xattr&4)?"sys ":
V"",
X          (xattr&8)?"lab ":"", (xattr&16)?"dir ":"", (xattr&32)?"arc":"");
X    printf(
X     "  offset of local header from start of archive:     %lu (%.8lXh) bytes
V\n",
X      crec.relative_offset_local_header, crec.relative_offset_local_header);
X
X/*--------------------------------------------------------------------------
V-
X    Skip the extra field, if any, and print the file comment, if any (the
X    filename has already been printed, above).  That finishes up this file
X    entry...
X  --------------------------------------------------------------------------
V-*/
X
X    if (crec.extra_field_length > 0) `7B
X/* #ifdef OS2 */
X#if TRUE
X        ULONG ea_size;
X        if ((error = do_string(crec.extra_field_length, EXTRA_FIELD)) != 0)
V `7B
X            error_in_archive = error;
X            if (error > 1)      /* fatal:  can't continue */
X                return (error);
X        `7D
X        if ((ea_size = SizeOfEAs(extra_field)) != 0)
X            printf("\n\
X  This file has %lu bytes of OS/2 EA's in the local extra field.\n\
X  (May not match OS/2 \"dir\" amount due to storage method.)\n\n",
X              ea_size);
X        else
X            printf("\n  There is an unknown extra field (skipping).\n");
X#else
X        printf("\n  There is an extra field (skipping).\n");
X        SKIP_(crec.extra_field_length)
X#endif
X    `7D else
X        printf("\n");
X
X    if (!crec.file_comment_length)
X        printf("  There is no file comment.\n");
X    else `7B
X        printf("\
X------------------------- file comment begins ----------------------------\n
V");
X        if ((error = do_string(crec.file_comment_length, DISPLAY)) != 0) `7B
X          error_in_archive = error;   /* might be warning */
X          if (error > 1)      /* fatal */
X              return error;
X        `7D
X        printf("\n\
X-------------------------- file comment ends -----------------------------\n
V");
X    `7D
X
X    return error_in_archive;
X
X`7D /* end function long_info() */
X
X
X
X
X
X/**************************/
X/*  Function SizeOfEAs()  */
X/**************************/
X
XULONG SizeOfEAs(extra_field)   /* Author: Kai Uwe Rommel */
X    void   *extra_field;
X`7B
X    EAHEADER *pEAblock = (PEAHEADER) extra_field;
X
X    if ( extra_field != NULL && pEAblock -> nID == EAID )
X      return pEAblock -> lSize;
X
X    return 0L;
X`7D
X
X
X
X
X
X/***************************/
X/*  Function short_info()  */
X/***************************/
X
Xint short_info()   /* return PK-type error code */
X`7B
X    int           k, error, error_in_archive=0;
X    UWORD         hostver, xattr;
X    char          workspace`5B12`5D, attribs`5B16`5D;
X    static char   impl`5B5`5D="i#:#", defl`5B5`5D="def#", unkn`5B8`5D;
X    static char   dtype`5B5`5D="NXF?";  /* normal, maximum, fastest, undefin
Ved */
X    static char   *os`5BNUM_HOSTS+1`5D = `7B"dos", "ami", "vms", "unx", "cms
V",
X                      "atr", "os2", "mac", "zzz", "cpm", "???" `7D;
X    static char   *method`5BNUM_METHODS+1`5D = `7B"stor", "shrk", "re:1", "r
Ve:2",
X                      "re:3", "re:4", impl, "tokn", defl, unkn`7D;
X
X
X/*--------------------------------------------------------------------------
V-
X    Print out various interesting things about the compressed file.
X  --------------------------------------------------------------------------
V-*/
X
X    methnum = MIN(crec.compression_method, NUM_METHODS);
X    hostnum = MIN(crec.version_made_by`5B1`5D, NUM_HOSTS);
X    hostver = crec.version_made_by`5B0`5D;
X/*
X    extnum = MIN(crec.version_needed_to_extract`5B1`5D, NUM_HOSTS);
X    extver = crec.version_needed_to_extract`5B0`5D;
X */
X
X    if (methnum == IMPLODED) `7B
X        impl`5B1`5D = (crec.general_purpose_bit_flag & 2)? '8' : '4';
X        impl`5B3`5D = (crec.general_purpose_bit_flag & 4)? '3' : '2';
X    `7D else if (methnum == DEFLATED) `7B
X        UWORD  dnum=(crec.general_purpose_bit_flag>>1) & 3;
X        defl`5B3`5D = dtype`5Bdnum`5D;
X    `7D else if (methnum == NUM_METHODS) `7B   /* unknown */
X        sprintf(unkn, "u%03d", crec.compression_method);
X    `7D
X
X    for (k = 0;  k < 15;  ++k)
X        attribs`5Bk`5D = ' ';
X    attribs`5B15`5D = 0;
X
X    xattr = (UWORD) ((crec.external_file_attributes >> 16) & 0xFFFF);
X    switch (hostnum) `7B
X      case VMS_:
X          `7B   char   *p=attribs;
X              int    i, j;
X
X              for (k = 0;  k < 12;  ++k)
X                  workspace`5Bk`5D = 0;
X              if (xattr & S_IRUSR)
X                  workspace`5B0`5D = 'R';
X              if (xattr & S_IWUSR) `7B
X                  workspace`5B1`5D = 'W';
X                  workspace`5B3`5D = 'D';
X              `7D
X              if (xattr & S_IXUSR)
X                  workspace`5B2`5D = 'E';
X              if (xattr & S_IRGRP)
X                  workspace`5B4`5D = 'R';
X              if (xattr & S_IWGRP) `7B
X                  workspace`5B5`5D = 'W';
X                  workspace`5B7`5D = 'D';
X              `7D
X              if (xattr & S_IXGRP)
X                workspace`5B6`5D = 'E';
X              if (xattr & S_IROTH)
X                  workspace`5B8`5D = 'R';
X              if (xattr & S_IWOTH) `7B
X                  workspace`5B9`5D = 'W';
X                  workspace`5B11`5D = 'D';
X              `7D
X              if (xattr & S_IXOTH)
X                  workspace`5B10`5D = 'E';
X
X              for (k = j = 0;  j < 3;  ++j) `7B     /* groups of permissions
V */
X                  for (i = 0;  i < 4;  ++i, ++k)  /* perms within a group */
X                      if (workspace`5Bk`5D)
X                          *p++ = workspace`5Bk`5D;
X                  *p++ = ',';                     /* group separator */
X              `7D
X              *--p = ' ';   /* overwrite last comma */
X              if ((p - attribs) < 12)
X                  sprintf(&attribs`5B12`5D, "%d.%d", hostver/10, hostver%10)
V;
X          `7D
X          break;
X
X      case DOS_OS2_FAT_:
X      case OS2_HPFS_:
X          xattr = (UWORD) (crec.external_file_attributes & 0xFF);
X          sprintf(attribs, "%s,%s,%s,%s", (xattr&32)?"arc":"",
X            (xattr&2)?"hid":"", (xattr&1)?"rdo":"rw", (xattr&4)?"sys":"");
X          if ((k = strlen(attribs)) < 15)
X              attribs`5Bk`5D = ' ';   /* overwrite '\0' */
X          if (k < 12)
X              sprintf(&attribs`5B12`5D, "%d.%d", hostver/10, hostver%10);
X          break;
X
X      default:   /* assume Unix-like */
X          switch (xattr & S_IFMT) `7B
X              case S_IFREG:   attribs`5B0`5D = '-';  break;
X              case S_IFLNK:   attribs`5B0`5D = 'l';  break;
X              case S_IFBLK:   attribs`5B0`5D = 'b';  break;
X              case S_IFCHR:   attribs`5B0`5D = 'c';  break;
X              case S_IFIFO:   attribs`5B0`5D = 'p';  break;
X              case S_IFSOCK:  attribs`5B0`5D = 's';  break;
X              case S_IFDIR:   attribs`5B0`5D = 'd';  break;
X              default:        attribs`5B0`5D = '?';  break;
X          `7D
X          if (xattr & S_IRUSR)        /* no read-permission: user */
X              attribs`5B1`5D = 'r';
X          else
X              attribs`5B1`5D = '-';
X          if (xattr & S_IWUSR)        /* no write-permission: user */
X              attribs`5B2`5D = 'w';
X          else
X              attribs`5B2`5D = '-';
X          if (xattr & S_IXUSR)        /* no execute-permission: user */
X              if (xattr & S_ISUID)
X                  attribs`5B3`5D = 's';
X              else
X                  attribs`5B3`5D = 'x';
X          else
X              if (xattr & S_ISUID)
X                  attribs`5B3`5D = 'S';   /* undefined state */
X              else
X                  attribs`5B3`5D = '-';
X          if (xattr & S_IRGRP)        /* no read-permission: group */
X              attribs`5B4`5D = 'r';
X          else
X              attribs`5B4`5D = '-';
X          if (xattr & S_IWGRP)        /* no write-permission: group */
X              attribs`5B5`5D = 'w';
X          else
X              attribs`5B5`5D = '-';
X          if (xattr & S_IXGRP)        /* no execute-permission: group */
X              if (xattr & S_ISGID)
X                  attribs`5B6`5D = 's';
X              else
X                  attribs`5B6`5D = 'x';
X          else
X              if (xattr & S_ISGID)    /* or could use S_ENFMT (same) */
X                  attribs`5B6`5D = 'l';
X              else
X                  attribs`5B6`5D = '-';
X          if (xattr & S_IROTH)        /* no read-permission: other */
X              attribs`5B7`5D = 'r';
X          else
X              attribs`5B7`5D = '-';
X          if (xattr & S_IWOTH)        /* no write-permission: other */
X              attribs`5B8`5D = 'w';
X          else
X              attribs`5B8`5D = '-';
X          if (xattr & S_IXOTH)        /* no execute-permission: other */
X              if (xattr & S_ISVTX)    /* "sticky bit" */
X                  attribs`5B9`5D = 't';
X              else
X                  attribs`5B9`5D = 'x';
X          else
X              if (xattr & S_ISVTX)
X                  attribs`5B9`5D = 'T';   /* undefined state */
X              else
X                  attribs`5B9`5D = '-';
X          sprintf(&attribs`5B12`5D, "%d.%d", hostver/10, hostver%10);
X          break;
X
X    `7D /* end switch (hostnum: external attributes format) */
X
X    printf("%s %s %7lu %c%c", attribs, os`5Bhostnum`5D, crec.uncompressed_si
Vze,
X      (crec.general_purpose_bit_flag & 1)?
X      ((crec.internal_file_attributes & 1)? 'T' : 'B') :   /* encrypted */
X      ((crec.internal_file_attributes & 1)? 't' : 'b'),    /* plaintext */
X      (crec.general_purpose_bit_flag & 8)? (crec.extra_field_length? 'X' : '
Vl')
X                                        : (crec.extra_field_length? 'x' : '-
V'));
X    if (lflag == 4) `7B
X        longint c = (longint) crec.compressed_size;
X        longint uc = (longint) crec.uncompressed_size;
X
X        if (crec.general_purpose_bit_flag & 1)
X            c -= 12;    /* if encrypted, don't count encryption header */
X        /* risk signed overflow if blindly multiply: */
X        printf("%3d%%", (uc==0)? 0 : ((uc>2000000L)?
X          ((int)((uc-c)/(uc/1000L))+5)/10 : ((int)((1000L*(uc-c))/uc)+5)/10)
V );
X    `7D else if (lflag == 5)
X        printf(" %7lu", crec.compressed_size);
X
X    printf(" %s %s %s\n", method`5Bmethnum`5D,
X      zipinfo_time(&crec.last_mod_file_date, &crec.last_mod_file_time),
X      filename);
X
X/*--------------------------------------------------------------------------
V-
X    Skip the extra field and/or the file comment, if any (the filename has
X    already been printed, above).  That finishes up this file entry...
X  --------------------------------------------------------------------------
V-*/
X
X    SKIP_(crec.extra_field_length)
X    SKIP_(crec.file_comment_length)
X
X    return error_in_archive;
X
X`7D /* end function short_info() */
X
X
X
X
X
X/*****************************/
X/*  Function zipinfo_time()  */
X/*****************************/
X
Xchar *zipinfo_time(datez, timez)
X    UWORD   *datez, *timez;
X`7B
X    UWORD         yr, mo, dy, hh, mm, ss;
X    static char   d_t_str`5B21`5D;
X    static char   *month`5B12`5D = `7B"Jan", "Feb", "Mar", "Apr", "May", "Ju
Vn",
X                                "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"`7D;
X
X
X
X/*--------------------------------------------------------------------------
V-
X    Convert the file-modification date and time info to a string of the form
V`20
X    "23 Feb 1990 17:15:00" or "23-Feb-91 17:15," depending on value of lflag
V.
X  --------------------------------------------------------------------------
V-*/
X
X    yr = ((*datez >> 9) & 0x7f) + 80;     /* dissect date */
X    mo = ((*datez >> 5) & 0x0f) - 1;
X    dy = *datez & 0x1f;
X
X    hh = (*timez >> 11) & 0x1f;           /* dissect time */
X    mm = (*timez >> 5) & 0x3f;
X    ss = (*timez & 0x1f) * 2;
X
X    if ((lflag >= 3) && (lflag <= 5))
X        sprintf(d_t_str, "%2u-%s-%u %02u:%02u", dy, month`5Bmo`5D, yr, hh, m
Vm);
X    else if (lflag > 9)  /* verbose listing format */
X        sprintf(d_t_str, "%u %s %u %02u:%02u:%02u", dy, month`5Bmo`5D, yr+19
V00,
X          hh, mm, ss);
X
X    return d_t_str;
X
X`7D /* end function zipinfo_time() */
X
X
X
X
X
X/********************************/
X/*  Function open_input_file()  */
X/********************************/
X
Xint open_input_file()   /* return 1 if open failed */
X`7B
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#ifdef VMS
X    zipfd = open(zipfn, O_RDONLY, 0, "ctx=stm");
X#else /* !VMS */
X#ifdef UNIX
X    zipfd = open(zipfn, O_RDONLY);
X#else /* !UNIX */
X#ifdef MACOS
X    zipfd = open(zipfn, 0);
X#else /* !MACOS */
X    zipfd = open(zipfn, O_RDONLY `7C O_BINARY);
X#endif /* ?MACOS */
X#endif /* ?UNIX */
X#endif /* ?VMS */
X    if (zipfd < 1) `7B
X        fprintf(stderr, "error:  can't open zipfile `5B %s `5D\n", zipfn);
X        return 1;
X    `7D
X    return 0;
X
X`7D /* end function open_input_file() */
X
X
X
X
X
X/************************/
X/*  Function readbuf()  */
X/************************/
X
Xint readbuf(buf, size)   /* return number of bytes read into buf */
X    char *buf;
X    register unsigned size;
X`7B
X    register int count;
X    int n;
X
X    n = size;
X    while (size) `7B
X        if (incnt == 0) `7B
X            if ((incnt = read(zipfd, inbuf, INBUFSIZ)) <= 0)
X                return (n-size);
X            /* buffer ALWAYS starts on a block boundary:  */
X            cur_zipfile_bufstart += INBUFSIZ;
X            inptr = inbuf;
X        `7D
X        count = MIN(size, (unsigned)incnt);
X        memcpy(buf, inptr, count);
X        buf += count;
X        inptr += count;
X        incnt -= count;
X        size -= count;
X    `7D
X    return n;
X
X`7D /* end function readbuf() */
$ CALL UNPACK [.UNZIP50]ZIPINFO.C;1 471242085
$ create 'f'
X
XZIPINFO(1)               USER COMMANDS                 ZIPINFO(1)
X
XNAME
X     zipinfo - list detailed information about a ZIP archive file
X
XSYNOPSIS
X     zipinfo `5B-1smlvht`5D file`5B.zip`5D `5Bfilespec ...`5D
X
XARGUMENTS
X     file`5B.zip`5D  Path of the ZIP archive.  The suffix `60`60.zip'' is
X                 applied  if  the  file specified does not exist.
X                 Note that self-extracting  ZIP  files  are  sup-
X                 ported;  just  specify the `60`60.exe'' suffix your-
X                 self.
X
X     `5Bfilespec`5D  An optional list of archive members to  be  pro-
X                 cessed.  Expressions may be used to match multi-
X                 ple members; be sure to quote  expressions  that
X                 contain   characters  interpreted  by  the  Unix
X                 shell. See PATTERN  MATCHING  (below)  for  more
X                 details.
X
XOPTIONS
X     -1  list filenames only, one per line (useful for pipes)
X     -s  list zipfile  info  in  short  Unix  `60`60ls  -l''  format:
X         default
X     -m  list zipfile info in medium Unix `60`60ls -l'' format
X     -l  list zipfile info in long Unix `60`60ls -l'' format
X     -v  list zipfile information in verbose, multi-page format
X     -h  list header line
X     -t  list totals for files listed or for all files
X
XPATTERN MATCHING
X     All archive members are listed unless a filespec is provided
X     to specify a subset of the archive members.  The filespec is
X     similar to an egrep expression, and may contain:
X
X     *      matches a sequence of 0 or more characters
X     ?      matches exactly 1 character
X     \nnn   matches the character having octal code nnn
X     `5B...`5D  matches any single character found inside the  brack-
X            ets; ranges are specified by a beginning character, a
X            hyphen, and an ending character.  If  an  exclamation
X            point  or  a  carat  (`60!'  or  `60`5E')  follows the left
X            bracket, then the range of characters matched is com-
X            plemented  with  respect  to  the ASCII character set
X            (that is, anything except the characters  inside  the
X            brackets is considered a match).
X
XDESCRIPTION
X     ZipInfo lists technical information  about  a  ZIP  archive,
X     including  information  file  access permissions, encryption
X     status, type of compression, version and operating system of
X     compressing program, and the like.  The default option is to
X
XInfo-ZIP          Last change: 19 Aug 92 (v1.0)                 1
X
XZIPINFO(1)               USER COMMANDS                 ZIPINFO(1)
X
X     list files in the following format:
X
X-rw-rwl---  1.5 unx    2802 t- defX 11-Aug-91 13:48 perms.2660
X
X     The last three fields are clearly the modification date  and
X     time of the file, and its name.  The case of the filename is
X     respected; thus files  which  come  from  MS-DOS  PKZIP  are
X     always  capitalized.   If  the file was zipped with a stored
X     directory name, that  is  also  displayed  as  part  of  the
X     filename.
X
X     The second and third  fields  indicate  that  the  file  was
X     zipped  under Unix with version 1.5 of Zip (a beta version).
X     Since it comes from Unix, the file permissions at the begin-
X     ning   of   the  line  are  printed  in  Unix  format.   The
X     uncompressed file-size (2802 in this example) is the  fourth
X     field.
X
X     The fifth field consists of two characters, either of  which
X     may  take  on  several  values.   The first character may be
X     either `60t' or `60b', indicating that Zip believes the file  to
X     be  text  or  binary,  respectively;  but  if  the  file  is
X     encrypted, ZipInfo notes this fact by capitalizing the char-
X     acter  (`60T'  or `60B').  The second character may also take on
X     four values, depending on whether there is an extended local
X     header  and/or  an  `60`60extra field'' associated with the file
X     (explained in PKWare's APPNOTE.TXT).  If neither exists, the
X     character  will  be  a hyphen (`60-'); if there is an extended
X     local header but no extra field, `60l'; if the  reverse,  `60x';
X     and  if  both  exist, `60X'.  Thus the file in this example is
X     (apparently) a text file, is not encrypted, and has  neither
X     an  extra field nor an extended local header associated with
X     it.  The example below, on the other hand, is  an  encrypted
X     binary file with an extra field:
X
XRWD,R,R     0.9 vms     168 Bx shrk  9-Aug-91 19:15 perms.0644
X
X     Extra fields are used by PKWare for  authenticity  verifica-
X     tion(?)  and  possibly other purposes, and by Info-ZIP's Zip
X     1.6 and later to store OS/2, Macintosh and VMS  file  attri-
X     butes.  This example presumably falls into the latter class,
X     then.  Note that the file attributes are listed in VMS  for-
X     mat.   Other  possibilities  for  the  host operating system
X     include OS/2 with High Performance File System  (HPFS),  DOS
X     or  OS/2  with  File Allocation Table (FAT) file system, and
X     Macintosh, denoted as follows:
X
Xarc,,rw,    1.0 os2    5358 Tl i4:3  4-Dec-91 11:33 longfilename.hpfs
Xarc,hid,rdo,sys dos    4096 b- i4:2 14-Jul-91 12:58 EA DATA. SF
X--w-------  1.0 mac   17357 bx i8:2  4-May-92 04:02 unzip.macr
X
XInfo-ZIP          Last change: 19 Aug 92 (v1.0)                 2
X
XZIPINFO(1)               USER COMMANDS                 ZIPINFO(1)
X
X     File attributes in the first two cases are  indicated  in  a
X     DOS-like  format,  where  the  file  may or may not have its
X     archive bit set; may be hidden or not; may be read-write  or
X     read-only;  and  may be a system file or not.  If the attri-
X     butes are too long,  the  version  number  of  the  encoding
X     software is omitted.  (The information is still available in
X     the verbose listing, however.)  Interpretation of  Macintosh
X     file attributes needs some work yet.
X
X     Finally, the sixth field indicates  the  compression  method
X     and  possible  sub-method used.  There are six methods known
X     at present:  storing (no compression), reducing,  shrinking,
X     imploding,  tokenizing,  and  deflating.  In addition, there
X     are four levels of reducing (1 through  4);  four  types  of
X     imploding  (4K or 8K sliding dictionary, and 2 or 3 Shannon-
X     Fano trees); and three levels of  deflating  (fast,  normal,
X     maximum  compression).  ZipInfo represents these methods and
X     their sub-methods as follows:  `60`60stor''; `60`60re:1,'' `60`60re:2,'
V'
X     etc.;  `60`60shrk'';  `60`60i4:2,''  `60`60i8:3,''  etc.;  `60`60tokn''
V; and
X     `60`60defF,'' `60`60defN,'' and `60`60defX.''
X
X     The medium and long listings are  almost  identical  to  the
X     short  format except that they add information on the file's
X     compression.   The  medium  format  indicates   the   file's
X     compression factor as a percentage:
X
X-rw-rwl---  1.5 unx    2802 t- 81% defX 11-Aug-91 13:48 perms.2660
X
X     In this example, the file has been compressed by more than a
X     factor of five; the compressed data are only 19% of the ori-
X     ginal size.  The long format  gives  the  compressed  file's
X     size in bytes, instead:
X
X-rw-rwl---  1.5 unx    2802 t-     538 defX 11-Aug-91 13:48 perms.2660
X
X     In addition to individual file information, a  default  zip-
X     file listing also includes header and trailer lines:
X
XArchive:  OS2.zip   5453 bytes   5 files
X,,rw,       1.0 os2     730 b- i4:3 26-Jun-92 23:40 Contents
X,,rw,       1.0 os2    3710 b- i4:3 26-Jun-92 23:33 makefile.os2
X,,rw,       1.0 os2    8753 b- i8:3 26-Jun-92 15:29 os2unzip.c
X,,rw,       1.0 os2      98 b- stor 21-Aug-91 15:34 unzip.def
X,,rw,       1.0 os2      95 b- stor 21-Aug-91 17:51 zipinfo.def
X5 files, 13386 bytes uncompressed, 4951 bytes compressed:  63%
X
X     The header line gives the name of  the  archive,  its  total
X     size,  and  the total number of files; the trailer gives the
X     number of files listed, their total uncompressed  size,  and
X     their  total  compressed  size  (not  including any of Zip's
X     internal overhead).  If, however, one or more filespecs  are
X     provided, the header and trailer lines are not listed.  This
X
XInfo-ZIP          Last change: 19 Aug 92 (v1.0)                 3
X
XZIPINFO(1)               USER COMMANDS                 ZIPINFO(1)
X
X     behavior is also similar to that of Unix's `60`60ls -l''; it may
X     be  overridden  by  specifying  the -h and -t options expli-
X     citly.  In such a case  the  listing  format  must  also  be
X     specified  explicitly,  since  -h  or  -t  (or  both) in the
X     absence of other options implies that  ONLY  the  header  or
X     trailer  line (or both) is listed.  See the EXAMPLES section
X     below for a semi-intelligible translation of this nonsense.
X
X     The verbose listing is self-explanatory.  It also lists file
X     comments  and the zipfile comment, if any, and the number of
X     bytes of OS/2 extended attributes  stored.   Note  that  the
X     latter  number will in general NOT match the number given by
X     OS/2's `60`60dir'' command; OS/2 always reports  the  number  of
X     bytes  required  in  16-bit  format,  whereas ZipInfo always
X     reports the 32-bit storage.
X
XENVIRONMENT OPTIONS
X     Modifying ZipInfo's default behavior via options  placed  in
X     an environment variable can be a bit complicated to explain,
X     due to ZipInfo's attempts to handle various defaults  in  an
X     intuitive,  yet  Unix-like,  manner.  Nevertheless, there is
X     some underlying logic.  In brief, there are three `60`60priority
X     levels''  of  options:   the  default  options;  environment
X     options, which can override or  add  to  the  defaults;  and
X     explicit  options  given  by the user, which can override or
X     add to either of the above.
X
X     The default listing  format,  as  noted  above,  corresponds
X     roughly  to  the "zipinfo -hst" command (except when indivi-
X     dual zipfile members are specified).  A user who prefers the
X     long-listing  format  (-l)  can  make  use  of  the  ZIPINFO
X     environment variable to change this default:
X
X           setenv ZIPINFO -l            Unix C shell
X
X           ZIPINFO=-l; export ZIPINFO   Unix Bourne shell
X
X           set ZIPINFO=-l               OS/2 or MS-DOS
X
X           define ZIPINFO_OPTS "-l"     VMS (quotes for LOWERCASE)
X
X     If,  in  addition,  the  user  dislikes  the  trailer  line,
X     ZipInfo's concept of `60`60negative options''  may  be  used  to
X     override  the default inclusion of the line.  This is accom-
X     plished by preceding the undesired option with one  or  more
X     minuses:   e.g., `60`60-l-t'' or `60`60--tl'', in this example.  The
X     first hyphen is the regular switch character,  but  the  one
X     before the `60t' is a minus sign.  The dual use of hyphens may
X     seem  a  little  awkward,  but  it's  reasonably   intuitive
X     nonetheless:   simply  ignore  the  first hyphen and go from
X     there.  It is also consistent with the behavior of the  Unix
X     command nice(1).
X
XInfo-ZIP          Last change: 19 Aug 92 (v1.0)                 4
X
XZIPINFO(1)               USER COMMANDS                 ZIPINFO(1)
X
XEXAMPLES
X     To get a basic, short-format listing of  the  complete  con-
X     tents of a ZIP archive `60`60storage.zip,'' with both header and
X     totals lines, use only the archive name as  an  argument  to
X     zipinfo:
X
X           zipinfo storage
X
X     To produce  a  basic,  long-format  listing  (not  verbose),
X     including header and totals lines, use -l:
X
X           zipinfo -l storage
X
X     To list the complete contents of the archive without  header
X     and  totals  lines,  either  negate the -h and -t options or
X     else specify the contents explicitly:
X
X           zipinfo --h-t storage
X
X           zipinfo storage \*
X
X     (where the backslash is required only  if  the  shell  would
X     otherwise  expand the `60*' wildcard, as in Unix when globbing
X     is turned on--double quotes around the asterisk  would  have
X     worked  as  well).   To turn off the totals line by default,
X     use the environment variable (C shell is assumed here):
X
X           setenv ZIPINFO --t
X
X           zipinfo storage
X
X     To get the full, short-format listing of the  first  example
X     again,  given that the environment variable is set as in the
X     previous example, it is necessary to specify the  -s  option
X     explicitly,  since the -t option by itself implies that ONLY
X     the footer line is to be printed:
X
X           setenv ZIPINFO --t
X
X           zipinfo -t storage           `5Bonly totals line`5D
X
X           zipinfo -st storage          `5Bfull listing`5D
X
X     The -s option, like -m and -l, includes headers and  footers
X     by  default, unless otherwise specified.  Since the environ-
X     ment variable specified no footers and  that  has  a  higher
X     precedence  than  the default behavior of -s, an explicit -t
X     option was necessary to produce the full  listing.   Nothing
X     was  indicated  about  the header, however, so the -s option
X     was sufficient.  Note that both the -h and -t options,  when
X     used  by themselves or with each other, override any default
X     listing of member files; only the header and/or  footer  are
X
XInfo-ZIP          Last change: 19 Aug 92 (v1.0)                 5
X
XZIPINFO(1)               USER COMMANDS                 ZIPINFO(1)
X
X     printed.   This  behavior  will  be more useful when ZipInfo
X     accepts wildcards for the zipfile name; one may then summar-
X     ize the contents of all zipfiles with a single command.
X
X     To list information on a single file within the archive,  in
X     medium format, specify the filename explicitly:
X
X           zipinfo -m storage unshrink.c
X
X     The specification of any member file, as  in  this  example,
X     will  override the default header and totals lines; only the
X     single line of information about the requested file will  be
X     printed.   This  is  intuitively  what one would expect when
X     requesting information about a single  file.   For  multiple
X     files,  it  is often useful to know the total compressed and
X     uncompressed size; in such cases -t may be specified  expli-
X     citly:
X
X           zipinfo -mt storage "*.`5Bch`5D Mak\*
X
X     Finally, to get maximal information about the  ZIP  archive,
X     use the verbose option.  It is usually wise to pipe the out-
X     put into a filter such as more(1):
X
X           zipinfo -v storage `7C more
X
XTIPS
X     The author finds it convenient to set up an alias `60`60ii'' for
X     ZipInfo  on systems which allow aliases, or else to set up a
X     batch  file  `60`60ii.bat''  or  to  rename  the  executable  to
X     `60`60ii.exe'' on systems such as MS-DOS which have no provision
X     for aliases.  The `60`60ii'' usage parallels the  common  `60`60ll''
X     alias  for long listings in Unix, and the similarity between
X     the outputs of the two commands was intentional.
X
XSEE ALSO
X     funzip(1),  unzip(1),   zip(1),   zipcloak(1),   zipnote(1),
X     zipsplit(1)
X
XAUTHOR
X     Greg Roelofs (also known as Cave Newt).  ZipInfo  is  partly
X     based  on  S. H. Smith's unzip and contains pattern-matching
X     code by  J.  Kercheval,  but  mostly  it  was  written  from
X     scratch.  The OS/2 extra-field code is by Kai Uwe Rommel.
X
XInfo-ZIP          Last change: 19 Aug 92 (v1.0)                 6
X
$ CALL UNPACK [.UNZIP50]ZIPINFO.DOC;1 1196901134
$ create 'f'
XSubject: Info-ZIP Rules (No Feelthy ...)
X
XIn discussions with Mark Adler (and others), I realized we in the Info-ZIP
Xcommunity have been evolving a set of rules that maybe oughtta be
Xdocumented, archived, and available to potential contributors.
X
XThe following appear to meet our requirements.  Please observe these
Xrules when submitting source, context diff, or other files to Info-ZIP.
X
X
X1 - "NO FEELTHY TABS"
X
X    Many editors and EMail systems either have no capability to use and/or
Xdisplay the Ascii 9 TAB character correctly, or there are variable tab
Xcolumns, or other horrors.  (My MaxEMail offline email editor for one.)
X
X    Bottom line:  use spaces, not tabs.
X
X    Related utility programs:  Unix and MS-DOS :  expand, unexpand.
XMS-DOS: Buerg's TABS; Toad Hall's TOADSOFT.  And some editors have the
Xconversion built-in.
X
X    Exceptions:  The Unix Makefile.  Some makes seem to require "real"
Xtabs.  If they need it there, fine.  So don't fiddle the Makefile.
X
X
X2 - "NO FEELTHY CRS"
X
X    All source, documentation and other text files shall have Unix style
Xline endings (LF, Ctrl-J), NOT the MS-DOS CR/LF or Mac CR line endings.
X
X    Reason:  "Real programmers" in any environment can convert back and
Xforth between Unix and DOS/Mac style.  MS-DOS Turbo C can use Unix or
XMS-DOS line endings (donno about Mac Turbo C).  Buerg's LIST file display
Xutility for MS-DOS can use Unix or MS-DOS line endings.  Unix utilities
Xlike diff and patch die a horrible death (or produce horrible output) if
Xtarget files have CRs.
X
X    Related utilities:  flip for Unix and MS-DOS.
X
X    Exceptions:  The zip archive README and zip.doc files, which Mark
XAdler wants to leave in MSDOS for "unsophisticated" (read brain-dead) DOS
Xusers.  Also the batch files to compile under MS-DOS (where it requires
Xthe CRs.)
X
X
X3 - "NO FEELTHY HEX"
X
X    We'll use uuencode/uudecode compatible converters to move binary files
Xthrough our 7-bit EMail systems (xxencode on special request).  Uuencoded
Xfiles, if larger than +/- 32Kb, will be broken into smaller (< 32Kb)
Xfiles (via David M. Read's UUXFER utility).
X
X    Reason:  to prevent sounds of gagging mailers from resounding
Xthroughout the land.  To be standard with the Uunet side of the world.
XTo be relatively efficient in the binary->Ascii conversion.  (Yeah, yeah,
XI know, there's better conversions out there.  But not as widely known.)
X
X    Related utilities:  uuencode, uudecode, uuxfer20, quux, others.
XJust make sure they don't leave imbedded or trailing spaces.  (E.g., they
Xshould use the "`60" character in place of Ascii 32.)  Else mailers are
Xprone to truncate or whatever.  Message me if you need one.
X
X
X4 - "NO FEELTHY TARS"
X
X    unzip will be available in .tar.Z (16-bit compressed tar), .arc (as
Xavailable on Unix, SIMTEL20, PKPAK, etc., *NOT* the latest proprietary
XSEA version), or .zip format.  (If requesting we EMail you source,
Xspecify desired format.)  zip source will only be distributed in .zip
Xarchives.
X
X    Reason:  For unzip development or use, anyone should have one of the
Xspecified dearchivers.  For zip development or use, you shouldn't be
Xmessing with zip unless you can already unzip.  (This protects the
Xinnocent.)
X
X    Related utilities:  Unix:  arc, tar, compress, zip, unzip.  MS-DOS:
XPKUNPAK, PKUNZIP, PAK, TAR, COMPRESS, and others.
X
X    Exceptions:  EMail me directly for any special circumstances or
Xrequirements (zoo, BinHex, 12-bit compress, etc.)
X
X
X5 - "NO FEELTHY FANCY_NAMES"
X
X    Assume the worst:  that someone on a brain-damaged DOS system has to
Xwork with everything your magic fingers produced.  Keep the file names
Xunimaginative and within MS-DOS limits (e.g., ordinary A..Z, 1..9, "-$_!"
Xtype characters, in the "filename.typ" 8-dot-3 format).  MacUsers, giggle
Xall you want, but no spaces.
X
X    Reason:  Compatibility with different file systems.  MS-DOS is the
Xmost limited.
X
X
X6 - "NO FEELTHY GRAPHICS"
X
X    Do all your editing in a plain-text ASCII editor.  No WordPerfect,
XWord, WordStar document mode, or other word processor files, thenkyew.
XNo desktop publishing.  No TIFFs, no GIFs, no imbedded pictures or dancing
Xladies (too bad, Cave Newt).
X
X    Reason:  Compatibility with different consoles.  My old XT clone is
Xthe most limited!
X
X    Related utilities:  vi, ed, EDLIN, Turbo C editor, UED, EASYEDIT, cat
Xor "COPY CON UNZIP.C"; various word processor -> text conversion utilities.
X
X
X7 - "NO FEELTHY DASHES"
X
X    Don't have repeated dashes (starting at the left margin) in any
Xsource code or patches you try to EMail to me or Info-ZIP.  Instead, be
Xsure to always prefix them with a space, asterisk, comment, whatever, like
Xthis:
X#---------------   or
X/*--------------   or even
X ---------------   (just indented)
X
X    Reason:  Most "undigestify" utilities (that break down newsletters
Xinto their separate messages) use that "--------" (starting at the left
Xmargin) as the symbol that it's hit the end of a message.  I'd rather not
Xhave your C source file broken up into a dozen separate untitled messages
Xin my mail system, thank you.  I'll be going through the unzip source Any
XDay Now and changing anything like that by indenting, prefixing, whatever.
X
X
X*-------------------*
X
XDavid Kirschbaum
XInfo-ZIP Coordinator
$ CALL UNPACK [.UNZIP50]ZIPRULES.;1 486630870
$ create 'f'
XEncoding of file DISK$USER99:`5BBERRYMAN`5DZIP19.ZIP;1
X`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`
V7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E
X!@@QIM5R$T5TEIUN9(3VBU$TR%USA9TWZ%DT1$#KZ%DT;DCajm@C@5ag@DP@@Dah@efag@HB@@*4
VICAb
X@Dal@8IJc@B<??af@LA@@Hah@Hb@mPPM1ABA5DGan@H@TKM@ATc@m@@SAICYX/>fJN%Eb@D.b@0@
V@<BP
XX,f6d2%Ff(9BY/MVRMEA@V54TVA@@Eah@VU#K5@PRMQB@VYTPBE@@PAc@0@GHT@@4b@EXAc@mBPD
VF4&2
XQDF4&2A@I5$F@X%QHMT@@0B@T.@@4/#,@,mBPCPCPBGaf@I5DH@XEQAQU@@0Bag@T",@@NdJ/=8?
V>J9,
X)<6#?;+Db@I5$G@XETR=T@@mE@KU%UXf"XA8?A1@Tc@Laj@$TSW@mURQDUA@@E@00EEPPORA@8,)
V<6#?
X;+D4&UM=668@Q/3_EC:%:B((BG7"44Sd06mfSdQZ06,_mT4C42#,XC%(VRJ;8<+__C)$-S3gIN6"
V<M3<
X&7<Ff')?%AZEWd5Q#+#465N/I64R&@))MZ/I?@WM=9;N;LZ6'96g6g2f&M4<3O;,BJ0,235,';*X
VZIdf
Xd_UIfU$*Mf+@6C=VS%N2+(P4d:VGHSGEdX<Q?P$V)#:R".-!UA.25-"eUUC>LZH*:1+II$';-:Jm
V42f8
X7;f&.H;)(KAW/'7XeCAU><ES!)69d3@5+MgZ6JSH*A8E$%;VGdP2R_X<7PM;Y%54Z$<E@/84O!mE
V9PA)
XQ*%/Q:T4Q':47>.<)J)?.!AKN&C4JGm,3E35DmX76FPTS)6TJ_eXLQT)JFX?Y6@Hm@.V:BA>_G&(
VCK")
XWd'BGM;JAJ#4CCUgS/4,JT/LG?WR-C!H:ITT_/$W@M<W?RS4+=;gB0GU%&TN#&*mR5XM6C@#:%V&
V*Z4g
XM>Y_(<UJ5'3ITmeg*UG+ZgBIU9ZQQFB@#-PVQ.N&>=!::V$GQO3)@*27d51M!'fSMR)F)d#dUJ2%
V4?%O
XdH:<<JEXUf:gH;2-ffL13@W_TJRV#8,4:*.OCQ:_CTE2&F=FVZP*m9Q&&1OT1=2-G!8(4QT,B<)"
VI!P&
X&+%VW'R/Qd,I"*%df>fP_f181@1B2*54%FG6JR%GM=(5%?UTM)8Y"*-.A;J)1MD8:A+4@2E1DM$A
VL1L5
XH/Z2,QIM;VQL@ET052dE4BP'Z5)1$)"P:d_893%BUV;FmBXHH*WMHEAY)XPQX-##,S'7U+2=ZZQ:
V.&.@
X;E@G%7O969/AKA>A!G$TYPNKHR%e8N>!H0YTW_U=ADmgC@JDgR(/GBY.B&Q1fPDY-*_2fI_+I%D>
VeTG%
XgV2_I>$2I+D%'Zff+!4_TM#@EXKK#A%J5-OI)FU_,6W5$8Q4!D"d_mZf@GOWIAdL?JP#PU+7m2I4
V"<>X
XYOX>XC,C$)UR/Z#FSe+SS'BXS3MX"5-BPU>?'M8I6f0'(;g$1"JG?(<mNGDZVVLHBP38ZEPUGf="
VTTN,
XA@B'gmD2/J-GN9I>XR#JHFfN2YSL3Q@HPKNBU$A>U4V'ODO)RG$TIN$6gTPdXX7HD;327I7H#f'J
V:G:2
XRRIBTETSRSLK2JNL'L.@@'NZZA?$e=(Y2,4I3UP(_29X*;+.<45$G,6.U/K$VKQG7';f!mIM/&Z8
VKG"*
X5e'X*!*O/DSO>,-M&,$HUJe'dXfCJ_IL0BTHX,GL$=eR"&1U'STW6I#,:G7Q<F-MSO*VFDR'I4"9
V$ZY%
X6T<DC?<D65B1ACA.KO"V$*-Q)WHMf(U)JZ2Fg48JMW%E:2,UZ4RSO9$&0D&""X?R)=O<PdAT+gJ#
VP.IF
Xm3RJ6g/d5PU64H)@%-(G6T=*Q-M?,@/_Q'T7dEfFV*=E1"d+I0E)AR(GWCOS;!dfO<&K6#Y*D3OK
VSH)W
XgA0B3A@-+CR++1<G7#FG*C?8me*M$/7!&Q:.R/LL,<G(C&+9I)FLR4-"LT8Q51gI;3-#$F9&D,gF
V*8IU
XQJ?R-+Q.H/=+HO9G:YV&-)!>49768,2;I8*Ddd)7M9!K)*W2XI&XOC+08*CCLf)-VfY(2Y0HWDFW
VOBS@
XISR/,5XB1dm02$+(Z#?X7O-53:U;>II?GYf7IVGR3_C+;@A?C9K?RU#3ODJ+=J5_L=N!!7+T_Sg9
V1/S2
XdM>12BJ?R$4E8__1E4_6Ym?P@M8K6d>HL4WS/gR4mG<A,3U=+GJ=WTPWf9%WR7:5fAfU6TCL2Uf"
VS"@H
X@;=3MR4"1:We2?2YK)SWTPW;J)EE*>g<1"3NY1dVmJ9"d.9:/e;%%7>O7B/"*!VD2L@5Fd:U5.9S
V7f5M
X4<23W(S/X+PJ;W2/e'*N6KGd8!9%UAW9mY(*D=<7?:>*W3O0U'mO;/?192=17)/M?47UN?,7T>62
V7g>7
XU?G@5RCP@Ec@H@m@mIQFeU,5PS5c@ZGb@M@@/@DFf!IWZ/DFf!IWZ.LVRMEA@V54TVA@@Eah@VU#
VK5@P
XRMQB@VYTPBE@@PAag@GHT@@4b@EXAc@mBPDF4&2QDF4&2A@I5$F@X%QHMT@@0Baf@P/#,@,mBPCP
VBP4F
Xaf@I5DH@XEQAQU@@0Bag@T",@@*SUOS;R?J)NU=L-K=+Db@I5$G@XETR=T@@mEb@#JKe"XA8?A1@
VTc@L
Xaj@$TSW@mURQDUA@@Eag@PORA@(NU=L-K=+D4dU-=6D9@!?>>+X@D,+S76&"D=K!@JBZPU*WQ*TI
V84A*
X2d,f#U75N26K!@"?;7L6Nd;B'Nf_:V%D9fFOO3dO3$#'T@SmEW/8*3O:M8Q:-K%+$gO7-C4&m4)8
V+$m*
X7,J(-F_M4Y=!6fm2:mUV3W%NOJ',3*mM<0Z00;$>#PIGW<D-RHUI</9CWWmBL+Z;ER8%>mPdOZ=+
VFK*U
X7LVV0:GKP_$@H@97B$m"'m@+MRX9%?1"OAO?E'NH9=K+<:dY@>SQ1*5eGL1G.QYHEU)7Y,Y#TU9Y
V;_fV
X1OJ<AgP/B"R0@mRH8/2g:K327L@37+DACm-+5-R(BUL_"?mC@F<CTJ@ZUTHL_NTgeI0"B!$=%_>3
V%3"B
XBGe@f8'8W<#SF:f&*L<X0>3"B,Y@X06dZ5&;*T;CXEE0CV$5&RJE#%L=8I0R>fRL!:,BX+FdRfZ#
V.#7*
X=T"./;"/G6QfNLd9&fd9;mMR;FL-6*dd!FI2Hmm367DE!0DVKQW3EVCQI0Bm',FmMN+(G)QP3N<N
VZ$68
X1N(DJMVG:6R(7#DG@-+L@6-FB($%%A+-5W"%V(#d4d:d9AI)6KOB>R$U%+D1,)RUC<;+E0/<mYNE
VUI"Y
X6T>/f+8=8!mS74G0mNUL%BJ:/UFHDH-ULBB<*/S?5XH%0VEO>@395YD@#5e87%NKXMm"+d;fRBB*
V!E)E
XOB?2!'A_8&3?8U'_=YH)!MPZV&me(YVC'TCKWe3U'-8-/?2K>SF<RX:@_JS@N<D6,A:@LM7>)Rd7
VfAY7
XFP;1(JmEDWm&X)P?:gW#EgCmC_Ne,ON:B7Og$L<WFQ23@3JZ-&dAM9Se#PUX._FI&83,?34?@e8e
V8T:$
XF%"$Xe4%J?D6LO<T8$)1'K(+H,9AK?FG6NUU!Z81Of:)-"GWCZ4-19(!UX@@H@GW:UZ'OT!T0)_;
V9'0(
X@A+Z7W$0DKV%Vg>E'%VGX7H1:ff7CF1RG:FM+%.7P7)#MZN=_@DR3XH>WQm6BQ4;&G@!O8:WQZ9A
VXR3H
X,"W_@+&1X!KFE):m)VTOL0XFPT)ZZ/C&H&%GQF%(CFCI<M,:*161HPSge/KfRZ7EU7ECL':(G2,'
V??7,
X&3'e$%fQfN)D)-%8>7!L(S(fUCQ/XTQ9-BY+LH+FYL>7RR#@#KeI1+7?/g4D?_CP-4@DPAc@B@XW
VZT$A
XOB,OIDIb@49A@@PD@0K@!QWX2%6K-E6Z%YVZ,U&K3QWRMEA@V54TVA@@Eah@VU#K5@PRMQB@VYTP
VBE@@
XPAag@GHT@@4b@EXAc@mBPDF4&2QDF4&2A@I5$F@X%QHMT@@0Baf@m/#,@,mBPCPB0NGaf@I5DH@X
VEQAQ
XU@@0Bag@T",@@":>.XIZ?JI*;;"%(=+Db@I5$G@XETR=T@@mEb@#JKe"XA8?A1@Tc@Laj@$TSW@m
VURQD
XUA@@Eag@PORA@H*;;"%(=+D4Z%Q=&60@11_&;S1)Vg(Q*A-5'6PJR%E::2DE$VB/m*TTHXJV$F#R
VLfR;
XS?<E;8@U1d-S#GRN'?7=36'/3eI>P6g6VgAC7J*0U<CWSO&K$LL+eCYG_(mKIU8Re"L+"#1=@I@H
Vmm?$
XK7!IG+VK0P<&Q_XD(TSD81Z658FAg13J,(?V<YC>Q52KH_<O='%0Y_ERB?6"G.K81$P@B?:,I7GG
V8OA=
X/G=#Fg%V4;1(9!3VN=N4_:$$I?HJMNAV&DM38>T2FGg%NeOHLLP&'C3&FHK8%;UFZGQ?8mO=1O_C
V-4gQ
X-72VW0*!E_9;+0@<W<C#D43&MP#5Q:K4P.PYeT2KT/g*P,N+(VY%Q9'QBBP$B0F66"LIE*,"1HGV
V3%*W
X@90R=LP0Rd!'Z)'Z0'gJ_J,9:0JEMeUdQB%G)D+U*)3K%T+BP_d<@Z3e(:Id,Fd-7*A0@V>N!:,+
V$AmY
X_L6,!2!A*TY(G:'7%S-ZPSgROC;H&,*J%!L#WHH#J6K<Z.(TK:@&VA,Id78Zf1IG#JXN.g+K,#?!
V%V#F
X4g.;&(1#>9XEAff#dLM:=C1HA6ZB7TZf)_Pf*m-e:-&*Z<6Y22(Bf5"Me5698__JeA6P@@d_%;Ee
V+K=/
XJ;TAS')dRZG:'S+F(;+GO0I%FG:G"Q*-6O5,X4%1.RW'Q2g1'Z<"3/S9,&!V4T9<?DX=MT/*!(!Z
Vd1=;
XGd7=f'7m4mUW.??A*9F01:dFW9)_G9QT&M%FZ>WAEm0@2;"2=JVAC/-+G)C0e7AV>*H-W2ZBM6f(
V5'D:
X/AP-4@DPAc@B@(I!X#A.CUe6"Ab@PKb@0C@PQ+@H0.@DFf!IWZ/LGf:%Fe.0&d+%TSQ@mUMM%U@@
VPAag
X@mU58RM@$TS$@mUFE$PA@@Tag@0ABE@@G@@PAVaf@(@D!A-)eD!A-)e@PRM%A@VYDRCE@@,ah@;H
VK@K(
X@e@L@$Vc@$TSm@mUDEDUA@@Kag@PI2B@(*+(0Id2+$*."B',I/Rb@$TSg@mUPI5SA@@Vag@0I"Em
V?GDC
XPAb@0aj@PRMfA@VIEQTE@@Tah@=HE@m*."B',I/RPfM.$B@BCCDf/G&"7A/B.,d:'TIPmJ-SA1S/
V)TEW
XH.HI/<Xm1..XE6dC3&<4I/+d;-B!J"JX4Y2AW!GQR,PC*5#7_9,BM0"g6$,7IU%"TRe('EE":FO#
V:_M<
XJ)C<U"e=QgA@5RCP@Ec@H@@OE"MF1(YAI&Jb@m8Ab@O@@/@DFf!IWZ/LGf:%Fe.@'e*%TSQ@mUMM
V%U@@
XPAag@mU58RM@$TS$@mUFE$PA@@Tag@0ABE@@G@@PAVaf@(@D!A-)eD!A-)e@PRM)A@VYDRCE@@,a
Vh@;H
XK@K(@e@L@T<Ac@PRMAB@VQTPTE@@,ah@%HK@m"E)7-,I/RJV$g72&<JA@@PRM9A@VA%TOE@@XAag
V@'HV
X@>_PL@Ec@Caj@I54E@88Z@HmURQDUA@@Eag@PORA@(XQ:fKd2+D4H$A+mb0m!/''"f4AZ0W@O)"8
VIGCO
XHJg(+K3E(,J-Y"8S/+:e"GedEBM?P2W2_N.MASR7@82S3V->P2.4='!E@('#V8A_E5Q-/IAU94(&
VO29B
XY""M6WYN:F;YdEVFC"6K9FNCdBPIJG#:@)B6P/)=_R1!B+;F:XGY@Mdd;*O:5Bd:eT_Eg1X3TF?0
V;dNU
XXT2HL&8H2O,1"!LV<#ZG?9PKZ:.<UHV?G1S@TKM@ATc@m@@eUH6X0>"/<7Sc@FBc@A@;BPX4E&e)
V=2e4
X)WZ09&K,96ZI5TD@XUSSYE@@Tah@XUM.TC@I5DI@X%QAITb@Eag@emPA@0A@@TmEaf@J@QXPdJGQ
VXPdJ
XG@$TSY@mUF!4PA@@Kag@0N2B0BJ@G@C@MDc@I5DH@XEQAQU@@0Bag@T",@@":E.92&<JI*W8&Kd2
V+Db@
XI5$G@XETR=T@@mEag@e"XA8?A1@Tc@Laj@$TSW@mURQDUA@@Eag@PORA@H*W8&Kd2+D,XB19X2I3
V$"IY
XC4K_.R,$DKJSm4U%YA9%_I)B!UZY&S*1C!Y)E@"AHA2L_P,RO'<SJ1eJFH+XmZL%$e1%$BPF:AD#
V$m)V
XQIXJXI9WLLAA@TKM@ATc@PHF@H@B@mV!X#1!DZRNPAb@eHc@D@,K@!QWX2%6K3Q'g)A7e.0&d+%T
VSQ@m
XUMM%U@@PAag@mU58RM@$TS$@mUFE$PA@@Tag@0ABE@@G@@PAVaf@(@D!A-)eD!A-)e@PRM%A@VYD
VRCE@
X@,ah@;HK@K(@e@L@<Pc@$TSm@mUDEDUA@@Kag@PI2B@(Z//)Kd2+$*=>&.,I/Rb@$TSg@mUPI5SA
V@@Va
Xg@0I"Em?GDCPAb@0aj@PRMfA@VIEQTE@@Tah@=HE@m*=>&.,I/R0"ID'#I'LSJ&$MP/<9J1RR,(L
VARWU
X&ETeA9$YIPX&V&9$Z<PXVZAmX@RmL3GD+43I?$RL'"A2JF(&SIIWeI)@$!g@1HIX*UTB&BVR>ECS
VP@@5
XRCP@Ec@H@PNK*DFQ9BET+Oc@AJb@L@0.@DFf!IWZ/P7X.L&Y'%TSQ@mUMM%U@@PAag@mU58RM@$T
VS$@m
XUFE$PA@@Tag@0ABE@@M@@PAVaf@(@D!A-)eD!A-)e@PRM%A@VYDRCE@@,ah@;HK@K(@4@4@$af@$
VTSm@
XmUDEDUA@@Kag@PI2B@8(A<N-:W+$#F0;4*_-Rb@$TSg@mUPI5SA@@Vag@0I"Em?GDCPAb@0aj@PR
VMfA@
XVA6X@HmTDQU@@PAag@4#T@@NZ@/S+>5JA#I&XmKSXXT0PL@KXQ,T-J&RRN&L3K9eJM%T1#gfLDGC
V238C
XNDFXH"@<OHmTmIH_mQ&2@CFZmALX,Q@Y30(mQA4e@KLP$@KL4R(II!$;H'LS"V9&(M@7,J&(<L@X
VX=BH
XH/F0,_FeVOmT4W+_@GX/=6#)mL1@3L8FC"mTX#/N:-+.9)O.2@BV@ALCWGe>3_1@C&7EPA8X"OAH
V_A@3
XS@F8XV3"A.NdgPTDOe@QF$@e>K%@S3HCe@E3@X,@L09%J@,LNCE3@Z.H8)V(;.HX@FA9"e5*XB19
VXe1U
X7eLT_BAZ2W:*KBD+MAEC6E9d*EWe")'Z1LLPAXZ@3&1Ab@5RCP@Ec@H@m3gIQFWOd18_&Cb@G,b@
VF@0.
X@HVZ4M'K#%TSQ@mUMM%U@@PAag@mU58RM@$TS$@mUFE$PA@@Tag@0ABE@@1@@PAVaf@(@D!A-)eD
V!A-)
Xe@PRM%A@VYDRCE@@,ah@;HK@K(@DC<B$Cc@$TSm@mUDEDUA@@Kag@PI2B@(,I;Z+K=+$2&,+-.4/
VRb@$
XTSg@mUPI5SA@@Vag@0I"Em?GDCPAb@0aj@PRMfA@VIEQTE@@Tah@=HE@m2&,+-.4/RP-Z-?edd#D
V>75_
XE8e'&#4!R%mN@H@d744G263$8:43We-=8GS';Z/1C%H(D'PQ*C$4JJ))?-__;"GDTRN135XM9!D9
V"EK6
XG_;.@8Yd7+'8(29KUYS&VKBNJT,;O<C;4G?3g"_IV=V1KS2%*H1%Y#'F+RD/Zm8W#3%UQ"?)L.(_
VgY3e
X1OG'%'/L*'8M1Y"dVHEWVNd&LWDW$HNYR)BL*HQAFHKgd9mg"K$*YYUUY%E",J1DUeQ-LQTW"A,T
V$U$$
XfWVRSe.@#L+(*N+.)&(ED4TI#D#!8F!W6S($IYU5*,QM5RQ=T0,*24:E1JI>"H/,X"H.RD'CV%"7
VK1m2
X&$U@V'&!5mmHL+XegS"L)'()XVYRVZ&LIBDGWK2*I9+(,FeKOQ$B9Y.*LM+N"WZLM<,N6)@A1Y#%
V=(1)
X$51YE2$A=:-=3:5;Yd7S,-PLJ+.Z0X1(%+)?Xg6UCBf%gTWS3B>S,(P.Pe'T1JO,(2&f+!#6%FX4
+-+-+-+-+-+-+-+-  END  OF PART 15 +-+-+-+-+-+-+-+-
Technical Details
Message-ID: <8009686@MVB.SAIC.COM>
Path: arc1-ca.pugleaf.net!sparky!uunet!elroy.jpl.nasa.gov!ames!agate!dog.ee.lbl.gov!network.ucsd.edu!mvb.saic.com!vmsnet-sources

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!elroy.jpl.nasa.gov!ames!agate!dog.ee.lbl.gov!network.ucsd.edu!mvb.saic.com!vmsnet-sources
From: goathunter@wkuvx1.bitnet
Newsgroups: vmsnet.sources
Subject: Zip v1.9 & UnZip v5.0, part 15/22
Message-ID: <8009686@MVB.SAIC.COM>
Date: Tue, 01 Sep 1992 22:53:17 GMT
Organization: Western Kentucky University, Bowling Green, KY
Lines: 1212
Approved: Mark.Berryman@Mvb.Saic.Com